blob: 84f81242001627124afa14404b23a2073816aeb1 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.server.controller.internal;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.RoleCommand;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.controller.AmbariManagementController;
import org.apache.ambari.server.controller.KerberosHelper;
import org.apache.ambari.server.controller.MaintenanceStateHelper;
import org.apache.ambari.server.controller.RequestStatusResponse;
import org.apache.ambari.server.controller.ServiceComponentHostRequest;
import org.apache.ambari.server.controller.ServiceComponentHostResponse;
import org.apache.ambari.server.controller.ServiceRequest;
import org.apache.ambari.server.controller.ServiceResponse;
import org.apache.ambari.server.controller.spi.Predicate;
import org.apache.ambari.server.controller.spi.Request;
import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.controller.spi.ResourceProvider;
import org.apache.ambari.server.controller.spi.SystemException;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.apache.ambari.server.metadata.RoleCommandOrder;
import org.apache.ambari.server.security.TestAuthenticationFactory;
import org.apache.ambari.server.security.authorization.AuthorizationException;
import org.apache.ambari.server.serveraction.kerberos.KerberosAdminAuthenticationException;
import org.apache.ambari.server.serveraction.kerberos.KerberosMissingAdminCredentialsException;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
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.ServiceFactory;
import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.State;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.easymock.EasyMock.anyBoolean;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.isNull;
import static org.easymock.EasyMock.newCapture;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
/**
* ServiceResourceProvider tests.
*/
public class ServiceResourceProviderTest {
@Before
public void clearAuthentication() {
SecurityContextHolder.getContext().setAuthentication(null);
}
@Test
public void testCreateResourcesAsAdministrator() throws Exception{
testCreateResources(TestAuthenticationFactory.createAdministrator());
}
@Test
public void testCreateResourcesAsClusterAdministrator() throws Exception{
testCreateResources(TestAuthenticationFactory.createClusterAdministrator());
}
@Test(expected = AuthorizationException.class)
public void testCreateResourcesAsServiceAdministrator() throws Exception{
testCreateResources(TestAuthenticationFactory.createServiceAdministrator());
}
private void testCreateResources(Authentication authentication) throws Exception{
AmbariManagementController managementController = createNiceMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service = createNiceMock(Service.class);
StackId stackId = createNiceMock(StackId.class);
ServiceFactory serviceFactory = createNiceMock(ServiceFactory.class);
AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo);
expect(managementController.getServiceFactory()).andReturn(serviceFactory);
expect(serviceFactory.createNew(cluster, "Service100")).andReturn(service);
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getService("Service100")).andReturn(null);
expect(cluster.getDesiredStackVersion()).andReturn(stackId);
expect(cluster.getClusterId()).andReturn(2L).anyTimes();
expect(ambariMetaInfo.isValidService( (String) anyObject(), (String) anyObject(), (String) anyObject())).andReturn(true);
// replay
replay(managementController, clusters, cluster, service, ambariMetaInfo, stackId, serviceFactory);
SecurityContextHolder.getContext().setAuthentication(authentication);
ResourceProvider provider = getServiceProvider(managementController);
// add the property map to a set for the request. add more maps for multiple creates
Set<Map<String, Object>> propertySet = new LinkedHashSet<Map<String, Object>>();
// Service 1: create a map of properties for the request
Map<String, Object> properties = new LinkedHashMap<String, Object>();
// add properties to the request map
properties.put(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID, "Cluster100");
properties.put(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID, "Service100");
properties.put(ServiceResourceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID, "INIT");
propertySet.add(properties);
// create the request
Request request = PropertyHelper.getCreateRequest(propertySet, null);
provider.createResources(request);
// verify
verify(managementController, clusters, cluster, service, ambariMetaInfo, stackId, serviceFactory);
}
@Test
public void testGetResourcesAsAdministrator() throws Exception{
testGetResources(TestAuthenticationFactory.createAdministrator());
}
@Test
public void testGetResourcesAsClusterAdministrator() throws Exception{
testGetResources(TestAuthenticationFactory.createClusterAdministrator());
}
@Test
public void testGetResourcesAsServiceAdministrator() throws Exception{
testGetResources(TestAuthenticationFactory.createServiceAdministrator());
}
private void testGetResources(Authentication authentication) throws Exception{
AmbariManagementController managementController = createMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service0 = createNiceMock(Service.class);
Service service1 = createNiceMock(Service.class);
Service service2 = createNiceMock(Service.class);
Service service3 = createNiceMock(Service.class);
Service service4 = createNiceMock(Service.class);
ServiceResponse serviceResponse0 = createNiceMock(ServiceResponse.class);
ServiceResponse serviceResponse1 = createNiceMock(ServiceResponse.class);
ServiceResponse serviceResponse2 = createNiceMock(ServiceResponse.class);
ServiceResponse serviceResponse3 = createNiceMock(ServiceResponse.class);
ServiceResponse serviceResponse4 = createNiceMock(ServiceResponse.class);
StackId stackId = createNiceMock(StackId.class);
ServiceFactory serviceFactory = createNiceMock(ServiceFactory.class);
AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
Map<String, Service> allResponseMap = new HashMap<String, Service>();
allResponseMap.put("Service100", service0);
allResponseMap.put("Service101", service1);
allResponseMap.put("Service102", service2);
allResponseMap.put("Service103", service3);
allResponseMap.put("Service104", service4);
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
expect(managementController.getServiceFactory()).andReturn(serviceFactory).anyTimes();
expect(managementController.getHostComponents(EasyMock.<Set<ServiceComponentHostRequest>>anyObject())).
andReturn(Collections.<ServiceComponentHostResponse>emptySet()).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getServices()).andReturn(allResponseMap).anyTimes();
expect(cluster.getService("Service102")).andReturn(service2);
expect(service0.convertToResponse()).andReturn(serviceResponse0).anyTimes();
expect(service1.convertToResponse()).andReturn(serviceResponse1).anyTimes();
expect(service2.convertToResponse()).andReturn(serviceResponse2).anyTimes();
expect(service3.convertToResponse()).andReturn(serviceResponse3).anyTimes();
expect(service4.convertToResponse()).andReturn(serviceResponse4).anyTimes();
expect(service0.getName()).andReturn("Service100").anyTimes();
expect(service1.getName()).andReturn("Service101").anyTimes();
expect(service2.getName()).andReturn("Service102").anyTimes();
expect(service3.getName()).andReturn("Service103").anyTimes();
expect(service4.getName()).andReturn("Service104").anyTimes();
expect(service0.getDesiredState()).andReturn(State.INIT);
expect(service1.getDesiredState()).andReturn(State.INSTALLED);
expect(service2.getDesiredState()).andReturn(State.INIT);
expect(service3.getDesiredState()).andReturn(State.INSTALLED);
expect(service4.getDesiredState()).andReturn(State.INIT);
expect(serviceResponse0.getClusterName()).andReturn("Cluster100").anyTimes();
expect(serviceResponse0.getServiceName()).andReturn("Service100").anyTimes();
expect(serviceResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
expect(serviceResponse1.getServiceName()).andReturn("Service101").anyTimes();
expect(serviceResponse2.getClusterName()).andReturn("Cluster100").anyTimes();
expect(serviceResponse2.getServiceName()).andReturn("Service102").anyTimes();
expect(serviceResponse3.getClusterName()).andReturn("Cluster100").anyTimes();
expect(serviceResponse3.getServiceName()).andReturn("Service103").anyTimes();
expect(serviceResponse4.getClusterName()).andReturn("Cluster100").anyTimes();
expect(serviceResponse4.getServiceName()).andReturn("Service104").anyTimes();
// replay
replay(managementController, clusters, cluster,
service0, service1, service2, service3, service4,
serviceResponse0, serviceResponse1, serviceResponse2, serviceResponse3, serviceResponse4,
ambariMetaInfo, stackId, serviceFactory);
SecurityContextHolder.getContext().setAuthentication(authentication);
ResourceProvider provider = getServiceProvider(managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID);
propertyIds.add(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID);
// create the request
Predicate predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").toPredicate();
Request request = PropertyHelper.getReadRequest("ServiceInfo");
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(5, resources.size());
Set<String> names = new HashSet<String>();
for (Resource resource : resources) {
String clusterName = (String) resource.getPropertyValue(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID);
Assert.assertEquals("Cluster100", clusterName);
names.add((String) resource.getPropertyValue(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID));
}
// Make sure that all of the response objects got moved into resources
for (Service service : allResponseMap.values() ) {
Assert.assertTrue(names.contains(service.getName()));
}
// get service named Service102
predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and().
property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("Service102").toPredicate();
request = PropertyHelper.getReadRequest("ServiceInfo");
resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
Assert.assertEquals("Service102", resources.iterator().next().getPropertyValue(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID));
// get services where state == "INIT"
predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and().
property(ServiceResourceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID).equals("INIT").toPredicate();
request = PropertyHelper.getReadRequest(propertyIds);
resources = provider.getResources(request, predicate);
Assert.assertEquals(3, resources.size());
names = new HashSet<String>();
for (Resource resource : resources) {
String clusterName = (String) resource.getPropertyValue(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID);
Assert.assertEquals("Cluster100", clusterName);
names.add((String) resource.getPropertyValue(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID));
}
// verify
verify(managementController, clusters, cluster,
service0, service1, service2, service3, service4,
serviceResponse0, serviceResponse1, serviceResponse2, serviceResponse3, serviceResponse4,
ambariMetaInfo, stackId, serviceFactory);
}
@Test
public void testGetResources_KerberosSpecificProperties() throws Exception{
AmbariManagementController managementController = createMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service0 = createNiceMock(Service.class);
ServiceResponse serviceResponse0 = createNiceMock(ServiceResponse.class);
StackId stackId = createNiceMock(StackId.class);
ServiceFactory serviceFactory = createNiceMock(ServiceFactory.class);
AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
KerberosHelper kerberosHeper = createStrictMock(KerberosHelper.class);
Map<String, Service> allResponseMap = new HashMap<String, Service>();
allResponseMap.put("KERBEROS", service0);
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
expect(managementController.getServiceFactory()).andReturn(serviceFactory).anyTimes();
expect(managementController.getHostComponents(EasyMock.<Set<ServiceComponentHostRequest>>anyObject())).
andReturn(Collections.<ServiceComponentHostResponse>emptySet()).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getServices()).andReturn(allResponseMap).anyTimes();
expect(cluster.getService("KERBEROS")).andReturn(service0);
expect(service0.convertToResponse()).andReturn(serviceResponse0).anyTimes();
expect(service0.getName()).andReturn("Service100").anyTimes();
expect(serviceResponse0.getClusterName()).andReturn("Cluster100").anyTimes();
expect(serviceResponse0.getServiceName()).andReturn("KERBEROS").anyTimes();
kerberosHeper.validateKDCCredentials(cluster);
// replay
replay(managementController, clusters, cluster, service0, serviceResponse0,
ambariMetaInfo, stackId, serviceFactory, kerberosHeper);
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
ResourceProvider provider = getServiceProvider(managementController);
// set kerberos helper on provider
Class<?> c = provider.getClass();
Field f = c.getDeclaredField("kerberosHelper");
f.setAccessible(true);
f.set(provider, kerberosHeper);
// create the request
Predicate predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and().
property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("KERBEROS").toPredicate();
Request request = PropertyHelper.getReadRequest("ServiceInfo", "Services");
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals("Cluster100", resource.getPropertyValue(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID));
Assert.assertEquals("KERBEROS", resource.getPropertyValue(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID));
Assert.assertEquals("OK", resource.getPropertyValue("Services/attributes/kdc_validation_result"));
Assert.assertEquals("", resource.getPropertyValue("Services/attributes/kdc_validation_failure_details"));
}
// verify
verify(managementController, clusters, cluster, service0, serviceResponse0,
ambariMetaInfo, stackId, serviceFactory, kerberosHeper);
}
@Test
public void testGetResources_KerberosSpecificProperties_NoKDCValidation() throws Exception{
AmbariManagementController managementController = createMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service0 = createNiceMock(Service.class);
ServiceResponse serviceResponse0 = createNiceMock(ServiceResponse.class);
StackId stackId = createNiceMock(StackId.class);
ServiceFactory serviceFactory = createNiceMock(ServiceFactory.class);
AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
KerberosHelper kerberosHelper = createStrictMock(KerberosHelper.class);
Map<String, Service> allResponseMap = new HashMap<String, Service>();
allResponseMap.put("KERBEROS", service0);
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
expect(managementController.getServiceFactory()).andReturn(serviceFactory).anyTimes();
expect(managementController.getHostComponents(EasyMock.<Set<ServiceComponentHostRequest>>anyObject())).
andReturn(Collections.<ServiceComponentHostResponse>emptySet()).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getServices()).andReturn(allResponseMap).anyTimes();
expect(cluster.getService("KERBEROS")).andReturn(service0);
expect(service0.convertToResponse()).andReturn(serviceResponse0).anyTimes();
expect(service0.getName()).andReturn("Service100").anyTimes();
expect(serviceResponse0.getClusterName()).andReturn("Cluster100").anyTimes();
expect(serviceResponse0.getServiceName()).andReturn("KERBEROS").anyTimes();
// The following call should NOT be made
// kerberosHelper.validateKDCCredentials(cluster);
// replay
replay(managementController, clusters, cluster, service0, serviceResponse0,
ambariMetaInfo, stackId, serviceFactory, kerberosHelper);
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
ResourceProvider provider = getServiceProvider(managementController);
// set kerberos helper on provider
Class<?> c = provider.getClass();
Field f = c.getDeclaredField("kerberosHelper");
f.setAccessible(true);
f.set(provider, kerberosHelper);
// create the request
Predicate predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and().
property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("KERBEROS").toPredicate();
Request request = PropertyHelper.getReadRequest("ServiceInfo");
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals("Cluster100", resource.getPropertyValue(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID));
Assert.assertEquals("KERBEROS", resource.getPropertyValue(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID));
}
// verify
verify(managementController, clusters, cluster, service0, serviceResponse0,
ambariMetaInfo, stackId, serviceFactory, kerberosHelper);
}
@Test
public void testGetResources_KerberosSpecificProperties_KDCInvalidCredentials() throws Exception{
AmbariManagementController managementController = createMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service0 = createNiceMock(Service.class);
ServiceResponse serviceResponse0 = createNiceMock(ServiceResponse.class);
StackId stackId = createNiceMock(StackId.class);
ServiceFactory serviceFactory = createNiceMock(ServiceFactory.class);
AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
KerberosHelper kerberosHeper = createStrictMock(KerberosHelper.class);
Map<String, Service> allResponseMap = new HashMap<String, Service>();
allResponseMap.put("KERBEROS", service0);
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
expect(managementController.getServiceFactory()).andReturn(serviceFactory).anyTimes();
expect(managementController.getHostComponents(EasyMock.<Set<ServiceComponentHostRequest>>anyObject())).
andReturn(Collections.<ServiceComponentHostResponse>emptySet()).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getServices()).andReturn(allResponseMap).anyTimes();
expect(cluster.getService("KERBEROS")).andReturn(service0);
expect(service0.convertToResponse()).andReturn(serviceResponse0).anyTimes();
expect(service0.getName()).andReturn("Service100").anyTimes();
expect(serviceResponse0.getClusterName()).andReturn("Cluster100").anyTimes();
expect(serviceResponse0.getServiceName()).andReturn("KERBEROS").anyTimes();
kerberosHeper.validateKDCCredentials(cluster);
expectLastCall().andThrow(new KerberosAdminAuthenticationException("Invalid KDC administrator credentials."));
// replay
replay(managementController, clusters, cluster, service0, serviceResponse0,
ambariMetaInfo, stackId, serviceFactory, kerberosHeper);
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
ResourceProvider provider = getServiceProvider(managementController);
// set kerberos helper on provider
Class<?> c = provider.getClass();
Field f = c.getDeclaredField("kerberosHelper");
f.setAccessible(true);
f.set(provider, kerberosHeper);
// create the request
Predicate predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and().
property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("KERBEROS").toPredicate();
Request request = PropertyHelper.getReadRequest("ServiceInfo", "Services");
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals("Cluster100", resource.getPropertyValue(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID));
Assert.assertEquals("KERBEROS", resource.getPropertyValue(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID));
Assert.assertEquals("INVALID_CREDENTIALS", resource.getPropertyValue("Services/attributes/kdc_validation_result"));
Assert.assertEquals("Invalid KDC administrator credentials.", resource.getPropertyValue("Services/attributes/kdc_validation_failure_details"));
}
// verify
verify(managementController, clusters, cluster, service0, serviceResponse0,
ambariMetaInfo, stackId, serviceFactory, kerberosHeper);
}
@Test
public void testGetResources_KerberosSpecificProperties_KDCMissingCredentials() throws Exception{
AmbariManagementController managementController = createMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service0 = createNiceMock(Service.class);
ServiceResponse serviceResponse0 = createNiceMock(ServiceResponse.class);
StackId stackId = createNiceMock(StackId.class);
ServiceFactory serviceFactory = createNiceMock(ServiceFactory.class);
AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
KerberosHelper kerberosHeper = createStrictMock(KerberosHelper.class);
Map<String, Service> allResponseMap = new HashMap<String, Service>();
allResponseMap.put("KERBEROS", service0);
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
expect(managementController.getServiceFactory()).andReturn(serviceFactory).anyTimes();
expect(managementController.getHostComponents((Set<ServiceComponentHostRequest>) anyObject())).
andReturn(Collections.<ServiceComponentHostResponse>emptySet()).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getServices()).andReturn(allResponseMap).anyTimes();
expect(cluster.getService("KERBEROS")).andReturn(service0);
expect(service0.convertToResponse()).andReturn(serviceResponse0).anyTimes();
expect(service0.getName()).andReturn("Service100").anyTimes();
expect(serviceResponse0.getClusterName()).andReturn("Cluster100").anyTimes();
expect(serviceResponse0.getServiceName()).andReturn("KERBEROS").anyTimes();
kerberosHeper.validateKDCCredentials(cluster);
expectLastCall().andThrow(new KerberosMissingAdminCredentialsException("Missing KDC administrator credentials."));
// replay
replay(managementController, clusters, cluster, service0, serviceResponse0,
ambariMetaInfo, stackId, serviceFactory, kerberosHeper);
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
ResourceProvider provider = getServiceProvider(managementController);
// set kerberos helper on provider
Class<?> c = provider.getClass();
Field f = c.getDeclaredField("kerberosHelper");
f.setAccessible(true);
f.set(provider, kerberosHeper);
// create the request
Predicate predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and().
property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("KERBEROS").toPredicate();
Request request = PropertyHelper.getReadRequest("ServiceInfo", "Services");
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals("Cluster100", resource.getPropertyValue(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID));
Assert.assertEquals("KERBEROS", resource.getPropertyValue(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID));
Assert.assertEquals("MISSING_CREDENTIALS", resource.getPropertyValue("Services/attributes/kdc_validation_result"));
Assert.assertEquals("Missing KDC administrator credentials.", resource.getPropertyValue("Services/attributes/kdc_validation_failure_details"));
}
// verify
verify(managementController, clusters, cluster, service0, serviceResponse0,
ambariMetaInfo, stackId, serviceFactory, kerberosHeper);
}
@Test
public void testUpdateResourcesAsAdministrator() throws Exception{
testUpdateResources(TestAuthenticationFactory.createAdministrator());
}
@Test
public void testUpdateResourcesAsClusterAdministrator() throws Exception{
testUpdateResources(TestAuthenticationFactory.createClusterAdministrator());
}
@Test
public void testUpdateResourcesAsServiceAdministrator() throws Exception{
testUpdateResources(TestAuthenticationFactory.createServiceAdministrator());
}
private void testUpdateResources(Authentication authentication) throws Exception{
MaintenanceStateHelper maintenanceStateHelper = createNiceMock(MaintenanceStateHelper.class);
AmbariManagementController managementController = createMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service0 = createNiceMock(Service.class);
ServiceFactory serviceFactory = createNiceMock(ServiceFactory.class);
AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
RequestStageContainer requestStages = createNiceMock(RequestStageContainer.class);
RequestStatusResponse requestStatusResponse = createNiceMock(RequestStatusResponse.class);
RoleCommandOrder rco = createNiceMock(RoleCommandOrder.class);
Map<String, String> mapRequestProps = new HashMap<String, String>();
mapRequestProps.put("context", "Called from a test");
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
expect(managementController.getServiceFactory()).andReturn(serviceFactory).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getClusterId()).andReturn(2L).anyTimes();
expect(cluster.getService("Service102")).andReturn(service0);
expect(service0.getDesiredState()).andReturn(State.INSTALLED).anyTimes();
expect(service0.getServiceComponents()).andReturn(Collections.<String, ServiceComponent>emptyMap()).anyTimes();
Capture<Map<String, String>> requestPropertiesCapture = newCapture();
Capture<Map<State, List<Service>>> changedServicesCapture = newCapture();
Capture<Map<State, List<ServiceComponent>>> changedCompsCapture = newCapture();
Capture<Map<String, Map<State, List<ServiceComponentHost>>>> changedScHostsCapture = newCapture();
Capture<Map<String, String>> requestParametersCapture = newCapture();
Capture<Collection<ServiceComponentHost>> ignoredScHostsCapture = newCapture();
Capture<Cluster> clusterCapture = newCapture();
expect(managementController.addStages((RequestStageContainer) isNull(), capture(clusterCapture), capture(requestPropertiesCapture),
capture(requestParametersCapture), capture(changedServicesCapture), capture(changedCompsCapture),
capture(changedScHostsCapture), capture(ignoredScHostsCapture), anyBoolean(), anyBoolean()
)).andReturn(requestStages);
requestStages.persist();
expect(requestStages.getRequestStatusResponse()).andReturn(requestStatusResponse);
expect(maintenanceStateHelper.isOperationAllowed(anyObject(Resource.Type.class), anyObject(Service.class))).andReturn(true).anyTimes();
expect(service0.getCluster()).andReturn(cluster).anyTimes();
expect(managementController.getRoleCommandOrder(cluster)).andReturn(rco).
anyTimes();
expect(rco.getTransitiveServices(eq(service0), eq(RoleCommand.START))).
andReturn(Collections.<Service>emptySet()).anyTimes();
// replay
replay(managementController, clusters, cluster, rco, maintenanceStateHelper,
service0, serviceFactory, ambariMetaInfo, requestStages, requestStatusResponse);
SecurityContextHolder.getContext().setAuthentication(authentication);
ServiceResourceProvider provider = getServiceProvider(managementController, maintenanceStateHelper);
// add the property map to a set for the request.
Map<String, Object> properties = new LinkedHashMap<String, Object>();
properties.put(ServiceResourceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID, "STARTED");
// create the request
Request request = PropertyHelper.getUpdateRequest(properties, mapRequestProps);
// update the service named Service102
Predicate predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").
and().property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("Service102").toPredicate();
provider.updateResources(request, predicate);
// verify
verify(managementController, clusters, cluster, maintenanceStateHelper,
service0, serviceFactory, ambariMetaInfo, requestStages, requestStatusResponse);
}
@Test
public void testReconfigureClientsFlagAsAdministrator() throws Exception {
testReconfigureClientsFlag(TestAuthenticationFactory.createAdministrator());
}
@Test
public void testReconfigureClientsFlagAsClusterAdministrator() throws Exception {
testReconfigureClientsFlag(TestAuthenticationFactory.createAdministrator("clusterAdmin"));
}
@Test
public void testReconfigureClientsFlagAsServiceAdministrator() throws Exception {
testReconfigureClientsFlag(TestAuthenticationFactory.createServiceAdministrator());
}
private void testReconfigureClientsFlag(Authentication authentication) throws Exception {
MaintenanceStateHelper maintenanceStateHelper = createNiceMock(MaintenanceStateHelper.class);
AmbariManagementController managementController1 = createMock(AmbariManagementController.class);
AmbariManagementController managementController2 = createMock
(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service0 = createNiceMock(Service.class);
ServiceResponse serviceResponse0 = createNiceMock(ServiceResponse.class);
AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
RequestStageContainer requestStages1 = createNiceMock(RequestStageContainer.class);
RequestStageContainer requestStages2 = createNiceMock(RequestStageContainer.class);
RequestStatusResponse response1 = createNiceMock(RequestStatusResponse.class);
RequestStatusResponse response2 = createNiceMock(RequestStatusResponse
.class);
RoleCommandOrder rco = createNiceMock(RoleCommandOrder.class);
Map<String, String> mapRequestProps = new HashMap<String, String>();
mapRequestProps.put("context", "Called from a test");
// set expectations
expect(managementController1.getHostComponents(EasyMock.<Set<ServiceComponentHostRequest>>anyObject())).
andReturn(Collections.<ServiceComponentHostResponse>emptySet()).anyTimes();
expect(managementController2.getHostComponents(EasyMock.<Set<ServiceComponentHostRequest>>anyObject())).
andReturn(Collections.<ServiceComponentHostResponse>emptySet()).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(managementController1.getClusters()).andReturn(clusters).anyTimes();
expect(managementController1.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
expect(managementController2.getClusters()).andReturn(clusters).anyTimes();
expect(managementController2.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
expect(cluster.getClusterId()).andReturn(2L).anyTimes();
expect(cluster.getService("Service102")).andReturn(service0).anyTimes();
expect(service0.convertToResponse()).andReturn(serviceResponse0).anyTimes();
expect(service0.getDesiredState()).andReturn(State.INSTALLED).anyTimes();
expect(service0.getServiceComponents()).andReturn(Collections.<String, ServiceComponent>emptyMap()).anyTimes();
expect(serviceResponse0.getClusterName()).andReturn("Cluster100").anyTimes();
expect(serviceResponse0.getServiceName()).andReturn("Service102").anyTimes();
Capture<Map<String, String>> requestPropertiesCapture = newCapture();
Capture<Map<State, List<Service>>> changedServicesCapture = newCapture();
Capture<Map<State, List<ServiceComponent>>> changedCompsCapture = newCapture();
Capture<Map<String, Map<State, List<ServiceComponentHost>>>> changedScHostsCapture = newCapture();
Capture<Map<String, String>> requestParametersCapture = newCapture();
Capture<Collection<ServiceComponentHost>> ignoredScHostsCapture = newCapture();
Capture<Cluster> clusterCapture = newCapture();
expect(managementController1.addStages((RequestStageContainer) isNull(), capture(clusterCapture), capture(requestPropertiesCapture),
capture(requestParametersCapture), capture(changedServicesCapture), capture(changedCompsCapture),
capture(changedScHostsCapture), capture(ignoredScHostsCapture), anyBoolean(), anyBoolean()
)).andReturn(requestStages1);
expect(managementController2.addStages((RequestStageContainer) isNull(), capture(clusterCapture), capture(requestPropertiesCapture),
capture(requestParametersCapture), capture(changedServicesCapture), capture(changedCompsCapture),
capture(changedScHostsCapture), capture(ignoredScHostsCapture), anyBoolean(), anyBoolean()
)).andReturn(requestStages2);
requestStages1.persist();
expect(requestStages1.getRequestStatusResponse()).andReturn(response1);
requestStages2.persist();
expect(requestStages2.getRequestStatusResponse()).andReturn(response2);
expect(maintenanceStateHelper.isOperationAllowed(anyObject(Resource.Type.class), anyObject(Service.class))).andReturn(true).anyTimes();
expect(service0.getCluster()).andReturn(cluster).anyTimes();
expect(managementController1.getRoleCommandOrder(cluster)).andReturn(rco).
anyTimes();
expect(managementController2.getRoleCommandOrder(cluster)).andReturn(rco).
anyTimes();
expect(rco.getTransitiveServices(eq(service0), eq(RoleCommand.START))).
andReturn(Collections.<Service>emptySet()).anyTimes();
// replay
replay(managementController1, response1, managementController2, requestStages1, requestStages2, response2,
clusters, cluster, service0, serviceResponse0, ambariMetaInfo, rco, maintenanceStateHelper);
SecurityContextHolder.getContext().setAuthentication(authentication);
ServiceResourceProvider provider1 = getServiceProvider(managementController1, maintenanceStateHelper);
ServiceResourceProvider provider2 = getServiceProvider(managementController2, maintenanceStateHelper);
// add the property map to a set for the request.
Map<String, Object> properties = new LinkedHashMap<String, Object>();
properties.put(ServiceResourceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID,
"STARTED");
// create the request
Request request = PropertyHelper.getUpdateRequest(properties, mapRequestProps);
// update the service named Service102
Predicate predicate1 = new PredicateBuilder().property
(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").
and().property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).
equals("Service102").and().property("params/reconfigure_client").
equals("true").toPredicate();
Predicate predicate2 = new PredicateBuilder().property
(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").
and().property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).
equals("Service102").and().property("params/reconfigure_client").equals
("false").toPredicate();
provider1.updateResources(request, predicate1);
provider2.updateResources(request, predicate2);
// verify
verify(managementController1, response1, managementController2, requestStages1, requestStages2, response2,
clusters, cluster, service0, serviceResponse0, ambariMetaInfo, maintenanceStateHelper);
}
@Test
public void testDeleteResourcesAsAdministrator() throws Exception{
testDeleteResources(TestAuthenticationFactory.createAdministrator());
}
@Test
public void testDeleteResourcesAsClusterAdministrator() throws Exception{
testDeleteResources(TestAuthenticationFactory.createClusterAdministrator());
}
@Test(expected = AuthorizationException.class)
public void testDeleteResourcesAsServiceAdministrator() throws Exception{
testDeleteResources(TestAuthenticationFactory.createServiceAdministrator());
}
private void testDeleteResources(Authentication authentication) throws Exception{
AmbariManagementController managementController = createMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service = createNiceMock(Service.class);
String serviceName = "Service100";
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getClusterId()).andReturn(2L).anyTimes();
expect(cluster.getService(serviceName)).andReturn(service).anyTimes();
expect(service.getDesiredState()).andReturn(State.INSTALLED).anyTimes();
expect(service.getName()).andReturn(serviceName).anyTimes();
expect(service.getServiceComponents()).andReturn(new HashMap<String, ServiceComponent>());
expect(service.getCluster()).andReturn(cluster);
cluster.deleteService(serviceName);
// replay
replay(managementController, clusters, cluster, service);
SecurityContextHolder.getContext().setAuthentication(authentication);
ResourceProvider provider = getServiceProvider(managementController);
AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
((ObservableResourceProvider)provider).addObserver(observer);
// delete the service named Service100
Predicate predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and()
.property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals(serviceName).toPredicate();
provider.deleteResources(new RequestImpl(null, null, null, null), predicate);
ResourceProviderEvent lastEvent = observer.getLastEvent();
Assert.assertNotNull(lastEvent);
Assert.assertEquals(Resource.Type.Service, lastEvent.getResourceType());
Assert.assertEquals(ResourceProviderEvent.Type.Delete, lastEvent.getType());
Assert.assertEquals(predicate, lastEvent.getPredicate());
Assert.assertNull(lastEvent.getRequest());
// verify
verify(managementController, clusters, cluster, service);
}
@Test
public void testDeleteResourcesBadServiceState() throws Exception {
AmbariManagementController managementController = createMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service = createNiceMock(Service.class);
String serviceName = "Service100";
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getClusterId()).andReturn(2L).anyTimes();
expect(cluster.getService(serviceName)).andReturn(service).anyTimes();
expect(service.getDesiredState()).andReturn(State.STARTED).anyTimes();
expect(service.getName()).andReturn(serviceName).anyTimes();
expect(service.getServiceComponents()).andReturn(new HashMap<String, ServiceComponent>());
expect(service.getCluster()).andReturn(cluster);
cluster.deleteService(serviceName);
// replay
replay(managementController, clusters, cluster, service);
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
ResourceProvider provider = getServiceProvider(managementController);
AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
((ObservableResourceProvider)provider).addObserver(observer);
// delete the service named Service100
Predicate predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and()
.property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals(serviceName).toPredicate();
provider.deleteResources(new RequestImpl(null, null, null, null), predicate);
ResourceProviderEvent lastEvent = observer.getLastEvent();
Assert.assertNotNull(lastEvent);
Assert.assertEquals(Resource.Type.Service, lastEvent.getResourceType());
Assert.assertEquals(ResourceProviderEvent.Type.Delete, lastEvent.getType());
Assert.assertEquals(predicate, lastEvent.getPredicate());
Assert.assertNull(lastEvent.getRequest());
// verify
verify(managementController, clusters, cluster, service);
}
@Test
public void testDeleteResourcesBadComponentState() throws Exception{
AmbariManagementController managementController = createMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service = createNiceMock(Service.class);
ServiceComponent sc = createNiceMock(ServiceComponent.class);
Map<String, ServiceComponent> scMap = new HashMap<String, ServiceComponent>();
scMap.put("Component100", sc);
State componentState = State.STARTED;
ServiceComponentHost sch = createNiceMock(ServiceComponentHost.class);
Map<String, ServiceComponentHost> schMap = new HashMap<>();
schMap.put("Host1", sch);
State schState = State.STARTED;
String serviceName = "Service100";
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getService(serviceName)).andReturn(service).anyTimes();
expect(service.getDesiredState()).andReturn(State.INSTALLED).anyTimes();
expect(service.getName()).andReturn(serviceName).anyTimes();
expect(service.getServiceComponents()).andReturn(scMap);
expect(sc.getDesiredState()).andReturn(componentState).anyTimes();
expect(sc.getName()).andReturn("Component100").anyTimes();
expect(sc.canBeRemoved()).andReturn(componentState.isRemovableState()).anyTimes();
expect(sc.getServiceComponentHosts()).andReturn(schMap).anyTimes();
expect(sch.getDesiredState()).andReturn(schState).anyTimes();
expect(sch.canBeRemoved()).andReturn(schState.isRemovableState()).anyTimes();
// replay
replay(managementController, clusters, cluster, service, sc, sch);
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
ResourceProvider provider = getServiceProvider(managementController);
AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
((ObservableResourceProvider)provider).addObserver(observer);
// delete the service named Service100
Predicate predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and()
.property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals(serviceName).toPredicate();
try {
provider.deleteResources(new RequestImpl(null, null, null, null), predicate);
Assert.fail("Expected exception deleting a service in a non-removable state.");
} catch (SystemException e) {
// expected
}
}
/*
If the host components of a service are in a removable state, the service should be removable even if it's state is non-removable
*/
@Test
public void testDeleteResourcesStoppedHostComponentState() throws Exception {
AmbariManagementController managementController = createMock(AmbariManagementController.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service = createNiceMock(Service.class);
//
// Data structure for holding ServiceComponent information
//
class TestComponent {
public String Name;
public ServiceComponent Component;
public State DesiredState;
public TestComponent(String name, ServiceComponent component, State desiredState) {
Name = name;
Component = component;
DesiredState = desiredState;
}
}
//
// Set up three components in STARTED state.
//
TestComponent component1 = new TestComponent("Component100", createNiceMock(ServiceComponent.class), State.STARTED);
TestComponent component2 = new TestComponent("Component101", createNiceMock(ServiceComponent.class), State.STARTED);
TestComponent component3 = new TestComponent("Component102", createNiceMock(ServiceComponent.class), State.STARTED);
Map<String, ServiceComponent> scMap = new HashMap<String, ServiceComponent>();
scMap.put(component1.Name, component1.Component);
scMap.put(component2.Name, component2.Component);
scMap.put(component3.Name, component3.Component);
Map<String, ServiceComponentHost> schMap1 = new HashMap<>();
ServiceComponentHost sch1 = createNiceMock(ServiceComponentHost.class);
schMap1.put("Host1", sch1);
Map<String, ServiceComponentHost> schMap2 = new HashMap<>();
ServiceComponentHost sch2 = createNiceMock(ServiceComponentHost.class);
schMap2.put("Host2", sch2);
Map<String, ServiceComponentHost> schMap3 = new HashMap<>();
ServiceComponentHost sch3 = createNiceMock(ServiceComponentHost.class);
schMap3.put("Host3", sch3);
String clusterName = "Cluster100";
String serviceName = "Service100";
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(clusters.getCluster(clusterName)).andReturn(cluster).anyTimes();
expect(cluster.getService(serviceName)).andReturn(service).anyTimes();
expect(service.getDesiredState()).andReturn(State.STARTED).anyTimes(); // Service is in a non-removable state
expect(service.getName()).andReturn(serviceName).anyTimes();
expect(service.getServiceComponents()).andReturn(scMap).anyTimes();
expect(component1.Component.getDesiredState()).andReturn(component1.DesiredState).anyTimes();
expect(component2.Component.getDesiredState()).andReturn(component2.DesiredState).anyTimes();
expect(component3.Component.getDesiredState()).andReturn(component3.DesiredState).anyTimes();
expect(component1.Component.canBeRemoved()).andReturn(component1.DesiredState.isRemovableState()).anyTimes();
expect(component2.Component.canBeRemoved()).andReturn(component2.DesiredState.isRemovableState()).anyTimes();
expect(component3.Component.canBeRemoved()).andReturn(component3.DesiredState.isRemovableState()).anyTimes();
expect(component1.Component.getServiceComponentHosts()).andReturn(schMap1).anyTimes();
expect(component2.Component.getServiceComponentHosts()).andReturn(schMap2).anyTimes();
expect(component3.Component.getServiceComponentHosts()).andReturn(schMap3).anyTimes();
// Put the SCH in INSTALLED state so that the service can be deleted,
// no matter what state the service component is in.
State sch1State = State.INSTALLED;
expect(sch1.getDesiredState()).andReturn(sch1State).anyTimes();
expect(sch1.canBeRemoved()).andReturn(sch1State.isRemovableState()).anyTimes();
State sch2State = State.INSTALLED;
expect(sch2.getDesiredState()).andReturn(sch2State).anyTimes();
expect(sch2.canBeRemoved()).andReturn(sch2State.isRemovableState()).anyTimes();
State sch3State = State.INSTALLED;
expect(sch3.getDesiredState()).andReturn(sch3State).anyTimes();
expect(sch3.canBeRemoved()).andReturn(sch3State.isRemovableState()).anyTimes();
expect(service.getCluster()).andReturn(cluster);
cluster.deleteService(serviceName);
// replay
replay(managementController, clusters, cluster, service,
component1.Component, component2.Component, component3.Component, sch1, sch2, sch3);
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
ResourceProvider provider = getServiceProvider(managementController);
AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
((ObservableResourceProvider)provider).addObserver(observer);
// delete the service named Service100
Predicate predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals(clusterName).and()
.property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals(serviceName).toPredicate();
provider.deleteResources(new RequestImpl(null, null, null, null), predicate);
ResourceProviderEvent lastEvent = observer.getLastEvent();
Assert.assertNotNull(lastEvent);
Assert.assertEquals(Resource.Type.Service, lastEvent.getResourceType());
Assert.assertEquals(ResourceProviderEvent.Type.Delete, lastEvent.getType());
Assert.assertEquals(predicate, lastEvent.getPredicate());
Assert.assertNull(lastEvent.getRequest());
// verify
verify(managementController, clusters, cluster, service,
component1.Component, component2.Component, component3.Component, sch1, sch2, sch3);
}
@Test
public void testCheckPropertyIds() throws Exception {
Set<String> propertyIds = new HashSet<String>();
propertyIds.add("foo");
propertyIds.add("cat1/foo");
propertyIds.add("cat2/bar");
propertyIds.add("cat2/baz");
propertyIds.add("cat3/sub1/bam");
propertyIds.add("cat4/sub2/sub3/bat");
propertyIds.add("cat5/subcat5/map");
Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
AmbariManagementController managementController = createMock(AmbariManagementController.class);
MaintenanceStateHelper maintenanceStateHelperMock = createNiceMock(MaintenanceStateHelper.class);
AbstractResourceProvider provider = new ServiceResourceProvider(propertyIds,
keyPropertyIds,
managementController, maintenanceStateHelperMock);
Set<String> unsupported = provider.checkPropertyIds(Collections.singleton("foo"));
Assert.assertTrue(unsupported.isEmpty());
// note that key is not in the set of known property ids. We allow it if its parent is a known property.
// this allows for Map type properties where we want to treat the entries as individual properties
Assert.assertTrue(provider.checkPropertyIds(Collections.singleton("cat5/subcat5/map/key")).isEmpty());
unsupported = provider.checkPropertyIds(Collections.singleton("bar"));
Assert.assertEquals(1, unsupported.size());
Assert.assertTrue(unsupported.contains("bar"));
unsupported = provider.checkPropertyIds(Collections.singleton("cat1/foo"));
Assert.assertTrue(unsupported.isEmpty());
unsupported = provider.checkPropertyIds(Collections.singleton("cat1"));
Assert.assertTrue(unsupported.isEmpty());
unsupported = provider.checkPropertyIds(Collections.singleton("config"));
Assert.assertTrue(unsupported.isEmpty());
unsupported = provider.checkPropertyIds(Collections.singleton("config/unknown_property"));
Assert.assertTrue(unsupported.isEmpty());
}
/**
* This factory method creates default MaintenanceStateHelper mock.
* It's useful in most cases (when we don't care about Maintenance State)
*/
public static ServiceResourceProvider getServiceProvider(AmbariManagementController managementController) throws AmbariException {
MaintenanceStateHelper maintenanceStateHelperMock = createNiceMock(MaintenanceStateHelper.class);
expect(maintenanceStateHelperMock.isOperationAllowed(anyObject(Resource.Type.class), anyObject(Service.class))).andReturn(true).anyTimes();
expect(maintenanceStateHelperMock.isOperationAllowed(anyObject(Resource.Type.class), anyObject(ServiceComponentHost.class))).andReturn(true).anyTimes();
replay(maintenanceStateHelperMock);
return getServiceProvider(managementController, maintenanceStateHelperMock);
}
/**
* This factory method allows to define custom MaintenanceStateHelper mock.
*/
public static ServiceResourceProvider getServiceProvider(AmbariManagementController managementController,
MaintenanceStateHelper maintenanceStateHelper) {
Resource.Type type = Resource.Type.Service;
return new ServiceResourceProvider(PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController, maintenanceStateHelper);
}
public static void createServices(AmbariManagementController controller, Set<ServiceRequest> requests)
throws AmbariException, AuthorizationException {
ServiceResourceProvider provider = getServiceProvider(controller);
provider.createServices(requests);
}
public static Set<ServiceResponse> getServices(AmbariManagementController controller,
Set<ServiceRequest> requests) throws AmbariException {
ServiceResourceProvider provider = getServiceProvider(controller);
return provider.getServices(requests);
}
public static RequestStatusResponse updateServices(AmbariManagementController controller,
Set<ServiceRequest> requests,
Map<String, String> requestProperties, boolean runSmokeTest,
boolean reconfigureClients)
throws AmbariException, AuthorizationException {
return updateServices(controller, requests, requestProperties, runSmokeTest, reconfigureClients, null);
}
/**
* Allows to set maintenanceStateHelper. For use when there is anything to test
* with maintenance mode.
*/
public static RequestStatusResponse updateServices(AmbariManagementController controller,
Set<ServiceRequest> requests,
Map<String, String> requestProperties, boolean runSmokeTest,
boolean reconfigureClients,
MaintenanceStateHelper maintenanceStateHelper)
throws AmbariException, AuthorizationException {
ServiceResourceProvider provider;
if (maintenanceStateHelper != null) {
provider = getServiceProvider(controller, maintenanceStateHelper);
} else {
provider = getServiceProvider(controller);
}
RequestStageContainer request = provider.updateServices(null, requests, requestProperties, runSmokeTest, reconfigureClients, true);
request.persist();
return request.getRequestStatusResponse();
}
public static RequestStatusResponse deleteServices(AmbariManagementController controller, Set<ServiceRequest> requests)
throws AmbariException, AuthorizationException {
ServiceResourceProvider provider = getServiceProvider(controller);
return provider.deleteServices(requests);
}
}