Repository: ambari
Updated Branches:
  refs/heads/branch-2.6 e27a21428 -> e6641558c


http://git-wip-us.apache.org/repos/asf/ambari/blob/e6641558/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 bf47cd7..fe1eec4 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
@@ -95,19 +95,23 @@ import 
org.apache.ambari.server.serveraction.kerberos.KerberosMissingAdminCreden
 import 
org.apache.ambari.server.serveraction.kerberos.KerberosOperationException;
 import org.apache.ambari.server.serveraction.kerberos.KerberosOperationHandler;
 import 
org.apache.ambari.server.serveraction.kerberos.KerberosOperationHandlerFactory;
+import org.apache.ambari.server.serveraction.kerberos.PreconfigureServiceType;
 import org.apache.ambari.server.stack.StackManagerFactory;
 import org.apache.ambari.server.stageplanner.RoleGraphFactory;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.ComponentInfo;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.HostState;
+import org.apache.ambari.server.state.PropertyInfo;
 import org.apache.ambari.server.state.SecurityState;
 import org.apache.ambari.server.state.SecurityType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
+import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.UpgradeContextFactory;
@@ -318,7 +322,7 @@ public class KerberosHelperTest extends EasyMockSupport {
     KerberosHelper kerberosHelper = injector.getInstance(KerberosHelper.class);
 
     final Map<String, String> kerberosEnvProperties = createMock(Map.class);
-    expect(kerberosEnvProperties.get("realm")).andReturn("EXAMPLE.COM").once();
+    
expect(kerberosEnvProperties.get(KerberosHelper.DEFAULT_REALM)).andReturn("EXAMPLE.COM").once();
     
expect(kerberosEnvProperties.get("kdc_hosts")).andReturn("10.0.100.1").once();
 
     final Map<String, String> krb5ConfProperties = createMock(Map.class);
@@ -601,12 +605,12 @@ public class KerberosHelperTest extends EasyMockSupport {
 
   @Test
   public void addAmbariServerIdentity_CreateAmbariPrincipal() throws Exception 
{
-    
addAmbariServerIdentity(Collections.singletonMap("create_ambari_principal", 
"true"));
+    
addAmbariServerIdentity(Collections.singletonMap(KerberosHelper.CREATE_AMBARI_PRINCIPAL,
 "true"));
   }
 
   @Test
   public void addAmbariServerIdentity_DoNotCreateAmbariPrincipal() throws 
Exception {
-    
addAmbariServerIdentity(Collections.singletonMap("create_ambari_principal", 
"false"));
+    
addAmbariServerIdentity(Collections.singletonMap(KerberosHelper.CREATE_AMBARI_PRINCIPAL,
 "false"));
   }
 
   @Test
@@ -1029,10 +1033,11 @@ public class KerberosHelperTest extends EasyMockSupport 
{
     expectLastCall().once();
 
     final Map<String, String> kerberosEnvProperties = createMock(Map.class);
-    
expect(kerberosEnvProperties.get("kdc_type")).andReturn(kdcType).anyTimes();
-    
expect(kerberosEnvProperties.get("manage_identities")).andReturn(manageIdentities).anyTimes();
-    
expect(kerberosEnvProperties.get("realm")).andReturn("FOOBAR.COM").anyTimes();
-    
expect(kerberosEnvProperties.get("create_ambari_principal")).andReturn("false").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.KDC_TYPE)).andReturn(kdcType).anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.MANAGE_IDENTITIES)).andReturn(manageIdentities).anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.DEFAULT_REALM)).andReturn("FOOBAR.COM").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.CREATE_AMBARI_PRINCIPAL)).andReturn("false").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.PRECONFIGURE_SERVICES)).andReturn(PreconfigureServiceType.DEFAULT.name()).anyTimes();
 
     final Config kerberosEnvConfig = createMock(Config.class);
     
expect(kerberosEnvConfig.getProperties()).andReturn(kerberosEnvProperties).anyTimes();
@@ -1062,9 +1067,6 @@ public class KerberosHelperTest extends EasyMockSupport {
           }
         })
         .once();
