/*************************************************************************** * Copyright (c) 2012-2014 VMware, Inc. All Rights Reserved. * 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 com.vmware.bdd.manager; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.apache.log4j.Logger; import org.springframework.batch.core.JobParameter; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.StepExecution; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.testng.annotations.Test; import com.vmware.bdd.apitypes.ClusterStatus; import com.vmware.bdd.apitypes.TaskRead; import com.vmware.bdd.service.job.JobConstants; public class TestJobManager { static final Logger logger = Logger.getLogger(TestJobManager.class); public static JobParameters createClusterCreateParameters(String name) { Map<String, JobParameter> param = new TreeMap<String, JobParameter>(); param.put("cluster.name", new JobParameter(name)); return new JobParameters(param); } public static String stepsToString(Collection<StepExecution> ses) { StringBuilder sb = new StringBuilder(); for (StepExecution se : ses) { if (sb.length() > 0) { sb.append(", "); } sb.append(se.getStepName()).append(":").append(se.getStatus()) .append("-").append(se.getExecutionContext()); } return sb.toString(); } @Test public void testJobOperations() throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext("spring/*.xml"); JobManager jobManager = (JobManager) context.getBean("jobManager"); long jobExecutionId = jobManager.runJob("helloWorldJob", createClusterCreateParameters("cluster-" + new Date())); int retry = 0; while (retry <= 5) { Thread.sleep(50); TaskRead tr = jobManager.getJobExecutionStatus(jobExecutionId); System.out.println("progress = " + tr.getProgress()); if (TaskRead.Status.COMPLETED.equals(tr.getStatus())) { logger.info("===========COMPLETED============"); break; } if (TaskRead.Status.FAILED.equals(tr.getStatus()) || TaskRead.Status.STOPPED.equals(tr.getStatus())) { ++retry; logger.info("failed with error message: " + tr.getErrorMessage()); logger.info("===========RESTART: #" + jobExecutionId + "============"); jobExecutionId = jobManager.restartJobExecution(jobExecutionId); } } } @Test public void testJobWithCondition() throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext("spring/*.xml"); JobManager jobManager = (JobManager) context.getBean("jobManager"); JobParametersBuilder parametersBuilder = new JobParametersBuilder(); JobParameters nodeParameters = parametersBuilder .addString(JobConstants.SUB_JOB_NODE_NAME, "node-fail-forever") .addString("date", new Date().toString()).toJobParameters(); long jobExecutionId = jobManager.runJob("simpleJobWithCondition", nodeParameters); logger.info("started simple job with condition"); int retry = 0; while (retry <= 5) { Thread.sleep(50); TaskRead tr = jobManager.getJobExecutionStatus(jobExecutionId); System.out.println("progress = " + tr.getProgress()); if (TaskRead.Status.COMPLETED.equals(tr.getStatus())) { logger.info("===========COMPLETED============"); break; } if (TaskRead.Status.FAILED.equals(tr.getStatus()) || TaskRead.Status.STOPPED.equals(tr.getStatus())) { ++retry; logger.info("failed with error message: " + tr.getErrorMessage()); logger.info("===========RESTART: #" + jobExecutionId + "============"); jobExecutionId = jobManager.restartJobExecution(jobExecutionId); } } } @Test public void testJobWithConditionSuccess() throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext("spring/*.xml"); JobManager jobManager = (JobManager) context.getBean("jobManager"); JobParametersBuilder parametersBuilder = new JobParametersBuilder(); JobParameters nodeParameters = parametersBuilder .addString(JobConstants.SUB_JOB_NODE_NAME, "node1") .addString("date", new Date().toString()).toJobParameters(); long jobExecutionId = jobManager.runJob("simpleJobWithCondition", nodeParameters); logger.info("started simple job with condition"); int retry = 0; while (retry <= 5) { Thread.sleep(50); TaskRead tr = jobManager.getJobExecutionStatus(jobExecutionId); System.out.println("progress = " + tr.getProgress()); if (TaskRead.Status.COMPLETED.equals(tr.getStatus())) { logger.info("===========COMPLETED============"); break; } if (TaskRead.Status.FAILED.equals(tr.getStatus()) || TaskRead.Status.STOPPED.equals(tr.getStatus())) { ++retry; logger.info("failed with error message: " + tr.getErrorMessage()); logger.info("===========RESTART: #" + jobExecutionId + "============"); jobExecutionId = jobManager.restartJobExecution(jobExecutionId); } } } @Test public void testRunSubJobForNodes() throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext("spring/*.xml"); JobManager jobManager = (JobManager) context.getBean("jobManager"); List<JobParameters> jobParametersList = new ArrayList<JobParameters>(); JobParametersBuilder parametersBuilder = new JobParametersBuilder(); String clusterName = "test-cluster"; JobParameters nodeParameters = parametersBuilder .addString(JobConstants.SUB_JOB_NODE_NAME, "node1") .addString("cluster.name", clusterName).toJobParameters(); jobParametersList.add(nodeParameters); nodeParameters = parametersBuilder .addString(JobConstants.SUB_JOB_NODE_NAME, "node2") .addString("cluster.name", clusterName).toJobParameters(); jobParametersList.add(nodeParameters); nodeParameters = parametersBuilder .addString(JobConstants.SUB_JOB_NODE_NAME, "node3") .addString("cluster.name", clusterName).toJobParameters(); jobParametersList.add(nodeParameters); String subJobName = "simpleJob"; long jobExecutionId = jobManager.runSubJobForNodes(subJobName, jobParametersList, clusterName, ClusterStatus.RUNNING, ClusterStatus.ERROR); while (true) { Thread.sleep(50); TaskRead tr = jobManager.getJobExecutionStatus(jobExecutionId); logger.info("======= main job progress = " + tr.getProgress()); if (TaskRead.Status.COMPLETED.equals(tr.getStatus()) || TaskRead.Status.FAILED.equals(tr.getStatus())) { logger.info("===========COMPLETED/FAILED============"); for (TaskRead.NodeStatus success : tr.getSucceedNodes()) { logger.info("success node: " + success); } for (TaskRead.NodeStatus fail : tr.getFailNodes()) { logger.info("fail node: " + fail); } break; } } } @Test public void testRunSubJobForNodesWithFailure() throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext("spring/*.xml"); JobManager jobManager = (JobManager) context.getBean("jobManager"); List<JobParameters> jobParametersList = new ArrayList<JobParameters>(); JobParametersBuilder parametersBuilder = new JobParametersBuilder(); String clusterName = "test-cluster"; JobParameters nodeParameters = parametersBuilder .addString(JobConstants.SUB_JOB_NODE_NAME, "node1") .addString("cluster.name", clusterName).toJobParameters(); jobParametersList.add(nodeParameters); nodeParameters = parametersBuilder .addString(JobConstants.SUB_JOB_NODE_NAME, "node-fail-forever") .addString("cluster.name", clusterName).toJobParameters(); jobParametersList.add(nodeParameters); nodeParameters = parametersBuilder .addString(JobConstants.SUB_JOB_NODE_NAME, "node3") .addString("cluster.name", clusterName).toJobParameters(); jobParametersList.add(nodeParameters); long jobExecutionId = jobManager.runSubJobForNodes("simpleJob", jobParametersList, clusterName, ClusterStatus.RUNNING, ClusterStatus.ERROR); while (true) { Thread.sleep(50); TaskRead tr = jobManager.getJobExecutionStatus(jobExecutionId); logger.info("======= main job progress = " + tr.getProgress()); if (TaskRead.Status.COMPLETED.equals(tr.getStatus()) || TaskRead.Status.FAILED.equals(tr.getStatus())) { logger.info("===========COMPLETED/FAILED============"); for (TaskRead.NodeStatus success : tr.getSucceedNodes()) { logger.info("success node: " + success); } for (TaskRead.NodeStatus fail : tr.getFailNodes()) { logger.info("fail node: " + fail); } break; } } } public static void main(String[] args) throws Exception { new TestJobManager().testJobOperations(); } }