sample worklet with multiEvent usage

Change-Id: I03f4609714fc1df564cca87223890663788a2acc
This commit is contained in:
nitinanand 2019-03-20 10:26:08 +05:30 committed by Jaegon Kim
parent 63a921cb33
commit 2a5c8fdb40
3 changed files with 161 additions and 0 deletions

View File

@ -97,6 +97,23 @@ public class OfOverlayWorkflow {
.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()
.id(uri)
//.attribute(WorkflowAttribute.REMOVE_AFTER_COMPLETE)
.chain(Ovs.CreateOvsdbDevice.class.getName())
.chain(Ovs.UpdateOvsVersion.class.getName())
.chain(Ovs.UpdateOverlayBridgeId.class.getName())
.chain(Ovs.CreateOverlayBridgeMultiEvent.class.getName())
.chain(Ovs.UpdateUnderlayBridgeId.class.getName())
.chain(Ovs.CreateUnderlayBridge.class.getName())
.chain(Ovs.CreateOverlayBridgeVxlanPort.class.getName())
.chain(Ovs.AddPhysicalPortsOnUnderlayBridge.class.getName())
.chain(Ovs.ConfigureUnderlayBridgeLocalIp.class.getName())
.build();
workflowStore.register(workflow);
uri = URI.create("of-overlay.clean-workflow-nova");
workflow = ImmutableListWorkflow.builder()
.id(uri)

View File

@ -65,6 +65,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@ -630,6 +631,108 @@ public final class Ovs {
}
}
/**
* Work-let class for creating overlay openflow bridge.
*/
public static class CreateOverlayBridgeMultiEvent extends AbstractWorklet {
@JsonDataModel(path = MODEL_MGMT_IP)
String strMgmtIp;
@JsonDataModel(path = MODEL_OVSDB_PORT)
Integer intOvsdbPort;
@JsonDataModel(path = MODEL_OVS_DATAPATH_TYPE)
String strOvsDatapath;
@JsonDataModel(path = MODEL_OF_DEVID_OVERLAY_BRIDGE, optional = true)
String strOfDevIdOverlay;
@Override
public boolean isNext(WorkflowContext context) throws WorkflowException {
check(strOfDevIdOverlay != null, "invalid strOfDevIdOverlay");
return !OvsUtil.isAvailableBridge(context, DeviceId.deviceId(strOfDevIdOverlay));
}
@Override
public void process(WorkflowContext context) throws WorkflowException {
check(strOfDevIdOverlay != null, "invalid strOfDevIdOverlay");
BridgeConfig bridgeConfig = OvsUtil.getOvsdbBehaviour(context, strMgmtIp, BridgeConfig.class);
List<ControllerInfo> ofControllers = OvsUtil.getOpenflowControllerInfoList(context);
DeviceId ofDeviceId = DeviceId.deviceId(strOfDevIdOverlay);
if (ofControllers == null || ofControllers.size() == 0) {
throw new WorkflowException("Invalid of controllers");
}
Optional<BridgeDescription> optBd = OvsUtil.getBridgeDescription(bridgeConfig, BRIDGE_OVERLAY);
if (!optBd.isPresent()) {
Set<String> eventHints = Sets.newHashSet(ofDeviceId.toString());
context.waitAnyCompletion(DeviceEvent.class, eventHints,
() -> OvsUtil.createBridge(bridgeConfig,
BRIDGE_OVERLAY,
OvsUtil.bridgeDatapathId(ofDeviceId),
ofControllers,
OvsUtil.buildOvsDatapathType(strOvsDatapath)),
TIMEOUT_DEVICE_CREATION_MS
);
return;
} else {
BridgeDescription bd = optBd.get();
if (OvsUtil.isEqual(ofControllers, bd.controllers())) {
log.error("{} has valid controller setting({})", BRIDGE_OVERLAY, bd.controllers());
context.completed();
return;
}
OvsdbClientService ovsdbClient = OvsUtil.getOvsdbClient(context, strMgmtIp, intOvsdbPort);
if (ovsdbClient == null || !ovsdbClient.isConnected()) {
throw new WorkflowException("Invalid ovsdb client for " + strMgmtIp);
}
// If controller settings are not matched, set controller with valid controller information.
Set<String> eventHints = Sets.newHashSet(ofDeviceId.toString());
context.waitAnyCompletion(DeviceEvent.class, eventHints,
() -> ovsdbClient.setControllersWithDeviceId(bd.deviceId().get(), ofControllers),
TIMEOUT_DEVICE_CREATION_MS
);
return;
}
}
@Override
public boolean isCompleted(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_ADDED:
case DEVICE_AVAILABILITY_CHANGED:
case DEVICE_UPDATED:
return context.getService(DeviceService.class).isAvailable(device.id());
default:
return false;
}
}
@Override
public void timeout(WorkflowContext context) throws WorkflowException {
if (!isNext(context)) {
context.completed(); //Complete the job of worklet by timeout
} else {
super.timeout(context);
}
}
}
/**
* Work-let class for updating underlay bridge device id.
*/

View File

@ -0,0 +1,41 @@
{
"apps": {
"org.onosproject.workflow": {
"workflow" : {
"rpc" : [
{
"op" : "workflow.invoke",
"params" : {
"workplace" : "Nova-000",
"id" : "of-overlay.workflow-nova-multiEvent-test",
"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" : [ "enp4s2" ],
"vtepIp" : "120.0.0.200/24",
"annotations" : {
"rackId" : 1,
"rackPosition" : 3
}
}
},
"id" : "00001@10.0.0.1"
}
]
}
}
}
}