-    expect(cluster.getServiceComponentHosts("KERBEROS", "KERBEROS_CLIENT"))
-        .andReturn(Collections.singletonList(schKerberosClient))
-        .once();
 
     if (identitiesManaged) {
       final Clusters clusters = injector.getInstance(Clusters.class);
@@ -1072,6 +1074,9 @@ public class KerberosHelperTest extends EasyMockSupport {
           .andReturn(host)
           .once();
     }
+    expect(cluster.getServiceComponentHosts("KERBEROS", "KERBEROS_CLIENT"))
+        .andReturn(Collections.singletonList(schKerberosClient))
+        .once();
 
     final AmbariManagementController ambariManagementController = 
injector.getInstance(AmbariManagementController.class);
     
expect(ambariManagementController.findConfigurationTagsWithOverrides(cluster, 
null))
@@ -1129,8 +1134,10 @@ public class KerberosHelperTest extends EasyMockSupport {
     // Update Configs Stage
     expect(requestStageContainer.getLastStageId()).andReturn(2L).anyTimes();
     expect(requestStageContainer.getId()).andReturn(1L).once();
+
     requestStageContainer.setClusterHostInfo(anyString());
     expectLastCall().once();
+
     requestStageContainer.addStages(anyObject(List.class));
     expectLastCall().once();
     // TODO: Add more of these when more stages are added.
@@ -1147,7 +1154,7 @@ public class KerberosHelperTest extends EasyMockSupport {
     replayAll();
 
     // Needed by infrastructure
-    metaInfo.init();
+    injector.getInstance(AmbariMetaInfo.class).init();
 
     CredentialStoreService credentialStoreService = 
injector.getInstance(CredentialStoreService.class);
     credentialStoreService.setCredential(cluster.getClusterName(), 
KerberosHelper.KDC_ADMINISTRATOR_CREDENTIAL_ALIAS,
@@ -1164,7 +1171,6 @@ public class KerberosHelperTest extends EasyMockSupport {
 
     final ServiceComponentHost schKerberosClient = 
createMock(ServiceComponentHost.class);
     
expect(schKerberosClient.getServiceName()).andReturn(Service.Type.KERBEROS.name()).anyTimes();
-    
expect(schKerberosClient.getServiceComponentName()).andReturn(Role.KERBEROS_CLIENT.name()).anyTimes();
     
expect(schKerberosClient.getSecurityState()).andReturn(SecurityState.UNSECURED).anyTimes();
     
expect(schKerberosClient.getDesiredSecurityState()).andReturn(SecurityState.UNSECURED).anyTimes();
     expect(schKerberosClient.getHostName()).andReturn("host1").anyTimes();
@@ -1172,7 +1178,6 @@ public class KerberosHelperTest extends EasyMockSupport {
 
     final ServiceComponentHost sch1 = createMock(ServiceComponentHost.class);
     expect(sch1.getServiceName()).andReturn("SERVICE1").times(1);
-    expect(sch1.getServiceComponentName()).andReturn("COMPONENT1").once();
     
expect(sch1.getSecurityState()).andReturn(SecurityState.SECURED_KERBEROS).anyTimes();
     
expect(sch1.getDesiredSecurityState()).andReturn(SecurityState.SECURED_KERBEROS).anyTimes();
     expect(sch1.getHostName()).andReturn("host1").anyTimes();
@@ -1185,7 +1190,6 @@ public class KerberosHelperTest extends EasyMockSupport {
 
     final ServiceComponentHost sch2 = createMock(ServiceComponentHost.class);
     expect(sch2.getServiceName()).andReturn("SERVICE2").times(1);
-    expect(sch2.getServiceComponentName()).andReturn("COMPONENT2").anyTimes();
     
expect(sch2.getSecurityState()).andReturn(SecurityState.SECURED_KERBEROS).anyTimes();
     
expect(sch2.getDesiredSecurityState()).andReturn(SecurityState.SECURED_KERBEROS).anyTimes();
     expect(sch2.getHostName()).andReturn("host1").anyTimes();
@@ -1230,8 +1234,8 @@ public class KerberosHelperTest extends EasyMockSupport {
     expectLastCall().once();
 
     final Map<String, String> kerberosEnvProperties = createMock(Map.class);
-    
expect(kerberosEnvProperties.get("kdc_type")).andReturn("mit-kdc").anyTimes();
-    
expect(kerberosEnvProperties.get("realm")).andReturn("FOOBAR.COM").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.KDC_TYPE)).andReturn("mit-kdc").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.DEFAULT_REALM)).andReturn("FOOBAR.COM").anyTimes();
 
     final Config kerberosEnvConfig = createMock(Config.class);
     
expect(kerberosEnvConfig.getProperties()).andReturn(kerberosEnvProperties).anyTimes();
@@ -1354,7 +1358,7 @@ public class KerberosHelperTest extends EasyMockSupport {
     replayAll();
 
     // Needed by infrastructure
-    metaInfo.init();
+    injector.getInstance(AmbariMetaInfo.class).init();
 
     CredentialStoreService credentialStoreService = 
injector.getInstance(CredentialStoreService.class);
     credentialStoreService.setCredential(cluster.getClusterName(), 
KerberosHelper.KDC_ADMINISTRATOR_CREDENTIAL_ALIAS,
@@ -1447,9 +1451,9 @@ public class KerberosHelperTest extends EasyMockSupport {
         .anyTimes();
 
     final Map<String, String> kerberosEnvProperties = createMock(Map.class);
-    
expect(kerberosEnvProperties.get("kdc_type")).andReturn("mit-kdc").anyTimes();
-    
expect(kerberosEnvProperties.get("realm")).andReturn("FOOBAR.COM").anyTimes();
-    
expect(kerberosEnvProperties.get("create_ambari_principal")).andReturn("false").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.KDC_TYPE)).andReturn("mit-kdc").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.DEFAULT_REALM)).andReturn("FOOBAR.COM").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.CREATE_AMBARI_PRINCIPAL)).andReturn("false").anyTimes();
 
     final Config kerberosEnvConfig = createMock(Config.class);
     
expect(kerberosEnvConfig.getProperties()).andReturn(kerberosEnvProperties).anyTimes();
@@ -1565,7 +1569,7 @@ public class KerberosHelperTest extends EasyMockSupport {
     replayAll();
 
     // Needed by infrastructure
-    metaInfo.init();
+    injector.getInstance(AmbariMetaInfo.class).init();
 
     CredentialStoreService credentialStoreService = 
injector.getInstance(CredentialStoreService.class);
     credentialStoreService.setCredential(cluster.getClusterName(), 
KerberosHelper.KDC_ADMINISTRATOR_CREDENTIAL_ALIAS,
@@ -1728,8 +1732,15 @@ public class KerberosHelperTest extends EasyMockSupport {
 
   @Test
   public void testSetAuthToLocalRules() throws Exception {
-    KerberosHelper kerberosHelper = injector.getInstance(KerberosHelper.class);
+    testSetAuthToLocalRules(false);
+  }
+
+  @Test
+  public void testSetAuthToLocalRulesWithPreconfiguredServices() throws 
Exception {
+    testSetAuthToLocalRules(true);
+  }
 
+  private void testSetAuthToLocalRules(boolean includePreconfiguredServices) 
throws Exception {
     final KerberosPrincipalDescriptor principalDescriptor1 = 
createMock(KerberosPrincipalDescriptor.class);
     
expect(principalDescriptor1.getValue()).andReturn("principal1/[email protected]").times(1);
     
expect(principalDescriptor1.getLocalUsername()).andReturn("principal1_user").times(1);
@@ -1756,19 +1767,19 @@ public class KerberosHelperTest extends EasyMockSupport 
{
 
     final KerberosComponentDescriptor componentDescriptor1 = 
createMockComponentDescriptor(
         "COMPONENT1",
-        new ArrayList<KerberosIdentityDescriptor>() {
-          {
-            add(identityDescriptor3);
-          }
-        },
+        Collections.singletonList(identityDescriptor3),
         null);
 
     final KerberosServiceDescriptor serviceDescriptor1 = 
createMock(KerberosServiceDescriptor.class);
+    
expect(serviceDescriptor1.getName()).andReturn("SERVICE1").times((includePreconfiguredServices)
 ? 2 : 1);
+    if (includePreconfiguredServices) {
+      
expect(serviceDescriptor1.shouldPreconfigure()).andReturn(false).times(2);
+    }
     expect(serviceDescriptor1.getIdentities(eq(true), EasyMock.<Map<String, 
Object>>anyObject())).andReturn(Arrays.asList(
         identityDescriptor1,
         identityDescriptor2
     )).times(1);
-    
expect(serviceDescriptor1.getComponent("COMPONENT1")).andReturn(componentDescriptor1).times(1);
+    
expect(serviceDescriptor1.getComponents()).andReturn(Collections.singletonMap("COMPONENT1",
 componentDescriptor1)).times(1);
     expect(serviceDescriptor1.getAuthToLocalProperties()).andReturn(new 
HashSet<>(Arrays.asList(
         "default",
         "explicit_multiple_lines|new_lines",
@@ -1780,11 +1791,88 @@ public class KerberosHelperTest extends EasyMockSupport 
{
         "service-site/explicit_single_line|spaces"
     ))).times(1);
 
+    Map<String, KerberosServiceDescriptor> serviceDescriptorMap = new 
HashMap<>();
+    serviceDescriptorMap.put("SERVICE1", serviceDescriptor1);
+
+    Map<String, ServiceComponent> component1Map = new HashMap<>();
+
+    Service service1 = createMockService("SERVICE1", component1Map);
+
+    Map<String, Service> serviceMap = new HashMap<>();
+    serviceMap.put("SERVICE1", service1);
+
+    Map<String, String> serviceSiteProperties = new HashMap<>();
+    serviceSiteProperties.put("default", 
"RULE:[1:$1@$0]([email protected])s/.*/service_user/\nDEFAULT");
+    serviceSiteProperties.put("explicit_multiple_lines", 
"RULE:[1:$1@$0]([email protected])s/.*/service_user/\nDEFAULT");
+    serviceSiteProperties.put("explicit_multiple_lines_escaped", 
"RULE:[1:$1@$0]([email protected])s/.*/service_user/\\\nDEFAULT");
+    serviceSiteProperties.put("explicit_single_line", 
"RULE:[1:$1@$0]([email protected])s/.*/service_user/ DEFAULT");
+
+    Map<String, Map<String, String>> existingConfigs = new HashMap<>();
+    existingConfigs.put("kerberos-env", new HashMap<String, String>());
+    existingConfigs.put("service-site", serviceSiteProperties);
+
+    if (includePreconfiguredServices) {
+      final KerberosPrincipalDescriptor principalDescriptor4 = 
createMock(KerberosPrincipalDescriptor.class);
+      
expect(principalDescriptor4.getValue()).andReturn("${preconfig-site/service_user}/[email protected]").times(1);
+      
expect(principalDescriptor4.getLocalUsername()).andReturn("principal4_user").times(1);
+
+      final KerberosPrincipalDescriptor principalDescriptor5 = 
createMock(KerberosPrincipalDescriptor.class);
+      
expect(principalDescriptor5.getValue()).andReturn("${preconfig-site/component_property1}/[email protected]").times(1);
+      
expect(principalDescriptor5.getLocalUsername()).andReturn("principal5_user").times(1);
+
+      final KerberosIdentityDescriptor identityDescriptor4 = 
createMock(KerberosIdentityDescriptor.class);
+      
expect(identityDescriptor4.getPrincipalDescriptor()).andReturn(principalDescriptor4).times(1);
+      
expect(identityDescriptor4.shouldInclude(anyObject(Map.class))).andReturn(true).anyTimes();
+
+      final KerberosIdentityDescriptor identityDescriptor5 = 
createMock(KerberosIdentityDescriptor.class);
+      
expect(identityDescriptor5.getPrincipalDescriptor()).andReturn(principalDescriptor5).times(1);
+      
expect(identityDescriptor5.shouldInclude(anyObject(Map.class))).andReturn(true).anyTimes();
+
+      final KerberosComponentDescriptor componentDescriptor2 = 
createMockComponentDescriptor(
+          "PRECONFIGURE_SERVICE_MASTER",
+          Collections.singletonList(identityDescriptor5),
+          null);
+
+      final KerberosServiceDescriptor serviceDescriptor2 = 
createMock(KerberosServiceDescriptor.class);
+      
expect(serviceDescriptor2.getName()).andReturn("PRECONFIGURE_SERVICE").times(2);
+      expect(serviceDescriptor2.shouldPreconfigure()).andReturn(true).times(2);
+      expect(serviceDescriptor2.getIdentities(eq(true), anyObject(Map.class)))
+          .andReturn(Collections.singletonList(identityDescriptor4))
+          .times(1);
+      
expect(serviceDescriptor2.getComponents()).andReturn(Collections.singletonMap("PRECONFIGURE_SERVICE_MASTER",
 componentDescriptor2)).times(1);
+      
expect(serviceDescriptor2.getAuthToLocalProperties()).andReturn(Collections.<String>emptySet()).times(1);
+
+      // Expected to have been added by a previous call to 
org.apache.ambari.server.controller.KerberosHelper.getKerberosDescriptor,
+      // where includePreconfigureData = true
+      serviceDescriptorMap.put("PRECONFIGURE_SERVICE", serviceDescriptor2);
+
+      ComponentInfo preconfigureComponentInfo = 
createMock(ComponentInfo.class);
+//      
expect(preconfigureComponentInfo.getName()).andReturn("PRECONFIGURE_SERVICE_MASTER").once();
+
+      PropertyInfo preconfigureServiceUser = 
createMockPropertyInfo("preconfig-site.xml", "service_user", "principal4");
+      PropertyInfo preconfigureComponentProperty1 = 
createMockPropertyInfo("preconfig-site.xml", "component_property1", 
"principal5");
+
+      List<PropertyInfo> preconfigureServiceProperties = 
Arrays.asList(preconfigureComponentProperty1, preconfigureServiceUser);
+
+      ServiceInfo preconfigureServiceInfo = createMock(ServiceInfo.class);
+      
expect(preconfigureServiceInfo.getProperties()).andReturn(preconfigureServiceProperties).anyTimes();
+      
expect(preconfigureServiceInfo.getComponents()).andReturn(Collections.singletonList(preconfigureComponentInfo)).anyTimes();
+
+      AmbariMetaInfo ambariMetaInfo = 
injector.getInstance(AmbariMetaInfo.class);
+      expect(ambariMetaInfo.isValidService("HDP", "2.2", 
"PRECONFIGURE_SERVICE")).andReturn(true).anyTimes();
+      expect(ambariMetaInfo.getService("HDP", "2.2", 
"PRECONFIGURE_SERVICE")).andReturn(preconfigureServiceInfo).anyTimes();
+    }
+
     final KerberosDescriptor kerberosDescriptor = 
createMock(KerberosDescriptor.class);
     
expect(kerberosDescriptor.getProperty("additional_realms")).andReturn(null).times(1);
     expect(kerberosDescriptor.getIdentities(eq(true), EasyMock.<Map<String, 
Object>>anyObject())).andReturn(null).times(1);
     
expect(kerberosDescriptor.getAuthToLocalProperties()).andReturn(null).times(1);
-    
expect(kerberosDescriptor.getService("SERVICE1")).andReturn(serviceDescriptor1).times(1);
+    
expect(kerberosDescriptor.getServices()).andReturn(serviceDescriptorMap).times((includePreconfiguredServices)
 ? 2 : 1);
+
+    final Cluster cluster = createMockCluster("c1", 
Collections.<Host>emptyList(), SecurityType.KERBEROS, null, null);
+    if (includePreconfiguredServices) {
+      expect(cluster.getServices()).andReturn(serviceMap).once();
+    }
 
     Map<String, Set<String>> installedServices = 
Collections.singletonMap("SERVICE1", Collections.singleton("COMPONENT1"));
 
@@ -1794,10 +1882,9 @@ public class KerberosHelperTest extends EasyMockSupport {
 
     // Needed by infrastructure
     injector.getInstance(AmbariMetaInfo.class).init();
-    Map existingConfigs = new HashMap<>();
-    existingConfigs.put("kerberos-env", new HashMap<String, String>());
 
-    kerberosHelper.setAuthToLocalRules(kerberosDescriptor, "EXAMPLE.COM", 
installedServices, existingConfigs, kerberosConfigurations);
+    KerberosHelper kerberosHelper = injector.getInstance(KerberosHelper.class);
+    kerberosHelper.setAuthToLocalRules(cluster, kerberosDescriptor, 
"EXAMPLE.COM", installedServices, existingConfigs, kerberosConfigurations, 
includePreconfiguredServices);
 
     verifyAll();
 
@@ -1805,59 +1892,249 @@ public class KerberosHelperTest extends 
EasyMockSupport {
 
     configs = kerberosConfigurations.get("");
     assertNotNull(configs);
-    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
-            "DEFAULT",
-        configs.get("default"));
-    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
-            "DEFAULT",
-        configs.get("explicit_multiple_lines"));
-    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\\\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\\\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\\\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\\\n" +
-            "DEFAULT",
-        configs.get("explicit_multiple_lines_escaped"));
-    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*// " +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/ " +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/ " +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/ " +
-            "DEFAULT",
-        configs.get("explicit_single_line"));
-
+    if (includePreconfiguredServices) {
+      assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal4_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal5_user/\n" +
+              "DEFAULT",
+          configs.get("default"));
+      assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal4_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal5_user/\n" +
+              "DEFAULT",
+          configs.get("explicit_multiple_lines"));
+      assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal4_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal5_user/\\\n" +
+              "DEFAULT",
+          configs.get("explicit_multiple_lines_escaped"));
+      assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*// " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal4_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal5_user/ " +
+              "DEFAULT",
+          configs.get("explicit_single_line"));
+    } else {
+      assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
+              "DEFAULT",
+          configs.get("default"));
+      assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
+              "DEFAULT",
+          configs.get("explicit_multiple_lines"));
+      assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\\\n" +
+              "DEFAULT",
+          configs.get("explicit_multiple_lines_escaped"));
+      assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*// " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/ " +
+              "DEFAULT",
+          configs.get("explicit_single_line"));
+    }
     configs = kerberosConfigurations.get("service-site");
     assertNotNull(configs);
