aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/providers/null/src/main/java/org/onosproject/provider/nil/NullFlowRuleProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/onos/providers/null/src/main/java/org/onosproject/provider/nil/NullFlowRuleProvider.java')
-rw-r--r--framework/src/onos/providers/null/src/main/java/org/onosproject/provider/nil/NullFlowRuleProvider.java132
1 files changed, 132 insertions, 0 deletions
diff --git a/framework/src/onos/providers/null/src/main/java/org/onosproject/provider/nil/NullFlowRuleProvider.java b/framework/src/onos/providers/null/src/main/java/org/onosproject/provider/nil/NullFlowRuleProvider.java
new file mode 100644
index 00000000..9b01d12a
--- /dev/null
+++ b/framework/src/onos/providers/null/src/main/java/org/onosproject/provider/nil/NullFlowRuleProvider.java
@@ -0,0 +1,132 @@
+/*
+ * 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.provider.nil;
+
+import com.google.common.collect.Sets;
+import org.jboss.netty.util.HashedWheelTimer;
+import org.jboss.netty.util.Timeout;
+import org.jboss.netty.util.TimerTask;
+import org.onlab.util.Timer;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.flow.CompletedBatchOperation;
+import org.onosproject.net.flow.DefaultFlowEntry;
+import org.onosproject.net.flow.FlowEntry;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.FlowRuleBatchEntry;
+import org.onosproject.net.flow.FlowRuleBatchOperation;
+import org.onosproject.net.flow.FlowRuleProvider;
+import org.onosproject.net.flow.FlowRuleProviderService;
+import org.slf4j.Logger;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Null provider to accept any flow and report them.
+ */
+class NullFlowRuleProvider extends NullProviders.AbstractNullProvider
+ implements FlowRuleProvider {
+
+ private final Logger log = getLogger(getClass());
+
+ private ConcurrentMap<DeviceId, Set<FlowEntry>> flowTable = new ConcurrentHashMap<>();
+
+ private FlowRuleProviderService providerService;
+
+ private HashedWheelTimer timer = Timer.getTimer();
+ private Timeout timeout;
+
+ /**
+ * Starts the flow rule provider simulation.
+ *
+ * @param providerService flow rule provider service
+ */
+ void start(FlowRuleProviderService providerService) {
+ this.providerService = providerService;
+ timeout = timer.newTimeout(new StatisticTask(), 5, TimeUnit.SECONDS);
+ }
+
+ /**
+ * Stops the flow rule provider simulation.
+ */
+ void stop() {
+ timeout.cancel();
+ }
+
+ @Override
+ public void applyFlowRule(FlowRule... flowRules) {
+ // FIXME: invoke executeBatch
+ }
+
+ @Override
+ public void removeFlowRule(FlowRule... flowRules) {
+ // FIXME: invoke executeBatch
+ }
+
+ @Override
+ public void removeRulesById(ApplicationId id, FlowRule... flowRules) {
+ throw new UnsupportedOperationException("Cannot remove by appId from null provider");
+ }
+
+ @Override
+ public void executeBatch(FlowRuleBatchOperation batch) {
+ // TODO: consider checking mastership
+ Set<FlowEntry> entries =
+ flowTable.getOrDefault(batch.deviceId(),
+ Sets.newConcurrentHashSet());
+ for (FlowRuleBatchEntry fbe : batch.getOperations()) {
+ switch (fbe.operator()) {
+ case ADD:
+ entries.add(new DefaultFlowEntry(fbe.target()));
+ break;
+ case REMOVE:
+ entries.remove(new DefaultFlowEntry(fbe.target()));
+ break;
+ case MODIFY:
+ FlowEntry entry = new DefaultFlowEntry(fbe.target());
+ entries.remove(entry);
+ entries.add(entry);
+ break;
+ default:
+ log.error("Unknown flow operation: {}", fbe);
+ }
+ }
+ flowTable.put(batch.deviceId(), entries);
+ CompletedBatchOperation op =
+ new CompletedBatchOperation(true, Collections.emptySet(),
+ batch.deviceId());
+ providerService.batchOperationCompleted(batch.id(), op);
+ }
+
+ // Periodically reports flow rule statistics.
+ private class StatisticTask implements TimerTask {
+ @Override
+ public void run(Timeout to) throws Exception {
+ for (DeviceId devId : flowTable.keySet()) {
+ Set<FlowEntry> entries =
+ flowTable.getOrDefault(devId, Collections.emptySet());
+ providerService.pushFlowMetrics(devId, entries);
+ }
+ timeout = timer.newTimeout(to.getTask(), 5, TimeUnit.SECONDS);
+ }
+ }
+}