/* * Copyright 2015 herd contributors * * Licensed 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.finra.herd.service; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ResourceLoader; import org.springframework.security.authentication.TestingAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.finra.herd.dao.EmrClusterDefinitionDaoTestHelper; import org.finra.herd.dao.NamespaceDao; import org.finra.herd.dao.helper.XmlHelper; import org.finra.herd.model.api.xml.EmrClusterDefinition; import org.finra.herd.model.api.xml.Job; import org.finra.herd.model.api.xml.JobCreateRequest; import org.finra.herd.model.api.xml.NamespaceAuthorization; import org.finra.herd.model.api.xml.NamespacePermissionEnum; import org.finra.herd.model.api.xml.Parameter; import org.finra.herd.model.dto.ApplicationUser; import org.finra.herd.model.dto.SecurityUserWrapper; import org.finra.herd.model.jpa.EmrClusterDefinitionEntity; import org.finra.herd.model.jpa.NamespaceEntity; @Component public class JobServiceTestHelper { @Autowired private EmrClusterDefinitionDaoTestHelper emrClusterDefinitionDaoTestHelper; @Autowired private JobDefinitionServiceTestHelper jobDefinitionServiceTestHelper; @Autowired private JobService jobService; @Autowired private NamespaceDao namespaceDao; @Autowired private ResourceLoader resourceLoader; @Autowired private XmlHelper xmlHelper; /** * Creates a job based on the specified Activiti XML classpath resource location. * * @param activitiXmlClasspathResourceName the Activiti XML classpath resource location. * * @return the job. * @throws Exception if any errors were encountered. */ public Job createJob(String activitiXmlClasspathResourceName) throws Exception { jobDefinitionServiceTestHelper.createJobDefinition(activitiXmlClasspathResourceName); // Start the job synchronously. return jobService.createAndStartJob(createJobCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME)); } /** * Creates a job based on the specified Activiti XML classpath resource location. * * @param activitiXmlClasspathResourceName the Activiti XML classpath resource location. * @param parameters the job parameters. * * @return the job. * @throws Exception if any errors were encountered. */ public Job createJob(String activitiXmlClasspathResourceName, List<Parameter> parameters) throws Exception { jobDefinitionServiceTestHelper.createJobDefinition(activitiXmlClasspathResourceName); // Start the job synchronously. return jobService .createAndStartJob(createJobCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME, parameters)); } /** * Creates job create request using a specified namespace code and job name, but test hard coded parameters will be used. * * @param namespaceCd the namespace code. * @param jobName the job definition name. * * @return the created job create request. */ public JobCreateRequest createJobCreateRequest(String namespaceCd, String jobName) { // Create a test list of parameters. List<Parameter> parameters = new ArrayList<>(); Parameter parameter = new Parameter(AbstractServiceTest.ATTRIBUTE_NAME_2_MIXED_CASE, AbstractServiceTest.ATTRIBUTE_VALUE_2); parameters.add(parameter); parameter = new Parameter("Extra Attribute With No Value", null); parameters.add(parameter); return createJobCreateRequest(namespaceCd, jobName, parameters); } /** * Creates job create request using test hard coded values. * * @param namespaceCd the namespace code. * @param jobName the job definition name. * @param parameters the job parameters. * * @return the created job create request. */ public JobCreateRequest createJobCreateRequest(String namespaceCd, String jobName, List<Parameter> parameters) { // Create a job create request. JobCreateRequest jobCreateRequest = new JobCreateRequest(); jobCreateRequest.setNamespace(namespaceCd); jobCreateRequest.setJobName(jobName); jobCreateRequest.setParameters(parameters); return jobCreateRequest; } /** * Creates a job based on the specified Activiti XML classpath resource location and defines a EMR cluster definition. * * @param activitiXmlClasspathResourceName the Activiti XML classpath resource location. * @param parameters the job parameters. * * @return the job. * @throws Exception if any errors were encountered. */ public Job createJobForCreateCluster(String activitiXmlClasspathResourceName, List<Parameter> parameters, String amiVersion) throws Exception { jobDefinitionServiceTestHelper.createJobDefinition(activitiXmlClasspathResourceName); NamespaceEntity namespaceEntity = namespaceDao.getNamespaceByCd(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD); String configXml = IOUtils.toString(resourceLoader.getResource(AbstractServiceTest.EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH).getInputStream()); EmrClusterDefinition emrClusterDefinition = xmlHelper.unmarshallXmlToObject(EmrClusterDefinition.class, configXml); emrClusterDefinition.setAmiVersion(amiVersion); configXml = xmlHelper.objectToXml(emrClusterDefinition); EmrClusterDefinitionEntity emrClusterDefinitionEntity = emrClusterDefinitionDaoTestHelper.createEmrClusterDefinitionEntity(namespaceEntity, AbstractServiceTest.EMR_CLUSTER_DEFINITION_NAME, configXml); Parameter parameter = new Parameter("emrClusterDefinitionName", emrClusterDefinitionEntity.getName()); parameters.add(parameter); parameter = new Parameter("namespace", AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD); parameters.add(parameter); // Start the job synchronously. return jobService .createAndStartJob(createJobCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME, parameters)); } /** * Creates a job based on the specified Activiti XML classpath resource location and defines a EMR cluster definition. * * @param activitiXmlClasspathResourceName the Activiti XML classpath resource location. * @param parameters the job parameters. * * @return the job. * @throws Exception if any errors were encountered. */ public Job createJobForCreateCluster(String activitiXmlClasspathResourceName, List<Parameter> parameters) throws Exception { return createJobForCreateCluster(activitiXmlClasspathResourceName, parameters, null); } /** * Creates a job based on the specified Activiti XML and defines a EMR cluster definition. * * @param activitiXml the Activiti XML. * @param parameters the job parameters. * * @return the job. * @throws Exception if any errors were encountered. */ public Job createJobForCreateClusterForActivitiXml(String activitiXml, List<Parameter> parameters) throws Exception { jobDefinitionServiceTestHelper.createJobDefinitionForActivitiXml(activitiXml); NamespaceEntity namespaceEntity = namespaceDao.getNamespaceByCd(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD); EmrClusterDefinitionEntity emrClusterDefinitionEntity = emrClusterDefinitionDaoTestHelper .createEmrClusterDefinitionEntity(namespaceEntity, AbstractServiceTest.EMR_CLUSTER_DEFINITION_NAME, IOUtils.toString(resourceLoader.getResource(AbstractServiceTest.EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH).getInputStream())); Parameter parameter = new Parameter("namespace", namespaceEntity.getCode()); parameters.add(parameter); parameter = new Parameter("emrClusterDefinitionName", emrClusterDefinitionEntity.getName()); parameters.add(parameter); parameter = new Parameter("dryRun", null); parameters.add(parameter); parameter = new Parameter("contentType", null); parameters.add(parameter); parameter = new Parameter("emrClusterDefinitionOverride", null); parameters.add(parameter); // Start the job synchronously. return jobService .createAndStartJob(createJobCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME, parameters)); } /** * Creates a job based on the specified Activiti XML. * * @param activitiXml the Activiti XML. * @param parameters the job parameters. * * @return the job. * @throws Exception if any errors were encountered. */ public Job createJobFromActivitiXml(String activitiXml, List<Parameter> parameters) throws Exception { jobDefinitionServiceTestHelper.createJobDefinitionForActivitiXml(activitiXml); // Start the job synchronously. return jobService .createAndStartJob(createJobCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME, parameters)); } /** * Sets specified namespace authorizations for the current user by updating the security context. * * @param namespace the namespace * @param namespacePermissions the list of namespace permissions */ public void setCurrentUserNamespaceAuthorizations(String namespace, List<NamespacePermissionEnum> namespacePermissions) { String username = AbstractServiceTest.USER_ID; ApplicationUser applicationUser = new ApplicationUser(getClass()); applicationUser.setUserId(username); Set<NamespaceAuthorization> namespaceAuthorizations = new LinkedHashSet<>(); namespaceAuthorizations.add(new NamespaceAuthorization(namespace, namespacePermissions)); applicationUser.setNamespaceAuthorizations(namespaceAuthorizations); SecurityContextHolder.getContext().setAuthentication( new TestingAuthenticationToken(new SecurityUserWrapper(username, "password", false, false, false, false, Collections.emptyList(), applicationUser), null)); } }