-    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
-            "DEFAULT",
-        configs.get("default"));
-    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
-            "DEFAULT",
-        configs.get("explicit_multiple_lines"));
-    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\\\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\\\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\\\n" +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\\\n" +
-            "DEFAULT",
-        configs.get("explicit_multiple_lines_escaped"));
-    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*// " +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/ " +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/ " +
-            "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/ " +
-            "DEFAULT",
-        configs.get("explicit_single_line"));
+    if (includePreconfiguredServices) {
+      
assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/\n" +
+              "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal4_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal5_user/\n" +
+              "DEFAULT",
+          configs.get("default"));
+      
assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/\n" +
+              "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal4_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal5_user/\n" +
+              "DEFAULT",
+          configs.get("explicit_multiple_lines"));
+      
assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/\\\n" +
+              "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal4_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal5_user/\\\n" +
+              "DEFAULT",
+          configs.get("explicit_multiple_lines_escaped"));
+      assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/ 
" +
+              "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*// " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal4_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal5_user/ " +
+              "DEFAULT",
+          configs.get("explicit_single_line"));
+    } else {
+      
assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/\n" +
+              "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
+              "DEFAULT",
+          configs.get("default"));
+      
assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/\n" +
+              "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\n" +
+              "DEFAULT",
+          configs.get("explicit_multiple_lines"));
+      
assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/\\\n" +
+              "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\\\n" +
+              
"RULE:[2:$1@$0]([email protected])s/.*/principal3_user/\\\n" +
+              "DEFAULT",
+          configs.get("explicit_multiple_lines_escaped"));
+      assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/ 
" +
+              "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*// " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/ " +
+              "RULE:[2:$1@$0]([email protected])s/.*/principal3_user/ " +
+              "DEFAULT",
+          configs.get("explicit_single_line"));
+    }
+  }
+
+  private PropertyInfo createMockPropertyInfo(String filename, String 
propertyName, String value) {
+    PropertyInfo propertyInfo = createMock(PropertyInfo.class);
+    expect(propertyInfo.getFilename()).andReturn(filename).anyTimes();
+    expect(propertyInfo.getName()).andReturn(propertyName).anyTimes();
+    expect(propertyInfo.getValue()).andReturn(value).anyTimes();
+    return propertyInfo;
   }
 
