use of org.opencastproject.workflow.api.WorkflowOperationInstance in project opencast by opencast.
the class WorkflowServiceImplTest method setupWorkflowInstanceImpl.
private WorkflowInstanceImpl setupWorkflowInstanceImpl(long id, String operation, WorkflowState state, Date startDate) throws ConfigurationException, MediaPackageException, NotFoundException, ServiceRegistryException {
Job job = new JobImpl(id);
job = serviceRegistry.updateJob(job);
MediaPackage mediapackage = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder().createNew();
mediapackage.setDate(startDate);
mediapackage.setDuration(7200L);
WorkflowOperationInstanceImpl workflowOperation = new WorkflowOperationInstanceImpl(operation, OperationState.PAUSED);
workflowOperation.setId(id);
List<WorkflowOperationInstance> workflowOperationInstanceList = new LinkedList<WorkflowOperationInstance>();
workflowOperationInstanceList.add(workflowOperation);
WorkflowInstanceImpl workflowInstanceImpl = new WorkflowInstanceImpl();
workflowInstanceImpl.setMediaPackage(mediapackage);
workflowInstanceImpl.setState(state);
workflowInstanceImpl.setId(id);
workflowInstanceImpl.setOperations(workflowOperationInstanceList);
return workflowInstanceImpl;
}
use of org.opencastproject.workflow.api.WorkflowOperationInstance in project opencast by opencast.
the class WorkflowServiceImplTest method testRetryStrategyHoldMaxAttemptsThree.
@Test
public void testRetryStrategyHoldMaxAttemptsThree() throws Exception {
WorkflowDefinitionImpl def = new WorkflowDefinitionImpl();
def.setId("workflow-definition-1");
def.setTitle("workflow-definition-1");
def.setDescription("workflow-definition-1");
def.setPublished(true);
service.registerWorkflowDefinition(def);
WorkflowOperationDefinitionImpl opDef = new WorkflowOperationDefinitionImpl("failTwice", "fails twice", null, true);
opDef.setRetryStrategy(RetryStrategy.HOLD);
opDef.setMaxAttempts(3);
def.add(opDef);
MediaPackage mp = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder().createNew();
WorkflowInstance workflow = startAndWait(def, mp, WorkflowState.PAUSED);
WorkflowOperationInstance errorResolutionOperation = service.getWorkflowById(workflow.getId()).getOperations().get(0);
WorkflowOperationInstance failTwiceOperation = service.getWorkflowById(workflow.getId()).getOperations().get(1);
Assert.assertTrue(errorResolutionOperation.getTemplate().equals(WorkflowServiceImpl.ERROR_RESOLUTION_HANDLER_ID));
Assert.assertTrue(errorResolutionOperation.getState() == OperationState.PAUSED);
Assert.assertTrue(errorResolutionOperation.getFailedAttempts() == 0);
Assert.assertTrue("failTwice".equals(failTwiceOperation.getTemplate()));
Assert.assertTrue(failTwiceOperation.getState() == OperationState.RETRY);
Assert.assertTrue(failTwiceOperation.getMaxAttempts() == 3);
Assert.assertTrue(failTwiceOperation.getFailedAttempts() == 1);
// Try operation a second time, simulate user selecting RETRY
retryAndWait(service.getWorkflowById(workflow.getId()), "RETRY", WorkflowState.PAUSED);
errorResolutionOperation = service.getWorkflowById(workflow.getId()).getOperations().get(1);
failTwiceOperation = service.getWorkflowById(workflow.getId()).getOperations().get(2);
Assert.assertTrue(errorResolutionOperation.getTemplate().equals(WorkflowServiceImpl.ERROR_RESOLUTION_HANDLER_ID));
Assert.assertTrue(errorResolutionOperation.getState() == OperationState.PAUSED);
Assert.assertTrue(errorResolutionOperation.getFailedAttempts() == 0);
Assert.assertTrue("failTwice".equals(failTwiceOperation.getTemplate()));
Assert.assertTrue(failTwiceOperation.getState() == OperationState.RETRY);
Assert.assertTrue(failTwiceOperation.getMaxAttempts() == 3);
Assert.assertTrue(failTwiceOperation.getFailedAttempts() == 2);
// Try operation a third time, it should succeed, simulate user selecting RETRY
retryAndWait(service.getWorkflowById(workflow.getId()), "RETRY", WorkflowState.SUCCEEDED);
failTwiceOperation = service.getWorkflowById(workflow.getId()).getOperations().get(2);
Assert.assertTrue("failTwice".equals(failTwiceOperation.getTemplate()));
Assert.assertTrue(failTwiceOperation.getState() == OperationState.SUCCEEDED);
Assert.assertTrue(failTwiceOperation.getMaxAttempts() == 3);
Assert.assertTrue(failTwiceOperation.getFailedAttempts() == 2);
}
use of org.opencastproject.workflow.api.WorkflowOperationInstance in project opencast by opencast.
the class DuplicateEventWorkflowOperationHandler method start.
@Override
public WorkflowOperationResult start(final WorkflowInstance workflowInstance, final JobContext context) throws WorkflowOperationException {
final MediaPackage mediaPackage = workflowInstance.getMediaPackage();
final WorkflowOperationInstance operation = workflowInstance.getCurrentOperation();
final String configuredSourceFlavors = trimToEmpty(operation.getConfiguration(SOURCE_FLAVORS_PROPERTY));
final String configuredSourceTags = trimToEmpty(operation.getConfiguration(SOURCE_TAGS_PROPERTY));
final String configuredTargetTags = trimToEmpty(operation.getConfiguration(TARGET_TAGS_PROPERTY));
final int numberOfEvents = Integer.parseInt(operation.getConfiguration(NUMBER_PROPERTY));
final String configuredPropertyNamespaces = trimToEmpty(operation.getConfiguration(PROPERTY_NAMESPACES_PROPERTY));
int maxNumberOfEvents = MAX_NUMBER_DEFAULT;
if (operation.getConfiguration(MAX_NUMBER_PROPERTY) != null) {
maxNumberOfEvents = Integer.parseInt(operation.getConfiguration(MAX_NUMBER_PROPERTY));
}
if (numberOfEvents > maxNumberOfEvents) {
throw new WorkflowOperationException("Number of events to create exceeds the maximum of " + maxNumberOfEvents + ". Aborting.");
}
logger.info("Creating {} new media packages from media package with id {}.", numberOfEvents, mediaPackage.getIdentifier());
final String[] sourceTags = split(configuredSourceTags, ",");
final String[] targetTags = split(configuredTargetTags, ",");
final String[] sourceFlavors = split(configuredSourceFlavors, ",");
final String[] propertyNamespaces = split(configuredPropertyNamespaces, ",");
final String copyNumberPrefix = trimToEmpty(operation.getConfiguration(COPY_NUMBER_PREFIX_PROPERTY));
final SimpleElementSelector elementSelector = new SimpleElementSelector();
for (String flavor : sourceFlavors) {
elementSelector.addFlavor(MediaPackageElementFlavor.parseFlavor(flavor));
}
final List<String> removeTags = new ArrayList<>();
final List<String> addTags = new ArrayList<>();
final List<String> overrideTags = new ArrayList<>();
for (String tag : targetTags) {
if (tag.startsWith(MINUS)) {
removeTags.add(tag);
} else if (tag.startsWith(PLUS)) {
addTags.add(tag);
} else {
overrideTags.add(tag);
}
}
for (String tag : sourceTags) {
elementSelector.addTag(tag);
}
// Filter elements to copy based on input tags and input flavors
final Collection<MediaPackageElement> elements = elementSelector.select(mediaPackage, false);
final Collection<Publication> internalPublications = new HashSet<>();
for (MediaPackageElement e : mediaPackage.getElements()) {
if (e instanceof Publication && InternalPublicationChannel.CHANNEL_ID.equals(((Publication) e).getChannel())) {
internalPublications.add((Publication) e);
}
if (MediaPackageElements.EPISODE.equals(e.getFlavor())) {
// Remove episode DC since we will add a new one (with changed title)
elements.remove(e);
}
}
final MediaPackageElement[] originalEpisodeDc = mediaPackage.getElementsByFlavor(MediaPackageElements.EPISODE);
if (originalEpisodeDc.length != 1) {
throw new WorkflowOperationException("Media package " + mediaPackage.getIdentifier() + " has " + originalEpisodeDc.length + " episode dublin cores while it is expected to have exactly 1. Aborting.");
}
for (int i = 0; i < numberOfEvents; i++) {
final List<URI> temporaryFiles = new ArrayList<>();
MediaPackage newMp = null;
try {
// Clone the media package (without its elements)
newMp = copyMediaPackage(mediaPackage, i + 1, copyNumberPrefix);
// Create and add new episode dublin core with changed title
newMp = copyDublinCore(mediaPackage, originalEpisodeDc[0], newMp, removeTags, addTags, overrideTags, temporaryFiles);
// Clone regular elements
for (final MediaPackageElement e : elements) {
final MediaPackageElement element = (MediaPackageElement) e.clone();
updateTags(element, removeTags, addTags, overrideTags);
newMp.add(element);
}
// Clone internal publications
for (final Publication originalPub : internalPublications) {
copyPublication(originalPub, mediaPackage, newMp, removeTags, addTags, overrideTags, temporaryFiles);
}
assetManager.takeSnapshot(AssetManager.DEFAULT_OWNER, newMp);
// Clone properties of media package
for (String namespace : propertyNamespaces) {
copyProperties(namespace, mediaPackage, newMp);
}
} finally {
cleanup(temporaryFiles, Optional.ofNullable(newMp));
}
}
return createResult(mediaPackage, Action.CONTINUE);
}
use of org.opencastproject.workflow.api.WorkflowOperationInstance in project opencast by opencast.
the class AnalyzeTracksWorkflowOperationHandlerTest method testStart.
@Test
public void testStart() throws MediaPackageException, WorkflowOperationException {
MediaPackage mediaPackage = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder().createNew();
VideoStreamImpl videoStream = new VideoStreamImpl("234");
videoStream.setFrameWidth(1280);
videoStream.setFrameHeight(720);
videoStream.setFrameRate(30.0f);
TrackImpl track = new TrackImpl();
track.setFlavor(MediaPackageElementFlavor.parseFlavor("presenter/source"));
track.addStream(videoStream);
JobContext jobContext = EasyMock.createMock(JobContext.class);
EasyMock.replay(jobContext);
WorkflowOperationInstance operationInstance = EasyMock.createMock(WorkflowOperationInstance.class);
String[][] config = { { AnalyzeTracksWorkflowOperationHandler.OPT_SOURCE_FLAVOR, "*/source" }, { AnalyzeTracksWorkflowOperationHandler.OPT_VIDEO_ASPECT, "4/3,16/9" } };
for (String[] cfg : config) {
EasyMock.expect(operationInstance.getConfiguration(cfg[0])).andReturn(cfg[1]).anyTimes();
}
EasyMock.expect(operationInstance.getConfiguration(AnalyzeTracksWorkflowOperationHandler.OPT_FAIL_NO_TRACK)).andReturn("true");
EasyMock.expect(operationInstance.getConfiguration(AnalyzeTracksWorkflowOperationHandler.OPT_FAIL_NO_TRACK)).andReturn("false").anyTimes();
EasyMock.replay(operationInstance);
WorkflowInstance workflowInstance = EasyMock.createMock(WorkflowInstance.class);
EasyMock.expect(workflowInstance.getMediaPackage()).andReturn(mediaPackage).anyTimes();
EasyMock.expect(workflowInstance.getId()).andReturn(0L).anyTimes();
EasyMock.expect(workflowInstance.getCurrentOperation()).andReturn(operationInstance).anyTimes();
EasyMock.replay(workflowInstance);
// With no matching track (should fail)
try {
operationHandler.start(workflowInstance, jobContext);
fail();
} catch (WorkflowOperationException e) {
logger.info("Fail on no tracks works");
}
WorkflowOperationResult workflowOperationResult = operationHandler.start(workflowInstance, jobContext);
Map<String, String> properties = workflowOperationResult.getProperties();
assertTrue(properties.isEmpty());
// With matching track
mediaPackage.add(track);
workflowOperationResult = operationHandler.start(workflowInstance, jobContext);
properties = workflowOperationResult.getProperties();
String[][] props = { { "presenter_source_media", "true" }, { "presenter_source_audio", "false" }, { "presenter_source_aspect", "16/9" }, { "presenter_source_resolution_y", "720" }, { "presenter_source_resolution_x", "1280" }, { "presenter_source_aspect_snap", "16/9" }, { "presenter_source_video", "true" }, { "presenter_source_framerate", "30.0" } };
for (String[] prop : props) {
assertEquals(prop[1], properties.get(prop[0]));
}
}
use of org.opencastproject.workflow.api.WorkflowOperationInstance in project opencast by opencast.
the class CloneWorkflowOperationHandlerTest method getWorkflowOperationResult.
private WorkflowOperationResult getWorkflowOperationResult(MediaPackage mp, Map<String, String> configurations) throws WorkflowOperationException {
// Add the mediapackage to a workflow instance
WorkflowInstanceImpl workflowInstance = new WorkflowInstanceImpl();
workflowInstance.setId(1);
workflowInstance.setState(WorkflowState.RUNNING);
workflowInstance.setMediaPackage(mp);
WorkflowOperationInstanceImpl operation = new WorkflowOperationInstanceImpl("op", OperationState.RUNNING);
operation.setTemplate("clone");
operation.setState(OperationState.RUNNING);
for (String key : configurations.keySet()) {
operation.setConfiguration(key, configurations.get(key));
}
List<WorkflowOperationInstance> operationsList = new ArrayList<WorkflowOperationInstance>();
operationsList.add(operation);
workflowInstance.setOperations(operationsList);
// Run the media package through the operation handler, ensuring that metadata gets added
return operationHandler.start(workflowInstance, null);
}
Aggregations