summaryrefslogtreecommitdiffstats
path: root/framework/src/onos/utils/stc/src/main/java/org/onlab/stc/Monitor.java
diff options
context:
space:
mode:
authorAshlee Young <ashlee@onosfw.com>2015-09-09 22:15:21 -0700
committerAshlee Young <ashlee@onosfw.com>2015-09-09 22:15:21 -0700
commit13d05bc8458758ee39cb829098241e89616717ee (patch)
tree22a4d1ce65f15952f07a3df5af4b462b4697cb3a /framework/src/onos/utils/stc/src/main/java/org/onlab/stc/Monitor.java
parent6139282e1e93c2322076de4b91b1c85d0bc4a8b3 (diff)
ONOS checkin based on commit tag e796610b1f721d02f9b0e213cf6f7790c10ecd60
Change-Id: Ife8810491034fe7becdba75dda20de4267bd15cd
Diffstat (limited to 'framework/src/onos/utils/stc/src/main/java/org/onlab/stc/Monitor.java')
-rw-r--r--framework/src/onos/utils/stc/src/main/java/org/onlab/stc/Monitor.java154
1 files changed, 154 insertions, 0 deletions
diff --git a/framework/src/onos/utils/stc/src/main/java/org/onlab/stc/Monitor.java b/framework/src/onos/utils/stc/src/main/java/org/onlab/stc/Monitor.java
new file mode 100644
index 00000000..4e6f63fa
--- /dev/null
+++ b/framework/src/onos/utils/stc/src/main/java/org/onlab/stc/Monitor.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.onlab.stc;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Maps;
+import org.onlab.stc.MonitorLayout.Box;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+import static org.onlab.stc.Coordinator.Status.IN_PROGRESS;
+
+/**
+ * Scenario test monitor.
+ */
+public class Monitor implements StepProcessListener {
+
+ private final ObjectMapper mapper = new ObjectMapper();
+
+ private final Coordinator coordinator;
+ private final Compiler compiler;
+ private final MonitorLayout layout;
+
+ private MonitorDelegate delegate;
+
+ private Map<Step, Box> boxes = Maps.newHashMap();
+
+ /**
+ * Creates a new shared process flow monitor.
+ *
+ * @param coordinator process flow coordinator
+ * @param compiler scenario compiler
+ */
+ Monitor(Coordinator coordinator, Compiler compiler) {
+ this.coordinator = coordinator;
+ this.compiler = compiler;
+ this.layout = new MonitorLayout(compiler);
+ coordinator.addListener(this);
+ }
+
+ /**
+ * Sets the process monitor delegate.
+ *
+ * @param delegate process monitor delegate
+ */
+ void setDelegate(MonitorDelegate delegate) {
+ this.delegate = delegate;
+ }
+
+ /**
+ * Notifies the process monitor delegate with the specified event.
+ *
+ * @param event JSON event data
+ */
+ public void notify(ObjectNode event) {
+ if (delegate != null) {
+ delegate.notify(event);
+ }
+ }
+
+ /**
+ * Returns the scenario process flow as JSON data.
+ *
+ * @return scenario process flow data
+ */
+ ObjectNode scenarioData() {
+ ObjectNode root = mapper.createObjectNode();
+ ArrayNode steps = mapper.createArrayNode();
+ ArrayNode requirements = mapper.createArrayNode();
+
+ ProcessFlow pf = compiler.processFlow();
+ pf.getVertexes().forEach(step -> add(step, steps));
+ pf.getEdges().forEach(requirement -> add(requirement, requirements));
+
+ root.set("steps", steps);
+ root.set("requirements", requirements);
+
+ try (FileWriter fw = new FileWriter("/tmp/data.json");
+ PrintWriter pw = new PrintWriter(fw)) {
+ pw.println(root.toString());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return root;
+ }
+
+
+ private void add(Step step, ArrayNode steps) {
+ Box box = layout.get(step);
+ ObjectNode sn = mapper.createObjectNode()
+ .put("name", step.name())
+ .put("isGroup", step instanceof Group)
+ .put("status", status(coordinator.getStatus(step)))
+ .put("tier", box.tier())
+ .put("depth", box.depth());
+ if (step.group() != null) {
+ sn.put("group", step.group().name());
+ }
+ steps.add(sn);
+ }
+
+ private String status(Coordinator.Status status) {
+ return status.toString().toLowerCase();
+ }
+
+ private void add(Dependency requirement, ArrayNode requirements) {
+ ObjectNode rn = mapper.createObjectNode();
+ rn.put("src", requirement.src().name())
+ .put("dst", requirement.dst().name())
+ .put("isSoft", requirement.isSoft());
+ requirements.add(rn);
+ }
+
+ @Override
+ public void onStart(Step step, String command) {
+ notify(event(step, status(IN_PROGRESS)));
+ }
+
+ @Override
+ public void onCompletion(Step step, Coordinator.Status status) {
+ notify(event(step, status(status)));
+ }
+
+ @Override
+ public void onOutput(Step step, String line) {
+
+ }
+
+ private ObjectNode event(Step step, String status) {
+ ObjectNode event = mapper.createObjectNode()
+ .put("name", step.name())
+ .put("status", status);
+ return event;
+ }
+
+}