+  @Test
+  public void testMergeConfigurationsForPreconfiguring() throws Exception {
+    Service existingService = createMockService("EXISTING_SERVICE", null);
+
+    Set<String> serviceNames = new HashSet<>();
+    serviceNames.add("EXISTING_SERVICE");
+    serviceNames.add("PRECONFIGURE_SERVICE");
+
+    Map<String, Set<String>> hostMap = new HashMap<>();
+
+    Map<String, Service> services = new HashMap<>();
+
+    Cluster cluster = createMockCluster("c1", Collections.<Host>emptyList(), 
SecurityType.KERBEROS, null, null);
+    expect(cluster.getServices()).andReturn(services).times(2);
+    expect(cluster.getServiceComponentHostMap(null, 
serviceNames)).andReturn(hostMap).once();
+
+    KerberosDescriptor kerberosDescriptor = createKerberosDescriptor();
+
+    ComponentInfo preconfigureComponentInfo = createMock(ComponentInfo.class);
+    
expect(preconfigureComponentInfo.getName()).andReturn("PRECONFIGURE_SERVICE_MASTER").once();
+
+    List<PropertyInfo> preconfigureServiceProperties = 
Collections.singletonList(createMockPropertyInfo("preconfigure-service-env.xml",
 "service_user", "preconfigure_user"));
+
+    ServiceInfo preconfigureServiceInfo = createMock(ServiceInfo.class);
+    
expect(preconfigureServiceInfo.getProperties()).andReturn(preconfigureServiceProperties).anyTimes();
+    
expect(preconfigureServiceInfo.getComponents()).andReturn(Collections.singletonList(preconfigureComponentInfo)).anyTimes();
+
+    AmbariMetaInfo ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
+    expect(ambariMetaInfo.isValidService("HDP", "2.2", 
"PRECONFIGURE_SERVICE")).andReturn(true).anyTimes();
+    expect(ambariMetaInfo.getService("HDP", "2.2", 
"PRECONFIGURE_SERVICE")).andReturn(preconfigureServiceInfo).anyTimes();
+
+    Set<Map<String, String>> host1Components = new HashSet<>();
+    host1Components.add(Collections.singletonMap("name", 
"EXISTING_SERVICE_MASTER"));
+    host1Components.add(Collections.singletonMap("name", 
"PRECONFIGURE_SERVICE_MASTER"));
+
+    Set<Map<String, String>> host2Components = new HashSet<>();
+    host2Components.add(Collections.singletonMap("name", 
"EXISTING_SERVICE_MASTER"));
+
+    RecommendationResponse.HostGroup hostGroup1 = 
createMock(RecommendationResponse.HostGroup.class);
+    expect(hostGroup1.getName()).andReturn("host1").once();
+    expect(hostGroup1.getComponents()).andReturn(host1Components).once();
+
+    RecommendationResponse.HostGroup hostGroup2 = 
createMock(RecommendationResponse.HostGroup.class);
+    expect(hostGroup2.getName()).andReturn("host2").once();
+    expect(hostGroup2.getComponents()).andReturn(host2Components).once();
+
+    Set<RecommendationResponse.HostGroup> hostGroups = new HashSet<>();
+    hostGroups.add(hostGroup1);
+    hostGroups.add(hostGroup2);
+
+    RecommendationResponse.Blueprint blueprint = 
createMock(RecommendationResponse.Blueprint.class);
+    expect(blueprint.getHostGroups()).andReturn(hostGroups).once();
+
+    RecommendationResponse.BindingHostGroup bindHostGroup1 = 
createMock(RecommendationResponse.BindingHostGroup.class);
+    expect(bindHostGroup1.getName()).andReturn("host1").once();
+    
expect(bindHostGroup1.getHosts()).andReturn(Collections.singleton(Collections.singletonMap("fqdn",
 "host1"))).once();
+
+    RecommendationResponse.BindingHostGroup bindHostGroup2 = 
createMock(RecommendationResponse.BindingHostGroup.class);
+    expect(bindHostGroup2.getName()).andReturn("host2").once();
+    
expect(bindHostGroup2.getHosts()).andReturn(Collections.singleton(Collections.singletonMap("fqdn",
 "host2"))).once();
+
+    Set<RecommendationResponse.BindingHostGroup> bindingHostGroups = new 
HashSet<>();
+    bindingHostGroups.add(bindHostGroup1);
+    bindingHostGroups.add(bindHostGroup2);
+
+    RecommendationResponse.BlueprintClusterBinding binding = 
createMock(RecommendationResponse.BlueprintClusterBinding.class);
+    expect(binding.getHostGroups()).andReturn(bindingHostGroups).once();
+
+    RecommendationResponse.Recommendation recommendation = 
createMock(RecommendationResponse.Recommendation.class);
+    expect(recommendation.getBlueprint()).andReturn(blueprint).once();
+    
expect(recommendation.getBlueprintClusterBinding()).andReturn(binding).once();
+
+    RecommendationResponse response = createMock(RecommendationResponse.class);
+    expect(response.getRecommendations()).andReturn(recommendation).once();
+
+    StackAdvisorHelper stackAdvisorHelper = 
injector.getInstance(StackAdvisorHelper.class);
+    
expect(stackAdvisorHelper.recommend(anyObject(StackAdvisorRequest.class))).andReturn(response).once();
+
+    replayAll();
+
+    services.put(existingService.getName(), existingService);
+
+    Map<String, Map<String, String>> existingConfigurations = new HashMap<>();
+    existingConfigurations.put("core-site", new 
HashMap<>(Collections.singletonMap("core-property1", "original_value")));
+    existingConfigurations.put("hadoop-env", new 
HashMap<>(Collections.singletonMap("proxyuser_group", "hadoop")));
+
+    Map<String, Map<String, String>> replacements = new 
HashMap<>(existingConfigurations);
+
+    // Needed by infrastructure
+    injector.getInstance(AmbariMetaInfo.class).init();
+
+    KerberosHelper kerberosHelper = injector.getInstance(KerberosHelper.class);
+
+    Map<String, Map<String, String>> configurations = 
kerberosHelper.processPreconfiguredServiceConfigurations(existingConfigurations,
 replacements, cluster, kerberosDescriptor);
+
+    verifyAll();
+
+    Assert.assertNotNull(configurations);
+    Assert.assertEquals(2, configurations.size());
+    Assert.assertNotNull(configurations.get("core-site"));
+    Assert.assertNotNull(configurations.get("hadoop-env"));
+    Assert.assertEquals("hadoop", 
configurations.get("core-site").get("hadoop.proxyuser.preconfigure_user.groups"));
+    Assert.assertEquals("host1", 
configurations.get("core-site").get("hadoop.proxyuser.preconfigure_user.hosts"));
+
+  }
 
   @Test
   public void testGetServiceConfigurationUpdates() throws Exception {
@@ -1871,10 +2148,10 @@ public class KerberosHelperTest extends EasyMockSupport 
{
 
     final Map<String, String> kerberosEnvProperties = new HashMap<String, 
String>() {
       {
-        put("kdc_type", "mit-kdc");
-        put("realm", "FOOBAR.COM");
+        put(KerberosHelper.KDC_TYPE, "mit-kdc");
+        put(KerberosHelper.DEFAULT_REALM, "FOOBAR.COM");
         put("case_insensitive_username_rules", "false");
-        put("create_ambari_principal", "false");
+        put(KerberosHelper.CREATE_AMBARI_PRINCIPAL, "false");
       }
     };
 
@@ -2011,10 +2288,10 @@ public class KerberosHelperTest extends EasyMockSupport 
{
           {
             add(identityDescriptor1);
           }
-        }
-    );
-    
expect(serviceDescriptor1.getComponent("COMPONENT1A")).andReturn(componentDescriptor1a).times(4);
-    
expect(serviceDescriptor1.getComponent("COMPONENT1B")).andReturn(componentDescriptor1b).times(4);
+        },
+        false);
+    
expect(serviceDescriptor1.getComponent("COMPONENT1A")).andReturn(componentDescriptor1a).times(2);
+    
expect(serviceDescriptor1.getComponent("COMPONENT1B")).andReturn(componentDescriptor1b).times(2);
 
     final KerberosServiceDescriptor serviceDescriptor2 = 
createMockServiceDescriptor(
         "SERVICE2",
@@ -2024,9 +2301,9 @@ public class KerberosHelperTest extends EasyMockSupport {
             put("COMPONENT2B", componentDescriptor2b);
           }
         },
-        Collections.<KerberosIdentityDescriptor>emptyList());
-    
expect(serviceDescriptor2.getComponent("COMPONENT2A")).andReturn(componentDescriptor2a).times(2);
-    
expect(serviceDescriptor2.getComponent("COMPONENT2B")).andReturn(componentDescriptor2b).times(2);
+        Collections.<KerberosIdentityDescriptor>emptyList(), false);
+    
expect(serviceDescriptor2.getComponent("COMPONENT2A")).andReturn(componentDescriptor2a).times(1);
+    
expect(serviceDescriptor2.getComponent("COMPONENT2B")).andReturn(componentDescriptor2b).times(1);
 
     final KerberosServiceDescriptor serviceDescriptor3 = 
createMockServiceDescriptor(
         "SERVICE3",
@@ -2035,17 +2312,23 @@ public class KerberosHelperTest extends EasyMockSupport 
{
             put("COMPONENT3A", componentDescriptor3a);
           }
         },
-        Collections.<KerberosIdentityDescriptor>emptyList());
-    
expect(serviceDescriptor3.getComponent("COMPONENT3A")).andReturn(componentDescriptor3a).times(4);
+        Collections.<KerberosIdentityDescriptor>emptyList(), false);
+    
expect(serviceDescriptor3.getComponent("COMPONENT3A")).andReturn(componentDescriptor3a).times(2);
+
+    Map<String, KerberosServiceDescriptor> serviceDescriptorMap = new 
HashMap<>();
+    serviceDescriptorMap.put("SERVICE1", serviceDescriptor1);
+    serviceDescriptorMap.put("SERVICE2", serviceDescriptor2);
+    serviceDescriptorMap.put("SERVICE3", serviceDescriptor3);
 
     final Map<String, String> kerberosDescriptorProperties = new HashMap<>();
-    kerberosDescriptorProperties.put("realm", "${kerberos-env/realm}");
+    kerberosDescriptorProperties.put(KerberosHelper.DEFAULT_REALM, 
"${kerberos-env/realm}");
 
     final KerberosDescriptor kerberosDescriptor = 
createMock(KerberosDescriptor.class);
     
expect(kerberosDescriptor.getProperties()).andReturn(kerberosDescriptorProperties).atLeastOnce();
     
expect(kerberosDescriptor.getService("SERVICE1")).andReturn(serviceDescriptor1).atLeastOnce();
     
expect(kerberosDescriptor.getService("SERVICE2")).andReturn(serviceDescriptor2).atLeastOnce();
     
expect(kerberosDescriptor.getService("SERVICE3")).andReturn(serviceDescriptor3).atLeastOnce();
+    
expect(kerberosDescriptor.getServices()).andReturn(serviceDescriptorMap).atLeastOnce();
     
expect(kerberosDescriptor.getProperty("additional_realms")).andReturn(null).atLeastOnce();
     expect(kerberosDescriptor.getIdentities(eq(true), EasyMock.<Map<String, 
Object>>anyObject())).andReturn(null).atLeastOnce();
     
