You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sw...@apache.org on 2017/10/12 18:56:26 UTC
[1/2] ambari git commit: AMBARI-22196. Refactor non-stack cluster-env
configs to cluster settings.
Repository: ambari
Updated Branches:
refs/heads/branch-feature-AMBARI-14714 5ddb07cdb -> 8d8c1a551
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/state/PropertyInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/PropertyInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/PropertyInfo.java
index 31fcb9d..afd4b46 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/PropertyInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/PropertyInfo.java
@@ -35,7 +35,7 @@ import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlList;
-import org.apache.ambari.server.controller.StackConfigurationResponse;
+import org.apache.ambari.server.controller.ReadOnlyConfigurationResponse;
import org.w3c.dom.Element;
@XmlAccessorType(XmlAccessType.FIELD)
@@ -167,8 +167,8 @@ public class PropertyInfo {
this.propertyAmbariUpgradeBehavior = propertyAmbariUpgradeBehavior;
}
- public StackConfigurationResponse convertToResponse() {
- return new StackConfigurationResponse(getName(), getValue(),
+ public ReadOnlyConfigurationResponse convertToResponse() {
+ return new ReadOnlyConfigurationResponse(getName(), getValue(),
getDescription(), getDisplayName() , getFilename(), isRequireInput(),
getPropertyTypes(), getAttributesMap(), getPropertyValueAttributes(),
getDependsOnProperties());
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/resources/cluster-settings.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/cluster-settings.xml b/ambari-server/src/main/resources/cluster-settings.xml
new file mode 100644
index 0000000..70b100a
--- /dev/null
+++ b/ambari-server/src/main/resources/cluster-settings.xml
@@ -0,0 +1,322 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<!--
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<configuration>
+ <property>
+ <name>recovery_enabled</name>
+ <value>true</value>
+ <description>Auto start enabled or not for this cluster.</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>recovery_type</name>
+ <value>AUTO_START</value>
+ <description>Auto start type.</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>recovery_lifetime_max_count</name>
+ <value>1024</value>
+ <description>Auto start lifetime maximum count of recovery attempt allowed per host component. This is reset
+ when agent is restarted.
+ </description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>recovery_max_count</name>
+ <value>6</value>
+ <description>Auto start maximum count of recovery attempt allowed per host component in a window. This is reset
+ when agent is restarted.
+ </description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>recovery_window_in_minutes</name>
+ <value>60</value>
+ <description>Auto start recovery window size in minutes.</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>recovery_retry_interval</name>
+ <value>5</value>
+ <description>Auto start recovery retry gap between tries per host component.</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>security_enabled</name>
+ <value>false</value>
+ <description>Hadoop Security</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>kerberos_domain</name>
+ <value>EXAMPLE.COM</value>
+ <description>Kerberos realm.</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>ignore_groupsusers_create</name>
+ <display-name>Skip group modifications during install</display-name>
+ <value>false</value>
+ <property-type>ADDITIONAL_USER_PROPERTY</property-type>
+ <description>Whether to ignore failures on users and group creation</description>
+ <value-attributes>
+ <overridable>false</overridable>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>sysprep_skip_create_users_and_groups</name>
+ <display-name>Whether to skip creating users and groups in a sysprepped cluster</display-name>
+ <value>false</value>
+ <property-type>ADDITIONAL_USER_PROPERTY</property-type>
+ <description>Whether to skip creating users and groups in a sysprepped cluster</description>
+ <value-attributes>
+ <overridable>true</overridable>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>sysprep_skip_copy_fast_jar_hdfs</name>
+ <display-name>Whether to skip copying the tarballs to HDFS on a sysprepped cluster</display-name>
+ <value>false</value>
+ <description>Whether to skip copying the tarballs to HDFS on a sysprepped cluster, during both fresh install and
+ stack upgrade
+ </description>
+ <value-attributes>
+ <overridable>true</overridable>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>sysprep_skip_copy_tarballs_hdfs</name>
+ <display-name>Whether to skip copying the tarballs to HDFS on a sysprepped cluster</display-name>
+ <value>false</value>
+ <description>Whether to skip copying the tarballs to HDFS on a sysprepped cluster, during both fresh install and
+ stack upgrade
+ </description>
+ <value-attributes>
+ <overridable>true</overridable>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>sysprep_skip_copy_oozie_share_lib_to_hdfs</name>
+ <display-name>Whether to skip copying the Oozie share lib to HDFS on sysprepped cluster</display-name>
+ <value>false</value>
+ <description>Whether to skip copying the Oozie share lib to HDFS on sysprepped cluster, during both fresh
+ install and stack upgrade
+ </description>
+ <value-attributes>
+ <overridable>true</overridable>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>sysprep_skip_setup_jce</name>
+ <display-name>Whether to skip setting up the unlimited key JCE policy on sysprepped cluster</display-name>
+ <value>false</value>
+ <description>Whether to skip setting up the unlimited key JCE policy on sysprepped cluster, during both fresh
+ install and upgrades
+ </description>
+ <value-attributes>
+ <overridable>true</overridable>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>smokeuser</name>
+ <display-name>Smoke User</display-name>
+ <value>ambari-qa</value>
+ <property-type>USER</property-type>
+ <description>User executing service checks</description>
+ <value-attributes>
+ <type>user</type>
+ <overridable>false</overridable>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>smokeuser_keytab</name>
+ <value>/etc/security/keytabs/smokeuser.headless.keytab</value>
+ <description>Path to smoke test user keytab file</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>user_group</name>
+ <display-name>Hadoop Group</display-name>
+ <value>hadoop</value>
+ <property-type>GROUP</property-type>
+ <description>Hadoop user group.</description>
+ <value-attributes>
+ <type>user</type>
+ <overridable>false</overridable>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>repo_suse_rhel_template</name>
+ <value>[{{repo_id}}]
+ name={{repo_id}}
+ {% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}
+
+ path=/
+ enabled=1
+ gpgcheck=0
+ </value>
+ <description>Template of repositories for rhel and suse.</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>repo_ubuntu_template</name>
+ <value>{{package_type}} {{base_url}} {{components}}</value>
+ <description>Template of repositories for ubuntu.</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>override_uid</name>
+ <value>true</value>
+ <property-type>ADDITIONAL_USER_PROPERTY</property-type>
+ <display-name>Have Ambari manage UIDs</display-name>
+ <description>Have Ambari manage UIDs</description>
+ <value-attributes>
+ <overridable>false</overridable>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>fetch_nonlocal_groups</name>
+ <value>true</value>
+ <display-name>Ambari fetch nonlocal groups</display-name>
+ <description>Ambari requires fetching all the groups. This can be slow
+ on envs with enabled ldap. Setting this option to false will enable Ambari,
+ to skip user/group management connected with ldap groups.
+ </description>
+ <value-attributes>
+ <overridable>false</overridable>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>managed_hdfs_resource_property_names</name>
+ <value/>
+ <description>Comma separated list of property names with HDFS resource paths.
+ Resource from this list will be managed even if it is marked as not managed in the stack
+ </description>
+ <value-attributes>
+ <overridable>false</overridable>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>alerts_repeat_tolerance</name>
+ <value>1</value>
+ <description>The number of consecutive alerts required to transition an alert from the SOFT to the HARD state.
+ </description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>ignore_bad_mounts</name>
+ <value>false</value>
+ <description>For properties handled by handle_mounted_dirs this will make Ambari not to create any
+ directories.
+ </description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>manage_dirs_on_root</name>
+ <value>true</value>
+ <description>For properties handled by handle_mounted_dirs this will make Ambari to manage (create and set
+ permissions) unknown directories on / partition
+ </description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>one_dir_per_partition</name>
+ <value>false</value>
+ <description>For properties handled by handle_mounted_dirs this will make Ambari</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>hide_yarn_memory_widget</name>
+ <value>false</value>
+ <description>YARN Memory widget should be hidden by default on the dashboard.</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>agent_mounts_ignore_list</name>
+ <value/>
+ <description>Comma separated list of the mounts which would be ignored by Ambari during property values
+ suggestion by Stack Advisor
+ </description>
+ <on-ambari-upgrade add="false"/>
+ <value-attributes>
+ <visible>true</visible>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ </property>
+ <property>
+ <name>enable_external_ranger</name>
+ <value>false</value>
+ <description>Flag to turn on when external setup of External Ranger is done.</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>service_check_type</name>
+ <display-name>Service Check Type</display-name>
+ <value>full</value>
+ <description>Indicates the complexity of the service check. Valid values are 'minimal' or 'full'.</description>
+ <on-ambari-upgrade add="true"/>
+ <value-attributes>
+ <visible>true</visible>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ </property>
+ <property>
+ <name>namenode_rolling_restart_timeout</name>
+ <value>4200</value>
+ <description>Timeout for namenode rolling restart command.</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>namenode_rolling_restart_safemode_exit_timeout</name>
+ <value>3600</value>
+ <description>Timeout for safemode exit, during namenode rolling restart</description>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>manage_hive_fsroot</name>
+ <value>true</value>
+ <description>If flag is set to true, ambari will manage fsroot for Hive, by setting it to fs.defautlFS of local
+ HDFS
+ </description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+</configuration>
[2/2] ambari git commit: AMBARI-22196. Refactor non-stack cluster-env
configs to cluster settings.
Posted by sw...@apache.org.
AMBARI-22196. Refactor non-stack cluster-env configs to cluster settings.
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8d8c1a55
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8d8c1a55
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8d8c1a55
Branch: refs/heads/branch-feature-AMBARI-14714
Commit: 8d8c1a551579b696d1730afcde9c49594a1dc77b
Parents: 5ddb07c
Author: Swapan Shridhar <ss...@hortonworks.com>
Authored: Fri Oct 6 01:19:13 2017 -0700
Committer: Swapan Shridhar <ss...@hortonworks.com>
Committed: Thu Oct 12 00:43:25 2017 -0700
----------------------------------------------------------------------
.../server/PropertyNotFoundException.java | 27 ++
.../server/ResourcesPathNotFoundException.java | 25 ++
.../resources/ResourceInstanceFactoryImpl.java | 4 +
.../RootClusterSettingsResourceDefinition.java | 52 +++
.../server/api/services/AmbariMetaInfo.java | 49 +++
.../api/services/RootClusterSettingService.java | 135 ++++++++
.../server/api/services/StacksService.java | 10 +-
.../controller/AmbariManagementController.java | 12 +-
.../AmbariManagementControllerImpl.java | 54 +++-
.../server/controller/ControllerModule.java | 2 +
.../ReadOnlyConfigurationResponse.java | 272 ++++++++++++++++
.../controller/RootClusterSettingRequest.java | 39 +++
.../controller/StackConfigurationResponse.java | 266 ---------------
.../StackLevelConfigurationRequest.java | 2 +-
.../StackLevelConfigurationResponse.java | 20 +-
.../ambari/server/controller/StackV2.java | 12 +-
.../AbstractControllerResourceProvider.java | 2 +
.../RootClusterSettingsResourceProvider.java | 167 ++++++++++
.../server/controller/internal/Stack.java | 14 +-
.../StackConfigurationResourceProvider.java | 8 +-
...StackLevelConfigurationResourceProvider.java | 8 +-
.../ambari/server/controller/spi/Resource.java | 2 +
.../ResourceLevelClusterSettingManager.java | 168 ++++++++++
...sourceLevelClusterSettingManagerFactory.java | 34 ++
.../ambari/server/state/ConfigHelper.java | 1 +
.../ambari/server/state/PropertyInfo.java | 6 +-
.../src/main/resources/cluster-settings.xml | 322 +++++++++++++++++++
27 files changed, 1393 insertions(+), 320 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/PropertyNotFoundException.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/PropertyNotFoundException.java b/ambari-server/src/main/java/org/apache/ambari/server/PropertyNotFoundException.java
new file mode 100644
index 0000000..b036c20
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/PropertyNotFoundException.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server;
+
+@SuppressWarnings("serial")
+public class PropertyNotFoundException extends ObjectNotFoundException {
+
+ public PropertyNotFoundException(String message) {
+ super(message);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/ResourcesPathNotFoundException.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/ResourcesPathNotFoundException.java b/ambari-server/src/main/java/org/apache/ambari/server/ResourcesPathNotFoundException.java
new file mode 100644
index 0000000..fdc1971
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/ResourcesPathNotFoundException.java
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server;
+
+public class ResourcesPathNotFoundException extends ObjectNotFoundException {
+ public ResourcesPathNotFoundException(String resourceDirPath) {
+ super("Resources folder not found. Path passed-in is : "
+ + resourceDirPath);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
index 7431f9d..737b9b4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
@@ -104,6 +104,10 @@ public class ResourceInstanceFactoryImpl implements ResourceInstanceFactory {
resourceDefinition = new ClusterResourceDefinition();
break;
+ case RootClusterSetting:
+ resourceDefinition = new RootClusterSettingsResourceDefinition();
+ break;
+
case ServiceGroup:
resourceDefinition = new ServiceGroupResourceDefinition();
break;
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RootClusterSettingsResourceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RootClusterSettingsResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RootClusterSettingsResourceDefinition.java
new file mode 100644
index 0000000..e83c191
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RootClusterSettingsResourceDefinition.java
@@ -0,0 +1,52 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.api.resources;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.ambari.server.controller.spi.Resource;
+
+public class RootClusterSettingsResourceDefinition extends BaseResourceDefinition {
+ /**
+ * Constructor.
+ */
+ public RootClusterSettingsResourceDefinition() {
+ super(Resource.Type.RootClusterSetting);
+ }
+
+ @Override
+ public String getPluralName() {
+ return "rootClusterSettings";
+ }
+
+ @Override
+ public String getSingularName() {
+ return "rootClusterSetting";
+ }
+
+ @Override
+ public Set<SubResourceDefinition> getSubResourceDefinitions() {
+ Set<SubResourceDefinition> subs = new HashSet<SubResourceDefinition>();
+ return subs;
+ }
+}
+
+
+
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
index c07df43..2bb450b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
@@ -41,6 +41,8 @@ import javax.xml.bind.JAXBException;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.ParentObjectNotFoundException;
+import org.apache.ambari.server.PropertyNotFoundException;
+import org.apache.ambari.server.ResourcesPathNotFoundException;
import org.apache.ambari.server.StackAccessException;
import org.apache.ambari.server.configuration.Configuration;
import org.apache.ambari.server.controller.MpackRequest;
@@ -61,6 +63,8 @@ import org.apache.ambari.server.orm.dao.MetainfoDAO;
import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
import org.apache.ambari.server.orm.entities.MpackEntity;
import org.apache.ambari.server.orm.entities.StackEntity;
+import org.apache.ambari.server.resources.ResourceLevelClusterSettingManager;
+import org.apache.ambari.server.resources.ResourceLevelClusterSettingManagerFactory;
import org.apache.ambari.server.stack.StackManager;
import org.apache.ambari.server.stack.StackManagerFactory;
import org.apache.ambari.server.state.Cluster;
@@ -139,6 +143,7 @@ public class AmbariMetaInfo {
private final ActionDefinitionManager adManager = new ActionDefinitionManager();
private String serverVersion = "undefined";
+ private String clusterSettingFileName = "cluster-settings.xml";
private File resourcesRoot;
private File stackRoot;
@@ -220,6 +225,17 @@ public class AmbariMetaInfo {
*/
private MpackManager mpackManager;
+ /**
+ * Factory for injecting {@link ResourceLevelClusterSettingManager} instances.
+ */
+ @Inject
+ private ResourceLevelClusterSettingManagerFactory resourceLevelClusterSettingManagerFactory;
+
+ /**
+ * Singleton instance of Resource Level 'Cluster Setting' Manager
+ */
+ private ResourceLevelClusterSettingManager resourceLevelClusterSettingManager;
+
private Configuration conf;
@@ -236,6 +252,8 @@ public class AmbariMetaInfo {
String resourcesPath = conf.getResourceDirPath();
if(resourcesPath != null && !resourcesPath.isEmpty()) {
resourcesRoot = new File(resourcesPath);
+ } else {
+ throw new ResourcesPathNotFoundException(resourcesPath);
}
String stackPath = conf.getMetadataPath();
@@ -280,6 +298,8 @@ public class AmbariMetaInfo {
mpackManager = mpackManagerFactory.create(mpacksV2Staging, stackRoot);
+ resourceLevelClusterSettingManager = resourceLevelClusterSettingManagerFactory.create(conf.getResourceDirPath());
+
getCustomActionDefinitions(customActionRoot);
}
@@ -789,6 +809,35 @@ public class AmbariMetaInfo {
return propertyResult;
}
+ /*
+ Returns Resource Level read only 'Cluster Properties'.
+ */
+ public Set<PropertyInfo> getClusterProperties() {
+ return new HashSet<>(resourceLevelClusterSettingManager.getClusterSettingsMap());
+ }
+
+ /*
+ Returns specific Resource Level read only 'Cluster Property'.
+ */
+ public Set<PropertyInfo> getClusterPropertiesByName(String propertyName) throws AmbariException {
+ HashSet<PropertyInfo> properties = new HashSet<>(resourceLevelClusterSettingManager.getClusterSettingsMap());
+ if (properties.size() == 0) {
+ throw new PropertyNotFoundException("'" + propertyName + "', in " + clusterSettingFileName);
+ }
+ Set<PropertyInfo> propertyResult = new HashSet<>();
+
+ for (PropertyInfo property : properties) {
+ if (property.getName().equals(propertyName)) {
+ propertyResult.add(property);
+ }
+ }
+
+ if (propertyResult.isEmpty()) {
+ throw new PropertyNotFoundException("'" + propertyName + "', in " + clusterSettingFileName);
+ }
+ return propertyResult;
+ }
+
public Set<PropertyInfo> getStackPropertiesByName(String stackName, String version, String propertyName)
throws AmbariException {
Set<PropertyInfo> properties = getStackProperties(stackName, version);
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootClusterSettingService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootClusterSettingService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootClusterSettingService.java
new file mode 100644
index 0000000..d77b347
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootClusterSettingService.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.api.services;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.controller.ReadOnlyConfigurationResponse;
+import org.apache.ambari.server.controller.internal.MpackResourceProvider;
+import org.apache.ambari.server.controller.internal.RootClusterSettingsResourceProvider;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.http.HttpStatus;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+
+/**
+ * Service responsible for services resource requests.
+ */
+@Path("/cluster_settings/")
+@Api(value = "ClusterSettings", description = "Endpoint for fetching read only 'cluster settings'")
+public class RootClusterSettingService extends BaseService {
+
+ public RootClusterSettingService() {
+ super();
+ }
+
+ /**
+ * Handles: GET /cluster_settings
+ * Get all default settings for a cluster.
+ *
+ * @param headers http headers
+ * @param ui uri info
+ * @return service collection resource representation
+ */
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ @ApiOperation(value = "Returns information for all the read only 'cluster settings'",
+ response = ReadOnlyConfigurationResponse.ReadOnlyConfigurationResponseSwagger.class, responseContainer = RESPONSE_CONTAINER_LIST)
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING,
+ paramType = PARAM_TYPE_QUERY, defaultValue = MpackResourceProvider.MPACK_ID),
+ @ApiImplicitParam(name = QUERY_SORT, value = QUERY_SORT_DESCRIPTION, dataType = DATA_TYPE_STRING,
+ paramType = PARAM_TYPE_QUERY),
+ @ApiImplicitParam(name = QUERY_PAGE_SIZE, value = QUERY_PAGE_SIZE_DESCRIPTION, defaultValue = DEFAULT_PAGE_SIZE,
+ dataType = DATA_TYPE_INT, paramType = PARAM_TYPE_QUERY),
+ @ApiImplicitParam(name = QUERY_FROM, value = QUERY_FROM_DESCRIPTION, allowableValues = QUERY_FROM_VALUES,
+ defaultValue = DEFAULT_FROM, dataType = DATA_TYPE_INT, paramType = PARAM_TYPE_QUERY),
+ @ApiImplicitParam(name = QUERY_TO, value = QUERY_TO_DESCRIPTION, allowableValues = QUERY_TO_VALUES,
+ dataType = DATA_TYPE_INT, paramType = PARAM_TYPE_QUERY),
+ })
+ @ApiResponses({
+ @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND),
+ @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+ @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+ })
+
+ public Response getClusterSettings(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
+ return handleRequest(headers, body, ui, Request.Type.GET, createClusterSettingsResource(null));
+ }
+
+ /**
+ * Handles GET /cluster_settings/{settingName}
+ * Get specific default setting for a cluster.
+ *
+ * @param headers http headers
+ * @param ui uri info
+ * @return service collection resource representation
+ */
+ @GET
+ @Path("{settingName}")
+ @Produces("text/plain")
+ @ApiOperation(value = "Returns information about specific read only 'cluster settings'",
+ response = ReadOnlyConfigurationResponse.ReadOnlyConfigurationResponseSwagger.class)
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING,
+ paramType = PARAM_TYPE_QUERY, defaultValue = RootClusterSettingsResourceProvider.ALL_PROPERTIES),
+ })
+ @ApiResponses({
+ @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND),
+ @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+ @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+ })
+ public Response getClusterSetting(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+ @PathParam("settingName") String settingName) {
+ return handleRequest(headers, body, ui, Request.Type.GET, createClusterSettingsResource(settingName));
+ }
+
+ /**
+ * Create a 'cluster setting' resource instance.
+ *
+ * @return 'cluster setting' resource instance
+ */
+ ResourceInstance createClusterSettingsResource(String settingName) {
+ Map<Resource.Type, String> mapIds = new HashMap<>();
+ mapIds.put(Resource.Type.RootClusterSetting, settingName);
+
+ return createResource(Resource.Type.RootClusterSetting, mapIds);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
index 67d3a15..aef7fc1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
@@ -37,9 +37,9 @@ import org.apache.ambari.server.api.resources.ResourceInstance;
import org.apache.ambari.server.controller.ComponentDependencyResponse;
import org.apache.ambari.server.controller.ExtensionLinkResponse;
import org.apache.ambari.server.controller.QuickLinksResponse;
+import org.apache.ambari.server.controller.ReadOnlyConfigurationResponse;
import org.apache.ambari.server.controller.StackArtifactResponse;
import org.apache.ambari.server.controller.StackConfigurationDependencyResponse;
-import org.apache.ambari.server.controller.StackConfigurationResponse;
import org.apache.ambari.server.controller.StackResponse;
import org.apache.ambari.server.controller.StackServiceArtifactResponse;
import org.apache.ambari.server.controller.StackServiceComponentResponse;
@@ -223,7 +223,7 @@ public class StacksService extends BaseService {
@ApiOperation(value = "Get all configurations for a stack version",
nickname = "StacksService#getStackLevelConfigurations",
notes = "Returns all configurations for a stack version.",
- response = StackConfigurationResponse.StackConfigurationResponseSwagger.class,
+ response = ReadOnlyConfigurationResponse.ReadOnlyConfigurationResponseSwagger.class,
responseContainer = RESPONSE_CONTAINER_LIST)
@ApiImplicitParams({
@ApiImplicitParam(name = QUERY_FIELDS, value = "Filter returned attributes",
@@ -261,7 +261,7 @@ public class StacksService extends BaseService {
@ApiOperation(value = "Get configuration details for a given property",
nickname = "StacksService#getStackLevelConfiguration",
notes = "Returns the configuration details for a given property.",
- response = StackConfigurationResponse.StackConfigurationResponseSwagger.class)
+ response = ReadOnlyConfigurationResponse.ReadOnlyConfigurationResponseSwagger.class)
@ApiImplicitParams({
@ApiImplicitParam(name = QUERY_FIELDS, value = "Filter returned attributes",
defaultValue = "StackLevelConfigurations/*",
@@ -611,7 +611,7 @@ public class StacksService extends BaseService {
@ApiOperation(value = "Get all configurations for a stack service",
nickname = "StacksService#getStackConfigurations",
notes = "Returns all configurations for a stack service.",
- response = StackConfigurationResponse.StackConfigurationResponseSwagger.class,
+ response = ReadOnlyConfigurationResponse.ReadOnlyConfigurationResponseSwagger.class,
responseContainer = RESPONSE_CONTAINER_LIST)
@ApiImplicitParams({
@ApiImplicitParam(name = QUERY_FIELDS, value = "Filter returned attributes",
@@ -653,7 +653,7 @@ public class StacksService extends BaseService {
@ApiOperation(value = "Get stack service configuration details",
nickname = "StacksService#getStackConfiguration",
notes = "Returns the details of a stack service configuration.",
- response = StackConfigurationResponse.StackConfigurationResponseSwagger.class)
+ response = ReadOnlyConfigurationResponse.ReadOnlyConfigurationResponseSwagger.class)
@ApiImplicitParams({
@ApiImplicitParam(name = QUERY_FIELDS, value = "Filter returned attributes",
defaultValue = "StackConfigurations/*",
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
index f2c4c52..ce61497 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
@@ -484,7 +484,7 @@ public interface AmbariManagementController {
*
* @throws AmbariException if the resources cannot be read
*/
- Set<StackConfigurationResponse> getStackConfigurations(Set<StackConfigurationRequest> requests) throws AmbariException;
+ Set<ReadOnlyConfigurationResponse> getStackConfigurations(Set<StackConfigurationRequest> requests) throws AmbariException;
/**
@@ -843,7 +843,15 @@ public interface AmbariManagementController {
* @return
* @throws AmbariException
*/
- Set<StackConfigurationResponse> getStackLevelConfigurations(Set<StackLevelConfigurationRequest> requests) throws AmbariException;
+ Set<ReadOnlyConfigurationResponse> getStackLevelConfigurations(Set<StackLevelConfigurationRequest> requests) throws AmbariException;
+
+ /**
+ * Get initial settings for a cluster (!not a service).
+ * @param requests
+ * @return
+ * @throws AmbariException
+ */
+ Set<ReadOnlyConfigurationResponse> getResourceLevelClusterSettings(Set<RootClusterSettingRequest> requests) throws AmbariException;
/**
* @param serviceInfo service info for a given service
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 188d4d3..28b5c28 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -4812,17 +4812,17 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
}
@Override
- public Set<StackConfigurationResponse> getStackLevelConfigurations(
+ public Set<ReadOnlyConfigurationResponse> getStackLevelConfigurations(
Set<StackLevelConfigurationRequest> requests) throws AmbariException {
- Set<StackConfigurationResponse> response = new HashSet<>();
+ Set<ReadOnlyConfigurationResponse> response = new HashSet<>();
for (StackLevelConfigurationRequest request : requests) {
String stackName = request.getStackName();
String stackVersion = request.getStackVersion();
- Set<StackConfigurationResponse> stackConfigurations = getStackLevelConfigurations(request);
+ Set<ReadOnlyConfigurationResponse> stackConfigurations = getStackLevelConfigurations(request);
- for (StackConfigurationResponse stackConfigurationResponse : stackConfigurations) {
+ for (ReadOnlyConfigurationResponse stackConfigurationResponse : stackConfigurations) {
stackConfigurationResponse.setStackName(stackName);
stackConfigurationResponse.setStackVersion(stackVersion);
}
@@ -4833,10 +4833,10 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
return response;
}
- private Set<StackConfigurationResponse> getStackLevelConfigurations(
+ private Set<ReadOnlyConfigurationResponse> getStackLevelConfigurations(
StackLevelConfigurationRequest request) throws AmbariException {
- Set<StackConfigurationResponse> response = new HashSet<>();
+ Set<ReadOnlyConfigurationResponse> response = new HashSet<>();
String stackName = request.getStackName();
String stackVersion = request.getStackVersion();
@@ -4856,18 +4856,48 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
}
@Override
- public Set<StackConfigurationResponse> getStackConfigurations(
+ public Set<ReadOnlyConfigurationResponse> getResourceLevelClusterSettings(
+ Set<RootClusterSettingRequest> requests) throws AmbariException {
+ Set<ReadOnlyConfigurationResponse> response = new HashSet<>();
+ for (RootClusterSettingRequest request : requests) {
+ Set<ReadOnlyConfigurationResponse> stackConfigurations = getResourceLevelClusterSettings(request);
+ response.addAll(stackConfigurations);
+ }
+
+ return response;
+ }
+
+ private Set<ReadOnlyConfigurationResponse> getResourceLevelClusterSettings(
+ RootClusterSettingRequest request) throws AmbariException {
+ Set<ReadOnlyConfigurationResponse> response = new HashSet<>();
+ String propertyName = request.getPropertyName();
+
+ Set<PropertyInfo> properties;
+ if (propertyName != null) {
+ properties = ambariMetaInfo.getClusterPropertiesByName(propertyName);
+ } else {
+ properties = ambariMetaInfo.getClusterProperties();
+ }
+ for (PropertyInfo property : properties) {
+ response.add(property.convertToResponse());
+ }
+ return response;
+ }
+
+
+ @Override
+ public Set<ReadOnlyConfigurationResponse> getStackConfigurations(
Set<StackConfigurationRequest> requests) throws AmbariException {
- Set<StackConfigurationResponse> response = new HashSet<>();
+ Set<ReadOnlyConfigurationResponse> response = new HashSet<>();
for (StackConfigurationRequest request : requests) {
String stackName = request.getStackName();
String stackVersion = request.getStackVersion();
String serviceName = request.getServiceName();
- Set<StackConfigurationResponse> stackConfigurations = getStackConfigurations(request);
+ Set<ReadOnlyConfigurationResponse> stackConfigurations = getStackConfigurations(request);
- for (StackConfigurationResponse stackConfigurationResponse : stackConfigurations) {
+ for (ReadOnlyConfigurationResponse stackConfigurationResponse : stackConfigurations) {
stackConfigurationResponse.setStackName(stackName);
stackConfigurationResponse.setStackVersion(stackVersion);
stackConfigurationResponse.setServiceName(serviceName);
@@ -4879,10 +4909,10 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
return response;
}
- private Set<StackConfigurationResponse> getStackConfigurations(
+ private Set<ReadOnlyConfigurationResponse> getStackConfigurations(
StackConfigurationRequest request) throws AmbariException {
- Set<StackConfigurationResponse> response = new HashSet<>();
+ Set<ReadOnlyConfigurationResponse> response = new HashSet<>();
String stackName = request.getStackName();
String stackVersion = request.getStackVersion();
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
index a4339ab..3117186 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
@@ -109,6 +109,7 @@ import org.apache.ambari.server.registry.RegistryFactory;
import org.apache.ambari.server.registry.RegistryFactoryImpl;
import org.apache.ambari.server.registry.RegistryManager;
import org.apache.ambari.server.registry.RegistryManagerImpl;
+import org.apache.ambari.server.resources.ResourceLevelClusterSettingManagerFactory;
import org.apache.ambari.server.scheduler.ExecutionScheduler;
import org.apache.ambari.server.scheduler.ExecutionSchedulerImpl;
import org.apache.ambari.server.security.SecurityHelper;
@@ -511,6 +512,7 @@ public class ControllerModule extends AbstractModule {
install(new FactoryModuleBuilder().build(MetricPropertyProviderFactory.class));
install(new FactoryModuleBuilder().build(UpgradeContextFactory.class));
install(new FactoryModuleBuilder().build(MpackManagerFactory.class));
+ install(new FactoryModuleBuilder().build(ResourceLevelClusterSettingManagerFactory.class));
bind(RegistryFactory.class).to(RegistryFactoryImpl.class);
bind(HostRoleCommandFactory.class).to(HostRoleCommandFactoryImpl.class);
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/ReadOnlyConfigurationResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ReadOnlyConfigurationResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ReadOnlyConfigurationResponse.java
new file mode 100644
index 0000000..0033ea3
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ReadOnlyConfigurationResponse.java
@@ -0,0 +1,272 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.controller;
+
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ambari.server.state.PropertyDependencyInfo;
+import org.apache.ambari.server.state.PropertyInfo.PropertyType;
+import org.apache.ambari.server.state.ValueAttributesInfo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+
+public class ReadOnlyConfigurationResponse {
+
+ /**
+ * Configuration response.
+ *
+ * @param propertyName Property Key
+ * @param propertyValue Property Value
+ * @param propertyDescription Property Description
+ * @param type Configuration type
+ * @param propertyAttributes Attributes map
+ */
+ public ReadOnlyConfigurationResponse(String propertyName, String propertyValue, String propertyDescription,
+ String type, Map<String, String> propertyAttributes) {
+ setPropertyName(propertyName);
+ setPropertyValue(propertyValue);
+ setPropertyDescription(propertyDescription);
+ setType(type);
+ setPropertyAttributes(propertyAttributes);
+ }
+
+ /**
+ * Configuration response with all properties.
+ *
+ * @param propertyName Property Key
+ * @param propertyValue Property Value
+ * @param propertyDescription Property Description
+ * @param type Configuration type
+ * @param isRequired Is required to be set
+ * @param propertyTypes Property Types
+ * @param propertyAttributes Attributes map
+ * @param propertyValueAttributes Value Attributes
+ * @param dependsOnProperties depends on properties set
+ */
+ public ReadOnlyConfigurationResponse(String propertyName, String propertyValue,
+ String propertyDescription, String propertyDisplayName, String type,
+ Boolean isRequired,
+ Set<PropertyType> propertyTypes,
+ Map<String, String> propertyAttributes,
+ ValueAttributesInfo propertyValueAttributes,
+ Set<PropertyDependencyInfo> dependsOnProperties) {
+ setPropertyName(propertyName);
+ setPropertyValue(propertyValue);
+ setPropertyDescription(propertyDescription);
+ setPropertyDisplayName(propertyDisplayName);
+ setType(type);
+ setRequired(isRequired);
+ setPropertyType(propertyTypes);
+ setPropertyAttributes(propertyAttributes);
+ setPropertyValueAttributes(propertyValueAttributes);
+ setDependsOnProperties(dependsOnProperties);
+ }
+
+ private String stackName;
+ private String stackVersion;
+ private String serviceName;
+ private String propertyName;
+ private String propertyValue;
+ private String propertyDescription;
+ private String propertyDisplayName;
+ private String type;
+ private Map<String, String> propertyAttributes;
+ private ValueAttributesInfo propertyValueAttributes;
+ private Set<PropertyDependencyInfo> dependsOnProperties;
+ private Boolean isRequired;
+ private Set<PropertyType> propertyTypes;
+
+ @ApiModelProperty(name = "stack_name")
+ public String getStackName() {
+ return stackName;
+ }
+
+ public void setStackName(String stackName) {
+ this.stackName = stackName;
+ }
+
+ @ApiModelProperty(name = "stack_version")
+ public String getStackVersion() {
+ return stackVersion;
+ }
+
+ public void setStackVersion(String stackVersion) {
+ this.stackVersion = stackVersion;
+ }
+
+ @ApiModelProperty(name = "service_name")
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+
+ @ApiModelProperty(name = "property_name")
+ public String getPropertyName() {
+ return propertyName;
+ }
+
+ public void setPropertyName(String propertyName) {
+ this.propertyName = propertyName;
+ }
+
+ @ApiModelProperty(name = "property_value")
+ public String getPropertyValue() {
+ return propertyValue;
+ }
+
+ public void setPropertyValue(String propertyValue) {
+ this.propertyValue = propertyValue;
+ }
+
+ @ApiModelProperty(name = "property_description")
+ public String getPropertyDescription() {
+ return propertyDescription;
+ }
+
+ public void setPropertyDescription(String propertyDescription) {
+ this.propertyDescription = propertyDescription;
+ }
+
+ @ApiModelProperty(name = "property_display_name")
+ public String getPropertyDisplayName() {
+ return propertyDisplayName;
+ }
+
+ public void setPropertyDisplayName(String propertyDisplayName) {
+ this.propertyDisplayName = propertyDisplayName;
+ }
+
+ /**
+ * Configuration type
+ *
+ * @return Configuration type (*-site.xml)
+ */
+ public String getType() {
+ return type;
+ }
+
+ @ApiModelProperty(name = "type")
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ /**
+ * Provides attributes of this configuration.
+ *
+ * @return Map of attribute name to attribute value
+ */
+ @ApiModelProperty(hidden = true)
+ public Map<String, String> getPropertyAttributes() {
+ return propertyAttributes;
+ }
+
+ /**
+ * Sets attributes for this configuration.
+ *
+ * @param propertyAttributes Map of attribute name to attribute value
+ */
+ public void setPropertyAttributes(Map<String, String> propertyAttributes) {
+ this.propertyAttributes = propertyAttributes;
+ }
+
+ /**
+ * Provides value attributes of this configuration.
+ *
+ * @return value attributes
+ */
+ @ApiModelProperty(name = "property_value_attributes")
+ public ValueAttributesInfo getPropertyValueAttributes() {
+ return propertyValueAttributes;
+ }
+
+ /**
+ * Sets value attributes for this configuration.
+ *
+ * @param propertyValueAttributes
+ */
+ public void setPropertyValueAttributes(ValueAttributesInfo propertyValueAttributes) {
+ this.propertyValueAttributes = propertyValueAttributes;
+ }
+
+ /**
+ * Provides depends on properties of this configuration.
+ *
+ * @return depends on properties set
+ */
+ @ApiModelProperty(name = "dependencies")
+ public Set<PropertyDependencyInfo> getDependsOnProperties() {
+ return dependsOnProperties;
+ }
+
+ /**
+ * Sets depends on properties set for this configuration.
+ *
+ * @param dependsOnProperties
+ */
+ public void setDependsOnProperties(Set<PropertyDependencyInfo> dependsOnProperties) {
+ this.dependsOnProperties = dependsOnProperties;
+ }
+
+ /**
+ * Is property a isRequired property
+ *
+ * @return True/False
+ */
+ @ApiModelProperty(hidden = true)
+ public Boolean isRequired() {
+ return isRequired;
+ }
+
+ /**
+ * Set required attribute on this property.
+ *
+ * @param required True/False.
+ */
+ public void setRequired(Boolean required) {
+ this.isRequired = required;
+ }
+
+ /**
+ * Get type of property as set in the stack definition.
+ *
+ * @return Property type.
+ */
+ @ApiModelProperty(name = "property_type")
+ public Set<PropertyType> getPropertyType() {
+ return propertyTypes;
+ }
+
+ public void setPropertyType(Set<PropertyType> propertyTypes) {
+ this.propertyTypes = propertyTypes;
+ }
+
+ /**
+ * Interface to help correct Swagger documentation generation
+ */
+ public interface ReadOnlyConfigurationResponseSwagger extends ApiModel {
+ @ApiModelProperty(name = "ReadOnlyConfigurations")
+ public ReadOnlyConfigurationResponse getStackConfigurationResponse();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/RootClusterSettingRequest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootClusterSettingRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootClusterSettingRequest.java
new file mode 100644
index 0000000..e86c94d
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootClusterSettingRequest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.ambari.server.controller;
+
+public class RootClusterSettingRequest {
+
+ private String propertyName;
+
+ public RootClusterSettingRequest(String propertyName) {
+ super();
+ setPropertyName(propertyName);
+ }
+
+ public String getPropertyName() {
+ return propertyName;
+ }
+
+ public void setPropertyName(String propertyName) {
+ this.propertyName = propertyName;
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/StackConfigurationResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackConfigurationResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackConfigurationResponse.java
deleted file mode 100644
index fb31c19..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackConfigurationResponse.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ambari.server.controller;
-
-
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.ambari.server.state.PropertyDependencyInfo;
-import org.apache.ambari.server.state.PropertyInfo.PropertyType;
-import org.apache.ambari.server.state.ValueAttributesInfo;
-
-import io.swagger.annotations.ApiModelProperty;
-
-
-public class StackConfigurationResponse {
-
- /**
- * Stack configuration response.
- * @param propertyName Property Key
- * @param propertyValue Property Value
- * @param propertyDescription Property Description
- * @param type Configuration type
- * @param propertyAttributes Attributes map
- */
- public StackConfigurationResponse(String propertyName, String propertyValue, String propertyDescription,
- String type, Map<String, String> propertyAttributes) {
- setPropertyName(propertyName);
- setPropertyValue(propertyValue);
- setPropertyDescription(propertyDescription);
- setType(type);
- setPropertyAttributes(propertyAttributes);
- }
-
- /**
- * Stack configuration response with all properties.
- * @param propertyName Property Key
- * @param propertyValue Property Value
- * @param propertyDescription Property Description
- * @param type Configuration type
- * @param isRequired Is required to be set
- * @param propertyTypes Property Types
- * @param propertyAttributes Attributes map
- * @param propertyValueAttributes Value Attributes
- * @param dependsOnProperties depends on properties set
- */
- public StackConfigurationResponse(String propertyName, String propertyValue,
- String propertyDescription, String propertyDisplayName, String type,
- Boolean isRequired,
- Set<PropertyType> propertyTypes,
- Map<String, String> propertyAttributes,
- ValueAttributesInfo propertyValueAttributes,
- Set<PropertyDependencyInfo> dependsOnProperties) {
- setPropertyName(propertyName);
- setPropertyValue(propertyValue);
- setPropertyDescription(propertyDescription);
- setPropertyDisplayName(propertyDisplayName);
- setType(type);
- setRequired(isRequired);
- setPropertyType(propertyTypes);
- setPropertyAttributes(propertyAttributes);
- setPropertyValueAttributes(propertyValueAttributes);
- setDependsOnProperties(dependsOnProperties);
- }
-
- private String stackName;
- private String stackVersion;
- private String serviceName;
- private String propertyName;
- private String propertyValue;
- private String propertyDescription;
- private String propertyDisplayName;
- private String type;
- private Map<String, String> propertyAttributes;
- private ValueAttributesInfo propertyValueAttributes;
- private Set<PropertyDependencyInfo> dependsOnProperties;
- private Boolean isRequired;
- private Set<PropertyType> propertyTypes;
-
- @ApiModelProperty(name = "stack_name")
- public String getStackName() {
- return stackName;
- }
-
- public void setStackName(String stackName) {
- this.stackName = stackName;
- }
-
- @ApiModelProperty(name = "stack_version")
- public String getStackVersion() {
- return stackVersion;
- }
-
- public void setStackVersion(String stackVersion) {
- this.stackVersion = stackVersion;
- }
-
- @ApiModelProperty(name = "service_name")
- public String getServiceName() {
- return serviceName;
- }
-
- public void setServiceName(String serviceName) {
- this.serviceName = serviceName;
- }
-
- @ApiModelProperty(name = "property_name")
- public String getPropertyName() {
- return propertyName;
- }
-
- public void setPropertyName(String propertyName) {
- this.propertyName = propertyName;
- }
-
- @ApiModelProperty(name = "property_value")
- public String getPropertyValue() {
- return propertyValue;
- }
-
- public void setPropertyValue(String propertyValue) {
- this.propertyValue = propertyValue;
- }
-
- @ApiModelProperty(name = "property_description")
- public String getPropertyDescription() {
- return propertyDescription;
- }
-
- public void setPropertyDescription(String propertyDescription) {
- this.propertyDescription = propertyDescription;
- }
-
- @ApiModelProperty(name = "property_display_name")
- public String getPropertyDisplayName() {
- return propertyDisplayName;
- }
-
- public void setPropertyDisplayName(String propertyDisplayName) {
- this.propertyDisplayName = propertyDisplayName;
- }
-
- /**
- * Configuration type
- * @return Configuration type (*-site.xml)
- */
- public String getType() {
- return type;
- }
-
- @ApiModelProperty(name = "type")
- public void setType(String type) {
- this.type = type;
- }
-
- /**
- * Provides attributes of this configuration.
- *
- * @return Map of attribute name to attribute value
- */
- @ApiModelProperty(hidden = true)
- public Map<String, String> getPropertyAttributes() {
- return propertyAttributes;
- }
-
- /**
- * Sets attributes for this configuration.
- *
- * @param propertyAttributes Map of attribute name to attribute value
- */
- public void setPropertyAttributes(Map<String, String> propertyAttributes) {
- this.propertyAttributes = propertyAttributes;
- }
-
- /**
- * Provides value attributes of this configuration.
- *
- * @return value attributes
- */
- @ApiModelProperty(name = "property_value_attributes")
- public ValueAttributesInfo getPropertyValueAttributes() {
- return propertyValueAttributes;
- }
-
- /**
- * Sets value attributes for this configuration.
- *
- * @param propertyValueAttributes
- */
- public void setPropertyValueAttributes(ValueAttributesInfo propertyValueAttributes) {
- this.propertyValueAttributes = propertyValueAttributes;
- }
-
- /**
- * Provides depends on properties of this configuration.
- *
- * @return depends on properties set
- */
- @ApiModelProperty(name = "dependencies")
- public Set<PropertyDependencyInfo> getDependsOnProperties() {
- return dependsOnProperties;
- }
-
- /**
- * Sets depends on properties set for this configuration.
- *
- * @param dependsOnProperties
- */
- public void setDependsOnProperties(Set<PropertyDependencyInfo> dependsOnProperties) {
- this.dependsOnProperties = dependsOnProperties;
- }
-
- /**
- * Is property a isRequired property
- * @return True/False
- */
- @ApiModelProperty(hidden = true)
- public Boolean isRequired() {
- return isRequired;
- }
-
- /**
- * Set required attribute on this property.
- * @param required True/False.
- */
- public void setRequired(Boolean required) {
- this.isRequired = required;
- }
-
- /**
- * Get type of property as set in the stack definition.
- * @return Property type.
- */
- @ApiModelProperty(name = "property_type")
- public Set<PropertyType> getPropertyType() {
- return propertyTypes;
- }
-
- public void setPropertyType(Set<PropertyType> propertyTypes) {
- this.propertyTypes = propertyTypes;
- }
-
- /**
- * Interface to help correct Swagger documentation generation
- */
- public interface StackConfigurationResponseSwagger extends ApiModel {
- @ApiModelProperty(name = "StackConfigurations")
- public StackConfigurationResponse getStackConfigurationResponse();
- }
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/StackLevelConfigurationRequest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackLevelConfigurationRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackLevelConfigurationRequest.java
index ea67207..70678ad 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackLevelConfigurationRequest.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackLevelConfigurationRequest.java
@@ -39,4 +39,4 @@ public class StackLevelConfigurationRequest extends StackVersionRequest {
this.propertyName = propertyName;
}
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/StackLevelConfigurationResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackLevelConfigurationResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackLevelConfigurationResponse.java
index d33b5cb..a962466 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackLevelConfigurationResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackLevelConfigurationResponse.java
@@ -26,20 +26,20 @@ import org.apache.ambari.server.state.PropertyDependencyInfo;
import org.apache.ambari.server.state.PropertyInfo.PropertyType;
import org.apache.ambari.server.state.ValueAttributesInfo;
-public class StackLevelConfigurationResponse extends StackConfigurationResponse {
+public class StackLevelConfigurationResponse extends ReadOnlyConfigurationResponse {
public StackLevelConfigurationResponse(String propertyName,
- String propertyValue, String propertyDescription, String propertyDisplayName, String type,
- Boolean isRequired, Set<PropertyType> propertyTypes,
- Map<String, String> propertyAttributes,
- ValueAttributesInfo propertyValueAttributes,
- Set<PropertyDependencyInfo> dependsOnProperties) {
+ String propertyValue, String propertyDescription, String propertyDisplayName, String type,
+ Boolean isRequired, Set<PropertyType> propertyTypes,
+ Map<String, String> propertyAttributes,
+ ValueAttributesInfo propertyValueAttributes,
+ Set<PropertyDependencyInfo> dependsOnProperties) {
super(propertyName, propertyValue, propertyDescription, propertyDisplayName, type, isRequired,
- propertyTypes, propertyAttributes, propertyValueAttributes,
- dependsOnProperties);
+ propertyTypes, propertyAttributes, propertyValueAttributes,
+ dependsOnProperties);
}
-
+
public StackLevelConfigurationResponse(String propertyName, String propertyValue, String propertyDescription,
- String type, Map<String, String> propertyAttributes) {
+ String type, Map<String, String> propertyAttributes) {
super(propertyName, propertyValue, propertyDescription, type, propertyAttributes);
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/StackV2.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackV2.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackV2.java
index 8a2208d..a6d8979 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackV2.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackV2.java
@@ -670,14 +670,14 @@ public class StackV2 {
serviceConfigurations.put(service, mapServiceConfig);
requiredServiceConfigurations.put(service, mapRequiredServiceConfig);
- Set<StackConfigurationResponse> serviceConfigs = controller.getStackConfigurations(
+ Set<ReadOnlyConfigurationResponse> serviceConfigs = controller.getStackConfigurations(
Collections.singleton(new StackConfigurationRequest(name, version, service, null)));
- Set<StackConfigurationResponse> stackLevelConfigs = controller.getStackLevelConfigurations(
+ Set<ReadOnlyConfigurationResponse> stackLevelConfigs = controller.getStackLevelConfigurations(
Collections.singleton(new StackLevelConfigurationRequest(name, version, null)));
serviceConfigs.addAll(stackLevelConfigs);
// shouldn't have any required properties in stack level configuration
- for (StackConfigurationResponse config : serviceConfigs) {
+ for (ReadOnlyConfigurationResponse config : serviceConfigs) {
ConfigProperty configProperty = new ConfigProperty(config);
String type = configProperty.getType();
@@ -711,10 +711,10 @@ public class StackV2 {
private void parseStackConfigurations () throws AmbariException {
- Set<StackConfigurationResponse> stackLevelConfigs = controller.getStackLevelConfigurations(
+ Set<ReadOnlyConfigurationResponse> stackLevelConfigs = controller.getStackLevelConfigurations(
Collections.singleton(new StackLevelConfigurationRequest(name, version, null)));
- for (StackConfigurationResponse config : stackLevelConfigs) {
+ for (ReadOnlyConfigurationResponse config : stackLevelConfigs) {
ConfigProperty configProperty = new ConfigProperty(config);
String type = configProperty.getType();
@@ -759,7 +759,7 @@ public class StackV2 {
private Set<PropertyDependencyInfo> dependsOnProperties =
Collections.emptySet();
- public ConfigProperty(StackConfigurationResponse config) {
+ public ConfigProperty(ReadOnlyConfigurationResponse config) {
this.name = config.getPropertyName();
this.value = config.getPropertyValue();
this.attributes = config.getPropertyAttributes();
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
index 84df08a..b8c1674 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
@@ -196,6 +196,8 @@ public abstract class AbstractControllerResourceProvider extends AbstractAuthori
return new RegistryMpackVersionResourceProvider(managementController);
case Mpack:
return new MpackResourceProvider(managementController);
+ case RootClusterSetting:
+ return new RootClusterSettingsResourceProvider(managementController);
case StackVersion:
return new StackVersionResourceProvider(propertyIds, keyPropertyIds, managementController);
case ClusterStackVersion:
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootClusterSettingsResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootClusterSettingsResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootClusterSettingsResourceProvider.java
new file mode 100644
index 0000000..1488672
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootClusterSettingsResourceProvider.java
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.ambari.server.controller.internal;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ReadOnlyConfigurationResponse;
+import org.apache.ambari.server.controller.RootClusterSettingRequest;
+import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
+import org.apache.ambari.server.controller.spi.NoSuchResourceException;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.Resource.Type;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.commons.lang.StringUtils;
+
+import com.google.inject.assistedinject.Assisted;
+
+public class RootClusterSettingsResourceProvider extends ReadOnlyResourceProvider {
+
+ public static final String RESPONSE_KEY = "ClusterSettingsInfo";
+ public static final String ALL_PROPERTIES = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "*";
+
+ public static final String PROPERTY_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "property_name";
+ public static final String PROPERTY_DISPLAY_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "property_display_name";
+ public static final String PROPERTY_VALUE_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "property_value";
+ public static final String PROPERTY_VALUE_ATTRIBUTES_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "property_value_attributes";
+ public static final String DEPENDS_ON_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "property_depends_on";
+ public static final String PROPERTY_DESCRIPTION_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "property_description";
+ public static final String PROPERTY_PROPERTY_TYPE_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "property_type";
+ public static final String PROPERTY_TYPE_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "type";
+ public static final String PROPERTY_FINAL_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "final";
+
+ private static Set<String> pkPropertyIds = new HashSet<>(Arrays.asList(new String[]{PROPERTY_NAME_PROPERTY_ID}));
+
+ /**
+ * The key property ids for 'cluster_setting' resource.
+ */
+ private static final Map<Resource.Type, String> KEY_PROPERTY_IDS = new HashMap<>();
+
+ /**
+ * The property ids for an 'cluster_setting' resource.
+ */
+ private static final Set<String> PROPERTY_IDS = new HashSet<>();
+
+ static {
+ // properties
+ PROPERTY_IDS.add(PROPERTY_NAME_PROPERTY_ID);
+ PROPERTY_IDS.add(PROPERTY_DISPLAY_NAME_PROPERTY_ID);
+ PROPERTY_IDS.add(PROPERTY_VALUE_PROPERTY_ID);
+ PROPERTY_IDS.add(PROPERTY_VALUE_ATTRIBUTES_PROPERTY_ID);
+ PROPERTY_IDS.add(DEPENDS_ON_PROPERTY_ID);
+ PROPERTY_IDS.add(PROPERTY_DESCRIPTION_PROPERTY_ID);
+ PROPERTY_IDS.add(PROPERTY_PROPERTY_TYPE_PROPERTY_ID);
+ PROPERTY_IDS.add(PROPERTY_TYPE_PROPERTY_ID);
+ PROPERTY_IDS.add(PROPERTY_FINAL_PROPERTY_ID);
+
+ // keys
+ KEY_PROPERTY_IDS.put(Type.RootClusterSetting, PROPERTY_NAME_PROPERTY_ID);
+ }
+
+ protected RootClusterSettingsResourceProvider(@Assisted AmbariManagementController managementController) {
+ super(PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
+ }
+
+
+ @Override
+ public Set<Resource> getResources(Request request, Predicate predicate)
+ throws SystemException, UnsupportedPropertyException,
+ NoSuchResourceException, NoSuchParentResourceException {
+
+ final Set<RootClusterSettingRequest> requests = new HashSet<>();
+
+ if (predicate == null) {
+ requests.add(getRequest(Collections.emptyMap()));
+ } else {
+ for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+ requests.add(getRequest(propertyMap));
+ }
+ }
+
+ Set<String> requestedIds = getRequestPropertyIds(request, predicate);
+
+ Set<ReadOnlyConfigurationResponse> responses = getResources(new Command<Set<ReadOnlyConfigurationResponse>>() {
+ @Override
+ public Set<ReadOnlyConfigurationResponse> invoke() throws AmbariException {
+ return getManagementController().getResourceLevelClusterSettings(requests);
+ }
+ });
+
+ Set<Resource> resources = new HashSet<>();
+
+ for (ReadOnlyConfigurationResponse response : responses) {
+ Resource resource = new ResourceImpl(Type.RootClusterSetting);
+
+ setResourceProperty(resource, PROPERTY_NAME_PROPERTY_ID, response.getPropertyName(), requestedIds);
+ setResourceProperty(resource, PROPERTY_VALUE_PROPERTY_ID, response.getPropertyValue(), requestedIds);
+ setResourceProperty(resource, PROPERTY_VALUE_ATTRIBUTES_PROPERTY_ID, response.getPropertyValueAttributes(), requestedIds);
+ setResourceProperty(resource, DEPENDS_ON_PROPERTY_ID, response.getDependsOnProperties(), requestedIds);
+ setResourceProperty(resource, PROPERTY_DESCRIPTION_PROPERTY_ID, response.getPropertyDescription(), requestedIds);
+
+ //should not be returned if empty
+ if (StringUtils.isNotEmpty(response.getPropertyDisplayName())) {
+ setResourceProperty(resource, PROPERTY_DISPLAY_NAME_PROPERTY_ID, response.getPropertyDisplayName(), requestedIds);
+ }
+
+ setResourceProperty(resource, PROPERTY_PROPERTY_TYPE_PROPERTY_ID, response.getPropertyType(), requestedIds);
+
+ setResourceProperty(resource, PROPERTY_TYPE_PROPERTY_ID, response.getType(), requestedIds);
+
+ setDefaultPropertiesAttributes(resource, requestedIds);
+
+ for (Map.Entry<String, String> attribute : response.getPropertyAttributes().entrySet()) {
+ setResourceProperty(resource, PropertyHelper.getPropertyId(RESPONSE_KEY, attribute.getKey()),
+ attribute.getValue(), requestedIds);
+ }
+ resources.add(resource);
+ }
+ return resources;
+ }
+
+ /**
+ * Set default values for properties attributes before applying original ones
+ * to prevent absence in case of empty attributes map
+ */
+ private void setDefaultPropertiesAttributes(Resource resource, Set<String> requestedIds) {
+ setResourceProperty(resource, PROPERTY_FINAL_PROPERTY_ID,
+ "false", requestedIds);
+ }
+
+ private RootClusterSettingRequest getRequest(Map<String, Object> properties) {
+ return new RootClusterSettingRequest((String) properties.get(PROPERTY_NAME_PROPERTY_ID));
+ }
+
+ @Override
+ protected Set<String> getPKPropertyIds() {
+ return pkPropertyIds;
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/Stack.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/Stack.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/Stack.java
index f8feef2..16907a1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/Stack.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/Stack.java
@@ -27,8 +27,8 @@ import java.util.Set;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ReadOnlyConfigurationResponse;
import org.apache.ambari.server.controller.StackConfigurationRequest;
-import org.apache.ambari.server.controller.StackConfigurationResponse;
import org.apache.ambari.server.controller.StackLevelConfigurationRequest;
import org.apache.ambari.server.controller.StackServiceComponentRequest;
import org.apache.ambari.server.controller.StackServiceComponentResponse;
@@ -668,14 +668,14 @@ public class Stack {
serviceConfigurations.put(service, mapServiceConfig);
requiredServiceConfigurations.put(service, mapRequiredServiceConfig);
- Set<StackConfigurationResponse> serviceConfigs = controller.getStackConfigurations(
+ Set<ReadOnlyConfigurationResponse> serviceConfigs = controller.getStackConfigurations(
Collections.singleton(new StackConfigurationRequest(name, version, service, null)));
- Set<StackConfigurationResponse> stackLevelConfigs = controller.getStackLevelConfigurations(
+ Set<ReadOnlyConfigurationResponse> stackLevelConfigs = controller.getStackLevelConfigurations(
Collections.singleton(new StackLevelConfigurationRequest(name, version, null)));
serviceConfigs.addAll(stackLevelConfigs);
// shouldn't have any required properties in stack level configuration
- for (StackConfigurationResponse config : serviceConfigs) {
+ for (ReadOnlyConfigurationResponse config : serviceConfigs) {
ConfigProperty configProperty = new ConfigProperty(config);
String type = configProperty.getType();
@@ -709,10 +709,10 @@ public class Stack {
private void parseStackConfigurations () throws AmbariException {
- Set<StackConfigurationResponse> stackLevelConfigs = controller.getStackLevelConfigurations(
+ Set<ReadOnlyConfigurationResponse> stackLevelConfigs = controller.getStackLevelConfigurations(
Collections.singleton(new StackLevelConfigurationRequest(name, version, null)));
- for (StackConfigurationResponse config : stackLevelConfigs) {
+ for (ReadOnlyConfigurationResponse config : stackLevelConfigs) {
ConfigProperty configProperty = new ConfigProperty(config);
String type = configProperty.getType();
@@ -757,7 +757,7 @@ public class Stack {
private Set<PropertyDependencyInfo> dependsOnProperties =
Collections.emptySet();
- public ConfigProperty(StackConfigurationResponse config) {
+ public ConfigProperty(ReadOnlyConfigurationResponse config) {
this.name = config.getPropertyName();
this.value = config.getPropertyValue();
this.attributes = config.getPropertyAttributes();
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
index 6f5b0f8..b0b1db0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
@@ -27,8 +27,8 @@ import java.util.Set;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ReadOnlyConfigurationResponse;
import org.apache.ambari.server.controller.StackConfigurationRequest;
-import org.apache.ambari.server.controller.StackConfigurationResponse;
import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
import org.apache.ambari.server.controller.spi.NoSuchResourceException;
import org.apache.ambari.server.controller.spi.Predicate;
@@ -108,16 +108,16 @@ public class StackConfigurationResourceProvider extends
Set<String> requestedIds = getRequestPropertyIds(request, predicate);
- Set<StackConfigurationResponse> responses = getResources(new Command<Set<StackConfigurationResponse>>() {
+ Set<ReadOnlyConfigurationResponse> responses = getResources(new Command<Set<ReadOnlyConfigurationResponse>>() {
@Override
- public Set<StackConfigurationResponse> invoke() throws AmbariException {
+ public Set<ReadOnlyConfigurationResponse> invoke() throws AmbariException {
return getManagementController().getStackConfigurations(requests);
}
});
Set<Resource> resources = new HashSet<>();
- for (StackConfigurationResponse response : responses) {
+ for (ReadOnlyConfigurationResponse response : responses) {
Resource resource = new ResourceImpl(Resource.Type.StackConfiguration);
setResourceProperty(resource, STACK_NAME_PROPERTY_ID,
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProvider.java
index 819507b..361f80a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProvider.java
@@ -27,7 +27,7 @@ import java.util.Set;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.controller.AmbariManagementController;
-import org.apache.ambari.server.controller.StackConfigurationResponse;
+import org.apache.ambari.server.controller.ReadOnlyConfigurationResponse;
import org.apache.ambari.server.controller.StackLevelConfigurationRequest;
import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
import org.apache.ambari.server.controller.spi.NoSuchResourceException;
@@ -105,16 +105,16 @@ public class StackLevelConfigurationResourceProvider extends
Set<String> requestedIds = getRequestPropertyIds(request, predicate);
- Set<StackConfigurationResponse> responses = getResources(new Command<Set<StackConfigurationResponse>>() {
+ Set<ReadOnlyConfigurationResponse> responses = getResources(new Command<Set<ReadOnlyConfigurationResponse>>() {
@Override
- public Set<StackConfigurationResponse> invoke() throws AmbariException {
+ public Set<ReadOnlyConfigurationResponse> invoke() throws AmbariException {
return getManagementController().getStackLevelConfigurations(requests);
}
});
Set<Resource> resources = new HashSet<>();
- for (StackConfigurationResponse response : responses) {
+ for (ReadOnlyConfigurationResponse response : responses) {
Resource resource = new ResourceImpl(Resource.Type.StackLevelConfiguration);
setResourceProperty(resource, STACK_NAME_PROPERTY_ID,
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
index a364c4c..6a76fff 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
@@ -75,6 +75,7 @@ public interface Resource {
*/
enum InternalType {
Cluster,
+ RootClusterSetting,
Service,
ServiceGroup,
Setting,
@@ -204,6 +205,7 @@ public interface Resource {
* Internal types. See {@link InternalType}.
*/
public static final Type Cluster = InternalType.Cluster.getType();
+ public static final Type RootClusterSetting = InternalType.RootClusterSetting.getType();
public static final Type ServiceGroup = InternalType.ServiceGroup.getType();
public static final Type Service = InternalType.Service.getType();
public static final Type Setting = InternalType.Setting.getType();
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/resources/ResourceLevelClusterSettingManager.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/resources/ResourceLevelClusterSettingManager.java b/ambari-server/src/main/java/org/apache/ambari/server/resources/ResourceLevelClusterSettingManager.java
new file mode 100644
index 0000000..4cb6cd9
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/resources/ResourceLevelClusterSettingManager.java
@@ -0,0 +1,168 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.resources;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.xml.namespace.QName;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.stack.ConfigurationInfo;
+import org.apache.ambari.server.stack.ConfigurationModule;
+import org.apache.ambari.server.stack.ModuleFileUnmarshaller;
+import org.apache.ambari.server.state.PropertyInfo;
+import org.apache.ambari.server.state.stack.ConfigurationXml;
+import org.apache.ambari.server.utils.XmlUtils;
+import org.apache.commons.io.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+
+public class ResourceLevelClusterSettingManager {
+ /**
+ * Used to unmarshal a configuration file to an object representation
+ */
+ private static ModuleFileUnmarshaller unmarshaller = new ModuleFileUnmarshaller();
+
+ private String clusterSettingsPath;
+ private static final String CLUSTER_SETTINGS_FILE_NAME = "cluster-settings.xml";
+ private static final String clusterSettingsConfigType = "cluster-settings";
+ private static File clusterSettingsFile;
+ private final static Logger LOG = LoggerFactory.getLogger(ResourceLevelClusterSettingManager.class);
+ private Map<String, Map<String, PropertyInfo>> clusterSettingsMap = new ConcurrentHashMap<>();
+ private Map<String, ConfigurationModule> configurationModules = new HashMap<>();
+
+ @AssistedInject
+ public ResourceLevelClusterSettingManager(@Assisted("resourcesDirPath") String resourcesDirPath) {
+ clusterSettingsPath = resourcesDirPath;
+ clusterSettingsFile = new File(clusterSettingsPath + File.separator + CLUSTER_SETTINGS_FILE_NAME);
+ populateClusterSettingsXml();
+ }
+
+ public Collection<PropertyInfo> getClusterSettingsMap() {
+ return configurationModules.get("cluster-settings").getModuleInfo().getProperties();
+ }
+
+ /**
+ * Obtain a collection of of configuration modules representing each configuration
+ * file contained in this configuration directory.
+ *
+ * @return collection of configuration modules
+ */
+ public Collection<ConfigurationModule> getConfigurationModules() {
+ return configurationModules.values();
+ }
+
+ /**
+ * Parses 'cluster-settings.xml' during ambari-server boostrap and (re)start
+ * Reads from /var/lib/ambari-server/resources
+ *
+ * @throws java.io.IOException
+ */
+ private void populateClusterSettingsXml() {
+ ConfigurationXml config = null;
+ try {
+ config = unmarshaller.unmarshal(ConfigurationXml.class, clusterSettingsFile);
+ ConfigurationInfo configInfo = new ConfigurationInfo(parseProperties(config, clusterSettingsFile.getName()),
+ parseAttributes(config));
+ ConfigurationModule module = new ConfigurationModule(clusterSettingsConfigType, configInfo);
+ configurationModules.put(clusterSettingsConfigType, module);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ /**
+ * Parse a configurations type attributes.
+ *
+ * @param configuration object representation of a configuration file
+ * @return collection of attributes for the configuration type
+ */
+ private Map<String, String> parseAttributes(ConfigurationXml configuration) {
+ Map<String, String> attributes = new HashMap<>();
+ for (Map.Entry<QName, String> attribute : configuration.getAttributes().entrySet()) {
+ attributes.put(attribute.getKey().getLocalPart(), attribute.getValue());
+ }
+ return attributes;
+ }
+
+ /**
+ * Parse a configurations properties.
+ *
+ * @param configuration object representation of a configuration file
+ * @param fileName configuration file name
+ * @return collection of properties
+ */
+ private Collection<PropertyInfo> parseProperties(ConfigurationXml configuration, String fileName)
+ throws FileNotFoundException, RuntimeException {
+ List<PropertyInfo> props = new ArrayList<>();
+ for (PropertyInfo pi : configuration.getProperties()) {
+ pi.setFilename(fileName);
+ if (pi.getPropertyTypes().contains(PropertyInfo.PropertyType.VALUE_FROM_PROPERTY_FILE)) {
+ if (clusterSettingsPath != null || clusterSettingsPath.isEmpty()) {
+ String propertyFileType = pi.getPropertyValueAttributes().getPropertyFileType();
+ if (clusterSettingsFile.exists() && clusterSettingsFile.isFile()) {
+ try {
+ String propertyValue = FileUtils.readFileToString(clusterSettingsFile);
+ boolean valid = true;
+ switch (propertyFileType.toLowerCase()) {
+ case "xml":
+ if (!XmlUtils.isValidXml(propertyValue)) {
+ valid = false;
+ LOG.error("Failed to load value from property file. Property file {} is not a valid XML file",
+ clusterSettingsFile);
+ }
+ break;
+ case "json": // Not supporting JSON as of now.
+ case "text": // fallthrough
+ default:
+ throw new AmbariException("'" + propertyFileType + "' type file not supported for '"
+ + clusterSettingsConfigType + "'. File Path : " + clusterSettingsFile.getAbsolutePath());
+ }
+ if (valid) {
+ pi.setValue(propertyValue);
+ }
+ } catch (IOException e) {
+ LOG.error("Failed to load value from property file {}. Error Message {}",
+ clusterSettingsFile.getAbsolutePath(), e.getMessage());
+ }
+ } else {
+ throw new FileNotFoundException("Failed to find '" + CLUSTER_SETTINGS_FILE_NAME + "' file with path : "
+ + clusterSettingsFile);
+ }
+ } else {
+ throw new RuntimeException("Failed to load value from property file. Properties directory {} does not exist"
+ + clusterSettingsFile.getAbsolutePath());
+ }
+ }
+ props.add(pi);
+ }
+ return props;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/resources/ResourceLevelClusterSettingManagerFactory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/resources/ResourceLevelClusterSettingManagerFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/resources/ResourceLevelClusterSettingManagerFactory.java
new file mode 100644
index 0000000..fcda654
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/resources/ResourceLevelClusterSettingManagerFactory.java
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.resources;
+
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+
+/**
+ * The {@link ResourceLevelClusterSettingManagerFactory} is used along with {@link AssistedInject} to
+ * build instances of {@link ResourceLevelClusterSettingManager}.
+ */
+public interface ResourceLevelClusterSettingManagerFactory {
+
+ /**
+ * @return a ResourceLevelClusterSetting manager instance.
+ */
+ ResourceLevelClusterSettingManager create(@Assisted("resourcesDirPath") String resourcesDirPath);
+}
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/8d8c1a55/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
index eade914..58b0300 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
@@ -89,6 +89,7 @@ public class ConfigHelper {
public static final String HIVE_SITE = "hive-site";
public static final String YARN_SITE = "yarn-site";
public static final String CLUSTER_ENV = "cluster-env";
+ public static final String CLUSTER_SETTINGS = "cluster-settings";
public static final String CLUSTER_ENV_ALERT_REPEAT_TOLERANCE = "alerts_repeat_tolerance";
public static final String CLUSTER_ENV_RETRY_ENABLED = "command_retry_enabled";
public static final String SERVICE_CHECK_TYPE = "service_check_type";