Repository: ambari Updated Branches: refs/heads/trunk 46f1ffbec -> 575097117
AMBARI-9439. Kerberos: regenerate keytabs not handled for all hosts (rlevas) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/57509711 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/57509711 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/57509711 Branch: refs/heads/trunk Commit: 575097117230f5111dd9171efbf632eff3f58d1e Parents: 46f1ffb Author: Robert Levas <rle...@hortonworks.com> Authored: Mon Feb 23 14:13:24 2015 -0500 Committer: Robert Levas <rle...@hortonworks.com> Committed: Mon Feb 23 14:13:30 2015 -0500 ---------------------------------------------------------------------- .../server/controller/KerberosHelper.java | 31 +++- .../org/apache/ambari/server/state/Service.java | 3 +- .../server/controller/KerberosHelperTest.java | 150 +++++++++++++++++-- 3 files changed, 170 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/57509711/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 7a0a374..e562497 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 @@ -81,6 +81,7 @@ 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.StackId; +import org.apache.ambari.server.state.State; import org.apache.ambari.server.state.kerberos.KerberosComponentDescriptor; import org.apache.ambari.server.state.kerberos.KerberosConfigurationDescriptor; import org.apache.ambari.server.state.kerberos.KerberosDescriptor; @@ -103,6 +104,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -509,6 +511,11 @@ public class KerberosHelper { Map<String, String> kerberosDescriptorProperties = kerberosDescriptor.getProperties(); Map<String, Map<String, String>> kerberosConfigurations = new HashMap<String, Map<String, String>>(); + // While iterating over all the ServiceComponentHosts find hosts that have KERBEROS_CLIENT + // components in the INSTALLED state and add them to the hostsWithValidKerberosClient Set. + // This is needed to help determine which hosts to perform actions for and create tasks for. + Set<String> hostsWithValidKerberosClient = new HashSet<String>(); + // Create a temporary directory to store metadata needed to complete this task. Information // such as which principals and keytabs files to create as well as what configurations need // to be update are stored in data files in this directory. Any keytab files are stored in @@ -545,6 +552,16 @@ public class KerberosHelper { // keytab files, and configurations need to be created or updated. for (ServiceComponentHost sch : serviceComponentHosts) { String serviceName = sch.getServiceName(); + String componentName = sch.getServiceComponentName(); + + // If the current ServiceComponentHost represents the KERBEROS/KERBEROS_CLIENT and + // indicates that the KERBEROS_CLIENT component is in the INSTALLED state, add the + // current host to the set of hosts that should be handled... + if(Service.Type.KERBEROS.name().equals(serviceName) && + Role.KERBEROS_CLIENT.name().equals(componentName) && + (sch.getState() == State.INSTALLED)) { + hostsWithValidKerberosClient.add(hostname); + } // If there is no filter or the filter contains the current service name... if ((serviceComponentFilter == null) || serviceComponentFilter.containsKey(serviceName)) { @@ -552,7 +569,6 @@ public class KerberosHelper { KerberosServiceDescriptor serviceDescriptor = kerberosDescriptor.getService(serviceName); if (serviceDescriptor != null) { - String componentName = sch.getServiceComponentName(); int identitiesAdded = 0; List<KerberosIdentityDescriptor> serviceIdentities = serviceDescriptor.getIdentities(true); @@ -607,6 +623,17 @@ public class KerberosHelper { } } + // Filter out ServiceComponentHosts not ready for processing from serviceComponentHostsToProcess + // by pruning off the ones that on hosts that are not in hostsWithValidKerberosClient + Iterator<ServiceComponentHost> iterator = serviceComponentHostsToProcess.iterator(); + while(iterator.hasNext()) { + ServiceComponentHost sch = iterator.next(); + + if(!hostsWithValidKerberosClient.contains(sch.getHostName())) { + iterator.remove(); + } + } + // If there are ServiceComponentHosts to process, make sure the administrator credentials // are available if (!serviceComponentHostsToProcess.isEmpty()) { @@ -1650,7 +1677,7 @@ public class KerberosHelper { List<String> hostsToUpdate = createUniqueHostList(serviceComponentHosts, Collections.singleton(HostState.HEALTHY)); Map<String, String> requestParams = new HashMap<String, String>(); List<RequestResourceFilter> requestResourceFilters = new ArrayList<RequestResourceFilter>(); - RequestResourceFilter reqResFilter = new RequestResourceFilter("KERBEROS", "KERBEROS_CLIENT", hostsToUpdate); + RequestResourceFilter reqResFilter = new RequestResourceFilter(Service.Type.KERBEROS.name(), Role.KERBEROS_CLIENT.name(), hostsToUpdate); requestResourceFilters.add(reqResFilter); ActionExecutionContext actionExecContext = new ActionExecutionContext( http://git-wip-us.apache.org/repos/asf/ambari/blob/57509711/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java index d05f209..1137cba 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java @@ -133,6 +133,7 @@ public interface Service { FLUME, YARN, MAPREDUCE2, - AMBARI_METRICS + AMBARI_METRICS, + KERBEROS } } http://git-wip-us.apache.org/repos/asf/ambari/blob/57509711/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 7db2653..c80970a 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 @@ -23,6 +23,7 @@ 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; import org.apache.ambari.server.actionmanager.HostRoleCommand; import org.apache.ambari.server.actionmanager.RequestFactory; @@ -56,6 +57,7 @@ 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.StackId; +import org.apache.ambari.server.state.State; import org.apache.ambari.server.state.cluster.ClusterFactory; import org.apache.ambari.server.state.cluster.ClustersImpl; import org.apache.ambari.server.state.host.HostFactory; @@ -87,14 +89,8 @@ import java.util.List; import java.util.Map; import java.util.Set; -import static org.easymock.EasyMock.anyLong; -import static org.easymock.EasyMock.anyObject; -import static org.easymock.EasyMock.capture; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.expectLastCall; -import static org.easymock.EasyMock.reset; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; +import static org.easymock.EasyMock.*; +import static org.easymock.EasyMock.createNiceMock; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -320,12 +316,17 @@ public class KerberosHelperTest extends EasyMockSupport { @Test public void testRegenerateKeytabsValidateRequestStageContainer() throws Exception { - testRegenerateKeytabs(new KerberosCredential("principal", "password", "keytab"), false); + testRegenerateKeytabs(new KerberosCredential("principal", "password", "keytab"), true, false); + } + + @Test + public void testRegenerateKeytabsValidateSkipInvalidHost() throws Exception { + testRegenerateKeytabs(new KerberosCredential("principal", "password", "keytab"), true, true); } @Test public void testRegenerateKeytabs() throws Exception { - testRegenerateKeytabs(new KerberosCredential("principal", "password", "keytab"), false); + testRegenerateKeytabs(new KerberosCredential("principal", "password", "keytab"), false, false); } @Test @@ -341,6 +342,15 @@ public class KerberosHelperTest extends EasyMockSupport { final StackId stackVersion = createNiceMock(StackId.class); + 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.getStackVersion()).andReturn(stackVersion).anyTimes(); + expect(schKerberosClient.getHostName()).andReturn("host1").anyTimes(); + expect(schKerberosClient.getState()).andReturn(State.INSTALLED).anyTimes(); + final ServiceComponentHost sch1 = createMock(ServiceComponentHost.class); expect(sch1.getServiceName()).andReturn("SERVICE1").anyTimes(); expect(sch1.getServiceComponentName()).andReturn("COMPONENT1").anyTimes(); @@ -348,6 +358,7 @@ public class KerberosHelperTest extends EasyMockSupport { expect(sch1.getDesiredSecurityState()).andReturn(SecurityState.UNSECURED).anyTimes(); expect(sch1.getStackVersion()).andReturn(stackVersion).anyTimes(); expect(sch1.getHostName()).andReturn("host1").anyTimes(); + expect(sch1.getState()).andReturn(State.INSTALLED).anyTimes(); sch1.setDesiredSecurityState(SecurityState.SECURED_KERBEROS); expect(expectLastCall()).once(); @@ -361,6 +372,7 @@ public class KerberosHelperTest extends EasyMockSupport { expect(sch2.getDesiredSecurityState()).andReturn(SecurityState.UNSECURED).anyTimes(); expect(sch2.getStackVersion()).andReturn(stackVersion).anyTimes(); expect(sch2.getHostName()).andReturn("host1").anyTimes(); + expect(sch2.getState()).andReturn(State.INSTALLED).anyTimes(); sch2.setDesiredSecurityState(SecurityState.SECURED_KERBEROS); expect(expectLastCall()).once(); @@ -371,6 +383,18 @@ public class KerberosHelperTest extends EasyMockSupport { expect(host.getHostName()).andReturn("host1").anyTimes(); expect(host.getState()).andReturn(HostState.HEALTHY).anyTimes(); + final ServiceComponent serviceComponentKerberosClient = createNiceMock(ServiceComponent.class); + expect(serviceComponentKerberosClient.getName()).andReturn(Role.KERBEROS_CLIENT.name()).anyTimes(); + expect(serviceComponentKerberosClient.getServiceComponentHosts()).andReturn(Collections.singletonMap("host1", schKerberosClient)).anyTimes(); + + final Service serviceKerberos = createStrictMock(Service.class); + expect(serviceKerberos.getName()).andReturn(Service.Type.KERBEROS.name()).anyTimes(); + expect(serviceKerberos.getServiceComponents()) + .andReturn(Collections.singletonMap(Role.KERBEROS_CLIENT.name(), serviceComponentKerberosClient)) + .times(3); + serviceKerberos.setSecurityState(SecurityState.SECURED_KERBEROS); + expectLastCall().once(); + final Service service1 = createStrictMock(Service.class); expect(service1.getName()).andReturn("SERVICE1").anyTimes(); expect(service1.getServiceComponents()) @@ -408,6 +432,7 @@ public class KerberosHelperTest extends EasyMockSupport { expect(cluster.getServices()) .andReturn(new HashMap<String, Service>() { { + put(Service.Type.KERBEROS.name(), serviceKerberos); put("SERVICE1", service1); put("SERVICE2", service2); } @@ -416,6 +441,7 @@ public class KerberosHelperTest extends EasyMockSupport { expect(cluster.getServiceComponentHosts("host1")) .andReturn(new ArrayList<ServiceComponentHost>() { { + add(schKerberosClient); add(sch1); add(sch2); } @@ -593,6 +619,14 @@ public class KerberosHelperTest extends EasyMockSupport { final StackId stackVersion = createNiceMock(StackId.class); + 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.getStackVersion()).andReturn(stackVersion).anyTimes(); + expect(schKerberosClient.getHostName()).andReturn("host1").anyTimes(); + expect(schKerberosClient.getState()).andReturn(State.INSTALLED).anyTimes(); final ServiceComponentHost sch1 = createMock(ServiceComponentHost.class); expect(sch1.getServiceName()).andReturn("SERVICE1").times(2); @@ -600,6 +634,8 @@ public class KerberosHelperTest extends EasyMockSupport { expect(sch1.getSecurityState()).andReturn(SecurityState.SECURED_KERBEROS).anyTimes(); expect(sch1.getDesiredSecurityState()).andReturn(SecurityState.SECURED_KERBEROS).anyTimes(); expect(sch1.getStackVersion()).andReturn(stackVersion).anyTimes(); + expect(sch1.getHostName()).andReturn("host1").anyTimes(); + expect(sch1.getState()).andReturn(State.INSTALLED).anyTimes(); sch1.setDesiredSecurityState(SecurityState.UNSECURED); expect(expectLastCall()).once(); @@ -612,6 +648,8 @@ public class KerberosHelperTest extends EasyMockSupport { expect(sch2.getSecurityState()).andReturn(SecurityState.SECURED_KERBEROS).anyTimes(); expect(sch2.getDesiredSecurityState()).andReturn(SecurityState.SECURED_KERBEROS).anyTimes(); expect(sch2.getStackVersion()).andReturn(stackVersion).anyTimes(); + expect(sch2.getHostName()).andReturn("host1").anyTimes(); + expect(sch2.getState()).andReturn(State.INSTALLED).anyTimes(); sch2.setDesiredSecurityState(SecurityState.UNSECURED); expect(expectLastCall()).once(); @@ -621,6 +659,18 @@ public class KerberosHelperTest extends EasyMockSupport { final Host host = createNiceMock(Host.class); expect(host.getHostName()).andReturn("host1").anyTimes(); + final ServiceComponent serviceComponentKerberosClient = createNiceMock(ServiceComponent.class); + expect(serviceComponentKerberosClient.getName()).andReturn(Role.KERBEROS_CLIENT.name()).anyTimes(); + expect(serviceComponentKerberosClient.getServiceComponentHosts()).andReturn(Collections.singletonMap("host1", schKerberosClient)).anyTimes(); + + final Service serviceKerberos = createStrictMock(Service.class); + expect(serviceKerberos.getName()).andReturn(Service.Type.KERBEROS.name()).anyTimes(); + expect(serviceKerberos.getServiceComponents()) + .andReturn(Collections.singletonMap(Role.KERBEROS_CLIENT.name(), serviceComponentKerberosClient)) + .times(3); + serviceKerberos.setSecurityState(SecurityState.UNSECURED); + expectLastCall().once(); + final Service service1 = createStrictMock(Service.class); expect(service1.getName()).andReturn("SERVICE1").anyTimes(); expect(service1.getServiceComponents()) @@ -657,6 +707,7 @@ public class KerberosHelperTest extends EasyMockSupport { expect(cluster.getServices()) .andReturn(new HashMap<String, Service>() { { + put(Service.Type.KERBEROS.name(), serviceKerberos); put("SERVICE1", service1); put("SERVICE2", service2); } @@ -665,6 +716,7 @@ public class KerberosHelperTest extends EasyMockSupport { expect(cluster.getServiceComponentHosts("host1")) .andReturn(new ArrayList<ServiceComponentHost>() { { + add(schKerberosClient); add(sch1); add(sch2); } @@ -822,12 +874,18 @@ public class KerberosHelperTest extends EasyMockSupport { verifyAll(); } - private void testRegenerateKeytabs(final KerberosCredential kerberosCredential, boolean mockRequestStageContainer) throws Exception { + private void testRegenerateKeytabs(final KerberosCredential kerberosCredential, boolean mockRequestStageContainer, final boolean testInvalidHost) throws Exception { KerberosHelper kerberosHelper = injector.getInstance(KerberosHelper.class); final StackId stackVersion = createNiceMock(StackId.class); + 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.getHostName()).andReturn("host1").anyTimes(); + expect(schKerberosClient.getState()).andReturn(State.INSTALLED).anyTimes(); + final ServiceComponentHost sch1 = createMock(ServiceComponentHost.class); expect(sch1.getServiceName()).andReturn("SERVICE1").anyTimes(); expect(sch1.getServiceComponentName()).andReturn("COMPONENT1").anyTimes(); @@ -848,6 +906,51 @@ public class KerberosHelperTest extends EasyMockSupport { expect(host.getHostName()).andReturn("host1").anyTimes(); expect(host.getState()).andReturn(HostState.HEALTHY).anyTimes(); + final ServiceComponentHost schKerberosClientInvalid; + final ServiceComponentHost sch1a; + final Host hostInvalid; + if(testInvalidHost) { + schKerberosClientInvalid = createMock(ServiceComponentHost.class); + expect(schKerberosClientInvalid.getServiceName()).andReturn(Service.Type.KERBEROS.name()).anyTimes(); + expect(schKerberosClientInvalid.getServiceComponentName()).andReturn(Role.KERBEROS_CLIENT.name()).anyTimes(); + expect(schKerberosClientInvalid.getHostName()).andReturn("host2").anyTimes(); + expect(schKerberosClientInvalid.getState()).andReturn(State.INIT).anyTimes(); + + sch1a = createMock(ServiceComponentHost.class); + expect(sch1a.getServiceName()).andReturn("SERVICE1").anyTimes(); + expect(sch1a.getServiceComponentName()).andReturn("COMPONENT1").anyTimes(); + expect(sch1a.getSecurityState()).andReturn(SecurityState.UNSECURED).anyTimes(); + expect(sch1a.getDesiredSecurityState()).andReturn(SecurityState.UNSECURED).anyTimes(); + expect(sch1a.getStackVersion()).andReturn(stackVersion).anyTimes(); + expect(sch1a.getHostName()).andReturn("host2").anyTimes(); + + hostInvalid = createNiceMock(Host.class); + expect(hostInvalid.getHostName()).andReturn("host1").anyTimes(); + expect(hostInvalid.getState()).andReturn(HostState.HEALTHY).anyTimes(); + } + else { + schKerberosClientInvalid = null; + sch1a = null; + hostInvalid = null; + } + + Map<String, ServiceComponentHost> map = new HashMap<String, ServiceComponentHost>(); + final ServiceComponent serviceComponentKerberosClient = createNiceMock(ServiceComponent.class); + map.put("host1", schKerberosClient); + expect(serviceComponentKerberosClient.getName()).andReturn(Role.KERBEROS_CLIENT.name()).anyTimes(); + + if(testInvalidHost) { + map.put("host2", schKerberosClientInvalid); + } + + expect(serviceComponentKerberosClient.getServiceComponentHosts()).andReturn(map).anyTimes(); + + final Service serviceKerberos = createStrictMock(Service.class); + expect(serviceKerberos.getName()).andReturn(Service.Type.KERBEROS.name()).anyTimes(); + expect(serviceKerberos.getServiceComponents()) + .andReturn(Collections.singletonMap(Role.KERBEROS_CLIENT.name(), serviceComponentKerberosClient)) + .times(3); + final Service service1 = createStrictMock(Service.class); expect(service1.getName()).andReturn("SERVICE1").anyTimes(); expect(service1.getServiceComponents()) @@ -880,6 +983,7 @@ public class KerberosHelperTest extends EasyMockSupport { expect(cluster.getServices()) .andReturn(new HashMap<String, Service>() { { + put(Service.Type.KERBEROS.name(), serviceKerberos); put("SERVICE1", service1); put("SERVICE2", service2); } @@ -888,6 +992,7 @@ public class KerberosHelperTest extends EasyMockSupport { expect(cluster.getServiceComponentHosts("host1")) .andReturn(new ArrayList<ServiceComponentHost>() { { + add(schKerberosClient); add(sch1); add(sch2); } @@ -909,6 +1014,10 @@ public class KerberosHelperTest extends EasyMockSupport { .andReturn(new HashMap<String, Host>() { { put("host1", host); + + if (testInvalidHost) { + put("host2", hostInvalid); + } } }) .once(); @@ -1109,6 +1218,12 @@ public class KerberosHelperTest extends EasyMockSupport { private void testEnsureIdentities(final KerberosCredential kerberosCredential) throws Exception { KerberosHelper kerberosHelper = injector.getInstance(KerberosHelper.class); + 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.getHostName()).andReturn("host1").anyTimes(); + expect(schKerberosClient.getState()).andReturn(State.INSTALLED).anyTimes(); + final ServiceComponentHost sch1 = createMock(ServiceComponentHost.class); expect(sch1.getServiceName()).andReturn("SERVICE1").anyTimes(); expect(sch1.getServiceComponentName()).andReturn("COMPONENT1").anyTimes(); @@ -1116,6 +1231,7 @@ public class KerberosHelperTest extends EasyMockSupport { final ServiceComponentHost sch2 = createStrictMock(ServiceComponentHost.class); expect(sch2.getServiceName()).andReturn("SERVICE2").anyTimes(); + expect(sch2.getServiceComponentName()).andReturn("COMPONENT3").anyTimes(); final ServiceComponentHost sch3 = createStrictMock(ServiceComponentHost.class); expect(sch3.getServiceName()).andReturn("SERVICE3").anyTimes(); @@ -1126,6 +1242,16 @@ public class KerberosHelperTest extends EasyMockSupport { expect(host.getHostName()).andReturn("host1").anyTimes(); expect(host.getState()).andReturn(HostState.HEALTHY).anyTimes(); + final ServiceComponent serviceComponentKerberosClient = createNiceMock(ServiceComponent.class); + expect(serviceComponentKerberosClient.getName()).andReturn(Role.KERBEROS_CLIENT.name()).anyTimes(); + expect(serviceComponentKerberosClient.getServiceComponentHosts()).andReturn(Collections.singletonMap("host1", schKerberosClient)).anyTimes(); + + final Service serviceKerberos = createStrictMock(Service.class); + expect(serviceKerberos.getName()).andReturn(Service.Type.KERBEROS.name()).anyTimes(); + expect(serviceKerberos.getServiceComponents()) + .andReturn(Collections.singletonMap(Role.KERBEROS_CLIENT.name(), serviceComponentKerberosClient)) + .times(3); + final Service service1 = createStrictMock(Service.class); expect(service1.getName()).andReturn("SERVICE1").anyTimes(); expect(service1.getServiceComponents()) @@ -1157,6 +1283,7 @@ public class KerberosHelperTest extends EasyMockSupport { expect(cluster.getServices()) .andReturn(new HashMap<String, Service>() { { + put(Service.Type.KERBEROS.name(), serviceKerberos); put("SERVICE1", service1); put("SERVICE2", service2); } @@ -1168,6 +1295,7 @@ public class KerberosHelperTest extends EasyMockSupport { add(sch1); add(sch2); add(sch3); + add(schKerberosClient); } }) .once();