mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-13 00:11:00 +02:00
Revert back of 'ONOS-7963 workflow invocation trigger on ONOS event'.
'ONOS-7963 workflow invocation trigger on ONOS event' needs to be re-designed, and re-devloped. So I revert back this. Change-Id: I97f3cb38e466fb3c9e1a14a78ed69128977c2023
This commit is contained in:
parent
9619d8087a
commit
ce75d3c68a
@ -57,5 +57,4 @@ public abstract class AbstractWorkflow implements Workflow {
|
|||||||
.data(data)
|
.data(data)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -33,21 +33,11 @@ public interface ContextEventMapStore {
|
|||||||
* @param eventType the class name of event
|
* @param eventType the class name of event
|
||||||
* @param eventHintSet Set of event hint string value of the event
|
* @param eventHintSet Set of event hint string value of the event
|
||||||
* @param contextName workflow context name
|
* @param contextName workflow context name
|
||||||
* @param programCounter the program counter of workflow
|
* @param programCounterString the program counter of workflow
|
||||||
* @throws WorkflowException workflow exception
|
* @throws WorkflowException workflow exception
|
||||||
*/
|
*/
|
||||||
void registerEventMap(String eventType, Set<String> eventHintSet,
|
void registerEventMap(String eventType, Set<String> eventHintSet,
|
||||||
String contextName, ProgramCounter programCounter) throws WorkflowException;
|
String contextName, String programCounterString) throws WorkflowException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers workflow trigger flag.
|
|
||||||
* @param eventType the class name of event
|
|
||||||
* @param eventHintSet Set of event hint string value of the event
|
|
||||||
* @param contextName workflow context name
|
|
||||||
* @throws WorkflowException workflow exception
|
|
||||||
*/
|
|
||||||
void registerTriggerFlag(String eventType, Set<String> eventHintSet,
|
|
||||||
String contextName) throws WorkflowException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unregisters workflow context event mapping.
|
* Unregisters workflow context event mapping.
|
||||||
@ -62,10 +52,10 @@ public interface ContextEventMapStore {
|
|||||||
* Returns workflow context event mapping.
|
* Returns workflow context event mapping.
|
||||||
* @param eventType the class name of event
|
* @param eventType the class name of event
|
||||||
* @param eventHint vent hint string value of the event
|
* @param eventHint vent hint string value of the event
|
||||||
* @return Map of workflow context and value (WorkflowEventMetaData)
|
* @return Map of workflow context and value (program counter)
|
||||||
* @throws WorkflowException workflow exception
|
* @throws WorkflowException workflow exception
|
||||||
*/
|
*/
|
||||||
Map<String, WorkflowEventMetaData> getEventMapByHint(String eventType,
|
Map<String, String> getEventMapByHint(String eventType,
|
||||||
String eventHint) throws WorkflowException;
|
String eventHint) throws WorkflowException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -75,24 +65,13 @@ public interface ContextEventMapStore {
|
|||||||
*/
|
*/
|
||||||
boolean isEventMapPresent(String contextName);
|
boolean isEventMapPresent(String contextName);
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true or false depending on trigger flag for the workflow.
|
|
||||||
* @param eventType the class name of event
|
|
||||||
* @param eventHint vent hint string value of the event
|
|
||||||
* @param contextName name of workflow context
|
|
||||||
* @return Boolean true or false depending on trigger flag for the workflow
|
|
||||||
* @throws WorkflowException workflow exception
|
|
||||||
*/
|
|
||||||
boolean isTriggerSet(String eventType, String eventHint,
|
|
||||||
String contextName) throws WorkflowException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns child nodes on document tree path.
|
* Returns child nodes on document tree path.
|
||||||
* @param path document tree path including eventType and Hint
|
* @param path document tree path including eventType and Hint
|
||||||
* @return children under document tree path
|
* @return children under document tree path
|
||||||
* @throws WorkflowException workflow exception
|
* @throws WorkflowException workflow exception
|
||||||
*/
|
*/
|
||||||
Map<String, Versioned<WorkflowEventMetaData>> getChildren(String path) throws WorkflowException;
|
Map<String, Versioned<String>> getChildren(String path) throws WorkflowException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns document path.
|
* Returns document path.
|
||||||
|
@ -91,12 +91,6 @@ public class DefaultWorkflowContext extends WorkflowContext {
|
|||||||
*/
|
*/
|
||||||
private transient WorkplaceStore workplaceStore;
|
private transient WorkplaceStore workplaceStore;
|
||||||
|
|
||||||
/**
|
|
||||||
* Service reference for eventMap store.
|
|
||||||
*/
|
|
||||||
private transient ContextEventMapStore eventMapStore;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor of DefaultWorkflowContext.
|
* Constructor of DefaultWorkflowContext.
|
||||||
* @param builder default workflow context builder
|
* @param builder default workflow context builder
|
||||||
@ -186,7 +180,7 @@ public class DefaultWorkflowContext extends WorkflowContext {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void waitAnyCompletion(Class<? extends Event> eventType, Set<String> eventHint,
|
public void waitAnyCompletion(Class<? extends Event> eventType, Set<String> eventHint,
|
||||||
WorkExecutor eventGenerator, long timeoutMs) {
|
WorkExecutor eventGenerator, long timeoutMs) {
|
||||||
this.completionEventType = eventType;
|
this.completionEventType = eventType;
|
||||||
this.completionEventHintSet = new HashSet<>();
|
this.completionEventHintSet = new HashSet<>();
|
||||||
this.completionEventHintSet.addAll(eventHint);
|
this.completionEventHintSet.addAll(eventHint);
|
||||||
@ -219,11 +213,6 @@ public class DefaultWorkflowContext extends WorkflowContext {
|
|||||||
return completionEventTimeoutMs;
|
return completionEventTimeoutMs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerTriggerEvent(Class<? extends Event> event, Set<String> eventHintSet) throws WorkflowException {
|
|
||||||
eventMapStore.registerTriggerFlag(event.getName(), eventHintSet, this.name());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setWorkflowExecutionService(WorkflowExecutionService workflowExecutionService) {
|
public void setWorkflowExecutionService(WorkflowExecutionService workflowExecutionService) {
|
||||||
this.workflowExecutionService = workflowExecutionService;
|
this.workflowExecutionService = workflowExecutionService;
|
||||||
@ -254,17 +243,6 @@ public class DefaultWorkflowContext extends WorkflowContext {
|
|||||||
return workplaceStore;
|
return workplaceStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setEventMapStore(ContextEventMapStore contextEventMapStore) {
|
|
||||||
this.eventMapStore = contextEventMapStore;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ContextEventMapStore eventMapStore() {
|
|
||||||
return eventMapStore;
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T> T getService(Class<T> serviceClass) throws WorkflowException {
|
public <T> T getService(Class<T> serviceClass) throws WorkflowException {
|
||||||
T service;
|
T service;
|
||||||
try {
|
try {
|
||||||
|
@ -28,7 +28,6 @@ import java.net.URI;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.onosproject.workflow.api.CheckCondition.check;
|
import static org.onosproject.workflow.api.CheckCondition.check;
|
||||||
@ -56,8 +55,6 @@ public final class ImmutableListWorkflow extends AbstractWorkflow {
|
|||||||
private static JsonDataModelInjector dataModelInjector = new JsonDataModelInjector();
|
private static JsonDataModelInjector dataModelInjector = new JsonDataModelInjector();
|
||||||
private static StaticDataModelInjector staticDataModelInjector = new StaticDataModelInjector();
|
private static StaticDataModelInjector staticDataModelInjector = new StaticDataModelInjector();
|
||||||
|
|
||||||
private Optional<String> triggerWorkletClassName = Optional.empty();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor of ImmutableListWorkflow.
|
* Constructor of ImmutableListWorkflow.
|
||||||
*
|
*
|
||||||
@ -65,17 +62,11 @@ public final class ImmutableListWorkflow extends AbstractWorkflow {
|
|||||||
*/
|
*/
|
||||||
private ImmutableListWorkflow(Builder builder) {
|
private ImmutableListWorkflow(Builder builder) {
|
||||||
super(builder.id);
|
super(builder.id);
|
||||||
triggerWorkletClassName = builder.triggerWorkletClassName;
|
|
||||||
this.initWorkletType = builder.initWorkletType;
|
this.initWorkletType = builder.initWorkletType;
|
||||||
program = ImmutableList.copyOf(builder.workletDescList);
|
program = ImmutableList.copyOf(builder.workletDescList);
|
||||||
attributes = ImmutableSet.copyOf(builder.attributes);
|
attributes = ImmutableSet.copyOf(builder.attributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<String> getTriggerWorkletClassName() {
|
|
||||||
return triggerWorkletClassName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Worklet init(WorkflowContext context) throws WorkflowException {
|
public Worklet init(WorkflowContext context) throws WorkflowException {
|
||||||
if (Objects.isNull(initWorkletType)) {
|
if (Objects.isNull(initWorkletType)) {
|
||||||
@ -217,12 +208,6 @@ public final class ImmutableListWorkflow extends AbstractWorkflow {
|
|||||||
return pcList;
|
return pcList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Worklet getTriggerWorkletInstance(String workletType) throws WorkflowException {
|
|
||||||
return getWorkletInstance(workletType);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WorkletDescription getWorkletDesc(ProgramCounter pc) {
|
public WorkletDescription getWorkletDesc(ProgramCounter pc) {
|
||||||
|
|
||||||
@ -312,7 +297,6 @@ public final class ImmutableListWorkflow extends AbstractWorkflow {
|
|||||||
public static class Builder {
|
public static class Builder {
|
||||||
|
|
||||||
private URI id;
|
private URI id;
|
||||||
private Optional<String> triggerWorkletClassName = Optional.empty();
|
|
||||||
private String initWorkletType;
|
private String initWorkletType;
|
||||||
private final List<WorkletDescription> workletDescList = Lists.newArrayList();
|
private final List<WorkletDescription> workletDescList = Lists.newArrayList();
|
||||||
private final Set<WorkflowAttribute> attributes = Sets.newHashSet();
|
private final Set<WorkflowAttribute> attributes = Sets.newHashSet();
|
||||||
@ -329,17 +313,6 @@ public final class ImmutableListWorkflow extends AbstractWorkflow {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets trigger flag of immutable list workflow.
|
|
||||||
*
|
|
||||||
* @param triggerWorkletClassName name of trigger worklet class
|
|
||||||
* @return builder
|
|
||||||
*/
|
|
||||||
public Builder trigger(String triggerWorkletClassName) {
|
|
||||||
this.triggerWorkletClassName = Optional.of(triggerWorkletClassName);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets init worklet class name of immutable list workflow.
|
* Sets init worklet class name of immutable list workflow.
|
||||||
*
|
*
|
||||||
|
@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2019-present Open Networking Foundation
|
|
||||||
*
|
|
||||||
* 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.onosproject.workflow.api;
|
|
||||||
|
|
||||||
|
|
||||||
import org.onosproject.event.Event;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract class for Trigger worklet.
|
|
||||||
*/
|
|
||||||
public abstract class TriggerWorklet implements Worklet {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String tag() {
|
|
||||||
return this.getClass().getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers trigger event for a workflow under the workflow context.
|
|
||||||
* @param context workflow context
|
|
||||||
* @throws WorkflowException workflow exception
|
|
||||||
*/
|
|
||||||
public abstract void register(WorkflowContext context) throws WorkflowException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates trigger event for a given workflow context.
|
|
||||||
* @param context workflow context
|
|
||||||
* @param event trigger event
|
|
||||||
* @return true/false based on trigger event's validity
|
|
||||||
* @throws WorkflowException workflow exception
|
|
||||||
*/
|
|
||||||
public abstract boolean isTriggerValid(WorkflowContext context, Event event) throws WorkflowException;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCompleted(WorkflowContext context, Event event)throws WorkflowException {
|
|
||||||
throw new WorkflowException("(" + tag() + ").isCompleted should not be called");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isNext(WorkflowContext context) throws WorkflowException {
|
|
||||||
throw new WorkflowException("(" + tag() + ").isNext should not be called");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void timeout(WorkflowContext context) throws WorkflowException {
|
|
||||||
throw new WorkflowException("(" + tag() + ").timeout should not be called");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void process(WorkflowContext context) throws WorkflowException {
|
|
||||||
throw new WorkflowException("(" + tag() + ").process should not be called");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,124 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018-present Open Networking Foundation
|
|
||||||
*
|
|
||||||
* 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.onosproject.workflow.api;
|
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
|
||||||
import org.onosproject.event.Event;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static org.onosproject.workflow.api.CheckCondition.check;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for WorkFlow Trigger event task.
|
|
||||||
*/
|
|
||||||
public final class WfTriggerEventTask extends HandlerTask {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Event triggering event task.
|
|
||||||
*/
|
|
||||||
private final Event event;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor of event task.
|
|
||||||
* @param builder builder of event task
|
|
||||||
*/
|
|
||||||
private WfTriggerEventTask(Builder builder) {
|
|
||||||
super(builder);
|
|
||||||
this.event = builder.event;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets event of event task.
|
|
||||||
* @return event triggering event task
|
|
||||||
*/
|
|
||||||
public Event event() {
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(this.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (obj == this) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(obj instanceof EventTask)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return Objects.equals(this.event(),
|
|
||||||
((WfTriggerEventTask) obj).event());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return MoreObjects.toStringHelper(getClass())
|
|
||||||
.add("context", context())
|
|
||||||
.add("event", event())
|
|
||||||
.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a instance of builder.
|
|
||||||
* @return instance of builder
|
|
||||||
*/
|
|
||||||
public static Builder builder() {
|
|
||||||
return new Builder();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builder of WfTriggerEventTask.
|
|
||||||
*/
|
|
||||||
public static class Builder extends HandlerTask.Builder {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Event triggering event task.
|
|
||||||
*/
|
|
||||||
private Event event;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets event.
|
|
||||||
* @param event event triggering event task
|
|
||||||
* @return Builder of WfTriggerEventTask
|
|
||||||
*/
|
|
||||||
public Builder event(Event event) {
|
|
||||||
this.event = event;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Builder context(WorkflowContext context) {
|
|
||||||
super.context(context);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builds WfTriggerEventTask.
|
|
||||||
* @return instance of WfTriggerEventTask
|
|
||||||
* @throws WorkflowException workflow exception
|
|
||||||
*/
|
|
||||||
public WfTriggerEventTask build() throws WorkflowException {
|
|
||||||
check(context != null, "context is invalid");
|
|
||||||
check(event != null, "event is invalid");
|
|
||||||
return new WfTriggerEventTask(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -17,7 +17,6 @@ package org.onosproject.workflow.api;
|
|||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -102,15 +101,6 @@ public interface Workflow {
|
|||||||
*/
|
*/
|
||||||
List<ProgramCounter> getProgram();
|
List<ProgramCounter> getProgram();
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns worklet instance with given worklet Name.
|
|
||||||
* @param workletType worklet name
|
|
||||||
* @return Worklet
|
|
||||||
* @throws WorkflowException workflow exception
|
|
||||||
*/
|
|
||||||
|
|
||||||
Worklet getTriggerWorkletInstance(String workletType) throws WorkflowException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns worklet description.
|
* Returns worklet description.
|
||||||
* @param pc program counter
|
* @param pc program counter
|
||||||
@ -118,10 +108,4 @@ public interface Workflow {
|
|||||||
*/
|
*/
|
||||||
WorkletDescription getWorkletDesc(ProgramCounter pc);
|
WorkletDescription getWorkletDesc(ProgramCounter pc);
|
||||||
|
|
||||||
/**
|
}
|
||||||
* Returns trigger worklet class name if any.
|
|
||||||
* @return trigger worklet class name
|
|
||||||
*/
|
|
||||||
Optional<String> getTriggerWorkletClassName();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
@ -143,29 +143,6 @@ public abstract class WorkflowContext extends WorkflowData {
|
|||||||
*/
|
*/
|
||||||
public abstract long completionEventTimeout();
|
public abstract long completionEventTimeout();
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets event map store.
|
|
||||||
* @param contextEventMapStore event map store
|
|
||||||
*/
|
|
||||||
public abstract void setEventMapStore(ContextEventMapStore contextEventMapStore);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the event map store.
|
|
||||||
* @return ContextEventMapStore
|
|
||||||
*/
|
|
||||||
public abstract ContextEventMapStore eventMapStore();
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers an trigger event which has 'eventHint'.
|
|
||||||
* If the event happens, Workflow would be resatrted.
|
|
||||||
* @param event event when trigger happens
|
|
||||||
* @param eventHintSet Set of hint for the event
|
|
||||||
* @throws WorkflowException exception in case any
|
|
||||||
*/
|
|
||||||
public abstract void registerTriggerEvent(Class<? extends Event> event,
|
|
||||||
Set<String> eventHintSet) throws WorkflowException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets workflow service.
|
* Sets workflow service.
|
||||||
* @param workflowExecutionService workflow service
|
* @param workflowExecutionService workflow service
|
||||||
|
@ -1,90 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2019-present Open Networking Foundation
|
|
||||||
*
|
|
||||||
* 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.onosproject.workflow.api;
|
|
||||||
|
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A class representing meta data for workflow event.
|
|
||||||
*/
|
|
||||||
public class WorkflowEventMetaData {
|
|
||||||
|
|
||||||
private boolean isTriggerSet = false;
|
|
||||||
private ProgramCounter programCounter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor of workflow event meta data.
|
|
||||||
* @param isTriggerSet trigger event set for the the workflow
|
|
||||||
* @param programCounter program counter representing worklet type for registered event
|
|
||||||
*/
|
|
||||||
public WorkflowEventMetaData(boolean isTriggerSet, ProgramCounter programCounter) {
|
|
||||||
this.isTriggerSet = isTriggerSet;
|
|
||||||
this.programCounter = programCounter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copy constructor of workflow event meta data.
|
|
||||||
* @param workflowEventMetaData object of WorkflowEventMetaData
|
|
||||||
*/
|
|
||||||
public WorkflowEventMetaData(WorkflowEventMetaData workflowEventMetaData) {
|
|
||||||
this.isTriggerSet = workflowEventMetaData.getTriggerFlag();
|
|
||||||
this.programCounter = workflowEventMetaData.getProgramCounter().clone();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns program counter value related to worflow event.
|
|
||||||
* @return programCounter
|
|
||||||
*/
|
|
||||||
public ProgramCounter getProgramCounter() {
|
|
||||||
return programCounter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns trigger flag for the workflow.
|
|
||||||
* @return triggerFlag
|
|
||||||
*/
|
|
||||||
public boolean getTriggerFlag() {
|
|
||||||
return isTriggerSet;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets true or false for triggerFlag of the workflow.
|
|
||||||
* @param triggerFlag flag to indicate trigger event set for the workflow
|
|
||||||
*/
|
|
||||||
public void setTriggerFlag(boolean triggerFlag) {
|
|
||||||
this.isTriggerSet = triggerFlag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets program counter representing worklet type for registered event of the workflow.
|
|
||||||
* @param programCounter program counter representing worklet type for registered event
|
|
||||||
*/
|
|
||||||
public void setProgramCounterString(ProgramCounter programCounter) {
|
|
||||||
this.programCounter = programCounter;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return MoreObjects.toStringHelper(getClass())
|
|
||||||
.add("trigger-flag", getTriggerFlag())
|
|
||||||
.add("program-counter", getProgramCounter())
|
|
||||||
.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -49,9 +49,9 @@ public interface WorkflowExecutionService extends ListenerService<WorkflowDataEv
|
|||||||
* @param eventType event type (class name of event)
|
* @param eventType event type (class name of event)
|
||||||
* @param eventHintSet Set of event hint value
|
* @param eventHintSet Set of event hint value
|
||||||
* @param contextName workflow context name to be called by this event map
|
* @param contextName workflow context name to be called by this event map
|
||||||
* @param programCounter worklet type to be called by this event map
|
* @param programCounterString worklet type to be called by this event map
|
||||||
* @throws WorkflowException workflow exception
|
* @throws WorkflowException workflow exception
|
||||||
*/
|
*/
|
||||||
void registerEventMap(Class<? extends Event> eventType, Set<String> eventHintSet,
|
void registerEventMap(Class<? extends Event> eventType, Set<String> eventHintSet,
|
||||||
String contextName, ProgramCounter programCounter) throws WorkflowException;
|
String contextName, String programCounterString) throws WorkflowException;
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,6 @@ import com.google.common.collect.Lists;
|
|||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import org.onosproject.store.service.EventuallyConsistentMap;
|
import org.onosproject.store.service.EventuallyConsistentMap;
|
||||||
import org.onosproject.store.service.WallClockTimestamp;
|
import org.onosproject.store.service.WallClockTimestamp;
|
||||||
import org.onosproject.workflow.api.ProgramCounter;
|
|
||||||
import org.onosproject.workflow.api.WorkflowEventMetaData;
|
|
||||||
import org.osgi.service.component.annotations.Activate;
|
import org.osgi.service.component.annotations.Activate;
|
||||||
import org.osgi.service.component.annotations.Component;
|
import org.osgi.service.component.annotations.Component;
|
||||||
import org.osgi.service.component.annotations.Deactivate;
|
import org.osgi.service.component.annotations.Deactivate;
|
||||||
@ -66,12 +64,10 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
|
|||||||
|
|
||||||
private ApplicationId appId;
|
private ApplicationId appId;
|
||||||
|
|
||||||
private AsyncDocumentTree<WorkflowEventMetaData> eventMapTree;
|
private AsyncDocumentTree<String> eventMapTree;
|
||||||
|
|
||||||
private EventuallyConsistentMap<String, Set<String>> hintSetPerCxtMap;
|
private EventuallyConsistentMap<String, Set<String>> hintSetPerCxtMap;
|
||||||
|
|
||||||
private static final ProgramCounter INVALID_PC = ProgramCounter.valueOf("INVALID_WORKLET", 0);
|
|
||||||
|
|
||||||
|
|
||||||
@Activate
|
@Activate
|
||||||
public void activate() {
|
public void activate() {
|
||||||
@ -81,12 +77,9 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
|
|||||||
|
|
||||||
KryoNamespace eventMapNamespace = KryoNamespace.newBuilder()
|
KryoNamespace eventMapNamespace = KryoNamespace.newBuilder()
|
||||||
.register(KryoNamespaces.API)
|
.register(KryoNamespaces.API)
|
||||||
.register(ProgramCounter.class)
|
|
||||||
.register(WorkflowEventMetaData.class)
|
|
||||||
.register(Set.class)
|
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
eventMapTree = storageService.<WorkflowEventMetaData>documentTreeBuilder()
|
eventMapTree = storageService.<String>documentTreeBuilder()
|
||||||
.withSerializer(Serializer.using(eventMapNamespace))
|
.withSerializer(Serializer.using(eventMapNamespace))
|
||||||
.withName("context-event-map-store")
|
.withName("context-event-map-store")
|
||||||
.withOrdering(Ordering.INSERTION)
|
.withOrdering(Ordering.INSERTION)
|
||||||
@ -110,49 +103,25 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerEventMap(String eventType, Set<String> eventHintSet,
|
public void registerEventMap(String eventType, Set<String> eventHintSet,
|
||||||
String contextName, ProgramCounter programCounter) throws WorkflowException {
|
String contextName, String programCounterString) throws WorkflowException {
|
||||||
for (String eventHint : eventHintSet) {
|
for (String eventHint : eventHintSet) {
|
||||||
//Insert in eventCxtPerHintMap
|
//Insert in eventCxtPerHintMap
|
||||||
DocumentPath dpathForCxt = DocumentPath.from(Lists.newArrayList(
|
DocumentPath dpathForCxt = DocumentPath.from(Lists.newArrayList(
|
||||||
"root", eventType, eventHint, contextName));
|
"root", eventType, eventHint, contextName));
|
||||||
WorkflowEventMetaData workflowEventMetaData = completeVersioned(eventMapTree.get(dpathForCxt));
|
String currentWorkletType = completeVersioned(eventMapTree.get(dpathForCxt));
|
||||||
if (workflowEventMetaData == null) {
|
if (currentWorkletType == null) {
|
||||||
workflowEventMetaData = new WorkflowEventMetaData(false, programCounter);
|
complete(eventMapTree.createRecursive(dpathForCxt, programCounterString));
|
||||||
complete(eventMapTree.createRecursive(dpathForCxt, workflowEventMetaData));
|
|
||||||
} else {
|
} else {
|
||||||
WorkflowEventMetaData updatedWorkflowEventMetaData =
|
complete(eventMapTree.replace(dpathForCxt, programCounterString, currentWorkletType));
|
||||||
new WorkflowEventMetaData(workflowEventMetaData.getTriggerFlag(), programCounter);
|
|
||||||
complete(eventMapTree.replace(dpathForCxt, updatedWorkflowEventMetaData, workflowEventMetaData));
|
|
||||||
}
|
}
|
||||||
log.trace("RegisterEventMap for eventType:{}, eventSet:{}, contextName:{}, pc:{}",
|
log.trace("RegisterEventMap for eventType:{}, eventSet:{}, contextName:{}, pc:{}",
|
||||||
eventType, eventHintSet, contextName, programCounter.toString());
|
eventType, eventHintSet, contextName, programCounterString);
|
||||||
|
|
||||||
}
|
}
|
||||||
hintSetPerCxtMap.put(contextName, eventHintSet);
|
hintSetPerCxtMap.put(contextName, eventHintSet);
|
||||||
log.trace("RegisterEventMap in hintSetPerCxt for " +
|
log.trace("RegisterEventMap in hintSetPerCxt for " +
|
||||||
"eventType:{}, eventSet:{}, contextName:{}, pc:{}",
|
"eventType:{}, eventSet:{}, contextName:{}, pc:{}",
|
||||||
eventType, eventHintSet, contextName, programCounter.toString());
|
eventType, eventHintSet, contextName, programCounterString);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerTriggerFlag(String eventType, Set<String> eventHintSet,
|
|
||||||
String contextName) throws WorkflowException {
|
|
||||||
for (String eventHint : eventHintSet) {
|
|
||||||
//Insert in eventCxtPerHintMap
|
|
||||||
DocumentPath dpathForCxt = DocumentPath.from(Lists.newArrayList(
|
|
||||||
"root", eventType, eventHint, contextName));
|
|
||||||
WorkflowEventMetaData workflowEventMetaData = completeVersioned(eventMapTree.get(dpathForCxt));
|
|
||||||
if (workflowEventMetaData == null) {
|
|
||||||
workflowEventMetaData = new WorkflowEventMetaData(true, INVALID_PC);
|
|
||||||
complete(eventMapTree.createRecursive(dpathForCxt, workflowEventMetaData));
|
|
||||||
} else {
|
|
||||||
WorkflowEventMetaData updatedWorkflowEventMetaData =
|
|
||||||
new WorkflowEventMetaData(true, workflowEventMetaData.getProgramCounter());
|
|
||||||
complete(eventMapTree.replace(dpathForCxt, updatedWorkflowEventMetaData, workflowEventMetaData));
|
|
||||||
}
|
|
||||||
log.trace("RegisterTriggerFlag for eventType:{}, eventSet:{}, contextName:{}",
|
|
||||||
eventType, eventHintSet, contextName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -160,39 +129,28 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
|
|||||||
throws WorkflowException {
|
throws WorkflowException {
|
||||||
|
|
||||||
Set<String> hints = hintSetPerCxtMap.get(contextName);
|
Set<String> hints = hintSetPerCxtMap.get(contextName);
|
||||||
|
|
||||||
if (Objects.isNull(hints)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (String eventHint : hints) {
|
for (String eventHint : hints) {
|
||||||
//Remove from eventCxtPerHintMap
|
//Remove from eventCxtPerHintMap
|
||||||
DocumentPath dpathForCxt = DocumentPath.from(Lists.newArrayList(
|
complete(eventMapTree.removeNode(DocumentPath.from(Lists.newArrayList(
|
||||||
"root", eventType, eventHint, contextName));
|
"root", eventType, eventHint, contextName))));
|
||||||
WorkflowEventMetaData workflowEventMetaData = completeVersioned(eventMapTree.get(dpathForCxt));
|
log.trace("UnregisterEventMap from eventCxtPerHintMap for eventType:{}, eventSet:{}, contextName:{}",
|
||||||
if (Objects.nonNull(workflowEventMetaData)) {
|
eventType, eventHint, contextName);
|
||||||
WorkflowEventMetaData updatedWorkflowEventMetaData = new WorkflowEventMetaData(workflowEventMetaData);
|
|
||||||
updatedWorkflowEventMetaData.setProgramCounterString(INVALID_PC);
|
|
||||||
complete(eventMapTree.replace(dpathForCxt, updatedWorkflowEventMetaData, workflowEventMetaData));
|
|
||||||
log.trace("UnregisterEventMap from eventCxtPerHintMap for eventType:{}, eventSet:{}, contextName:{}",
|
|
||||||
eventType, eventHint, contextName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
hintSetPerCxtMap.remove(contextName);
|
hintSetPerCxtMap.remove(contextName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, WorkflowEventMetaData> getEventMapByHint(String eventType,
|
public Map<String, String> getEventMapByHint(String eventType, String eventHint) throws WorkflowException {
|
||||||
String eventHint) throws WorkflowException {
|
|
||||||
DocumentPath path = DocumentPath.from(
|
DocumentPath path = DocumentPath.from(
|
||||||
Lists.newArrayList("root", eventType, eventHint));
|
Lists.newArrayList("root", eventType, eventHint));
|
||||||
Map<String, Versioned<WorkflowEventMetaData>> contexts = complete(eventMapTree.getChildren(path));
|
Map<String, Versioned<String>> contexts = complete(eventMapTree.getChildren(path));
|
||||||
Map<String, WorkflowEventMetaData> eventMap = Maps.newHashMap();
|
Map<String, String> eventMap = Maps.newHashMap();
|
||||||
if (Objects.isNull(contexts)) {
|
if (Objects.isNull(contexts)) {
|
||||||
return eventMap;
|
return eventMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map.Entry<String, Versioned<WorkflowEventMetaData>> entry : contexts.entrySet()) {
|
for (Map.Entry<String, Versioned<String>> entry : contexts.entrySet()) {
|
||||||
eventMap.put(entry.getKey(), entry.getValue().value());
|
eventMap.put(entry.getKey(), entry.getValue().value());
|
||||||
}
|
}
|
||||||
log.trace("getEventMapByHint returns eventMap {} ", eventMap);
|
log.trace("getEventMapByHint returns eventMap {} ", eventMap);
|
||||||
@ -212,25 +170,11 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isTriggerSet(String eventType, String eventHint,
|
|
||||||
String contextName) throws WorkflowException {
|
|
||||||
|
|
||||||
//Remove from eventCxtPerHintMap
|
|
||||||
DocumentPath dpathForCxt = DocumentPath.from(Lists.newArrayList(
|
|
||||||
"root", eventType, eventHint, contextName));
|
|
||||||
WorkflowEventMetaData workflowEventMetaData = completeVersioned(eventMapTree.get(dpathForCxt));
|
|
||||||
if (Objects.nonNull(workflowEventMetaData)) {
|
|
||||||
return workflowEventMetaData.getTriggerFlag();
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Versioned<WorkflowEventMetaData>> getChildren(String path) throws WorkflowException {
|
public Map<String, Versioned<String>> getChildren(String path) throws WorkflowException {
|
||||||
DocumentPath dpath = DocumentPath.from(path);
|
DocumentPath dpath = DocumentPath.from(path);
|
||||||
Map<String, Versioned<WorkflowEventMetaData>> entries = complete(eventMapTree.getChildren(dpath));
|
Map<String, Versioned<String>> entries = complete(eventMapTree.getChildren(dpath));
|
||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,11 +188,11 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
|
|||||||
public ObjectNode asJsonTree() throws WorkflowException {
|
public ObjectNode asJsonTree() throws WorkflowException {
|
||||||
|
|
||||||
DocumentPath rootPath = DocumentPath.from(Lists.newArrayList("root"));
|
DocumentPath rootPath = DocumentPath.from(Lists.newArrayList("root"));
|
||||||
Map<String, Versioned<WorkflowEventMetaData>> eventmap = complete(eventMapTree.getChildren(rootPath));
|
Map<String, Versioned<String>> eventmap = complete(eventMapTree.getChildren(rootPath));
|
||||||
|
|
||||||
ObjectNode rootNode = JsonNodeFactory.instance.objectNode();
|
ObjectNode rootNode = JsonNodeFactory.instance.objectNode();
|
||||||
|
|
||||||
for (Map.Entry<String, Versioned<WorkflowEventMetaData>> eventTypeEntry : eventmap.entrySet()) {
|
for (Map.Entry<String, Versioned<String>> eventTypeEntry : eventmap.entrySet()) {
|
||||||
|
|
||||||
String eventType = eventTypeEntry.getKey();
|
String eventType = eventTypeEntry.getKey();
|
||||||
|
|
||||||
@ -256,9 +200,9 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
|
|||||||
rootNode.put(eventType, eventTypeNode);
|
rootNode.put(eventType, eventTypeNode);
|
||||||
|
|
||||||
DocumentPath eventTypePath = DocumentPath.from(Lists.newArrayList("root", eventType));
|
DocumentPath eventTypePath = DocumentPath.from(Lists.newArrayList("root", eventType));
|
||||||
Map<String, Versioned<WorkflowEventMetaData>> hintmap = complete(eventMapTree.getChildren(eventTypePath));
|
Map<String, Versioned<String>> hintmap = complete(eventMapTree.getChildren(eventTypePath));
|
||||||
|
|
||||||
for (Map.Entry<String, Versioned<WorkflowEventMetaData>> hintEntry : hintmap.entrySet()) {
|
for (Map.Entry<String, Versioned<String>> hintEntry : hintmap.entrySet()) {
|
||||||
|
|
||||||
String hint = hintEntry.getKey();
|
String hint = hintEntry.getKey();
|
||||||
|
|
||||||
@ -266,10 +210,10 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
|
|||||||
eventTypeNode.put(hint, hintNode);
|
eventTypeNode.put(hint, hintNode);
|
||||||
|
|
||||||
DocumentPath hintPath = DocumentPath.from(Lists.newArrayList("root", eventType, hint));
|
DocumentPath hintPath = DocumentPath.from(Lists.newArrayList("root", eventType, hint));
|
||||||
Map<String, Versioned<WorkflowEventMetaData>> contextmap = complete(eventMapTree.getChildren(hintPath));
|
Map<String, Versioned<String>> contextmap = complete(eventMapTree.getChildren(hintPath));
|
||||||
|
|
||||||
for (Map.Entry<String, Versioned<WorkflowEventMetaData>> ctxtEntry : contextmap.entrySet()) {
|
for (Map.Entry<String, Versioned<String>> ctxtEntry : contextmap.entrySet()) {
|
||||||
hintNode.put(ctxtEntry.getKey(), ctxtEntry.getValue().value().toString());
|
hintNode.put(ctxtEntry.getKey(), ctxtEntry.getValue().value());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,8 +32,6 @@ import org.onosproject.workflow.api.SystemWorkflowContext;
|
|||||||
import org.onosproject.workflow.api.EventTimeoutTask;
|
import org.onosproject.workflow.api.EventTimeoutTask;
|
||||||
import org.onosproject.workflow.api.TimeoutTask;
|
import org.onosproject.workflow.api.TimeoutTask;
|
||||||
import org.onosproject.workflow.api.TimerChain;
|
import org.onosproject.workflow.api.TimerChain;
|
||||||
import org.onosproject.workflow.api.TriggerWorklet;
|
|
||||||
import org.onosproject.workflow.api.WorkflowEventMetaData;
|
|
||||||
import org.onosproject.workflow.api.Worklet;
|
import org.onosproject.workflow.api.Worklet;
|
||||||
import org.onosproject.workflow.api.Workflow;
|
import org.onosproject.workflow.api.Workflow;
|
||||||
import org.onosproject.workflow.api.WorkflowContext;
|
import org.onosproject.workflow.api.WorkflowContext;
|
||||||
@ -180,7 +178,7 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
|
|||||||
|
|
||||||
Workflow workflow = workflowStore.get(context.workflowId());
|
Workflow workflow = workflowStore.get(context.workflowId());
|
||||||
if (workflow == null) {
|
if (workflow == null) {
|
||||||
log.error("Invalid workflow {}", context.workflowId());
|
log.error("Invalid workflow id:{}", context.workflowId());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,7 +234,7 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, WorkflowEventMetaData> eventMap;
|
Map<String, String> eventMap;
|
||||||
|
|
||||||
String eventHint;
|
String eventHint;
|
||||||
try {
|
try {
|
||||||
@ -245,7 +243,6 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
|
|||||||
log.error("Exception: ", e);
|
log.error("Exception: ", e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eventHint == null) {
|
if (eventHint == null) {
|
||||||
// do nothing
|
// do nothing
|
||||||
log.error("Invalid eventHint, event: {}", event);
|
log.error("Invalid eventHint, event: {}", event);
|
||||||
@ -254,87 +251,59 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
eventMap = eventMapStore.getEventMapByHint(event.getClass().getName(), eventHint);
|
eventMap = eventMapStore.getEventMapByHint(event.getClass().getName(), eventHint);
|
||||||
if (Objects.isNull(eventMap) || eventMap.isEmpty()) {
|
} catch (WorkflowException e) {
|
||||||
// do nothing;
|
log.error("Exception: ", e);
|
||||||
log.debug("Invalid eventMap, event: {}", event);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Objects.isNull(eventMap) || eventMap.isEmpty()) {
|
||||||
|
// do nothing;
|
||||||
|
log.debug("Invalid eventMap, event: {}", event);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, String> entry : eventMap.entrySet()) {
|
||||||
|
String contextName = entry.getKey();
|
||||||
|
String strProgramCounter = entry.getValue();
|
||||||
|
ProgramCounter pc;
|
||||||
|
try {
|
||||||
|
pc = ProgramCounter.valueOf(strProgramCounter);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
log.error("Exception: ", e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map.Entry<String, WorkflowEventMetaData> entry : eventMap.entrySet()) {
|
WorkflowContext context = workplaceStore.getContext(contextName);
|
||||||
String contextName = entry.getKey();
|
if (Objects.isNull(context)) {
|
||||||
ProgramCounter pc = ProgramCounter.valueOf("INVALID_WORKLET", 0);
|
log.info("Invalid context: {}, event: {}", contextName, event);
|
||||||
WorkflowContext context = null;
|
continue;
|
||||||
|
}
|
||||||
context = workplaceStore.getContext(contextName);
|
EventTask eventtask = null;
|
||||||
|
try {
|
||||||
if (Objects.isNull(context)) {
|
eventtask = EventTask.builder()
|
||||||
log.info("Invalid context: {}, event: {}", contextName, event);
|
.event(event)
|
||||||
continue;
|
.eventHint(eventHint)
|
||||||
}
|
.context(context)
|
||||||
|
.programCounter(pc)
|
||||||
EventTask eventtask = null;
|
.build();
|
||||||
if (eventMapStore.isTriggerSet(event.getClass().getName(), eventHint, contextName)) {
|
} catch (WorkflowException e) {
|
||||||
try {
|
log.error("Exception: ", e);
|
||||||
eventtask = EventTask.builder()
|
|
||||||
.event(event)
|
|
||||||
.eventHint(eventHint)
|
|
||||||
.context(context)
|
|
||||||
.programCounter(pc)
|
|
||||||
.build();
|
|
||||||
} catch (WorkflowException e) {
|
|
||||||
log.error("Exception: ", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
log.debug("eventtaskAccumulator.add: task: {}", eventtask);
|
|
||||||
if (!Objects.isNull(eventtask)) {
|
|
||||||
eventtaskAccumulator.add(eventtask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*Both type of event is being scheduled here if applicable.
|
|
||||||
If worfklow trigger event is set but may not be a valid one for current event type,
|
|
||||||
then normal worklet event should be processed if applicable. But validity of workflow
|
|
||||||
trigger event would be checked later, so as of now both kind of event would be scheduled.
|
|
||||||
later while trigger event processing, its validity is found to be true, then worklet events
|
|
||||||
would be unregistered and eventually these events wont be processed.*/
|
|
||||||
if (eventMapStore.isEventMapPresent(contextName)) {
|
|
||||||
try {
|
|
||||||
pc = entry.getValue().getProgramCounter();
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
log.error("Exception: ", e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
eventtask = EventTask.builder()
|
|
||||||
.event(event)
|
|
||||||
.eventHint(eventHint)
|
|
||||||
.context(context)
|
|
||||||
.programCounter(pc)
|
|
||||||
.build();
|
|
||||||
} catch (WorkflowException e) {
|
|
||||||
log.error("Exception: ", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
log.debug("eventtaskAccumulator.add: task: {}", eventtask);
|
|
||||||
if (!Objects.isNull(eventtask)) {
|
|
||||||
eventtaskAccumulator.add(eventtask);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (WorkflowException we) {
|
log.debug("eventtaskAccumulator.add: task: {}", eventtask);
|
||||||
log.error("Exception {} occured in fetching contexts for trigger event {}", we, event);
|
if (!Objects.isNull(eventtask)) {
|
||||||
|
eventtaskAccumulator.add(eventtask);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerEventMap(Class<? extends Event> eventType, Set<String> eventHintSet,
|
public void registerEventMap(Class<? extends Event> eventType, Set<String> eventHintSet,
|
||||||
String contextName, ProgramCounter programCounter) throws WorkflowException {
|
String contextName, String programCounterString) throws WorkflowException {
|
||||||
eventMapStore.registerEventMap(eventType.getName(), eventHintSet, contextName, programCounter);
|
eventMapStore.registerEventMap(eventType.getName(), eventHintSet, contextName, programCounterString);
|
||||||
for (String eventHint : eventHintSet) {
|
for (String eventHint : eventHintSet) {
|
||||||
for (int i = 0; i < MAX_REGISTER_EVENTMAP_WAITS; i++) {
|
for (int i = 0; i < MAX_REGISTER_EVENTMAP_WAITS; i++) {
|
||||||
Map<String, WorkflowEventMetaData> eventMap =
|
Map<String, String> eventMap = eventMapStore.getEventMapByHint(eventType.getName(), eventHint);
|
||||||
eventMapStore.getEventMapByHint(eventType.getName(), eventHint);
|
|
||||||
if (eventMap != null && eventMap.containsKey(contextName)) {
|
if (eventMap != null && eventMap.containsKey(contextName)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -454,7 +423,6 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
|
|||||||
context.setWorkflowExecutionService(this);
|
context.setWorkflowExecutionService(this);
|
||||||
context.setWorkflowStore(workflowStore);
|
context.setWorkflowStore(workflowStore);
|
||||||
context.setWorkplaceStore(workplaceStore);
|
context.setWorkplaceStore(workplaceStore);
|
||||||
context.setEventMapStore(eventMapStore);
|
|
||||||
context.waitCompletion(null, null, null, 0L);
|
context.waitCompletion(null, null, null, 0L);
|
||||||
context.setTriggerNext(false);
|
context.setTriggerNext(false);
|
||||||
}
|
}
|
||||||
@ -490,39 +458,14 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
|
|||||||
*/
|
*/
|
||||||
private EventTask execEventTask(EventTask task) {
|
private EventTask execEventTask(EventTask task) {
|
||||||
|
|
||||||
WorkflowContext context = (WorkflowContext) (task.context());
|
if (!eventMapStore.isEventMapPresent(task.context().name())) {
|
||||||
String cxtName = context.name();
|
log.trace("EventMap doesnt exist for taskcontext:{}", task.context().name());
|
||||||
try {
|
|
||||||
if (eventMapStore.isTriggerSet(task.event().getClass().getName(), task.eventHint(), cxtName)) {
|
|
||||||
WorkflowContext workflowContext = workplaceStore.getContext(cxtName);
|
|
||||||
Workflow workflow = workflowStore.get(workflowContext.workflowId());
|
|
||||||
String triggerWorkletName = workflow.getTriggerWorkletClassName().get();
|
|
||||||
Worklet worklet = workflow.getTriggerWorkletInstance(triggerWorkletName);
|
|
||||||
if (worklet instanceof TriggerWorklet) {
|
|
||||||
if (((TriggerWorklet) worklet).isTriggerValid(workflowContext, task.event())) {
|
|
||||||
if (Objects.nonNull(workflowContext.completionEventType())) {
|
|
||||||
eventMapStore.unregisterEventMap(workflowContext.completionEventType().getName(),
|
|
||||||
workflowContext.name());
|
|
||||||
}
|
|
||||||
initWorkletExecution(workflowContext);
|
|
||||||
workflowContext.setCurrent(ProgramCounter.INIT_PC);
|
|
||||||
workplaceStore.commitContext(cxtName, workflowContext, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (WorkflowException we) {
|
|
||||||
log.error("Error Occurred in validating trigger for eventType {} eventHint {} context name {}",
|
|
||||||
task.eventType(), task.eventHint(), cxtName);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!eventMapStore.isEventMapPresent(cxtName)) {
|
|
||||||
log.trace("EventMap doesnt exist for taskcontext:{}", cxtName);
|
|
||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
|
||||||
log.debug("execEventTask- task: {}, hash: {}", task, stringHash(task.context().distributor()));
|
log.debug("execEventTask- task: {}, hash: {}", task, stringHash(task.context().distributor()));
|
||||||
|
|
||||||
|
WorkflowContext context = (WorkflowContext) (task.context());
|
||||||
Workflow workflow = workflowStore.get(context.workflowId());
|
Workflow workflow = workflowStore.get(context.workflowId());
|
||||||
if (workflow == null) {
|
if (workflow == null) {
|
||||||
log.error("Invalid workflow {}", context.workflowId());
|
log.error("Invalid workflow {}", context.workflowId());
|
||||||
@ -874,7 +817,8 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
|
|||||||
}
|
}
|
||||||
|
|
||||||
registerEventMap(latestContext.completionEventType(), latestContext.completionEventHints(),
|
registerEventMap(latestContext.completionEventType(), latestContext.completionEventHints(),
|
||||||
latestContext.name(), pc);
|
latestContext.name(), pc.toString());
|
||||||
|
|
||||||
latestContext.completionEventGenerator().apply();
|
latestContext.completionEventGenerator().apply();
|
||||||
|
|
||||||
if (latestContext.completionEventTimeout() != 0L) {
|
if (latestContext.completionEventTimeout() != 0L) {
|
||||||
|
@ -23,10 +23,8 @@ import org.onosproject.workflow.api.AbstractWorklet;
|
|||||||
import org.onosproject.workflow.api.DefaultWorkflowContext;
|
import org.onosproject.workflow.api.DefaultWorkflowContext;
|
||||||
import org.onosproject.workflow.api.DefaultWorkplace;
|
import org.onosproject.workflow.api.DefaultWorkplace;
|
||||||
import org.onosproject.workflow.api.ImmutableListWorkflow;
|
import org.onosproject.workflow.api.ImmutableListWorkflow;
|
||||||
import org.onosproject.workflow.api.JsonDataModelInjector;
|
|
||||||
import org.onosproject.workflow.api.JsonDataModelTree;
|
import org.onosproject.workflow.api.JsonDataModelTree;
|
||||||
import org.onosproject.workflow.api.SystemWorkflowContext;
|
import org.onosproject.workflow.api.SystemWorkflowContext;
|
||||||
import org.onosproject.workflow.api.TriggerWorklet;
|
|
||||||
import org.onosproject.workflow.api.Workflow;
|
import org.onosproject.workflow.api.Workflow;
|
||||||
import org.onosproject.workflow.api.WorkflowAttribute;
|
import org.onosproject.workflow.api.WorkflowAttribute;
|
||||||
import org.onosproject.workflow.api.WorkflowContext;
|
import org.onosproject.workflow.api.WorkflowContext;
|
||||||
@ -37,7 +35,6 @@ import org.onosproject.workflow.api.WorkflowDescription;
|
|||||||
import org.onosproject.workflow.api.WorkflowException;
|
import org.onosproject.workflow.api.WorkflowException;
|
||||||
import org.onosproject.workflow.api.WorkflowExecutionService;
|
import org.onosproject.workflow.api.WorkflowExecutionService;
|
||||||
import org.onosproject.workflow.api.WorkflowStore;
|
import org.onosproject.workflow.api.WorkflowStore;
|
||||||
import org.onosproject.workflow.api.Worklet;
|
|
||||||
import org.onosproject.workflow.api.Workplace;
|
import org.onosproject.workflow.api.Workplace;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -94,7 +91,7 @@ public class WorkplaceWorkflow {
|
|||||||
((SystemWorkflowContext) context).setDistributor(workplaceName);
|
((SystemWorkflowContext) context).setDistributor(workplaceName);
|
||||||
|
|
||||||
context.completed();
|
context.completed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class CreateWorkplace extends AbsWorkflowWorklet {
|
public static class CreateWorkplace extends AbsWorkflowWorklet {
|
||||||
@ -217,17 +214,6 @@ public class WorkplaceWorkflow {
|
|||||||
WorkflowContext buildingContext = workflow.buildContext(workplace, subTree);
|
WorkflowContext buildingContext = workflow.buildContext(workplace, subTree);
|
||||||
log.info("registerContext {}", buildingContext.name());
|
log.info("registerContext {}", buildingContext.name());
|
||||||
context.workplaceStore().registerContext(buildingContext.name(), buildingContext);
|
context.workplaceStore().registerContext(buildingContext.name(), buildingContext);
|
||||||
|
|
||||||
if (workflow.getTriggerWorkletClassName().isPresent()) {
|
|
||||||
String triggerWorkletName = workflow.getTriggerWorkletClassName().get();
|
|
||||||
Worklet worklet = workflow.getTriggerWorkletInstance(triggerWorkletName);
|
|
||||||
if (worklet instanceof TriggerWorklet) {
|
|
||||||
buildingContext.setEventMapStore(context.eventMapStore());
|
|
||||||
JsonDataModelInjector dataModelInjector = new JsonDataModelInjector();
|
|
||||||
dataModelInjector.inject(worklet, buildingContext);
|
|
||||||
((TriggerWorklet) worklet).register(buildingContext);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
submitTrue(context);
|
submitTrue(context);
|
||||||
|
|
||||||
context.completed();
|
context.completed();
|
||||||
|
@ -106,29 +106,6 @@ public class OfOverlayWorkflowRegister {
|
|||||||
|
|
||||||
workflowStore.register(workflow);
|
workflowStore.register(workflow);
|
||||||
|
|
||||||
// registering new workflow definition
|
|
||||||
uri = URI.create("of-overlay.workflow-nova-with-trigger-to-restart");
|
|
||||||
workflow = ImmutableListWorkflow.builder()
|
|
||||||
.id(uri)
|
|
||||||
//.attribute(WorkflowAttribute.REMOVE_AFTER_COMPLETE)
|
|
||||||
.chain(Ovs.CreateOvsdbDevice.class.getName())
|
|
||||||
.chain(Ovs.UpdateOvsVersion.class.getName())
|
|
||||||
.chain(Ovs.UpdateBridgeId.class.getName())
|
|
||||||
.chain(DefaultWorkletDescription.builder().name(Ovs.CreateBridge.class.getName())
|
|
||||||
.staticDataModel(BRIDGE_NAME, "br-int")
|
|
||||||
.build())
|
|
||||||
.chain(DefaultWorkletDescription.builder().name(Ovs.CreateBridge.class.getName())
|
|
||||||
.staticDataModel(BRIDGE_NAME, "br-phy")
|
|
||||||
.build())
|
|
||||||
.chain(Ovs.CreateOverlayBridgeVxlanPort.class.getName())
|
|
||||||
.chain(Ovs.AddPhysicalPortsOnUnderlayBridge.class.getName())
|
|
||||||
.chain(Ovs.ConfigureUnderlayBridgeLocalIp.class.getName())
|
|
||||||
.trigger(Ovs.TrigerWorkflowAtDeviceReboot.class.getName())
|
|
||||||
.build();
|
|
||||||
workflowStore.register(workflow);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// registering new workflow definition based on multi-event handling
|
// registering new workflow definition based on multi-event handling
|
||||||
uri = URI.create("of-overlay.workflow-nova-multiEvent-test");
|
uri = URI.create("of-overlay.workflow-nova-multiEvent-test");
|
||||||
workflow = ImmutableListWorkflow.builder()
|
workflow = ImmutableListWorkflow.builder()
|
||||||
|
@ -57,7 +57,6 @@ import org.onosproject.ovsdb.controller.OvsdbController;
|
|||||||
import org.onosproject.ovsdb.controller.OvsdbNodeId;
|
import org.onosproject.ovsdb.controller.OvsdbNodeId;
|
||||||
import org.onosproject.workflow.api.AbstractWorklet;
|
import org.onosproject.workflow.api.AbstractWorklet;
|
||||||
import org.onosproject.workflow.api.JsonDataModel;
|
import org.onosproject.workflow.api.JsonDataModel;
|
||||||
import org.onosproject.workflow.api.TriggerWorklet;
|
|
||||||
import org.onosproject.workflow.api.WorkflowContext;
|
import org.onosproject.workflow.api.WorkflowContext;
|
||||||
import org.onosproject.workflow.api.WorkflowException;
|
import org.onosproject.workflow.api.WorkflowException;
|
||||||
import org.onosproject.workflow.api.StaticDataModel;
|
import org.onosproject.workflow.api.StaticDataModel;
|
||||||
@ -68,7 +67,6 @@ import org.slf4j.LoggerFactory;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -1314,40 +1312,5 @@ public final class Ovs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Work-let class for trigger event registration and validation.
|
|
||||||
*/
|
|
||||||
public static class TrigerWorkflowAtDeviceReboot extends TriggerWorklet {
|
|
||||||
|
|
||||||
@JsonDataModel(path = MODEL_MGMT_IP)
|
|
||||||
String strMgmtIp;
|
|
||||||
|
|
||||||
String strOfDevIdUnderlay;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void register(WorkflowContext context) throws WorkflowException {
|
|
||||||
DeviceId brphyDevId = OvsUtil.buildOfDeviceId(IpAddress.valueOf(strMgmtIp), DEVID_IDX_BRIDGE_UNDERLAY_NOVA);
|
|
||||||
Set<String> eventHintSet = new HashSet<>();
|
|
||||||
eventHintSet.add(brphyDevId.toString());
|
|
||||||
context.registerTriggerEvent(DeviceEvent.class, eventHintSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isTriggerValid(WorkflowContext context, Event event) throws WorkflowException {
|
|
||||||
|
|
||||||
if (!(event instanceof DeviceEvent)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
DeviceEvent deviceEvent = (DeviceEvent) event;
|
|
||||||
Device device = deviceEvent.subject();
|
|
||||||
switch (deviceEvent.type()) {
|
|
||||||
case DEVICE_AVAILABILITY_CHANGED:
|
|
||||||
return !context.getService(DeviceService.class).isAvailable(device.id());
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"apps": {
|
|
||||||
"org.onosproject.workflow": {
|
|
||||||
"workflow" : {
|
|
||||||
"rpc" : [
|
|
||||||
{
|
|
||||||
"op" : "workflow.invoke",
|
|
||||||
"params" : {
|
|
||||||
"workplace" : "Nova-000",
|
|
||||||
"id" : "of-overlay.workflow-nova-with-trigger-to-restart",
|
|
||||||
"data" : {
|
|
||||||
|
|
||||||
"mgmtIp" : "192.168.10.8",
|
|
||||||
"ovsdbPort" : 6641,
|
|
||||||
|
|
||||||
"sshAccessInfo" : {
|
|
||||||
"remoteIp" : "192.168.10.8",
|
|
||||||
"port" : 22,
|
|
||||||
"user" : "root",
|
|
||||||
"password" : "iloveyou",
|
|
||||||
"keyfile" : "~/.ssh/id_rsa"
|
|
||||||
},
|
|
||||||
|
|
||||||
"ovsDatapathType" : "system",
|
|
||||||
"physicalPorts" : [ "nova0_1" ],
|
|
||||||
"vtepIp" : "120.0.0.200/24",
|
|
||||||
|
|
||||||
"annotations" : {
|
|
||||||
"rackId" : 1,
|
|
||||||
"rackPosition" : 3
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"id" : "00001@10.0.0.1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user