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:
jaegonkim 2020-03-22 00:44:29 +09:00 committed by Jian Li
parent 9619d8087a
commit ce75d3c68a
16 changed files with 85 additions and 703 deletions

View File

@ -57,5 +57,4 @@ public abstract class AbstractWorkflow implements Workflow {
.data(data)
.build();
}
}

View File

@ -33,21 +33,11 @@ public interface ContextEventMapStore {
* @param eventType the class name of event
* @param eventHintSet Set of event hint string value of the event
* @param contextName workflow context name
* @param programCounter the program counter of workflow
* @param programCounterString the program counter of workflow
* @throws WorkflowException workflow exception
*/
void registerEventMap(String eventType, Set<String> eventHintSet,
String contextName, ProgramCounter programCounter) 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;
String contextName, String programCounterString) throws WorkflowException;
/**
* Unregisters workflow context event mapping.
@ -62,10 +52,10 @@ public interface ContextEventMapStore {
* Returns workflow context event mapping.
* @param eventType the class name of 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
*/
Map<String, WorkflowEventMetaData> getEventMapByHint(String eventType,
Map<String, String> getEventMapByHint(String eventType,
String eventHint) throws WorkflowException;
/**
@ -75,24 +65,13 @@ public interface ContextEventMapStore {
*/
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.
* @param path document tree path including eventType and Hint
* @return children under document tree path
* @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.

View File

@ -91,12 +91,6 @@ public class DefaultWorkflowContext extends WorkflowContext {
*/
private transient WorkplaceStore workplaceStore;
/**
* Service reference for eventMap store.
*/
private transient ContextEventMapStore eventMapStore;
/**
* Constructor of DefaultWorkflowContext.
* @param builder default workflow context builder
@ -219,11 +213,6 @@ public class DefaultWorkflowContext extends WorkflowContext {
return completionEventTimeoutMs;
}
@Override
public void registerTriggerEvent(Class<? extends Event> event, Set<String> eventHintSet) throws WorkflowException {
eventMapStore.registerTriggerFlag(event.getName(), eventHintSet, this.name());
}
@Override
public void setWorkflowExecutionService(WorkflowExecutionService workflowExecutionService) {
this.workflowExecutionService = workflowExecutionService;
@ -254,17 +243,6 @@ public class DefaultWorkflowContext extends WorkflowContext {
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 {
T service;
try {

View File

@ -28,7 +28,6 @@ import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
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 StaticDataModelInjector staticDataModelInjector = new StaticDataModelInjector();
private Optional<String> triggerWorkletClassName = Optional.empty();
/**
* Constructor of ImmutableListWorkflow.
*
@ -65,17 +62,11 @@ public final class ImmutableListWorkflow extends AbstractWorkflow {
*/
private ImmutableListWorkflow(Builder builder) {
super(builder.id);
triggerWorkletClassName = builder.triggerWorkletClassName;
this.initWorkletType = builder.initWorkletType;
program = ImmutableList.copyOf(builder.workletDescList);
attributes = ImmutableSet.copyOf(builder.attributes);
}
@Override
public Optional<String> getTriggerWorkletClassName() {
return triggerWorkletClassName;
}
@Override
public Worklet init(WorkflowContext context) throws WorkflowException {
if (Objects.isNull(initWorkletType)) {
@ -217,12 +208,6 @@ public final class ImmutableListWorkflow extends AbstractWorkflow {
return pcList;
}
@Override
public Worklet getTriggerWorkletInstance(String workletType) throws WorkflowException {
return getWorkletInstance(workletType);
}
@Override
public WorkletDescription getWorkletDesc(ProgramCounter pc) {
@ -312,7 +297,6 @@ public final class ImmutableListWorkflow extends AbstractWorkflow {
public static class Builder {
private URI id;
private Optional<String> triggerWorkletClassName = Optional.empty();
private String initWorkletType;
private final List<WorkletDescription> workletDescList = Lists.newArrayList();
private final Set<WorkflowAttribute> attributes = Sets.newHashSet();
@ -329,17 +313,6 @@ public final class ImmutableListWorkflow extends AbstractWorkflow {
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.
*

View File

@ -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");
}
}

View File

@ -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);
}
}
}

View File

@ -17,7 +17,6 @@ package org.onosproject.workflow.api;
import java.net.URI;
import java.util.List;
import java.util.Optional;
import java.util.Set;
/**
@ -102,15 +101,6 @@ public interface Workflow {
*/
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.
* @param pc program counter
@ -118,10 +108,4 @@ public interface Workflow {
*/
WorkletDescription getWorkletDesc(ProgramCounter pc);
/**
* Returns trigger worklet class name if any.
* @return trigger worklet class name
*/
Optional<String> getTriggerWorkletClassName();
}

View File

@ -143,29 +143,6 @@ public abstract class WorkflowContext extends WorkflowData {
*/
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.
* @param workflowExecutionService workflow service

View File

@ -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();
}
}

View File

@ -49,9 +49,9 @@ public interface WorkflowExecutionService extends ListenerService<WorkflowDataEv
* @param eventType event type (class name of event)
* @param eventHintSet Set of event hint value
* @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
*/
void registerEventMap(Class<? extends Event> eventType, Set<String> eventHintSet,
String contextName, ProgramCounter programCounter) throws WorkflowException;
String contextName, String programCounterString) throws WorkflowException;
}