expect(kerberosDescriptor.getAuthToLocalProperties()).andReturn(Collections.singleton("core-site/auth.to.local")).atLeastOnce();
@@ -2146,9 +2429,6 @@ public class KerberosHelperTest extends EasyMockSupport {
 
     final Cluster cluster = createMockCluster("c1", hosts, 
SecurityType.KERBEROS, krb5ConfConfig, kerberosEnvConfig);
     expect(cluster.getServices()).andReturn(services).anyTimes();
-    expect(cluster.getService("SERVICE1")).andReturn(service1).atLeastOnce();
-    expect(cluster.getService("SERVICE2")).andReturn(service2).atLeastOnce();
-    expect(cluster.getService("SERVICE3")).andReturn(service3).atLeastOnce();
     
expect(cluster.getServiceComponentHostMap(EasyMock.<Set<String>>anyObject(), 
EasyMock.<Set<String>>anyObject())).andReturn(serviceComponentHostMap).anyTimes();
 
     final Map<String, Map<String, String>> existingConfigurations = new 
HashMap<String, Map<String, String>>() {
@@ -2275,10 +2555,10 @@ public class KerberosHelperTest extends EasyMockSupport 
{
       {
         put("kerberos-env", new HashMap<String, String>() {
           {
-            put("kdc_type", "mit-kdc");
-            put("realm", "FOOBAR.COM");
+            put(KerberosHelper.KDC_TYPE, "mit-kdc");
+            put(KerberosHelper.DEFAULT_REALM, "FOOBAR.COM");
             put("case_insensitive_username_rules", "false");
-            put("create_ambari_principal", "false");
+            put(KerberosHelper.CREATE_AMBARI_PRINCIPAL, "false");
           }
         });
         put("", new HashMap<String, String>() {
@@ -2334,12 +2614,11 @@ public class KerberosHelperTest extends EasyMockSupport 
{
     KerberosPrincipalType ambariServerPrincipalType;
     String ambariServerPrincipalNameExpected;
 
-    if(ambariServerPrincipalAsService) {
+    if (ambariServerPrincipalAsService) {
       ambariServerPrincipalName = 
"ambari-server${principal_suffix}/_HOST@${realm}";
       ambariServerPrincipalType = KerberosPrincipalType.SERVICE;
       ambariServerPrincipalNameExpected = 
String.format("ambari-server-%s/%s@%s", clusterName, ambariServerHostname, 
realm);
-    }
-    else {
+    } else {
       ambariServerPrincipalName = "ambari-server${principal_suffix}@${realm}";
       ambariServerPrincipalType = KerberosPrincipalType.USER;
       ambariServerPrincipalNameExpected = String.format("ambari-server-%s@%s", 
clusterName, realm);
@@ -2348,15 +2627,15 @@ public class KerberosHelperTest extends EasyMockSupport 
{
     Map<String, String> propertiesKrb5Conf = new HashMap<>();
 
     Map<String, String> propertiesKerberosEnv = new HashMap<>();
-    propertiesKerberosEnv.put("realm", realm);
-    propertiesKerberosEnv.put("kdc_type", "mit-kdc");
+    propertiesKerberosEnv.put(KerberosHelper.DEFAULT_REALM, realm);
+    propertiesKerberosEnv.put(KerberosHelper.KDC_TYPE, "mit-kdc");
     propertiesKerberosEnv.put("password_length", "20");
     propertiesKerberosEnv.put("password_min_lowercase_letters", "1");
     propertiesKerberosEnv.put("password_min_uppercase_letters", "1");
     propertiesKerberosEnv.put("password_min_digits", "1");
     propertiesKerberosEnv.put("password_min_punctuation", "0");
     propertiesKerberosEnv.put("password_min_whitespace", "0");
-    propertiesKerberosEnv.put("create_ambari_principal", 
(createAmbariIdentities) ? "true" : "false");
+    propertiesKerberosEnv.put(KerberosHelper.CREATE_AMBARI_PRINCIPAL, 
(createAmbariIdentities) ? "true" : "false");
 
     Config configKrb5Conf = createMock(Config.class);
     
expect(configKrb5Conf.getProperties()).andReturn(propertiesKrb5Conf).times(1);
@@ -2393,7 +2672,7 @@ public class KerberosHelperTest extends EasyMockSupport {
     Map<String, String> kerberosDescriptorProperties = new HashMap<>();
     kerberosDescriptorProperties.put("additional_realms", "");
     kerberosDescriptorProperties.put("keytab_dir", "/etc/security/keytabs");
-    kerberosDescriptorProperties.put("realm", "${kerberos-env/realm}");
+    kerberosDescriptorProperties.put(KerberosHelper.DEFAULT_REALM, 
"${kerberos-env/realm}");
     kerberosDescriptorProperties.put("principal_suffix", 
"-${cluster_name|toLower()}");
 
     ArrayList<KerberosIdentityDescriptor> service1Component1Identities = new 
ArrayList<>();
@@ -2423,7 +2702,7 @@ public class KerberosHelperTest extends EasyMockSupport {
         createMockKeytabDescriptor("s1.service.keytab", null)
     ));
 
-    KerberosServiceDescriptor service1KerberosDescriptor = 
createMockServiceDescriptor("SERVICE1", service1ComponentDescriptorMap, 
service1Identities);
+    KerberosServiceDescriptor service1KerberosDescriptor = 
createMockServiceDescriptor("SERVICE1", service1ComponentDescriptorMap, 
service1Identities, false);
 
     ArrayList<KerberosIdentityDescriptor> service2Component1Identities = new 
ArrayList<>();
     service2Component1Identities.add(createMockIdentityDescriptor(
@@ -2440,7 +2719,7 @@ public class KerberosHelperTest extends EasyMockSupport {
     HashMap<String, KerberosComponentDescriptor> 
service2ComponentDescriptorMap = new HashMap<>();
     service2ComponentDescriptorMap.put("COMPONENT21", 
createMockComponentDescriptor("COMPONENT21", service2Component1Identities, 
null));
 
-    KerberosServiceDescriptor service2KerberosDescriptor = 
createMockServiceDescriptor("SERVICE2", service2ComponentDescriptorMap, null);
+    KerberosServiceDescriptor service2KerberosDescriptor = 
createMockServiceDescriptor("SERVICE2", service2ComponentDescriptorMap, null, 
false);
 
     KerberosDescriptor kerberosDescriptor = 
createMock(KerberosDescriptor.class);
     
expect(kerberosDescriptor.getProperties()).andReturn(kerberosDescriptorProperties);
@@ -2466,7 +2745,7 @@ public class KerberosHelperTest extends EasyMockSupport {
       HashMap<String, KerberosComponentDescriptor> 
ambariServerComponentDescriptorMap = new HashMap<>();
       ambariServerComponentDescriptorMap.put("AMBARI_SERVER", 
ambariServerComponentKerberosDescriptor);
 
-      KerberosServiceDescriptor ambariServiceKerberosDescriptor = 
createMockServiceDescriptor("AMBARI", ambariServerComponentDescriptorMap, null);
+      KerberosServiceDescriptor ambariServiceKerberosDescriptor = 
createMockServiceDescriptor("AMBARI", ambariServerComponentDescriptorMap, null, 
false);
       
expect(ambariServiceKerberosDescriptor.getComponent("AMBARI_SERVER")).andReturn(ambariServerComponentKerberosDescriptor).once();
 
       
expect(kerberosDescriptor.getService("AMBARI")).andReturn(ambariServiceKerberosDescriptor).once();
@@ -2505,7 +2784,7 @@ public class KerberosHelperTest extends EasyMockSupport {
         .andReturn(new 
CreatePrincipalsServerAction.CreatePrincipalResult("anything", "password", 1))
         .times(3);
 
-    if(createAmbariIdentities) {
+    if (createAmbariIdentities) {
       if (ambariServerPrincipalAsService) {
         
expect(createPrincipalsServerAction.createPrincipal(capture(capturePrincipal), 
eq(true), EasyMock.<Map<String, String>>anyObject(), 
anyObject(KerberosOperationHandler.class), eq(false), isNull(ActionLog.class)))
             .andReturn(new 
CreatePrincipalsServerAction.CreatePrincipalResult("anything", "password", 1))
@@ -2551,7 +2830,7 @@ public class KerberosHelperTest extends EasyMockSupport {
     assertTrue(capturedPrincipalsForKeytab.contains("[email protected]"));
     assertTrue(capturedPrincipalsForKeytab.contains("[email protected]"));
 
-    if(createAmbariIdentities) {
+    if (createAmbariIdentities) {
       String spnegoPrincipalName = String.format("HTTP/%[email protected]", 
ambariServerHostname);
 
       
assertTrue(capturedPrincipals.contains(ambariServerPrincipalNameExpected));
@@ -2570,9 +2849,9 @@ public class KerberosHelperTest extends EasyMockSupport {
     Map<String, String> propertiesKrb5Conf = new HashMap<>();
 
     Map<String, String> propertiesKerberosEnv = new HashMap<>();
-    propertiesKerberosEnv.put("realm", "EXAMPLE.COM");
-    propertiesKerberosEnv.put("kdc_type", "mit-kdc");
-    propertiesKerberosEnv.put("create_ambari_principal", "false");
+    propertiesKerberosEnv.put(KerberosHelper.DEFAULT_REALM, "EXAMPLE.COM");
+    propertiesKerberosEnv.put(KerberosHelper.KDC_TYPE, "mit-kdc");
+    propertiesKerberosEnv.put(KerberosHelper.CREATE_AMBARI_PRINCIPAL, "false");
 
     Config configKrb5Conf = createMock(Config.class);
     
expect(configKrb5Conf.getProperties()).andReturn(propertiesKrb5Conf).times(1);
@@ -2594,19 +2873,19 @@ public class KerberosHelperTest extends EasyMockSupport 
{
     Map<String, Service> servicesMap = new HashMap<>();
     servicesMap.put("SERVICE1", service1);
 
-    Cluster cluster = createMockCluster("c1", Arrays.asList(host1), 
SecurityType.KERBEROS, configKrb5Conf, configKerberosEnv);
+    Cluster cluster = createMockCluster("c1", 
Collections.singletonList(host1), SecurityType.KERBEROS, configKrb5Conf, 
configKerberosEnv);
     expect(cluster.getServices()).andReturn(servicesMap).anyTimes();
 
     Map<String, String> kerberosDescriptorProperties = new HashMap<>();
     kerberosDescriptorProperties.put("additional_realms", "");
     kerberosDescriptorProperties.put("keytab_dir", "/etc/security/keytabs");
-    kerberosDescriptorProperties.put("realm", "${kerberos-env/realm}");
+    kerberosDescriptorProperties.put(KerberosHelper.DEFAULT_REALM, 
"${kerberos-env/realm}");
 
     // Notice that this map is empty, hence it has 0 Components in the 
kerberosDescriptor.
     HashMap<String, KerberosComponentDescriptor> 
service1ComponentDescriptorMap = new HashMap<>();
 
     List<KerberosIdentityDescriptor> service1Identities = new ArrayList<>();
-    KerberosServiceDescriptor service1KerberosDescriptor = 
createMockServiceDescriptor("SERVICE1", service1ComponentDescriptorMap, 
service1Identities);
+    KerberosServiceDescriptor service1KerberosDescriptor = 
createMockServiceDescriptor("SERVICE1", service1ComponentDescriptorMap, 
service1Identities, false);
 
     KerberosDescriptor kerberosDescriptor = 
createMock(KerberosDescriptor.class);
     
expect(kerberosDescriptor.getProperties()).andReturn(kerberosDescriptorProperties);
@@ -2650,7 +2929,9 @@ public class KerberosHelperTest extends EasyMockSupport {
 
   private void setupKerberosDescriptor(KerberosDescriptor kerberosDescriptor) 
throws Exception {
     // cluster.getCurrentStackVersion expectation is already specified in main 
test method
-    expect(metaInfo.getKerberosDescriptor("HDP", 
"2.2")).andReturn(kerberosDescriptor).anyTimes();
+    AmbariMetaInfo metaInfo = injector.getInstance(AmbariMetaInfo.class);
+    expect(metaInfo.
+        getKerberosDescriptor("HDP", "2.2", 
false)).andReturn(kerberosDescriptor).anyTimes();
     expect(kerberosDescriptor.principals()).andReturn(Collections.<String, 
String>emptyMap()).anyTimes();
   }
 
@@ -2758,8 +3039,8 @@ public class KerberosHelperTest extends EasyMockSupport {
         .anyTimes();
 
     final Map<String, String> kerberosEnvProperties = createMock(Map.class);
-    
expect(kerberosEnvProperties.get("kdc_type")).andReturn("mit-kdc").anyTimes();
-    
expect(kerberosEnvProperties.get("realm")).andReturn("FOOBAR.COM").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.KDC_TYPE)).andReturn("mit-kdc").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.DEFAULT_REALM)).andReturn("FOOBAR.COM").anyTimes();
 
     final Config kerberosEnvConfig = createMock(Config.class);
     
expect(kerberosEnvConfig.getProperties()).andReturn(kerberosEnvProperties).anyTimes();
@@ -2781,40 +3062,34 @@ public class KerberosHelperTest extends EasyMockSupport 
{
         })
         .anyTimes();
 
-    if ((filteredHosts == null) || filteredHosts.contains("hostA")) {
-      expect(cluster.getServiceComponentHosts("hostA"))
-          .andReturn(new ArrayList<ServiceComponentHost>() {
-            {
-              add(sch1A);
-              add(sch2);
-              add(sch3);
-              add(schKerberosClientA);
-            }
-          })
-          .once();
-    }
+    expect(cluster.getServiceComponentHosts("hostA"))
+        .andReturn(new ArrayList<ServiceComponentHost>() {
+          {
+            add(sch1A);
+            add(sch2);
+            add(sch3);
+            add(schKerberosClientA);
+          }
+        })
+        .once();
 
-    if ((filteredHosts == null) || filteredHosts.contains("hostB")) {
-      expect(cluster.getServiceComponentHosts("hostB"))
-          .andReturn(new ArrayList<ServiceComponentHost>() {
-            {
-              add(sch1B);
-              add(schKerberosClientB);
-            }
-          })
-          .once();
-    }
+    expect(cluster.getServiceComponentHosts("hostB"))
+        .andReturn(new ArrayList<ServiceComponentHost>() {
+          {
+            add(sch1B);
+            add(schKerberosClientB);
+          }
+        })
+        .once();
 
-    if ((filteredHosts == null) || filteredHosts.contains("hostC")) {
-      expect(cluster.getServiceComponentHosts("hostC"))
-          .andReturn(new ArrayList<ServiceComponentHost>() {
-            {
-              add(sch1C);
-              add(schKerberosClientC);
-            }
-          })
-          .once();
-    }
+    expect(cluster.getServiceComponentHosts("hostC"))
+        .andReturn(new ArrayList<ServiceComponentHost>() {
+          {
+            add(sch1C);
+            add(schKerberosClientC);
+          }
+        })
+        .once();
 
     expect(cluster.getServiceComponentHosts("KERBEROS", "KERBEROS_CLIENT"))
         .andReturn(new ArrayList<ServiceComponentHost>() {
@@ -3017,8 +3292,8 @@ public class KerberosHelperTest extends EasyMockSupport {
         .anyTimes();
 
     final Map<String, String> kerberosEnvProperties = createMock(Map.class);
-    
expect(kerberosEnvProperties.get("kdc_type")).andReturn("mit-kdc").anyTimes();
-    
expect(kerberosEnvProperties.get("realm")).andReturn("FOOBAR.COM").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.KDC_TYPE)).andReturn("mit-kdc").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.DEFAULT_REALM)).andReturn("FOOBAR.COM").anyTimes();
 
     final Config kerberosEnvConfig = createMock(Config.class);
     
expect(kerberosEnvConfig.getProperties()).andReturn(kerberosEnvProperties).anyTimes();
@@ -3170,10 +3445,10 @@ public class KerberosHelperTest extends EasyMockSupport 
{
     boolean managingIdentities = !Boolean.FALSE.equals(manageIdentities);
 
     final Map<String, String> kerberosEnvProperties = new HashMap<>();
-    kerberosEnvProperties.put("kdc_type", "mit-kdc");
-    kerberosEnvProperties.put("realm", "FOOBAR.COM");
-    kerberosEnvProperties.put("manage_identities", "FOOBAR.COM");
-    kerberosEnvProperties.put("manage_identities",
+    kerberosEnvProperties.put(KerberosHelper.KDC_TYPE, "mit-kdc");
+    kerberosEnvProperties.put(KerberosHelper.DEFAULT_REALM, "FOOBAR.COM");
+    kerberosEnvProperties.put(KerberosHelper.MANAGE_IDENTITIES, "FOOBAR.COM");
+    kerberosEnvProperties.put(KerberosHelper.MANAGE_IDENTITIES,
         (manageIdentities == null)
             ? null
             : ((manageIdentities) ? "true" : "false"));
@@ -3407,9 +3682,9 @@ public class KerberosHelperTest extends EasyMockSupport {
         .anyTimes();
 
     final Map<String, String> kerberosEnvProperties = createMock(Map.class);
-    
expect(kerberosEnvProperties.get("kdc_type")).andReturn("mit-kdc").anyTimes();
-    
expect(kerberosEnvProperties.get("realm")).andReturn("FOOBAR.COM").anyTimes();
-    
expect(kerberosEnvProperties.get("manage_identities")).andReturn(null).anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.KDC_TYPE)).andReturn("mit-kdc").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.DEFAULT_REALM)).andReturn("FOOBAR.COM").anyTimes();
+    
expect(kerberosEnvProperties.get(KerberosHelper.MANAGE_IDENTITIES)).andReturn(null).anyTimes();
 
     final Config kerberosEnvConfig = createMock(Config.class);
     
expect(kerberosEnvConfig.getProperties()).andReturn(kerberosEnvProperties).anyTimes();
@@ -3616,10 +3891,10 @@ public class KerberosHelperTest extends EasyMockSupport 
{
 
     final Map<String, String> kerberosEnvProperties = new HashMap<String, 
String>() {
       {
-        put("kdc_type", "mit-kdc");
-        put("realm", "FOOBAR.COM");
+        put(KerberosHelper.KDC_TYPE, "mit-kdc");
+        put(KerberosHelper.DEFAULT_REALM, "FOOBAR.COM");
         put("case_insensitive_username_rules", "false");
-        put("create_ambari_principal", "false");
+        put(KerberosHelper.CREATE_AMBARI_PRINCIPAL, "false");
       }
     };
 
@@ -3773,7 +4048,7 @@ public class KerberosHelperTest extends EasyMockSupport {
     final KerberosDescriptor kerberosDescriptor = 
createMock(KerberosDescriptor.class);
     expect(kerberosDescriptor.getProperties()).andReturn(new HashMap<String, 
String>() {
       {
-        put("realm", "EXAMPLE.COM");
+        put(KerberosHelper.DEFAULT_REALM, "EXAMPLE.COM");
       }
     }).anyTimes();
     
expect(kerberosDescriptor.getService("KERBEROS")).andReturn(null).anyTimes();
@@ -3785,7 +4060,7 @@ public class KerberosHelperTest extends EasyMockSupport {
     replayAll();
 
     // Needed by infrastructure
-    metaInfo.init();
+    injector.getInstance(AmbariMetaInfo.class).init();
 
     Map<String, Collection<KerberosIdentityDescriptor>> identities;
     identities = kerberosHelper.getActiveIdentities(clusterName, hostName, 
serviceName, componentName, replaceHostNames);
@@ -3826,7 +4101,7 @@ public class KerberosHelperTest extends EasyMockSupport {
       KerberosComponentDescriptor componentDescrptor = 
createMockComponentDescriptor("AMBARI_SERVER", ambarServerComponent1Identities, 
null);
       ambariServerComponentDescriptorMap.put("AMBARI_SERVER", 
componentDescrptor);
 
-      KerberosServiceDescriptor ambariServiceKerberosDescriptor = 
createMockServiceDescriptor("AMBARI", ambariServerComponentDescriptorMap, null);
+      KerberosServiceDescriptor ambariServiceKerberosDescriptor = 
createMockServiceDescriptor("AMBARI", ambariServerComponentDescriptorMap, null, 
false);
       
expect(ambariServiceKerberosDescriptor.getComponent("AMBARI_SERVER")).andReturn(componentDescrptor).once();
 
       
expect(kerberosDescriptor.getService("AMBARI")).andReturn(ambariServiceKerberosDescriptor).once();
@@ -3869,7 +4144,8 @@ public class KerberosHelperTest extends EasyMockSupport {
   }
 
   private KerberosPrincipalDescriptor createMockPrincipalDescriptor(String 
value,
-                                                                    
KerberosPrincipalType type, String localUsername,
+                                                                    
KerberosPrincipalType type,
+                                                                    String 
localUsername,
                                                                     String 
configuration) {
     KerberosPrincipalDescriptor descriptor = 
createMock(KerberosPrincipalDescriptor.class);
     expect(descriptor.getValue()).andReturn(value).anyTimes();
@@ -3881,13 +4157,15 @@ public class KerberosHelperTest extends EasyMockSupport 
{
 
   private KerberosServiceDescriptor createMockServiceDescriptor(String 
serviceName,
                                                                 
HashMap<String, KerberosComponentDescriptor> componentMap,
-                                                                
List<KerberosIdentityDescriptor> identities)
+                                                                
List<KerberosIdentityDescriptor> identities,
+                                                                Boolean 
shouldPreconfigure)
       throws AmbariException {
     KerberosServiceDescriptor descriptor = 
createMock(KerberosServiceDescriptor.class);
     expect(descriptor.getName()).andReturn(serviceName).anyTimes();
     expect(descriptor.getComponents()).andReturn(componentMap).anyTimes();
     expect(descriptor.getIdentities(eq(true), EasyMock.<Map<String, 
Object>>anyObject())).andReturn(identities).anyTimes();
     expect(descriptor.getAuthToLocalProperties()).andReturn(null).anyTimes();
+    
expect(descriptor.shouldPreconfigure()).andReturn(shouldPreconfigure).anyTimes();
     return descriptor;
   }
 
@@ -3902,7 +4180,7 @@ public class KerberosHelperTest extends EasyMockSupport {
   }
 
   private KerberosComponentDescriptor createMockComponentDescriptor(String 
componentName,
-                                                                    
ArrayList<KerberosIdentityDescriptor> identities,
+                                                                    
List<KerberosIdentityDescriptor> identities,
                                                                     
Map<String, KerberosConfigurationDescriptor> configurations)
       throws AmbariException {
     KerberosComponentDescriptor descriptor = 
createMock(KerberosComponentDescriptor.class);
@@ -3961,4 +4239,101 @@ public class KerberosHelperTest extends EasyMockSupport 
{
     return cluster;
   }
 
+  private KerberosDescriptor createKerberosDescriptor() throws AmbariException 
{
+    String json = "{" +
+        "  \"services\": [" +
+        "    {" +
+        "      \"name\": \"EXISTING_SERVICE\"," +
+        "      \"components\": [" +
+        "        {" +
+        "          \"name\": \"EXISTING_SERVICE_MASTER\"," +
+        "          \"identities\": [" +
+        "            {" +
+        "              \"name\": \"existing_service_principal\"," +
+        "              \"principal\": {" +
+        "                \"value\": 
\"${existing-service-env/service_user}/_HOST@${realm}\"," +
+        "                \"type\": \"service\"," +
+        "                \"configuration\": 
\"existing-service-env/service_principal_name\"," +
+        "                \"local_username\": 
\"${existing-service-env/service_user}\"" +
+        "              }," +
+        "              \"keytab\": {" +
+        "                \"file\": 
\"${keytab_dir}/existing_service.service.keytab\"," +
+        "                \"owner\": {" +
+        "                  \"name\": 
\"${existing-service-env/service_user}\"," +
+        "                  \"access\": \"r\"" +
+        "                }," +
+        "                \"group\": {" +
+        "                  \"name\": \"${cluster-env/user_group}\"," +
+        "                  \"access\": \"\"" +
+        "                }," +
+        "                \"configuration\": 
\"existing-service-env/service_keytab_path\"" +
+        "              }" +
+        "            }" +
+        "          ]," +
+        "          \"configurations\": [" +
+        "            {" +
+        "              \"existing-service-site\": {" +
+        "                \"kerberos.secured\": \"true\"" +
+        "              }" +
+        "            }," +
+        "            {" +
+        "              \"core-site\": {" +
+        "                
\"hadoop.proxyuser.${existing-service-env/service_user}.groups\": 
\"${hadoop-env/proxyuser_group}\"," +
+        "                
\"hadoop.proxyuser.${existing-service-env/service_user}.hosts\": 
\"${clusterHostInfo/existing_service_master_hosts}\"" +
+        "              }" +
+        "            }" +
+        "          ]" +
+        "        }" +
+        "      ]" +
+        "    }," +
+        "    {" +
+        "      \"name\": \"PRECONFIGURE_SERVICE\"," +
+        "      \"preconfigure\": true," +
+        "      \"components\": [" +
+        "        {" +
+        "          \"name\": \"PRECONFIGURE_SERVICE_MASTER\"," +
+        "          \"identities\": [" +
+        "            {" +
+        "              \"name\": \"preconfigure_service_principal\"," +
+        "              \"principal\": {" +
+        "                \"value\": 
\"${preconfigure-service-env/service_user}/_HOST@${realm}\"," +
+        "                \"type\": \"service\"," +
+        "                \"configuration\": 
\"preconfigure-service-env/service_principal_name\"," +
+        "                \"local_username\": 
\"${preconfigure-service-env/service_user}\"" +
+        "              }," +
+        "              \"keytab\": {" +
+        "                \"file\": 
\"${keytab_dir}/preconfigure_service.service.keytab\"," +
+        "                \"owner\": {" +
+        "                  \"name\": 
\"${preconfigure-service-env/service_user}\"," +
+        "                  \"access\": \"r\"" +
+        "                }," +
+        "                \"group\": {" +
+        "                  \"name\": \"${cluster-env/user_group}\"," +
+        "                  \"access\": \"\"" +
+        "                }," +
+        "                \"configuration\": 
\"preconfigure-service-env/service_keytab_path\"" +
+        "              }" +
+        "            }" +
+        "          ]," +
+        "          \"configurations\": [" +
+        "            {" +
+        "              \"preconfigure-service-site\": {" +
+        "                \"kerberos.secured\": \"true\"" +
+        "              }" +
+        "            }," +
+        "            {" +
+        "              \"core-site\": {" +
+        "                
\"hadoop.proxyuser.${preconfigure-service-env/service_user}.groups\": 
\"${hadoop-env/proxyuser_group}\"," +
+        "                
\"hadoop.proxyuser.${preconfigure-service-env/service_user}.hosts\": 
\"${clusterHostInfo/preconfigure_service_master_hosts}\"" +
+        "              }" +
+        "            }" +
+        "          ]" +
+        "        }" +
+        "      ]" +
+        "    }" +
+        "  ]" +
+        "}";
+
+    return new KerberosDescriptorFactory().createInstance(json);
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e6641558/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProviderTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProviderTest.java
index 1f91915..367dd75 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProviderTest.java
@@ -352,11 +352,11 @@ public class 
ClusterKerberosDescriptorResourceProviderTest extends EasyMockSuppo
     compositeKerberosDescriptor.update(userKerberosDescriptor);
 
     KerberosHelper kerberosHelper = createMock(KerberosHelper.class);
-    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.STACK),
 eq(cluster), eq(false), anyObject(Collection.class)))
+    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.STACK),
 eq(cluster), eq(false), anyObject(Collection.class), eq(false)))
         .andReturn(stackKerberosDescriptor).atLeastOnce();
-    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.USER),
 eq(cluster), eq(false), anyObject(Collection.class)))
+    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.USER),
 eq(cluster), eq(false), anyObject(Collection.class), eq(false)))
         .andReturn(userKerberosDescriptor).atLeastOnce();
-    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.COMPOSITE),
 eq(cluster), eq(false), anyObject(Collection.class)))
+    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.COMPOSITE),
 eq(cluster), eq(false), anyObject(Collection.class), eq(false)))
         .andReturn(compositeKerberosDescriptor).atLeastOnce();
 
     AmbariManagementController managementController = 
createMock(AmbariManagementController.class);
@@ -466,11 +466,11 @@ public class 
ClusterKerberosDescriptorResourceProviderTest extends EasyMockSuppo
     Capture<? extends Collection<String>> captureAdditionalServices = 
newCapture(CaptureType.ALL);
 
     KerberosHelper kerberosHelper = createMock(KerberosHelper.class);
-    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.STACK),
 eq(cluster), eq(true), capture(captureAdditionalServices)))
+    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.STACK),
 eq(cluster), eq(true), capture(captureAdditionalServices), eq(false)))
         .andReturn(stackKerberosDescriptor).atLeastOnce();
-    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.USER),
 eq(cluster), eq(true), capture(captureAdditionalServices)))
