String stackName = "test";
String stackVersion = "1.23";
BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class);
AmbariManagementController managementController = createStrictMock(AmbariManagementController.class);
Request request = createNiceMock(Request.class);
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
BlueprintEntity blueprint = createNiceMock(BlueprintEntity.class);
StackServiceResponse stackServiceResponse1 = createNiceMock(StackServiceResponse.class);
StackServiceResponse stackServiceResponse2 = createNiceMock(StackServiceResponse.class);
Capture<Set<StackServiceRequest>> stackServiceRequestCapture = new Capture<Set<StackServiceRequest>>();
StackServiceComponentResponse stackServiceComponentResponse1 = createNiceMock(StackServiceComponentResponse.class);
StackServiceComponentResponse stackServiceComponentResponse2 = createNiceMock(StackServiceComponentResponse.class);
StackServiceComponentResponse stackServiceComponentResponse3 = createNiceMock(StackServiceComponentResponse.class);
Capture<Set<StackServiceComponentRequest>> serviceComponentRequestCapture1 = new Capture<Set<StackServiceComponentRequest>>();
Capture<Set<StackServiceComponentRequest>> serviceComponentRequestCapture2 = new Capture<Set<StackServiceComponentRequest>>();
StackConfigurationResponse stackConfigurationResponse1 = createNiceMock(StackConfigurationResponse.class);
StackConfigurationResponse stackConfigurationResponse2 = createNiceMock(StackConfigurationResponse.class);
StackConfigurationResponse stackConfigurationResponse3 = createNiceMock(StackConfigurationResponse.class);
StackConfigurationResponse stackConfigurationResponse4 = createNiceMock(StackConfigurationResponse.class);
Capture<Set<StackConfigurationRequest>> serviceConfigurationRequestCapture1 = new Capture<Set<StackConfigurationRequest>>();
Capture<Set<StackConfigurationRequest>> serviceConfigurationRequestCapture2 = new Capture<Set<StackConfigurationRequest>>();
BlueprintConfigEntity blueprintConfig = createNiceMock(BlueprintConfigEntity.class);
HostGroupEntity hostGroup = createNiceMock(HostGroupEntity.class);
HostGroupComponentEntity hostGroupComponent1 = createNiceMock(HostGroupComponentEntity.class);
HostGroupComponentEntity hostGroupComponent2 = createNiceMock(HostGroupComponentEntity.class);
HostGroupComponentEntity hostGroupComponent3 = createNiceMock(HostGroupComponentEntity.class);
ServiceResourceProvider serviceResourceProvider = createStrictMock(ServiceResourceProvider.class);
ResourceProvider componentResourceProvider = createStrictMock(ResourceProvider.class);
ResourceProvider hostResourceProvider = createStrictMock(ResourceProvider.class);
ResourceProvider hostComponentResourceProvider = createStrictMock(ResourceProvider.class);
PersistKeyValueImpl persistKeyValue = createNiceMock(PersistKeyValueImpl.class);
Capture<ClusterRequest> createClusterRequestCapture = new Capture<ClusterRequest>();
Capture<Set<ClusterRequest>> updateClusterRequestCapture = new Capture<Set<ClusterRequest>>();
Capture<Map<String, String>> updateClusterPropertyMapCapture = new Capture<Map<String, String>>();
Capture<Set<ClusterRequest>> updateClusterRequestCapture2 = new Capture<Set<ClusterRequest>>();
Capture<Map<String, String>> updateClusterPropertyMapCapture2 = new Capture<Map<String, String>>();
Capture<Set<ClusterRequest>> updateClusterRequestCapture3 = new Capture<Set<ClusterRequest>>();
Capture<Map<String, String>> updateClusterPropertyMapCapture3 = new Capture<Map<String, String>>();
Capture<Request> serviceRequestCapture = new Capture<Request>();
Capture<Request> componentRequestCapture = new Capture<Request>();
Capture<Request> componentRequestCapture2 = new Capture<Request>();
Capture<Request> hostRequestCapture = new Capture<Request>();
Capture<Request> hostComponentRequestCapture = new Capture<Request>();
Set<StackServiceResponse> stackServiceResponses = new LinkedHashSet<StackServiceResponse>();
stackServiceResponses.add(stackServiceResponse1);
stackServiceResponses.add(stackServiceResponse2);
// service1 has 2 components
Set<StackServiceComponentResponse> stackServiceComponentResponses1 = new LinkedHashSet<StackServiceComponentResponse>();
stackServiceComponentResponses1.add(stackServiceComponentResponse1);
stackServiceComponentResponses1.add(stackServiceComponentResponse2);
// service2 has 1 components
Set<StackServiceComponentResponse> stackServiceComponentResponses2 = new LinkedHashSet<StackServiceComponentResponse>();
stackServiceComponentResponses2.add(stackServiceComponentResponse3);
// service1 has 1 config
Set<StackConfigurationResponse> stackConfigurationResponses1 = new LinkedHashSet<StackConfigurationResponse>();
stackConfigurationResponses1.add(stackConfigurationResponse1);
// service2 has 3 config
Set<StackConfigurationResponse> stackConfigurationResponses2 = new LinkedHashSet<StackConfigurationResponse>();
stackConfigurationResponses2.add(stackConfigurationResponse2);
stackConfigurationResponses2.add(stackConfigurationResponse3);
stackConfigurationResponses2.add(stackConfigurationResponse4);
Collection<HostGroupComponentEntity> hostGroupComponents = new LinkedHashSet<HostGroupComponentEntity>();
hostGroupComponents.add(hostGroupComponent1);
hostGroupComponents.add(hostGroupComponent2);
hostGroupComponents.add(hostGroupComponent3);
// request properties
Set<Map<String, Object>> propertySet = new LinkedHashSet<Map<String, Object>>();
Map<String, Object> properties = new LinkedHashMap<String, Object>();
properties.put(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID, "c1");
properties.put(ClusterResourceProvider.BLUEPRINT_PROPERTY_ID, blueprintName);
propertySet.add(properties);
Collection<Map<String, Object>> hostGroups = new ArrayList<Map<String, Object>>();
Map<String, Object> hostGroupProperties = new HashMap<String, Object>();
hostGroups.add(hostGroupProperties);
hostGroupProperties.put("name", "group1");
Collection<Map<String, String>> hostGroupHosts = new ArrayList<Map<String, String>>();
hostGroupProperties.put("hosts", hostGroupHosts);
Map<String, String> hostGroupHostProperties = new HashMap<String, String>();
hostGroupHostProperties.put("fqdn", "host.domain");
hostGroupHosts.add(hostGroupHostProperties);
properties.put("host-groups", hostGroups);
// blueprint cluster configuration properties
Map<String, String> blueprintConfigProperties = new HashMap<String, String>();
blueprintConfigProperties.put("property1", "value2");
blueprintConfigProperties.put("new.property", "new.property.value");
// expectations
expect(request.getProperties()).andReturn(propertySet).anyTimes();
expect(blueprintDAO.findByName(blueprintName)).andReturn(blueprint);
expect(blueprint.getStackName()).andReturn(stackName);
expect(blueprint.getStackVersion()).andReturn(stackVersion);
expect(blueprint.getConfigurations()).andReturn(Collections.<BlueprintConfigEntity>singletonList(blueprintConfig));
expect(managementController.getStackServices(capture(stackServiceRequestCapture))).andReturn(stackServiceResponses);
expect(stackServiceResponse1.getServiceName()).andReturn("service1");
expect(stackServiceResponse2.getServiceName()).andReturn("service2");
expect(managementController.getStackComponents(capture(serviceComponentRequestCapture1))).
andReturn(stackServiceComponentResponses1);
expect(stackServiceComponentResponse1.getComponentName()).andReturn("component1");
expect(stackServiceComponentResponse2.getComponentName()).andReturn("component2");
expect(managementController.getStackConfigurations(capture(serviceConfigurationRequestCapture1))).
andReturn(stackConfigurationResponses1);
expect(stackConfigurationResponse1.getType()).andReturn("core-site.xml");
expect(stackConfigurationResponse1.getPropertyName()).andReturn("property1");
expect(stackConfigurationResponse1.getPropertyValue()).andReturn("value1");
expect(managementController.getStackComponents(capture(serviceComponentRequestCapture2))).
andReturn(stackServiceComponentResponses2);
expect(stackServiceComponentResponse3.getComponentName()).andReturn("component3");
expect(managementController.getStackConfigurations(capture(serviceConfigurationRequestCapture2))).
andReturn(stackConfigurationResponses2);
expect(stackConfigurationResponse2.getType()).andReturn("hdfs-site.xml");
expect(stackConfigurationResponse2.getPropertyName()).andReturn("property2");
expect(stackConfigurationResponse2.getPropertyValue()).andReturn("value2");
expect(stackConfigurationResponse3.getType()).andReturn("global.xml");
expect(stackConfigurationResponse3.getPropertyName()).andReturn("oozie_user");
expect(stackConfigurationResponse3.getPropertyValue()).andReturn("oozie");
expect(stackConfigurationResponse4.getType()).andReturn("core-site.xml");
expect(stackConfigurationResponse4.getPropertyName()).andReturn("property3");
expect(stackConfigurationResponse4.getPropertyValue()).andReturn("value3");
expect(blueprintConfig.getBlueprintName()).andReturn("test-blueprint").anyTimes();
expect(blueprintConfig.getType()).andReturn("core-site").anyTimes();
expect(blueprintConfig.getConfigData()).andReturn(new Gson().toJson(blueprintConfigProperties));
expect(blueprint.getHostGroups()).andReturn(Collections.singleton(hostGroup));
expect(hostGroup.getName()).andReturn("group1");
expect(hostGroup.getComponents()).andReturn(hostGroupComponents);
expect(hostGroupComponent1.getName()).andReturn("component1");
expect(hostGroupComponent2.getName()).andReturn("component2");
expect(hostGroupComponent3.getName()).andReturn("component3");
managementController.createCluster(capture(createClusterRequestCapture));
expect(managementController.updateClusters(capture(updateClusterRequestCapture),
capture(updateClusterPropertyMapCapture))).andReturn(null);
expect(managementController.updateClusters(capture(updateClusterRequestCapture2),
capture(updateClusterPropertyMapCapture2))).andReturn(null);
expect(managementController.updateClusters(capture(updateClusterRequestCapture3),
capture(updateClusterPropertyMapCapture3))).andReturn(null);
expect(serviceResourceProvider.createResources(capture(serviceRequestCapture))).andReturn(null);
expect(componentResourceProvider.createResources(capture(componentRequestCapture))).andReturn(null);
expect(componentResourceProvider.createResources(capture(componentRequestCapture2))).andReturn(null);
expect(hostResourceProvider.createResources(capture(hostRequestCapture))).andReturn(null);
expect(hostComponentResourceProvider.createResources(capture(hostComponentRequestCapture))).andReturn(null);
expect(serviceResourceProvider.installAndStart("c1")).andReturn(response);
persistKeyValue.put("CLUSTER_CURRENT_STATUS", "{\"clusterState\":\"CLUSTER_STARTED_5\"}");
replay(blueprintDAO, managementController, request, response, blueprint, stackServiceResponse1, stackServiceResponse2,
stackServiceComponentResponse1, stackServiceComponentResponse2, stackServiceComponentResponse3,
stackConfigurationResponse1, stackConfigurationResponse2, stackConfigurationResponse3, stackConfigurationResponse4,
blueprintConfig, hostGroup, hostGroupComponent1, hostGroupComponent2, hostGroupComponent3, serviceResourceProvider,
componentResourceProvider, hostResourceProvider, hostComponentResourceProvider, persistKeyValue);
// test
ClusterResourceProvider.injectBlueprintDAO(blueprintDAO);
PersistKeyValueService.init(persistKeyValue);
ResourceProvider provider = new TestClusterResourceProvider(
managementController, serviceResourceProvider, componentResourceProvider,
hostResourceProvider, hostComponentResourceProvider);
RequestStatus requestStatus = provider.createResources(request);
assertEquals(RequestStatus.Status.InProgress, requestStatus.getStatus());
Set<StackServiceRequest> stackServiceRequests = stackServiceRequestCapture.getValue();
assertEquals(1, stackServiceRequests.size());
StackServiceRequest ssr = stackServiceRequests.iterator().next();
assertNull(ssr.getServiceName());
assertEquals("test", ssr.getStackName());
assertEquals("1.23", ssr.getStackVersion());
Set<StackServiceComponentRequest> stackServiceComponentRequests1 = serviceComponentRequestCapture1.getValue();
Set<StackServiceComponentRequest> stackServiceComponentRequests2 = serviceComponentRequestCapture2.getValue();
assertEquals(1, stackServiceComponentRequests1.size());
assertEquals(1, stackServiceComponentRequests2.size());
StackServiceComponentRequest scr1 = stackServiceComponentRequests1.iterator().next();
StackServiceComponentRequest scr2 = stackServiceComponentRequests2.iterator().next();
assertNull(scr1.getComponentName());
assertNull(scr2.getComponentName());
assertEquals("1.23", scr1.getStackVersion());
assertEquals("1.23", scr2.getStackVersion());
assertEquals("test", scr1.getStackName());
assertEquals("test", scr2.getStackName());
assertTrue(scr1.getServiceName().equals("service1") || scr1.getServiceName().equals("service2"));
assertTrue(scr2.getServiceName().equals("service1") || scr2.getServiceName().equals("service2") &&
! scr2.getServiceName().equals(scr1.getServiceName()));
Set<StackConfigurationRequest> serviceConfigurationRequest1 = serviceConfigurationRequestCapture1.getValue();
Set<StackConfigurationRequest> serviceConfigurationRequest2 = serviceConfigurationRequestCapture2.getValue();
assertEquals(1, serviceConfigurationRequest1.size());
assertEquals(1, serviceConfigurationRequest2.size());
StackConfigurationRequest configReq1 = serviceConfigurationRequest1.iterator().next();
StackConfigurationRequest configReq2 = serviceConfigurationRequest2.iterator().next();
assertNull(configReq1.getPropertyName());
assertNull(configReq2.getPropertyName());
assertEquals("1.23", configReq1.getStackVersion());
assertEquals("1.23", configReq2.getStackVersion());
assertEquals("test", configReq1.getStackName());
assertEquals("test", configReq2.getStackName());
assertTrue(configReq1.getServiceName().equals("service1") || configReq1.getServiceName().equals("service2"));
assertTrue(configReq2.getServiceName().equals("service1") || configReq2.getServiceName().equals("service2") &&
! configReq2.getServiceName().equals(configReq1.getServiceName()));
ClusterRequest clusterRequest = createClusterRequestCapture.getValue();
assertEquals("c1", clusterRequest.getClusterName());
assertEquals("test-1.23", clusterRequest.getStackVersion());
Set<ClusterRequest> updateClusterRequest1 = updateClusterRequestCapture.getValue();
Set<ClusterRequest> updateClusterRequest2 = updateClusterRequestCapture2.getValue();
Set<ClusterRequest> updateClusterRequest3 = updateClusterRequestCapture3.getValue();
assertEquals(1, updateClusterRequest1.size());
assertEquals(1, updateClusterRequest2.size());
assertEquals(1, updateClusterRequest3.size());
ClusterRequest ucr1 = updateClusterRequest1.iterator().next();
ClusterRequest ucr2 = updateClusterRequest2.iterator().next();
ClusterRequest ucr3 = updateClusterRequest3.iterator().next();
assertEquals("c1", ucr1.getClusterName());
assertEquals("c1", ucr2.getClusterName());
assertEquals("c1", ucr3.getClusterName());
ConfigurationRequest cr1 = ucr1.getDesiredConfig();
ConfigurationRequest cr2 = ucr2.getDesiredConfig();
ConfigurationRequest cr3 = ucr3.getDesiredConfig();
assertEquals("1", cr1.getVersionTag());
assertEquals("1", cr2.getVersionTag());
assertEquals("1", cr3.getVersionTag());
Map<String, ConfigurationRequest> mapConfigRequests = new HashMap<String, ConfigurationRequest>();
mapConfigRequests.put(cr1.getType(), cr1);
mapConfigRequests.put(cr2.getType(), cr2);
mapConfigRequests.put(cr3.getType(), cr3);
assertEquals(3, mapConfigRequests.size());
ConfigurationRequest globalConfigRequest = mapConfigRequests.get("global");
assertEquals(5, globalConfigRequest.getProperties().size());
assertEquals("hadoop", globalConfigRequest.getProperties().get("user_group"));
assertEquals("ambari-qa", globalConfigRequest.getProperties().get("smokeuser"));
assertEquals("default@REPLACEME.NOWHERE", globalConfigRequest.getProperties().get("nagios_contact"));
assertEquals("admin", globalConfigRequest.getProperties().get("nagios_web_password"));
assertEquals("oozie", globalConfigRequest.getProperties().get("oozie_user"));
ConfigurationRequest hdfsConfigRequest = mapConfigRequests.get("hdfs-site");
assertEquals(1, hdfsConfigRequest.getProperties().size());
assertEquals("value2", hdfsConfigRequest.getProperties().get("property2"));
ConfigurationRequest coreConfigRequest = mapConfigRequests.get("core-site");
assertEquals(5, coreConfigRequest.getProperties().size());
assertEquals("value2", coreConfigRequest.getProperties().get("property1"));
assertEquals("value3", coreConfigRequest.getProperties().get("property3"));
assertEquals("*", coreConfigRequest.getProperties().get("hadoop.proxyuser.oozie.hosts"));
assertEquals("users", coreConfigRequest.getProperties().get("hadoop.proxyuser.oozie.groups"));
assertEquals("new.property.value", coreConfigRequest.getProperties().get("new.property"));
assertNull(updateClusterPropertyMapCapture.getValue());
assertNull(updateClusterPropertyMapCapture2.getValue());
assertNull(updateClusterPropertyMapCapture3.getValue());
Request serviceRequest = serviceRequestCapture.getValue();
assertEquals(2, serviceRequest.getProperties().size());
Request componentRequest = componentRequestCapture.getValue();
Request componentRequest2 = componentRequestCapture2.getValue();
assertEquals(2, componentRequest.getProperties().size());
Set<String> componentRequest1Names = new HashSet<String>();
for (Map<String, Object> componentRequest1Properties : componentRequest.getProperties()) {
assertEquals(3, componentRequest1Properties.size());
assertEquals("c1", componentRequest1Properties.get("ServiceComponentInfo/cluster_name"));
assertEquals("service1", componentRequest1Properties.get("ServiceComponentInfo/service_name"));
componentRequest1Names.add((String) componentRequest1Properties.get("ServiceComponentInfo/component_name"));
}
assertTrue(componentRequest1Names.contains("component1") && componentRequest1Names.contains("component2"));
assertEquals(1, componentRequest2.getProperties().size());
Map<String, Object> componentRequest2Properties = componentRequest2.getProperties().iterator().next();
assertEquals("c1", componentRequest2Properties.get("ServiceComponentInfo/cluster_name"));
assertEquals("service2", componentRequest2Properties.get("ServiceComponentInfo/service_name"));
assertEquals("component3", componentRequest2Properties.get("ServiceComponentInfo/component_name"));
Request hostRequest = hostRequestCapture.getValue();
assertEquals(1, hostRequest.getProperties().size());
assertEquals("c1", hostRequest.getProperties().iterator().next().get("Hosts/cluster_name"));
assertEquals("host.domain", hostRequest.getProperties().iterator().next().get("Hosts/host_name"));
Request hostComponentRequest = hostComponentRequestCapture.getValue();
assertEquals(3, hostComponentRequest.getProperties().size());
Set<String> componentNames = new HashSet<String>();
for (Map<String, Object> hostComponentProperties : hostComponentRequest.getProperties()) {
assertEquals(3, hostComponentProperties.size());
assertEquals("c1", hostComponentProperties.get("HostRoles/cluster_name"));
assertEquals("host.domain", hostComponentProperties.get("HostRoles/host_name"));
componentNames.add((String) hostComponentProperties.get("HostRoles/component_name"));
}