ONOS-7963 workflow invocation trigger on ONOS event

Change-Id: Ie9014bfa77f5514c3580042f9ff2add8e42f25f6
diff --git a/apps/workflow/ofoverlay/app/src/main/java/org/onosproject/ofoverlay/impl/OfOverlayWorkflow.java b/apps/workflow/ofoverlay/app/src/main/java/org/onosproject/ofoverlay/impl/OfOverlayWorkflow.java
index b397db5..14eb59d 100644
--- a/apps/workflow/ofoverlay/app/src/main/java/org/onosproject/ofoverlay/impl/OfOverlayWorkflow.java
+++ b/apps/workflow/ofoverlay/app/src/main/java/org/onosproject/ofoverlay/impl/OfOverlayWorkflow.java
@@ -106,6 +106,29 @@
 
             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()
@@ -188,6 +211,7 @@
                                             String hint = event.subject().id().toString();
                                             log.debug("hint: {}", hint);
                                             return hint;
+
                                         }
                                 )
                         );
diff --git a/apps/workflow/ofoverlay/app/src/main/java/org/onosproject/ofoverlay/impl/Ovs.java b/apps/workflow/ofoverlay/app/src/main/java/org/onosproject/ofoverlay/impl/Ovs.java
index 923173c..0506793 100644
--- a/apps/workflow/ofoverlay/app/src/main/java/org/onosproject/ofoverlay/impl/Ovs.java
+++ b/apps/workflow/ofoverlay/app/src/main/java/org/onosproject/ofoverlay/impl/Ovs.java
@@ -57,6 +57,7 @@
 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;
@@ -67,6 +68,7 @@
 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;
@@ -1312,5 +1314,40 @@
             }
         }
     }
+
+    /**
+     * 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;
+            }
+        }
+    }
 }
 
diff --git a/apps/workflow/ofoverlay/test-cfg/network-cfg-cr-trigger-event-wf.json b/apps/workflow/ofoverlay/test-cfg/network-cfg-cr-trigger-event-wf.json
new file mode 100755
index 0000000..f837445
--- /dev/null
+++ b/apps/workflow/ofoverlay/test-cfg/network-cfg-cr-trigger-event-wf.json
@@ -0,0 +1,41 @@
+{
+    "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"
+              }
+            ]
+          }
+        }
+    }
+}