+    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.USER),
 eq(cluster), eq(true), capture(captureAdditionalServices), eq(false)))
         .andReturn(userKerberosDescriptor).atLeastOnce();
-    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.COMPOSITE),
 eq(cluster), eq(true), capture(captureAdditionalServices)))
+    
expect(kerberosHelper.getKerberosDescriptor(eq(KerberosHelper.KerberosDescriptorType.COMPOSITE),
 eq(cluster), eq(true), capture(captureAdditionalServices), eq(false)))
         .andReturn(compositeKerberosDescriptor).atLeastOnce();
 
     AmbariManagementController managementController = 
createMock(AmbariManagementController.class);
@@ -599,7 +599,7 @@ public class ClusterKerberosDescriptorResourceProviderTest 
extends EasyMockSuppo
     expect(kerberosDescriptor.toMap()).andReturn(STACK_MAP).atLeastOnce();
 
     AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
-    expect(metaInfo.getKerberosDescriptor("stackName", 
"stackVersion")).andReturn(kerberosDescriptor).atLeastOnce();
+    expect(metaInfo.getKerberosDescriptor("stackName", "stackVersion", 
false)).andReturn(kerberosDescriptor).atLeastOnce();
 
     AmbariManagementController managementController = 
createMock(AmbariManagementController.class);
     
