Repository: ambari Updated Branches: refs/heads/trunk 6c71cd1f0 -> 9022bfb11
AMBARI-14506. Certain config properties get reverted when adding new host or host component (secure cluster).(vbrodetskyi) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/9022bfb1 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/9022bfb1 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/9022bfb1 Branch: refs/heads/trunk Commit: 9022bfb113feba9f212dd843e38263f2f7e9f176 Parents: 6c71cd1 Author: Vitaly Brodetskyi <[email protected]> Authored: Mon Dec 28 23:31:28 2015 +0200 Committer: Vitaly Brodetskyi <[email protected]> Committed: Mon Dec 28 23:31:28 2015 +0200 ---------------------------------------------------------------------- .../AmbariManagementControllerImpl.java | 134 +++++++++++-------- .../server/controller/KerberosHelper.java | 2 +- .../server/controller/KerberosHelperImpl.java | 60 ++++++--- .../topology/ClusterConfigurationRequest.java | 2 +- .../server/controller/KerberosHelperTest.java | 61 +++++---- .../ClusterConfigurationRequestTest.java | 43 ++---- 6 files changed, 160 insertions(+), 142 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/9022bfb1/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 545a25e..95f0230 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 @@ -18,50 +18,16 @@ package org.apache.ambari.server.controller; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_DRIVER; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_PASSWORD; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_URL; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_USERNAME; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_RETRY_ENABLED; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_TIMEOUT; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_DRIVER_FILENAME; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GROUP_LIST; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.MAX_DURATION_OF_RETRIES; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.PACKAGE_LIST; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.REPO_INFO; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT_TYPE; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_REPO_INFO; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.VERSION; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.lang.reflect.Type; -import java.net.InetAddress; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumMap; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; - +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.google.inject.Singleton; +import com.google.inject.persist.Transactional; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.ClusterNotFoundException; import org.apache.ambari.server.DuplicateResourceException; @@ -171,16 +137,49 @@ import org.apache.http.client.utils.URIBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.google.inject.Inject; -import com.google.inject.Injector; -import com.google.inject.Singleton; -import com.google.inject.persist.Transactional; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.lang.reflect.Type; +import java.net.InetAddress; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumMap; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; + +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_DRIVER; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_PASSWORD; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_URL; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_USERNAME; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_RETRY_ENABLED; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_TIMEOUT; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_DRIVER_FILENAME; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GROUP_LIST; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.MAX_DURATION_OF_RETRIES; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.PACKAGE_LIST; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.REPO_INFO; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT_TYPE; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_REPO_INFO; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.VERSION; @Singleton public class AmbariManagementControllerImpl implements AmbariManagementController { @@ -2396,10 +2395,13 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle // the host (i,e, create user accounts, etc...) before Kerberos-related tasks an // occur (like distribute keytabs) if((oldSchState == State.INIT || oldSchState == State.INSTALL_FAILED) && kerberosHelper.isClusterKerberosEnabled(cluster)) { - try { - kerberosHelper.configureService(cluster, scHost); - } catch (KerberosInvalidConfigurationException e) { - throw new AmbariException(e.getMessage(), e); + // check if host component already exists, if it exists no need to reset kerberos configs + if (!hostComponentAlreadyExists(cluster, scHost)) { + try { + kerberosHelper.configureService(cluster, scHost); + } catch (KerberosInvalidConfigurationException e) { + throw new AmbariException(e.getMessage(), e); + } } componentsToEnableKerberos.add(scHost); @@ -2643,6 +2645,22 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle return requestStages; } + private boolean hostComponentAlreadyExists(Cluster cluster, ServiceComponentHost sch) throws AmbariException { + Service service = cluster.getService(sch.getServiceName()); + if (service != null) { + ServiceComponent serviceComponent = service.getServiceComponent(sch.getServiceComponentName()); + if (serviceComponent != null) { + Map<String, ServiceComponentHost> serviceComponentHostMap = serviceComponent.getServiceComponentHosts(); + for (ServiceComponentHost serviceComponentHost : serviceComponentHostMap.values()) { + if (serviceComponentHost.getState() == State.INSTALLED || serviceComponentHost.getState() == State.STARTED) { + return true; + } + } + } + } + return false; + } + @Override public ExecutionCommand getExecutionCommand(Cluster cluster, ServiceComponentHost scHost, http://git-wip-us.apache.org/repos/asf/ambari/blob/9022bfb1/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java index bdb208b..b6686b4 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java @@ -231,7 +231,7 @@ public interface KerberosHelper { */ Map<String, Map<String, String>> getServiceConfigurationUpdates(Cluster cluster, Map<String, Map<String, String>> existingConfigurations, - Set<String> services) + Set<String> services, boolean serviceAlreadyExists) throws KerberosInvalidConfigurationException, AmbariException; /** http://git-wip-us.apache.org/repos/asf/ambari/blob/9022bfb1/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java index a9f11f7..ef9cab6 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java @@ -18,23 +18,10 @@ package org.apache.ambari.server.controller; -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - +import com.google.inject.Inject; import com.google.inject.Injector; +import com.google.inject.Singleton; +import com.google.inject.persist.Transactional; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.Role; import org.apache.ambari.server.RoleCommand; @@ -122,9 +109,21 @@ import org.apache.directory.server.kerberos.shared.keytab.Keytab; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.inject.Inject; -import com.google.inject.Singleton; -import com.google.inject.persist.Transactional; +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Singleton public class KerberosHelperImpl implements KerberosHelper { @@ -311,7 +310,7 @@ public class KerberosHelperImpl implements KerberosHelper { Map<String, Map<String, String>> existingConfigurations = calculateExistingConfigurations(cluster, hostName); Map<String, Map<String, String>> updates = getServiceConfigurationUpdates(cluster, - existingConfigurations, Collections.singleton(serviceName)); + existingConfigurations, Collections.singleton(serviceName), serviceAlreadyExists(cluster, serviceComponentHost)); for (Map.Entry<String, Map<String, String>> entry : updates.entrySet()) { configHelper.updateConfigType(cluster, ambariManagementController, entry.getKey(), entry.getValue(), null, @@ -319,8 +318,25 @@ public class KerberosHelperImpl implements KerberosHelper { } } + private boolean serviceAlreadyExists(Cluster cluster, ServiceComponentHost sch) throws AmbariException { + Service service = cluster.getService(sch.getServiceName()); + if (service != null) { + Map<String, ServiceComponent> serviceComponentMap = service.getServiceComponents(); + for (ServiceComponent serviceComponent : serviceComponentMap.values()) { + Map<String, ServiceComponentHost> serviceComponentHostMap = serviceComponent.getServiceComponentHosts(); + for (ServiceComponentHost serviceComponentHost : serviceComponentHostMap.values()) { + if (serviceComponentHost.getState() == State.INSTALLED || serviceComponentHost.getState() == State.STARTED) { + return true; + } + } + } + } + return false; + } + @Override - public Map<String, Map<String, String>> getServiceConfigurationUpdates(Cluster cluster, Map<String, Map<String, String>> existingConfigurations, Set<String> services) + public Map<String, Map<String, String>> getServiceConfigurationUpdates(Cluster cluster, Map<String, Map<String, String>> existingConfigurations, Set<String> services, + boolean serviceAlreadyExists) throws KerberosInvalidConfigurationException, AmbariException { Map<String, Map<String, String>> kerberosConfigurations = new HashMap<String, Map<String, String>>(); @@ -359,7 +375,7 @@ public class KerberosHelperImpl implements KerberosHelper { } mergeConfigurations(kerberosConfigurations, - componentDescriptor.getConfigurations(true), configurations); + componentDescriptor.getConfigurations(!serviceAlreadyExists), configurations); } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/9022bfb1/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java index c662e28..9390b3a 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java @@ -116,7 +116,7 @@ public class ClusterConfigurationRequest { Map<String, Map<String, String>> updatedConfigs = AmbariContext.getController().getKerberosHelper() .getServiceConfigurationUpdates(cluster, clusterConfiguration.getFullProperties(), - new HashSet<String>(blueprint.getServices())); + new HashSet<String>(blueprint.getServices()), false); for (String configType : updatedConfigs.keySet()) { Map<String, String> propertyMap = updatedConfigs.get(configType); for (String property : propertyMap.keySet()) { http://git-wip-us.apache.org/repos/asf/ambari/blob/9022bfb1/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java index 6b7ec6f..035d6b1 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java @@ -18,27 +18,10 @@ package org.apache.ambari.server.controller; -import static org.easymock.EasyMock.*; -import static org.junit.Assert.*; - -import java.lang.reflect.Field; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import javax.persistence.EntityManager; - +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; import junit.framework.Assert; - import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.Role; import org.apache.ambari.server.actionmanager.ActionManager; @@ -111,9 +94,37 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; +import javax.persistence.EntityManager; +import java.lang.reflect.Field; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import static org.easymock.EasyMock.anyLong; +import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.capture; +import static org.easymock.EasyMock.eq; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.expectLastCall; +import static org.easymock.EasyMock.getCurrentArguments; +import static org.easymock.EasyMock.isNull; +import static org.easymock.EasyMock.newCapture; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.reset; +import static org.easymock.EasyMock.verify; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; @SuppressWarnings("unchecked") public class KerberosHelperTest extends EasyMockSupport { @@ -2256,10 +2267,10 @@ public class KerberosHelperTest extends EasyMockSupport { injector.getInstance(AmbariMetaInfo.class).init(); Map<String, Map<String, String>> updates1 = kerberosHelper.getServiceConfigurationUpdates( - cluster, existingConfigurations, new HashSet<String>(Arrays.asList("SERVICE1", "SERVICE2", "SERVICE3"))); + cluster, existingConfigurations, new HashSet<String>(Arrays.asList("SERVICE1", "SERVICE2", "SERVICE3")), false); Map<String, Map<String, String>> updates2 = kerberosHelper.getServiceConfigurationUpdates( - cluster, existingConfigurations, new HashSet<String>(Arrays.asList("SERVICE1", "SERVICE3"))); + cluster, existingConfigurations, new HashSet<String>(Arrays.asList("SERVICE1", "SERVICE3")), false); verifyAll(); http://git-wip-us.apache.org/repos/asf/ambari/blob/9022bfb1/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterConfigurationRequestTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterConfigurationRequestTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterConfigurationRequestTest.java index 93f4de6..26ab63f 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterConfigurationRequestTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterConfigurationRequestTest.java @@ -18,43 +18,16 @@ package org.apache.ambari.server.topology; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; - import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorBlueprintProcessor; import org.apache.ambari.server.controller.AmbariManagementController; -import org.apache.ambari.server.controller.ClusterRequest; import org.apache.ambari.server.controller.ConfigurationRequest; import org.apache.ambari.server.controller.KerberosHelper; -import org.apache.ambari.server.controller.RequestStatusResponse; -import org.apache.ambari.server.controller.internal.ProvisionClusterRequest; import org.apache.ambari.server.controller.internal.Stack; -import org.apache.ambari.server.controller.spi.ClusterController; -import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.spi.ResourceProvider; -import org.apache.ambari.server.security.encryption.CredentialStoreService; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; -import org.apache.ambari.server.state.SecurityType; -import org.easymock.Capture; -import org.easymock.EasyMock; import org.easymock.EasyMockRule; -import org.easymock.EasyMockSupport; import org.easymock.Mock; import org.easymock.MockType; -import org.easymock.TestSubject; -import org.junit.After; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -62,17 +35,17 @@ import org.powermock.api.easymock.PowerMock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import static org.easymock.EasyMock.anyBoolean; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.anyString; -import static org.easymock.EasyMock.capture; -import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; -import static org.easymock.EasyMock.isA; -import static org.easymock.EasyMock.isNull; -import static org.easymock.EasyMock.newCapture; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.reset; import static org.easymock.EasyMock.verify; /** @@ -157,7 +130,7 @@ public class ClusterConfigurationRequestTest { expect(kerberosHelper.ensureHeadlessIdentities(anyObject(Cluster.class), anyObject(Map.class), anyObject (Set.class))).andReturn(true).once(); expect(kerberosHelper.getServiceConfigurationUpdates(anyObject(Cluster.class), anyObject(Map.class), anyObject - (Set.class))).andReturn(kerberosConfig).once(); + (Set.class), anyBoolean())).andReturn(kerberosConfig).once(); PowerMock.replay(stack, blueprint, topology, controller, clusters, kerberosHelper, ambariContext,
