diff options
author | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
---|---|---|
committer | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
commit | 13d05bc8458758ee39cb829098241e89616717ee (patch) | |
tree | 22a4d1ce65f15952f07a3df5af4b462b4697cb3a /framework/src/onos/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java | |
parent | 6139282e1e93c2322076de4b91b1c85d0bc4a8b3 (diff) |
ONOS checkin based on commit tag e796610b1f721d02f9b0e213cf6f7790c10ecd60
Change-Id: Ife8810491034fe7becdba75dda20de4267bd15cd
Diffstat (limited to 'framework/src/onos/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java')
-rw-r--r-- | framework/src/onos/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/framework/src/onos/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java b/framework/src/onos/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java new file mode 100644 index 00000000..a44ead57 --- /dev/null +++ b/framework/src/onos/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java @@ -0,0 +1,194 @@ +/* + * 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.onosproject.intentperf; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Deactivate; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.ReferenceCardinality; +import org.apache.felix.scr.annotations.Service; +import org.onlab.osgi.ServiceDirectory; +import org.onosproject.intentperf.IntentPerfCollector.Sample; +import org.onosproject.ui.RequestHandler; +import org.onosproject.ui.UiConnection; +import org.onosproject.ui.UiExtension; +import org.onosproject.ui.UiExtensionService; +import org.onosproject.ui.UiMessageHandler; +import org.onosproject.ui.UiView; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static java.util.Collections.synchronizedSet; +import static org.onosproject.ui.UiView.Category.OTHER; + +/** + * Mechanism to stream data to the GUI. + */ +@Component(immediate = true, enabled = true) +@Service(value = IntentPerfUi.class) +public class IntentPerfUi { + + private static final String INTENT_PERF_START = "intentPerfStart"; + private static final String INTENT_PERF_STOP = "intentPerfStop"; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected UiExtensionService uiExtensionService; + + private final Set<StreamingControl> handlers = synchronizedSet(new HashSet<>()); + + private List<UiView> views = ImmutableList.of( + new UiView(OTHER, "intentPerf", "Intent Performance") + ); + + private UiExtension uiExtension = + new UiExtension.Builder(getClass().getClassLoader(), views) + .messageHandlerFactory(this::newHandlers) + .build(); + + private IntentPerfCollector collector; + + @Activate + protected void activate() { + uiExtensionService.register(uiExtension); + } + + @Deactivate + protected void deactivate() { + uiExtensionService.unregister(uiExtension); + } + + /** + * Reports a single sample of performance data. + * + * @param sample performance sample + */ + public void reportSample(Sample sample) { + synchronized (handlers) { + handlers.forEach(h -> h.send(sample)); + } + } + + /** + * Binds the sample collector. + * + * @param collector list of headers for future samples + */ + public void setCollector(IntentPerfCollector collector) { + this.collector = collector; + } + + // Creates and returns session specific message handler. + private Collection<UiMessageHandler> newHandlers() { + return ImmutableList.of(new StreamingControl()); + } + + + // UI Message handlers for turning on/off reporting to a session. + private class StreamingControl extends UiMessageHandler { + + private boolean streamingEnabled = false; + + @Override + protected Collection<RequestHandler> createRequestHandlers() { + return ImmutableSet.of( + new IntentPerfStart(), + new IntentPerfStop() + ); + } + + @Override + public void init(UiConnection connection, ServiceDirectory directory) { + super.init(connection, directory); + handlers.add(this); + } + + @Override + public void destroy() { + super.destroy(); + handlers.remove(this); + } + + private void send(Sample sample) { + if (streamingEnabled) { + connection().sendMessage("intentPerfSample", 0, sampleNode(sample)); + } + } + + + private ObjectNode sampleNode(Sample sample) { + ObjectNode sampleNode = objectNode(); + ArrayNode an = arrayNode(); + sampleNode.put("time", sample.time); + sampleNode.set("data", an); + + for (double d : sample.data) { + an.add(d); + } + return sampleNode; + } + + // ====================================================================== + + private final class IntentPerfStart extends RequestHandler { + + private IntentPerfStart() { + super(INTENT_PERF_START); + } + + @Override + public void process(long sid, ObjectNode payload) { + streamingEnabled = true; + sendInitData(); + } + + private void sendInitData() { + ObjectNode rootNode = MAPPER.createObjectNode(); + ArrayNode an = MAPPER.createArrayNode(); + ArrayNode sn = MAPPER.createArrayNode(); + rootNode.set("headers", an); + rootNode.set("samples", sn); + + collector.getSampleHeaders().forEach(an::add); + collector.getSamples().forEach(s -> sn.add(sampleNode(s))); + sendMessage("intentPerfInit", 0, rootNode); + } + } + + // ====================================================================== + + private final class IntentPerfStop extends RequestHandler { + + private IntentPerfStop() { + super(INTENT_PERF_STOP); + } + + @Override + public void process(long sid, ObjectNode payload) { + streamingEnabled = false; + } + } + + } + +} |