expect(managementController.getClusters()).andReturn(clusters).atLeastOnce();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e6641558/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/FixAuthToLocalMappingActionTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/FixAuthToLocalMappingActionTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/FixAuthToLocalMappingActionTest.java
index ab102bc..fe8cb4b 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/FixAuthToLocalMappingActionTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/FixAuthToLocalMappingActionTest.java
@@ -62,7 +62,7 @@ public class FixAuthToLocalMappingActionTest {
     KerberosHelper kerberosHelper = createNiceMock(KerberosHelper.class);
     KerberosDescriptor descriptor = createNiceMock(KerberosDescriptor.class);
 
-    
expect(kerberosHelper.getKerberosDescriptor(cluster)).andReturn(descriptor).anyTimes();
+    expect(kerberosHelper.getKerberosDescriptor(cluster, false 
)).andReturn(descriptor).anyTimes();
     Set<String> mappings = new HashSet<>();
     mappings.add("core-site/hadoop.security.auth_to_local");
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e6641558/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeUserKerberosDescriptorTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeUserKerberosDescriptorTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeUserKerberosDescriptorTest.java
index 0da9088..69d82b2 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeUserKerberosDescriptorTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeUserKerberosDescriptorTest.java
@@ -120,8 +120,8 @@ public class UpgradeUserKerberosDescriptorTest {
     PowerMockito.mockStatic(KerberosDescriptorUpdateHelper.class);
     
PowerMockito.when(KerberosDescriptorUpdateHelper.updateUserKerberosDescriptor(previousDescriptor,
 newDescriptor, userDescriptor)).thenReturn(updatedKerberosDescriptor);
     
expect(kerberosDescriptorFactory.createInstance((Map)null)).andReturn(userDescriptor).atLeastOnce();
-    
expect(ambariMetaInfo.getKerberosDescriptor("HDP","2.5")).andReturn(newDescriptor).atLeastOnce();
-    
expect(ambariMetaInfo.getKerberosDescriptor("HDP","2.4")).andReturn(previousDescriptor).atLeastOnce();
+    expect(ambariMetaInfo.getKerberosDescriptor("HDP","2.5", 
false)).andReturn(newDescriptor).atLeastOnce();
+    expect(ambariMetaInfo.getKerberosDescriptor("HDP","2.4", 
false)).andReturn(previousDescriptor).atLeastOnce();
 
 
     expect(updatedKerberosDescriptor.toMap()).andReturn(null).once();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e6641558/ambari-server/src/test/java/org/apache/ambari/server/stack/ServiceModuleTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/stack/ServiceModuleTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/stack/ServiceModuleTest.java
index a6ca8a3..5efbc89 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/stack/ServiceModuleTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/stack/ServiceModuleTest.java
@@ -21,7 +21,6 @@ package org.apache.ambari.server.stack;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.state.CommandScriptDefinition;
 import org.apache.ambari.server.state.ComponentInfo;
 import org.apache.ambari.server.state.CredentialStoreInfo;
@@ -1236,7 +1235,7 @@ public class ServiceModuleTest {
 
     ServiceDirectory serviceDirectory = createNiceMock(ServiceDirectory.class);
 
-    expect(serviceDirectory.getConfigurationDirectory(dir, 
AmbariMetaInfo.SERVICE_PROPERTIES_FOLDER_NAME)).andReturn(configDir).anyTimes();
+    expect(serviceDirectory.getConfigurationDirectory(dir, 
StackDirectory.SERVICE_PROPERTIES_FOLDER_NAME)).andReturn(configDir).anyTimes();
     
expect(serviceDirectory.getMetricsFile(anyObject(String.class))).andReturn(new 
File("testMetricsFile")).anyTimes();
     
expect(serviceDirectory.getWidgetsDescriptorFile(anyObject(String.class))).andReturn(new
 File("testWidgetsFile")).anyTimes();
     expect(serviceDirectory.getAlertsFile()).andReturn(new 
File("testAlertsFile")).anyTimes();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e6641558/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosDescriptorUpdateHelperTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosDescriptorUpdateHelperTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosDescriptorUpdateHelperTest.java
index 8055c35..9495a1a 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosDescriptorUpdateHelperTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosDescriptorUpdateHelperTest.java
@@ -98,8 +98,8 @@ public class KerberosDescriptorUpdateHelperTest extends 
EasyMockSupport {
     injector.injectMembers(metaInfo);
     metaInfo.init();
 
-    KerberosDescriptor hdp24 = metaInfo.getKerberosDescriptor("HDP", "2.4");
-    KerberosDescriptor hdp25 = metaInfo.getKerberosDescriptor("HDP", "2.5");
+    KerberosDescriptor hdp24 = metaInfo.getKerberosDescriptor("HDP", "2.4", 
false);
+    KerberosDescriptor hdp25 = metaInfo.getKerberosDescriptor("HDP", "2.5", 
false);
     KerberosDescriptor user = new KerberosDescriptor(hdp24.toMap());
 
     KerberosDescriptor updated = 
KerberosDescriptorUpdateHelper.updateUserKerberosDescriptor(hdp24, hdp25, user);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e6641558/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptorTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptorTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptorTest.java
index fb341ca..7c1e655 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptorTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptorTest.java
@@ -40,6 +40,7 @@ public class KerberosServiceDescriptorTest {
   public static final String JSON_VALUE =
       "{" +
           "  \"name\": \"SERVICE_NAME\"," +
+          "  \"preconfigure\": \"true\"," +
           "  \"identities\": [" +
           KerberosIdentityDescriptorTest.JSON_VALUE +
           "]," +
@@ -64,6 +65,7 @@ public class KerberosServiceDescriptorTest {
           "\"services\" : [" +
           "{" +
           "  \"name\": \"SERVICE_NAME\"," +
+          "  \"preconfigure\": \"true\"," +
           "  \"identities\": [" +
           KerberosIdentityDescriptorTest.JSON_VALUE +
           "]," +

http://git-wip-us.apache.org/repos/asf/ambari/blob/e6641558/ambari-server/src/test/resources/stacks/HDP/2.0.8/kerberos_preconfigure.json
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.0.8/kerberos_preconfigure.json 
b/ambari-server/src/test/resources/stacks/HDP/2.0.8/kerberos_preconfigure.json
new file mode 100644
index 0000000..27379df
--- /dev/null
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.0.8/kerberos_preconfigure.json
@@ -0,0 +1,23 @@
+{
+  "services": [
+    {
+      "name": "HDFS"
+    },
+    {
+      "name": "NEW_SERVICE",
+      "preconfigure" : true,
+      "configurations": {
+      },
+      "identities": [
+        {
+          "name": "new_service",
+          "principal": {
+            "value": "ns/_HOST@${realm}",
+            "type": "service",
+            "local_username": "new_service"
+          }
+        }
+      ]
+    }
+  ]
+}

Reply via email to