AMBARI-5706. Provide basic validation for cluster create via a blueprint
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/2ddb477f Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/2ddb477f Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/2ddb477f Branch: refs/heads/branch-1.6.0 Commit: 2ddb477f71da7ce7f34a973ca96208b7c1f33780 Parents: 8584443 Author: John Speidel <[email protected]> Authored: Wed May 7 17:59:56 2014 -0400 Committer: John Speidel <[email protected]> Committed: Wed May 7 20:58:10 2014 -0400 ---------------------------------------------------------------------- .../internal/ClusterResourceProvider.java | 18 +- .../internal/ClusterResourceProviderTest.java | 515 +++++++++++++++++++ 2 files changed, 531 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/2ddb477f/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java index f038df4..1d05b46 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java @@ -671,7 +671,7 @@ public class ClusterResourceProvider extends AbstractControllerResourceProvider * @param properties request properties * @param blueprintHostGroups blueprint host groups * - * @throws IllegalArgumentException a host-group in the request doesn't match a host-group in the blueprint + * @throws IllegalArgumentException a host_group in the request doesn't match a host-group in the blueprint */ private void applyRequestInfoToHostGroups(Map<String, Object> properties, Map<String, HostGroup> blueprintHostGroups) @@ -681,9 +681,16 @@ public class ClusterResourceProvider extends AbstractControllerResourceProvider Collection<Map<String, Object>> hostGroups = (Collection<Map<String, Object>>) properties.get("host_groups"); + if (hostGroups == null || hostGroups.isEmpty()) { + throw new IllegalArgumentException("'host_groups' element must be included in cluster create body"); + } + // iterate over host groups provided in request body for (Map<String, Object> hostGroupProperties : hostGroups) { String name = (String) hostGroupProperties.get("name"); + if (name == null || name.isEmpty()) { + throw new IllegalArgumentException("Every host_group must include a non-null 'name' property"); + } HostGroup hostGroup = blueprintHostGroups.get(name); if (hostGroup == null) { @@ -692,11 +699,18 @@ public class ClusterResourceProvider extends AbstractControllerResourceProvider } Collection hosts = (Collection) hostGroupProperties.get("hosts"); + if (hosts == null || hosts.isEmpty()) { + throw new IllegalArgumentException("Host group '" + name + "' must contain a 'hosts' element"); + } for (Object oHost : hosts) { @SuppressWarnings("unchecked") Map<String, String> mapHostProperties = (Map<String, String>) oHost; //add host information to host group - hostGroup.addHostInfo(mapHostProperties.get("fqdn")); + String fqdn = mapHostProperties.get("fqdn"); + if (fqdn == null || fqdn.isEmpty()) { + throw new IllegalArgumentException("Host group '" + name + "' hosts element must include at least one fqdn"); + } + hostGroup.addHostInfo(fqdn); } Map<String, Map<String, String>> existingConfigurations = hostGroup.getConfigurations(); overrideExistingProperties(existingConfigurations, (Collection<Map<String, String>>) http://git-wip-us.apache.org/repos/asf/ambari/blob/2ddb477f/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java index e644b08..616df5b 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java @@ -698,6 +698,521 @@ public class ClusterResourceProviderTest { } @Test + public void testCreateResource_blueprint__noHostGroups() throws Exception { + String blueprintName = "test-blueprint"; + String stackName = "test"; + String stackVersion = "1.23"; + String clusterName = "c1"; + + BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class); + AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.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); + + HostGroupConfigEntity hostGroupConfig = createNiceMock(HostGroupConfigEntity.class); + + ServiceResourceProvider serviceResourceProvider = createStrictMock(ServiceResourceProvider.class); + ResourceProvider componentResourceProvider = createStrictMock(ResourceProvider.class); + ResourceProvider hostResourceProvider = createStrictMock(ResourceProvider.class); + ResourceProvider hostComponentResourceProvider = createStrictMock(ResourceProvider.class); + ConfigGroupResourceProvider configGroupResourceProvider = createStrictMock(ConfigGroupResourceProvider.class); + PersistKeyValueImpl persistKeyValue = createNiceMock(PersistKeyValueImpl.class); + + 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, clusterName); + properties.put(ClusterResourceProvider.BLUEPRINT_PROPERTY_ID, blueprintName); + propertySet.add(properties); + + Map<String, String> mapGroupConfigProperties = new HashMap<String, String>(); + mapGroupConfigProperties.put("myGroupProp", "awesomeValue"); + + // 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(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(blueprint.getHostGroups()).andReturn(Collections.singleton(hostGroup)).anyTimes(); + expect(hostGroup.getName()).andReturn("group1").anyTimes(); + expect(hostGroup.getComponents()).andReturn(hostGroupComponents).anyTimes(); + expect(hostGroupComponent1.getName()).andReturn("component1").anyTimes(); + expect(hostGroupComponent2.getName()).andReturn("component2").anyTimes(); + expect(hostGroupComponent3.getName()).andReturn("component3").anyTimes(); + expect(hostGroup.getConfigurations()).andReturn( + Collections.<HostGroupConfigEntity>singleton(hostGroupConfig)).anyTimes(); + + expect(hostGroupConfig.getType()).andReturn("core-site").anyTimes(); + expect(hostGroupConfig.getConfigData()).andReturn(new Gson().toJson(mapGroupConfigProperties)).anyTimes(); + + replay(blueprintDAO, managementController, request, response, blueprint, stackServiceResponse1, stackServiceResponse2, + stackServiceComponentResponse1, stackServiceComponentResponse2, stackServiceComponentResponse3, + stackConfigurationResponse1, stackConfigurationResponse2, stackConfigurationResponse3, stackConfigurationResponse4, + blueprintConfig, hostGroup, hostGroupComponent1, hostGroupComponent2, hostGroupComponent3, hostGroupConfig, + serviceResourceProvider, componentResourceProvider, hostResourceProvider, hostComponentResourceProvider, + configGroupResourceProvider, persistKeyValue, metaInfo); + + // test + ClusterResourceProvider.init(blueprintDAO, metaInfo); + ResourceProvider provider = new TestClusterResourceProvider( + managementController, serviceResourceProvider, componentResourceProvider, + hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider); + + try { + provider.createResources(request); + fail("Expected exception for missing password property"); + } catch (IllegalArgumentException e) { + //expected + } + } + + @Test + public void testCreateResource_blueprint__hostGroupMissingName() throws Exception { + String blueprintName = "test-blueprint"; + String stackName = "test"; + String stackVersion = "1.23"; + String clusterName = "c1"; + + BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class); + AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.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); + + HostGroupConfigEntity hostGroupConfig = createNiceMock(HostGroupConfigEntity.class); + + ServiceResourceProvider serviceResourceProvider = createStrictMock(ServiceResourceProvider.class); + ResourceProvider componentResourceProvider = createStrictMock(ResourceProvider.class); + ResourceProvider hostResourceProvider = createStrictMock(ResourceProvider.class); + ResourceProvider hostComponentResourceProvider = createStrictMock(ResourceProvider.class); + ConfigGroupResourceProvider configGroupResourceProvider = createStrictMock(ConfigGroupResourceProvider.class); + PersistKeyValueImpl persistKeyValue = createNiceMock(PersistKeyValueImpl.class); + + 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, clusterName); + 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); + 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); + + Map<String, String> mapGroupConfigProperties = new HashMap<String, String>(); + mapGroupConfigProperties.put("myGroupProp", "awesomeValue"); + + // 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(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(blueprint.getHostGroups()).andReturn(Collections.singleton(hostGroup)).anyTimes(); + expect(hostGroup.getName()).andReturn("group1").anyTimes(); + expect(hostGroup.getComponents()).andReturn(hostGroupComponents).anyTimes(); + expect(hostGroupComponent1.getName()).andReturn("component1").anyTimes(); + expect(hostGroupComponent2.getName()).andReturn("component2").anyTimes(); + expect(hostGroupComponent3.getName()).andReturn("component3").anyTimes(); + expect(hostGroup.getConfigurations()).andReturn( + Collections.<HostGroupConfigEntity>singleton(hostGroupConfig)).anyTimes(); + + expect(hostGroupConfig.getType()).andReturn("core-site").anyTimes(); + expect(hostGroupConfig.getConfigData()).andReturn(new Gson().toJson(mapGroupConfigProperties)).anyTimes(); + + replay(blueprintDAO, managementController, request, response, blueprint, stackServiceResponse1, stackServiceResponse2, + stackServiceComponentResponse1, stackServiceComponentResponse2, stackServiceComponentResponse3, + stackConfigurationResponse1, stackConfigurationResponse2, stackConfigurationResponse3, stackConfigurationResponse4, + blueprintConfig, hostGroup, hostGroupComponent1, hostGroupComponent2, hostGroupComponent3, hostGroupConfig, + serviceResourceProvider, componentResourceProvider, hostResourceProvider, hostComponentResourceProvider, + configGroupResourceProvider, persistKeyValue, metaInfo); + + // test + ClusterResourceProvider.init(blueprintDAO, metaInfo); + ResourceProvider provider = new TestClusterResourceProvider( + managementController, serviceResourceProvider, componentResourceProvider, + hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider); + + try { + provider.createResources(request); + fail("Expected exception for missing password property"); + } catch (IllegalArgumentException e) { + //expected + } + } + + @Test + public void testCreateResource_blueprint__hostGroupMissingFQDN() throws Exception { + String blueprintName = "test-blueprint"; + String stackName = "test"; + String stackVersion = "1.23"; + String clusterName = "c1"; + + BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class); + AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.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); + + HostGroupConfigEntity hostGroupConfig = createNiceMock(HostGroupConfigEntity.class); + + ServiceResourceProvider serviceResourceProvider = createStrictMock(ServiceResourceProvider.class); + ResourceProvider componentResourceProvider = createStrictMock(ResourceProvider.class); + ResourceProvider hostResourceProvider = createStrictMock(ResourceProvider.class); + ResourceProvider hostComponentResourceProvider = createStrictMock(ResourceProvider.class); + ConfigGroupResourceProvider configGroupResourceProvider = createStrictMock(ConfigGroupResourceProvider.class); + PersistKeyValueImpl persistKeyValue = createNiceMock(PersistKeyValueImpl.class); + + 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, clusterName); + 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>(); + hostGroupHosts.add(hostGroupHostProperties); + properties.put("host_groups", hostGroups); + + Map<String, String> mapGroupConfigProperties = new HashMap<String, String>(); + mapGroupConfigProperties.put("myGroupProp", "awesomeValue"); + + // 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(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(blueprint.getHostGroups()).andReturn(Collections.singleton(hostGroup)).anyTimes(); + expect(hostGroup.getName()).andReturn("group1").anyTimes(); + expect(hostGroup.getComponents()).andReturn(hostGroupComponents).anyTimes(); + expect(hostGroupComponent1.getName()).andReturn("component1").anyTimes(); + expect(hostGroupComponent2.getName()).andReturn("component2").anyTimes(); + expect(hostGroupComponent3.getName()).andReturn("component3").anyTimes(); + expect(hostGroup.getConfigurations()).andReturn( + Collections.<HostGroupConfigEntity>singleton(hostGroupConfig)).anyTimes(); + + expect(hostGroupConfig.getType()).andReturn("core-site").anyTimes(); + expect(hostGroupConfig.getConfigData()).andReturn(new Gson().toJson(mapGroupConfigProperties)).anyTimes(); + + replay(blueprintDAO, managementController, request, response, blueprint, stackServiceResponse1, stackServiceResponse2, + stackServiceComponentResponse1, stackServiceComponentResponse2, stackServiceComponentResponse3, + stackConfigurationResponse1, stackConfigurationResponse2, stackConfigurationResponse3, stackConfigurationResponse4, + blueprintConfig, hostGroup, hostGroupComponent1, hostGroupComponent2, hostGroupComponent3, hostGroupConfig, + serviceResourceProvider, componentResourceProvider, hostResourceProvider, hostComponentResourceProvider, + configGroupResourceProvider, persistKeyValue, metaInfo); + + // test + ClusterResourceProvider.init(blueprintDAO, metaInfo); + ResourceProvider provider = new TestClusterResourceProvider( + managementController, serviceResourceProvider, componentResourceProvider, + hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider); + + try { + provider.createResources(request); + fail("Expected exception for missing password property"); + } catch (IllegalArgumentException e) { + //expected + } + } + + @Test public void testCreateResource_blueprint__defaultPassword() throws Exception { String blueprintName = "test-blueprint"; String stackName = "test";
