/** * Creates a new EMR cluster definition. <p>Requires WRITE permission on namespace</p> * * @param request the information needed to create an EMR cluster definition * * @return the newly created EMR cluster definition */ @RequestMapping(value = EMR_CLUSTER_DEFINITIONS_URI_PREFIX, method = RequestMethod.POST, consumes = {"application/xml", "application/json"}) @Secured(SecurityFunctions.FN_EMR_CLUSTER_DEFINITIONS_POST) public EmrClusterDefinitionInformation createEmrClusterDefinition(@RequestBody EmrClusterDefinitionCreateRequest request) throws Exception { return emrClusterDefinitionService.createEmrClusterDefinition(request); }
/** * Creates a new EMR cluster definition. <p>Requires WRITE permission on namespace</p> * * @param request the information needed to create an EMR cluster definition * * @return the newly created EMR cluster definition */ @RequestMapping(value = EMR_CLUSTER_DEFINITIONS_URI_PREFIX, method = RequestMethod.POST, consumes = {"application/xml", "application/json"}) @Secured(SecurityFunctions.FN_EMR_CLUSTER_DEFINITIONS_POST) public EmrClusterDefinitionInformation createEmrClusterDefinition(@RequestBody EmrClusterDefinitionCreateRequest request) throws Exception { return emrClusterDefinitionService.createEmrClusterDefinition(request); }
@Test public void testCreateEmrClusterDefinitionLowerCaseParameters() throws Exception { // Create and persist the namespace entity with an uppercase name. namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE.toUpperCase()); // Create an EMR cluster definition create request by passing the EMR cluster definition name key parameters in lower case. EmrClusterDefinitionCreateRequest request = createEmrClusterDefinitionCreateRequest(NAMESPACE.toLowerCase(), EMR_CLUSTER_DEFINITION_NAME.toLowerCase(), getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH)); // Create an EMR cluster definition. EmrClusterDefinitionInformation resultEmrClusterDefinition = emrClusterDefinitionService.createEmrClusterDefinition(request); // Validate the returned object. validateEmrClusterDefinition(null, NAMESPACE.toUpperCase(), EMR_CLUSTER_DEFINITION_NAME.toLowerCase(), getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH), resultEmrClusterDefinition); }
@Test public void testCreateEmrClusterDefinitionUpperCaseParameters() throws Exception { // Create and persist the namespace entity with a lowercase name. namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE.toLowerCase()); // Create an EMR cluster definition create request by passing the EMR cluster definition name key parameters in upper case. EmrClusterDefinitionCreateRequest request = createEmrClusterDefinitionCreateRequest(NAMESPACE.toUpperCase(), EMR_CLUSTER_DEFINITION_NAME.toUpperCase(), getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH)); // Create an EMR cluster definition. EmrClusterDefinitionInformation resultEmrClusterDefinition = emrClusterDefinitionService.createEmrClusterDefinition(request); // Validate the returned object. validateEmrClusterDefinition(null, NAMESPACE.toLowerCase(), EMR_CLUSTER_DEFINITION_NAME.toUpperCase(), getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH), resultEmrClusterDefinition); }
@Test public void testCreateEmrClusterDefinition() throws Exception { // Create an EMR cluster definition key. EmrClusterDefinitionKey emrClusterDefinitionKey = new EmrClusterDefinitionKey(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME); // Create an EMR cluster definition. EmrClusterDefinition emrClusterDefinition = new EmrClusterDefinition(); // Create an EMR cluster definition create request. EmrClusterDefinitionCreateRequest emrClusterDefinitionCreateRequest = new EmrClusterDefinitionCreateRequest(emrClusterDefinitionKey, emrClusterDefinition); // Create an object that holds EMR cluster definition information. EmrClusterDefinitionInformation emrClusterDefinitionInformation = new EmrClusterDefinitionInformation(ID, emrClusterDefinitionKey, emrClusterDefinition); // Mock the external calls. when(emrClusterDefinitionService.createEmrClusterDefinition(emrClusterDefinitionCreateRequest)).thenReturn(emrClusterDefinitionInformation); // Call the method under test. EmrClusterDefinitionInformation result = emrClusterDefinitionRestController.createEmrClusterDefinition(emrClusterDefinitionCreateRequest); // Verify the external calls. verify(emrClusterDefinitionService).createEmrClusterDefinition(emrClusterDefinitionCreateRequest); verifyNoMoreInteractionsHelper(); // Validate the results. assertEquals(emrClusterDefinitionInformation, result); }
@Test public void testCreateEmrClusterDefinitionNamespaceNoExists() throws Exception { // Try to perform a create using a non-existing namespace. String testNamespace = "I_DO_NOT_EXIST"; try { emrClusterDefinitionService.createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(testNamespace, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH))); fail("Should throw an ObjectNotFoundException when namespace is not specified."); } catch (ObjectNotFoundException e) { assertEquals(String.format("Namespace \"%s\" doesn't exist.", testNamespace), e.getMessage()); } }
try emrClusterDefinitionService.createEmrClusterDefinition( createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, emrClusterDefinitionConfiguration)); fail(String.format("Should throw an IllegalArgumentException when \"%s\" required AWS node tag is not specified.", mandatoryAwsTagName));
@Test public void testCreateEmrClusterDefinitionInvalidParameters() throws Exception { // Try to perform a create when namespace contains a forward slash character. try { emrClusterDefinitionService.createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(addSlash(NAMESPACE), EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH))); fail("Should throw an IllegalArgumentException when namespace contains a forward slash character."); } catch (IllegalArgumentException e) { assertEquals("Namespace can not contain a forward slash character.", e.getMessage()); } // Try to perform a create when EMR cluster definition name contains a forward slash character. try { emrClusterDefinitionService.createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(NAMESPACE, addSlash(EMR_CLUSTER_DEFINITION_NAME), getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH))); fail("Should throw an IllegalArgumentException when EMR cluster definition name contains a forward slash character."); } catch (IllegalArgumentException e) { assertEquals("EMR cluster definition name can not contain a forward slash character.", e.getMessage()); } }
@Test public void testCreateEmrClusterDefinitionDuplicateNodeTags() throws Exception { // Try to perform a create with duplicate node tag names. try { EmrClusterDefinition emrClusterDefinitionConfiguration = getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH); for (int i = 0; i < 2; i++) { NodeTag nodeTag = new NodeTag(); nodeTag.setTagName(ATTRIBUTE_NAME_1_MIXED_CASE); nodeTag.setTagValue(ATTRIBUTE_VALUE_1); emrClusterDefinitionConfiguration.getNodeTags().add(nodeTag); } emrClusterDefinitionService .createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, emrClusterDefinitionConfiguration)); fail("Should throw an IllegalArgumentException when duplicate node tag names are specified."); } catch (IllegalArgumentException e) { assertEquals(String.format("Duplicate node tag \"%s\" is found.", ATTRIBUTE_NAME_1_MIXED_CASE), e.getMessage()); } }
@Test public void testCreateEmrClusterDefinition() throws Exception { // Create and persist the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE); // Create an EMR cluster definition create request. EmrClusterDefinitionCreateRequest request = createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH)); // Create an EMR cluster definition. EmrClusterDefinitionInformation resultEmrClusterDefinition = emrClusterDefinitionService.createEmrClusterDefinition(request); // Validate the returned object. validateEmrClusterDefinition(null, NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH), resultEmrClusterDefinition); }
@Test public void testCreateEmrClusterDefinitionMaxInstancesExceeded() throws Exception { final Integer TEST_MAX_EMR_INSTANCES_COUNT = 10; // Override configuration. Map<String, Object> overrideMap = new HashMap<>(); overrideMap.put(ConfigurationValue.MAX_EMR_INSTANCES_COUNT.getKey(), TEST_MAX_EMR_INSTANCES_COUNT.toString()); modifyPropertySourceInEnvironment(overrideMap); // Try to perform a create by specifying too many instances (TEST_MAX_EMR_INSTANCES_COUNT + 1). EmrClusterDefinition emrClusterDefinitionConfiguration = getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH); emrClusterDefinitionConfiguration.getInstanceDefinitions().getMasterInstances().setInstanceCount(TEST_MAX_EMR_INSTANCES_COUNT); emrClusterDefinitionConfiguration.getInstanceDefinitions().getCoreInstances().setInstanceCount(1); try { emrClusterDefinitionService .createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, emrClusterDefinitionConfiguration)); fail("Should throw an IllegalArgumentException when total number of instances exceeds maximum allowed."); } catch (IllegalArgumentException e) { assertEquals(String.format("Total number of instances requested can not exceed : %d", TEST_MAX_EMR_INSTANCES_COUNT), e.getMessage()); } finally { // Restore the property sources so we don't affect other tests. restorePropertySourceInEnvironment(); } }
@Test public void testCreateEmrClusterDefinitionMaxInstancesSetToZero() throws Exception { // Create and persist the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE); // Override configuration to set the maximum allowed number of EMR instances to zero. Map<String, Object> overrideMap = new HashMap<>(); overrideMap.put(ConfigurationValue.MAX_EMR_INSTANCES_COUNT.getKey(), "0"); modifyPropertySourceInEnvironment(overrideMap); try { // Create an EMR cluster definition create request. EmrClusterDefinitionCreateRequest request = createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH)); // Create an EMR cluster definition. EmrClusterDefinitionInformation resultEmrClusterDefinition = emrClusterDefinitionService.createEmrClusterDefinition(request); // Validate the returned object. validateEmrClusterDefinition(null, NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH), resultEmrClusterDefinition); } finally { // Restore the property sources so we don't affect other tests. restorePropertySourceInEnvironment(); } }
@Test public void testCreateEmrClusterDefinitionEmrClusterDefinitionAlreadyExists() throws Exception { // Create and persist the namespace entity. NamespaceEntity namespaceEntity = namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE); // Create and persist the EMR cluster definition entity. emrClusterDefinitionDaoTestHelper.createEmrClusterDefinitionEntity(namespaceEntity, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfigurationXml(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH)); // Try to perform a create using an already existing EMR cluster definition name. try { emrClusterDefinitionService.createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH))); fail("Should throw an AlreadyExistsException when EMR cluster definition already exists."); } catch (AlreadyExistsException e) { assertEquals(String .format("Unable to create EMR cluster definition with name \"%s\" for namespace \"%s\" because it already exists.", EMR_CLUSTER_DEFINITION_NAME, NAMESPACE), e.getMessage()); } }
@Test public void testCreateEmrClusterDefinitionTrimParameters() throws Exception { // Create and persist the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE); // Create an EMR cluster definition create request by passing namespace and EMR cluster definition name with leading and trailing whitespace characters. EmrClusterDefinitionCreateRequest request = createEmrClusterDefinitionCreateRequest(addWhitespace(NAMESPACE), addWhitespace(EMR_CLUSTER_DEFINITION_NAME), getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH)); // Create an EMR cluster definition. EmrClusterDefinitionInformation resultEmrClusterDefinition = emrClusterDefinitionService.createEmrClusterDefinition(request); // Validate the returned object. validateEmrClusterDefinition(null, NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH), resultEmrClusterDefinition); }
/** * Asserts that when a negative number is specified for core instance count, a validation exception is thrown. */ @Test public void testCreateEmrClusterDefinitionCoreInstanceCountNegativeAssertException() throws Exception { // Create and persist the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE); // Create an EMR cluster definition create request. EmrClusterDefinitionCreateRequest request = createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH)); InstanceDefinition coreInstanceDefinition = new InstanceDefinition(-1, "m1.medium", NO_EMR_CLUSTER_DEFINITION_EBS_CONFIGURATION, NO_INSTANCE_SPOT_PRICE, NO_INSTANCE_MAX_SEARCH_PRICE, NO_INSTANCE_ON_DEMAND_THRESHOLD); request.getEmrClusterDefinition().getInstanceDefinitions().setCoreInstances(coreInstanceDefinition); // Create an EMR cluster definition. try { emrClusterDefinitionService.createEmrClusterDefinition(request); fail(); } catch (IllegalArgumentException e) { assertEquals("At least 0 core instance must be specified.", e.getMessage()); } }
emrClusterDefinitionService.createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(BLANK_TEXT, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH))); fail("Should throw an IllegalArgumentException when namespace is not specified."); emrClusterDefinitionService.createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(NAMESPACE, BLANK_TEXT, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH))); fail("Should throw an IllegalArgumentException when EMR cluster definition name is not specified."); emrClusterDefinitionService.createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, null)); fail("Should throw an IllegalArgumentException when EMR cluster definition configuration is not specified."); emrClusterDefinitionConfiguration.setInstanceFleets(null); emrClusterDefinitionService .createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, emrClusterDefinitionConfiguration)); fail(); emrClusterDefinitionConfiguration.getInstanceDefinitions().setMasterInstances(null); emrClusterDefinitionService .createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, emrClusterDefinitionConfiguration)); fail("Should throw an IllegalArgumentException when master instances are not specified."); emrClusterDefinitionConfiguration.getInstanceDefinitions().getMasterInstances().setInstanceCount(0); emrClusterDefinitionService .createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, emrClusterDefinitionConfiguration)); fail("Should throw an IllegalArgumentException when instance count is less than one for master instances."); emrClusterDefinitionConfiguration.getInstanceDefinitions().getMasterInstances().setInstanceType(BLANK_TEXT); emrClusterDefinitionService .createEmrClusterDefinition(createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, emrClusterDefinitionConfiguration));
/** * Asserts that when 0 is specified for core instance count, no validation exception is thrown. */ @Test public void testCreateEmrClusterDefinitionCoreInstanceCount0AssertResponseCoreInstanceDefinitionIsNull() throws Exception { // Create and persist the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE); // Create an EMR cluster definition create request. EmrClusterDefinitionCreateRequest request = createEmrClusterDefinitionCreateRequest(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, getTestEmrClusterDefinitionConfiguration(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH)); InstanceDefinition coreInstanceDefinition = new InstanceDefinition(0, "m1.medium", NO_EMR_CLUSTER_DEFINITION_EBS_CONFIGURATION, NO_INSTANCE_SPOT_PRICE, NO_INSTANCE_MAX_SEARCH_PRICE, NO_INSTANCE_ON_DEMAND_THRESHOLD); request.getEmrClusterDefinition().getInstanceDefinitions().setCoreInstances(coreInstanceDefinition); // Create an EMR cluster definition. EmrClusterDefinitionInformation emrClusterDefinitionInformation = emrClusterDefinitionService.createEmrClusterDefinition(request); assertNull(emrClusterDefinitionInformation.getEmrClusterDefinition().getInstanceDefinitions().getCoreInstances()); }