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;
+            }
+        }
+    }
 }