View File

@ -21,8 +21,6 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.onosproject.store.service.EventuallyConsistentMap;
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.Component;
import org.osgi.service.component.annotations.Deactivate;
@ -66,12 +64,10 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
private ApplicationId appId;
private AsyncDocumentTree<WorkflowEventMetaData> eventMapTree;
private AsyncDocumentTree<String> eventMapTree;
private EventuallyConsistentMap<String, Set<String>> hintSetPerCxtMap;
private static final ProgramCounter INVALID_PC = ProgramCounter.valueOf("INVALID_WORKLET", 0);
@Activate
public void activate() {
@ -81,12 +77,9 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
KryoNamespace eventMapNamespace = KryoNamespace.newBuilder()
.register(KryoNamespaces.API)
.register(ProgramCounter.class)
.register(WorkflowEventMetaData.class)
.register(Set.class)
.build();
eventMapTree = storageService.<WorkflowEventMetaData>documentTreeBuilder()
eventMapTree = storageService.<String>documentTreeBuilder()
.withSerializer(Serializer.using(eventMapNamespace))
.withName("context-event-map-store")
.withOrdering(Ordering.INSERTION)
@ -110,49 +103,25 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
@Override
public void registerEventMap(String eventType, Set<String> eventHintSet,
String contextName, ProgramCounter programCounter) throws WorkflowException {
String contextName, String programCounterString) 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(false, programCounter);
complete(eventMapTree.createRecursive(dpathForCxt, workflowEventMetaData));
String currentWorkletType = completeVersioned(eventMapTree.get(dpathForCxt));
if (currentWorkletType == null) {
complete(eventMapTree.createRecursive(dpathForCxt, programCounterString));
} else {
WorkflowEventMetaData updatedWorkflowEventMetaData =
new WorkflowEventMetaData(workflowEventMetaData.getTriggerFlag(), programCounter);
complete(eventMapTree.replace(dpathForCxt, updatedWorkflowEventMetaData, workflowEventMetaData));
complete(eventMapTree.replace(dpathForCxt, programCounterString, currentWorkletType));
}
log.trace("RegisterEventMap for eventType:{}, eventSet:{}, contextName:{}, pc:{}",
eventType, eventHintSet, contextName, programCounter.toString());
eventType, eventHintSet, contextName, programCounterString);
}
hintSetPerCxtMap.put(contextName, eventHintSet);
log.trace("RegisterEventMap in hintSetPerCxt for " +
"eventType:{}, eventSet:{}, contextName:{}, pc:{}",
eventType, eventHintSet, contextName, programCounter.toString());
}
@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);
}
eventType, eventHintSet, contextName, programCounterString);
}
@Override
@ -160,39 +129,28 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
throws WorkflowException {
Set<String> hints = hintSetPerCxtMap.get(contextName);
if (Objects.isNull(hints)) {
return;
}
for (String eventHint : hints) {
//Remove from eventCxtPerHintMap
DocumentPath dpathForCxt = DocumentPath.from(Lists.newArrayList(
"root", eventType, eventHint, contextName));
WorkflowEventMetaData workflowEventMetaData = completeVersioned(eventMapTree.get(dpathForCxt));
if (Objects.nonNull(workflowEventMetaData)) {
WorkflowEventMetaData updatedWorkflowEventMetaData = new WorkflowEventMetaData(workflowEventMetaData);
updatedWorkflowEventMetaData.setProgramCounterString(INVALID_PC);
complete(eventMapTree.replace(dpathForCxt, updatedWorkflowEventMetaData, workflowEventMetaData));
complete(eventMapTree.removeNode(DocumentPath.from(Lists.newArrayList(
"root", eventType, eventHint, contextName))));
log.trace("UnregisterEventMap from eventCxtPerHintMap for eventType:{}, eventSet:{}, contextName:{}",
eventType, eventHint, contextName);
}
}
hintSetPerCxtMap.remove(contextName);
}
@Override
public Map<String, WorkflowEventMetaData> getEventMapByHint(String eventType,
String eventHint) throws WorkflowException {
public Map<String, String> getEventMapByHint(String eventType, String eventHint) throws WorkflowException {
DocumentPath path = DocumentPath.from(
Lists.newArrayList("root", eventType, eventHint));
Map<String, Versioned<WorkflowEventMetaData>> contexts = complete(eventMapTree.getChildren(path));
Map<String, WorkflowEventMetaData> eventMap = Maps.newHashMap();
Map<String, Versioned<String>> contexts = complete(eventMapTree.getChildren(path));
Map<String, String> eventMap = Maps.newHashMap();
if (Objects.isNull(contexts)) {
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());
}
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
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);
Map<String, Versioned<WorkflowEventMetaData>> entries = complete(eventMapTree.getChildren(dpath));
Map<String, Versioned<String>> entries = complete(eventMapTree.getChildren(dpath));
return entries;
}
@ -244,11 +188,11 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
public ObjectNode asJsonTree() throws WorkflowException {
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();
for (Map.Entry<String, Versioned<WorkflowEventMetaData>> eventTypeEntry : eventmap.entrySet()) {
for (Map.Entry<String, Versioned<String>> eventTypeEntry : eventmap.entrySet()) {
String eventType = eventTypeEntry.getKey();
@ -256,9 +200,9 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
rootNode.put(eventType, eventTypeNode);
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();
@ -266,10 +210,10 @@ public class DistributedContextEventMapTreeStore implements ContextEventMapStore
eventTypeNode.put(hint, hintNode);
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()) {
hintNode.put(ctxtEntry.getKey(), ctxtEntry.getValue().value().toString());
for (Map.Entry<String, Versioned<String>> ctxtEntry : contextmap.entrySet()) {
hintNode.put(ctxtEntry.getKey(), ctxtEntry.getValue().value());
}
}
}

View File

@ -32,8 +32,6 @@ import org.onosproject.workflow.api.SystemWorkflowContext;
import org.onosproject.workflow.api.EventTimeoutTask;
import org.onosproject.workflow.api.TimeoutTask;
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.Workflow;
import org.onosproject.workflow.api.WorkflowContext;
@ -180,7 +178,7 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
Workflow workflow = workflowStore.get(context.workflowId());
if (workflow == null) {
log.error("Invalid workflow {}", context.workflowId());
log.error("Invalid workflow id:{}", context.workflowId());
return;
}
@ -236,7 +234,7 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
return;
}
Map<String, WorkflowEventMetaData> eventMap;
Map<String, String> eventMap;
String eventHint;
try {
@ -245,7 +243,6 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
log.error("Exception: ", e);
return;
}
if (eventHint == null) {
// do nothing
log.error("Invalid eventHint, event: {}", event);
@ -254,26 +251,34 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
try {
eventMap = eventMapStore.getEventMapByHint(event.getClass().getName(), eventHint);
} catch (WorkflowException e) {
log.error("Exception: ", e);
return;
}
if (Objects.isNull(eventMap) || eventMap.isEmpty()) {
// do nothing;
log.debug("Invalid eventMap, event: {}", event);
return;
}
for (Map.Entry<String, WorkflowEventMetaData> entry : eventMap.entrySet()) {
for (Map.Entry<String, String> entry : eventMap.entrySet()) {
String contextName = entry.getKey();
ProgramCounter pc = ProgramCounter.valueOf("INVALID_WORKLET", 0);
WorkflowContext context = null;
context = workplaceStore.getContext(contextName);
String strProgramCounter = entry.getValue();
ProgramCounter pc;
try {
pc = ProgramCounter.valueOf(strProgramCounter);
} catch (IllegalArgumentException e) {
log.error("Exception: ", e);
return;
}
WorkflowContext context = workplaceStore.getContext(contextName);
if (Objects.isNull(context)) {
log.info("Invalid context: {}, event: {}", contextName, event);
continue;
}
EventTask eventtask = null;
if (eventMapStore.isTriggerSet(event.getClass().getName(), eventHint, contextName)) {
try {
eventtask = EventTask.builder()
.event(event)
@ -290,51 +295,15 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
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.error("Exception {} occured in fetching contexts for trigger event {}", we, event);
}
}
@Override
public void registerEventMap(Class<? extends Event> eventType, Set<String> eventHintSet,
String contextName, ProgramCounter programCounter) throws WorkflowException {
eventMapStore.registerEventMap(eventType.getName(), eventHintSet, contextName, programCounter);
String contextName, String programCounterString) throws WorkflowException {
eventMapStore.registerEventMap(eventType.getName(), eventHintSet, contextName, programCounterString);
for (String eventHint : eventHintSet) {
for (int i = 0; i < MAX_REGISTER_EVENTMAP_WAITS; i++) {
Map<String, WorkflowEventMetaData> eventMap =
eventMapStore.getEventMapByHint(eventType.getName(), eventHint);
Map<String, String> eventMap = eventMapStore.getEventMapByHint(eventType.getName(), eventHint);
if (eventMap != null && eventMap.containsKey(contextName)) {
break;
}
@ -454,7 +423,6 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
context.setWorkflowExecutionService(this);
context.setWorkflowStore(workflowStore);
context.setWorkplaceStore(workplaceStore);
context.setEventMapStore(eventMapStore);
context.waitCompletion(null, null, null, 0L);
context.setTriggerNext(false);
}
@ -490,39 +458,14 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
*/
private EventTask execEventTask(EventTask task) {
WorkflowContext context = (WorkflowContext) (task.context());
String cxtName = 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);
if (!eventMapStore.isEventMapPresent(task.context().name())) {
log.trace("EventMap doesnt exist for taskcontext:{}", task.context().name());
return task;
}
log.debug("execEventTask- task: {}, hash: {}", task, stringHash(task.context().distributor()));
WorkflowContext context = (WorkflowContext) (task.context());
Workflow workflow = workflowStore.get(context.workflowId());
if (workflow == null) {
log.error("Invalid workflow {}", context.workflowId());
@ -874,7 +817,8 @@ public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, W
}
registerEventMap(latestContext.completionEventType(), latestContext.completionEventHints(),
latestContext.name(), pc);
latestContext.name(), pc.toString());
latestContext.completionEventGenerator().apply();
if (latestContext.completionEventTimeout() != 0L) {

View File

@ -23,10 +23,8 @@ import org.onosproject.workflow.api.AbstractWorklet;
import org.onosproject.workflow.api.DefaultWorkflowContext;
import org.onosproject.workflow.api.DefaultWorkplace;
import org.onosproject.workflow.api.ImmutableListWorkflow;
import org.onosproject.workflow.api.JsonDataModelInjector;
import org.onosproject.workflow.api.JsonDataModelTree;
import org.onosproject.workflow.api.SystemWorkflowContext;
import org.onosproject.workflow.api.TriggerWorklet;
import org.onosproject.workflow.api.Workflow;
import org.onosproject.workflow.api.WorkflowAttribute;
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.WorkflowExecutionService;
import org.onosproject.workflow.api.WorkflowStore;
import org.onosproject.workflow.api.Worklet;
import org.onosproject.workflow.api.Workplace;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -217,17 +214,6 @@ public class WorkplaceWorkflow {
WorkflowContext buildingContext = workflow.buildContext(workplace, subTree);
log.info("registerContext {}", buildingContext.name());
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);
context.completed();

View File

@ -106,29 +106,6 @@ public class OfOverlayWorkflowRegister {
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
uri = URI.create("of-overlay.workflow-nova-multiEvent-test");
workflow = ImmutableListWorkflow.builder()

View File

@ -57,7 +57,6 @@ import org.onosproject.ovsdb.controller.OvsdbController;
import org.onosproject.ovsdb.controller.OvsdbNodeId;
import org.onosproject.workflow.api.AbstractWorklet;
import org.onosproject.workflow.api.JsonDataModel;
import org.onosproject.workflow.api.TriggerWorklet;
import org.onosproject.workflow.api.WorkflowContext;
import org.onosproject.workflow.api.WorkflowException;
import org.onosproject.workflow.api.StaticDataModel;
@ -68,7 +67,6 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
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;
}
}
}
}

View File

@ -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"
}
]
}
}
}
}