diff options
Diffstat (limited to 'framework/src/onos/apps/vtn/vtnrsc/src/main/java/org')
29 files changed, 977 insertions, 88 deletions
diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/ClassifierService.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/ClassifierService.java new file mode 100644 index 00000000..a15da3ef --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/ClassifierService.java @@ -0,0 +1,41 @@ +/* + * 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.vtnrsc.classifier; + +import org.onosproject.net.DeviceId; + +/** + * Provides Services for Classifier. + */ +public interface ClassifierService { + + /** + * Get Classifier devices for sfc. + * + * @return list of device id's for classifiers + */ + Iterable<DeviceId> getClassifiers(); + + /** + * Add Classifier device for sfc. + */ + void addClassifier(DeviceId deviceId); + + /** + * Remove Classifier device for sfc. + */ + void removeClassifier(DeviceId deviceId); +} diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/impl/ClassifierManager.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/impl/ClassifierManager.java new file mode 100644 index 00000000..a12d6221 --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/impl/ClassifierManager.java @@ -0,0 +1,78 @@ +/* + * 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.vtnrsc.classifier.impl; + +import static org.slf4j.LoggerFactory.getLogger; + +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.onosproject.net.DeviceId; +import org.onosproject.store.serializers.KryoNamespaces; +import org.onosproject.store.service.DistributedSet; +import org.onosproject.store.service.Serializer; +import org.onosproject.store.service.StorageService; +import org.onosproject.vtnrsc.classifier.ClassifierService; +import org.slf4j.Logger; + +import com.google.common.collect.ImmutableList; + +/** + * Provides implementation of the Classifier Service. + */ +@Component(immediate = true) +@Service +public class ClassifierManager implements ClassifierService { + + private final Logger log = getLogger(ClassifierManager.class); + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected StorageService storageService; + + private DistributedSet<DeviceId> classifierList; + + @Activate + protected void activate() { + classifierList = storageService.<DeviceId>setBuilder() + .withName("classifier") + .withSerializer(Serializer.using(KryoNamespaces.API)) + .build(); + log.info("Started"); + } + + @Deactivate + protected void deactivate() { + log.info("Stopped"); + } + + @Override + public void addClassifier(DeviceId deviceId) { + classifierList.add(deviceId); + } + + @Override + public Iterable<DeviceId> getClassifiers() { + return ImmutableList.copyOf(classifierList); + } + + @Override + public void removeClassifier(DeviceId deviceId) { + classifierList.remove(deviceId); + } +} diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/impl/package-info.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/impl/package-info.java new file mode 100644 index 00000000..dc72e806 --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/impl/package-info.java @@ -0,0 +1,20 @@ +/* + * 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. + */ + +/** + * Provides implementation of the Classifier service. + */ +package org.onosproject.vtnrsc.classifier.impl; diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/package-info.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/package-info.java new file mode 100644 index 00000000..56976d96 --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/package-info.java @@ -0,0 +1,20 @@ +/* + * 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. + */ + +/** + * Service for interacting with Classifier of SFC. + */ +package org.onosproject.vtnrsc.classifier; diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetCreateCommand.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetCreateCommand.java index 56236408..de8cfe53 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetCreateCommand.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetCreateCommand.java @@ -98,7 +98,7 @@ public class SubnetCreateCommand extends AbstractShellCommand { protected void execute() { SubnetService service = get(SubnetService.class); if (id == null || networkId == null || tenantId == null) { - print(null, "id,networkId,tenantId can not be null"); + print("id,networkId,tenantId can not be null"); return; } Subnet subnet = new DefaultSubnet(SubnetId.subnetId(id), subnetName, diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetUpdateCommand.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetUpdateCommand.java index b0578a1e..c76ca5b2 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetUpdateCommand.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetUpdateCommand.java @@ -98,7 +98,7 @@ public class SubnetUpdateCommand extends AbstractShellCommand { protected void execute() { SubnetService service = get(SubnetService.class); if (id == null || networkId == null || tenantId == null) { - print(null, "id,networkId,tenantId can not be null"); + print("id,networkId,tenantId can not be null"); return; } Subnet subnet = new DefaultSubnet(SubnetId.subnetId(id), subnetName, diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEvent.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEvent.java index 3bac158b..ce3faae7 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEvent.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEvent.java @@ -51,7 +51,55 @@ public class VtnRscEvent /** * Signifies that router interface has remove. */ - ROUTER_INTERFACE_DELETE + ROUTER_INTERFACE_DELETE, + /** + * Signifies that port-pair has add. + */ + PORT_PAIR_PUT, + /** + * Signifies that port-pair has remove. + */ + PORT_PAIR_DELETE, + /** + * Signifies that port-pair has update. + */ + PORT_PAIR_UPDATE, + /** + * Signifies that port-pair-group has add. + */ + PORT_PAIR_GROUP_PUT, + /** + * Signifies that port-pair-group has remove. + */ + PORT_PAIR_GROUP_DELETE, + /** + * Signifies that port-pair-group has update. + */ + PORT_PAIR_GROUP_UPDATE, + /** + * Signifies that flow-classifier has add. + */ + FLOW_CLASSIFIER_PUT, + /** + * Signifies that flow-classifier has remove. + */ + FLOW_CLASSIFIER_DELETE, + /** + * Signifies that flow-classifier has update. + */ + FLOW_CLASSIFIER_UPDATE, + /** + * Signifies that port-chain has add. + */ + PORT_CHAIN_PUT, + /** + * Signifies that port-chain has remove. + */ + PORT_CHAIN_DELETE, + /** + * Signifies that port-chain has update. + */ + PORT_CHAIN_UPDATE } /** diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEventFeedback.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEventFeedback.java index 63dcaeee..112c6411 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEventFeedback.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEventFeedback.java @@ -20,6 +20,10 @@ import java.util.Objects; import org.onosproject.vtnrsc.FloatingIp; import org.onosproject.vtnrsc.Router; import org.onosproject.vtnrsc.RouterInterface; +import org.onosproject.vtnrsc.PortPair; +import org.onosproject.vtnrsc.PortPairGroup; +import org.onosproject.vtnrsc.FlowClassifier; +import org.onosproject.vtnrsc.PortChain; import static com.google.common.base.MoreObjects.toStringHelper; import static com.google.common.base.Preconditions.checkNotNull; @@ -31,6 +35,10 @@ public class VtnRscEventFeedback { private final FloatingIp floaingtIp; private final Router router; private final RouterInterface routerInterface; + private final PortPair portPair; + private final PortPairGroup portPairGroup; + private final FlowClassifier flowClassifier; + private final PortChain portChain; /** * Creates VtnRscEventFeedback object. @@ -41,6 +49,10 @@ public class VtnRscEventFeedback { this.floaingtIp = checkNotNull(floatingIp, "floaintIp cannot be null"); this.router = null; this.routerInterface = null; + this.portPair = null; + this.portPairGroup = null; + this.flowClassifier = null; + this.portChain = null; } /** @@ -52,6 +64,10 @@ public class VtnRscEventFeedback { this.floaingtIp = null; this.router = checkNotNull(router, "router cannot be null"); this.routerInterface = null; + this.portPair = null; + this.portPairGroup = null; + this.flowClassifier = null; + this.portChain = null; } /** @@ -64,6 +80,74 @@ public class VtnRscEventFeedback { this.router = null; this.routerInterface = checkNotNull(routerInterface, "routerInterface cannot be null"); + this.portPair = null; + this.portPairGroup = null; + this.flowClassifier = null; + this.portChain = null; + } + + /** + * Creates VtnRscEventFeedback object. + * + * @param portPair the Port-Pair + */ + public VtnRscEventFeedback(PortPair portPair) { + this.floaingtIp = null; + this.router = null; + this.routerInterface = null; + this.portPair = checkNotNull(portPair, + "Port-Pair cannot be null"); + this.portPairGroup = null; + this.flowClassifier = null; + this.portChain = null; + } + + /** + * Creates VtnRscEventFeedback object. + * + * @param portPairGroup the Port-Pair-Group + */ + public VtnRscEventFeedback(PortPairGroup portPairGroup) { + this.floaingtIp = null; + this.router = null; + this.routerInterface = null; + this.portPair = null; + this.portPairGroup = checkNotNull(portPairGroup, + "Port-Pair-Group cannot be null"); + this.flowClassifier = null; + this.portChain = null; + } + + /** + * Creates VtnRscEventFeedback object. + * + * @param flowClassifier the Flow-Classifier + */ + public VtnRscEventFeedback(FlowClassifier flowClassifier) { + this.floaingtIp = null; + this.router = null; + this.routerInterface = null; + this.portPair = null; + this.portPairGroup = null; + this.flowClassifier = checkNotNull(flowClassifier, + "Flow-Classifier cannot be null"); + this.portChain = null; + } + + /** + * Creates VtnRscEventFeedback object. + * + * @param portChain the Port-Chain + */ + public VtnRscEventFeedback(PortChain portChain) { + this.floaingtIp = null; + this.router = null; + this.routerInterface = null; + this.portPair = null; + this.portPairGroup = null; + this.flowClassifier = null; + this.portChain = checkNotNull(portChain, + "Port-Chain cannot be null"); } /** @@ -93,9 +177,46 @@ public class VtnRscEventFeedback { return routerInterface; } + /** + * Returns Port-Pair. + * + * @return portPair the Port-Pair + */ + public PortPair portPair() { + return portPair; + } + + /** + * Returns Port-Pair-Group. + * + * @return portPairGroup the Port-Pair-Group + */ + public PortPairGroup portPairGroup() { + return portPairGroup; + } + + /** + * Returns Flow-Classifier. + * + * @return flowClassifier the Flow-Classifier + */ + public FlowClassifier flowClassifier() { + return flowClassifier; + } + + /** + * Returns Port-Chain. + * + * @return portChain the Port-Chain + */ + public PortChain portChain() { + return portChain; + } + @Override public int hashCode() { - return Objects.hash(floaingtIp, router, routerInterface); + return Objects.hash(floaingtIp, router, routerInterface, portPair, + portPairGroup, flowClassifier, portChain); } @Override @@ -107,7 +228,11 @@ public class VtnRscEventFeedback { final VtnRscEventFeedback that = (VtnRscEventFeedback) obj; return Objects.equals(this.floaingtIp, that.floaingtIp) && Objects.equals(this.router, that.router) - && Objects.equals(this.routerInterface, that.routerInterface); + && Objects.equals(this.routerInterface, that.routerInterface) + && Objects.equals(this.portPair, that.portPair) + && Objects.equals(this.portPairGroup, that.portPairGroup) + && Objects.equals(this.flowClassifier, that.flowClassifier) + && Objects.equals(this.portChain, that.portChain); } return false; } @@ -118,6 +243,10 @@ public class VtnRscEventFeedback { .add("router", router) .add("floaingtIp", floaingtIp) .add("routerInterface", routerInterface) + .add("portPair", portPair) + .add("portPairGroup", portPairGroup) + .add("flowClassifier", flowClassifier) + .add("portChain", portChain) .toString(); } } diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/floatingip/impl/FloatingIpManager.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/floatingip/impl/FloatingIpManager.java index 9f944da1..ce9bb21f 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/floatingip/impl/FloatingIpManager.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/floatingip/impl/FloatingIpManager.java @@ -202,27 +202,24 @@ public class FloatingIpManager implements FloatingIpService { public boolean updateFloatingIps(Collection<FloatingIp> floatingIps) { checkNotNull(floatingIps, FLOATINGIP_NOT_NULL); boolean result = true; - if (floatingIps != null) { - for (FloatingIp floatingIp : floatingIps) { - verifyFloatingIpData(floatingIp); - if (floatingIp.portId() != null) { - floatingIpStore.put(floatingIp.id(), floatingIp); - if (!floatingIpStore.containsKey(floatingIp.id())) { + for (FloatingIp floatingIp : floatingIps) { + verifyFloatingIpData(floatingIp); + if (floatingIp.portId() != null) { + floatingIpStore.put(floatingIp.id(), floatingIp); + if (!floatingIpStore.containsKey(floatingIp.id())) { + log.debug("The floating Ip is updated failed whose identifier is {}", + floatingIp.id().toString()); + result = false; + } + } else { + FloatingIp oldFloatingIp = floatingIpStore.get(floatingIp.id()); + if (oldFloatingIp != null) { + floatingIpStore.remove(floatingIp.id(), oldFloatingIp); + if (floatingIpStore.containsKey(floatingIp.id())) { log.debug("The floating Ip is updated failed whose identifier is {}", floatingIp.id().toString()); result = false; } - } else { - FloatingIp oldFloatingIp = floatingIpStore.get(floatingIp - .id()); - if (oldFloatingIp != null) { - floatingIpStore.remove(floatingIp.id(), oldFloatingIp); - if (floatingIpStore.containsKey(floatingIp.id())) { - log.debug("The floating Ip is updated failed whose identifier is {}", - floatingIp.id().toString()); - result = false; - } - } } } } @@ -233,21 +230,19 @@ public class FloatingIpManager implements FloatingIpService { public boolean removeFloatingIps(Collection<FloatingIpId> floatingIpIds) { checkNotNull(floatingIpIds, FLOATINGIP_ID_NOT_NULL); boolean result = true; - if (floatingIpIds != null) { - for (FloatingIpId floatingIpId : floatingIpIds) { - if (!floatingIpStore.containsKey(floatingIpId)) { - log.debug("The floatingIp is not exist whose identifier is {}", - floatingIpId.toString()); - throw new IllegalArgumentException( - "FloatingIP ID doesn't exist"); - } - FloatingIp floatingIp = floatingIpStore.get(floatingIpId); - floatingIpStore.remove(floatingIpId, floatingIp); - if (floatingIpStore.containsKey(floatingIpId)) { - log.debug("The floating Ip is deleted failed whose identifier is {}", - floatingIpId.toString()); - result = false; - } + for (FloatingIpId floatingIpId : floatingIpIds) { + if (!floatingIpStore.containsKey(floatingIpId)) { + log.debug("The floatingIp is not exist whose identifier is {}", + floatingIpId.toString()); + throw new IllegalArgumentException( + "FloatingIP ID doesn't exist"); + } + FloatingIp floatingIp = floatingIpStore.get(floatingIpId); + floatingIpStore.remove(floatingIpId, floatingIp); + if (floatingIpStore.containsKey(floatingIpId)) { + log.debug("The floating Ip is deleted failed whose identifier is {}", + floatingIpId.toString()); + result = false; } } return result; diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/FlowClassifierEvent.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/FlowClassifierEvent.java new file mode 100644 index 00000000..d81ab48a --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/FlowClassifierEvent.java @@ -0,0 +1,63 @@ +/* + * 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.vtnrsc.flowclassifier; + +import org.onosproject.event.AbstractEvent; +import org.onosproject.vtnrsc.FlowClassifier; + +/** + * Describes network Flow-Classifier event. + */ +public class FlowClassifierEvent extends AbstractEvent<FlowClassifierEvent.Type, FlowClassifier> { + /** + * Type of flow-classifier events. + */ + public enum Type { + /** + * Signifies that flow-classifier has been created. + */ + FLOW_CLASSIFIER_PUT, + /** + * Signifies that flow-classifier has been deleted. + */ + FLOW_CLASSIFIER_DELETE, + /** + * Signifies that flow-classifier has been updated. + */ + FLOW_CLASSIFIER_UPDATE + } + + /** + * Creates an event of a given type and for the specified Flow-Classifier. + * + * @param type Flow-Classifier event type + * @param flowClassifier Flow-Classifier subject + */ + public FlowClassifierEvent(Type type, FlowClassifier flowClassifier) { + super(type, flowClassifier); + } + + /** + * Creates an event of a given type and for the specified Flow-Classifier. + * + * @param type Flow-Classifier event type + * @param flowClassifier Flow-Classifier subject + * @param time occurrence time + */ + public FlowClassifierEvent(Type type, FlowClassifier flowClassifier, long time) { + super(type, flowClassifier, time); + } +} diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/FlowClassifierListener.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/FlowClassifierListener.java new file mode 100644 index 00000000..3c0409ad --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/FlowClassifierListener.java @@ -0,0 +1,25 @@ +/* + * 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.vtnrsc.flowclassifier; + +import org.onosproject.event.EventListener; + +/** + * Entity capable of Flow-Classifier related events. + */ +public interface FlowClassifierListener extends EventListener<FlowClassifierEvent> { + +} diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/FlowClassifierService.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/FlowClassifierService.java index c5911ff2..48438846 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/FlowClassifierService.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/FlowClassifierService.java @@ -15,13 +15,14 @@ */ package org.onosproject.vtnrsc.flowclassifier; +import org.onosproject.event.ListenerService; import org.onosproject.vtnrsc.FlowClassifier; import org.onosproject.vtnrsc.FlowClassifierId; /** * Provides Services for Flow Classifier. */ -public interface FlowClassifierService { +public interface FlowClassifierService extends ListenerService<FlowClassifierEvent, FlowClassifierListener> { /** * Check whether Flow Classifier is present based on given Flow Classifier diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java index 4a60cd34..18f63b30 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java @@ -15,6 +15,9 @@ */ package org.onosproject.vtnrsc.flowclassifier.impl; +import static org.slf4j.LoggerFactory.getLogger; +import static com.google.common.base.Preconditions.checkNotNull; + import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Deactivate; @@ -22,6 +25,7 @@ import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.Service; import org.onlab.util.KryoNamespace; +import org.onosproject.event.AbstractListenerManager; import org.onosproject.store.serializers.KryoNamespaces; import org.onosproject.store.service.EventuallyConsistentMap; import org.onosproject.store.service.MultiValuedTimestamp; @@ -29,12 +33,11 @@ import org.onosproject.store.service.StorageService; import org.onosproject.store.service.WallClockTimestamp; import org.onosproject.vtnrsc.FlowClassifierId; import org.onosproject.vtnrsc.FlowClassifier; +import org.onosproject.vtnrsc.flowclassifier.FlowClassifierEvent; +import org.onosproject.vtnrsc.flowclassifier.FlowClassifierListener; import org.onosproject.vtnrsc.flowclassifier.FlowClassifierService; import org.slf4j.Logger; -import static org.slf4j.LoggerFactory.getLogger; -import static com.google.common.base.Preconditions.checkNotNull; - import com.google.common.collect.ImmutableList; /** @@ -42,14 +45,17 @@ import com.google.common.collect.ImmutableList; */ @Component(immediate = true) @Service -public class FlowClassifierManager implements FlowClassifierService { - - private final Logger log = getLogger(FlowClassifierManager.class); +public class FlowClassifierManager extends AbstractListenerManager<FlowClassifierEvent, FlowClassifierListener> + implements FlowClassifierService { private static final String FLOW_CLASSIFIER_NOT_NULL = "Flow Classifier cannot be null"; private static final String FLOW_CLASSIFIER_ID_NOT_NULL = "Flow Classifier Id cannot be null"; + private static final String LISTENER_NOT_NULL = "Listener cannot be null"; + + private final Logger log = getLogger(FlowClassifierManager.class); private EventuallyConsistentMap<FlowClassifierId, FlowClassifier> flowClassifierStore; + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected StorageService storageService; diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/PortChainEvent.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/PortChainEvent.java new file mode 100644 index 00000000..44a4e8ed --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/PortChainEvent.java @@ -0,0 +1,63 @@ +/* + * 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.vtnrsc.portchain; + +import org.onosproject.event.AbstractEvent; +import org.onosproject.vtnrsc.PortChain; + +/** + * Describes network Port-Chain event. + */ +public class PortChainEvent extends AbstractEvent<PortChainEvent.Type, PortChain> { + /** + * Type of port-chain events. + */ + public enum Type { + /** + * Signifies that port-chain has been created. + */ + PORT_CHAIN_PUT, + /** + * Signifies that port-chain has been deleted. + */ + PORT_CHAIN_DELETE, + /** + * Signifies that port-chain has been updated. + */ + PORT_CHAIN_UPDATE + } + + /** + * Creates an event of a given type and for the specified Port-Chain. + * + * @param type Port-Chain event type + * @param portChain Port-Chain subject + */ + public PortChainEvent(Type type, PortChain portChain) { + super(type, portChain); + } + + /** + * Creates an event of a given type and for the specified Port-Chain. + * + * @param type Port-Chain event type + * @param portChain Port-Chain subject + * @param time occurrence time + */ + public PortChainEvent(Type type, PortChain portChain, long time) { + super(type, portChain, time); + } +} diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/PortChainListener.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/PortChainListener.java new file mode 100644 index 00000000..27a498b5 --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/PortChainListener.java @@ -0,0 +1,25 @@ +/* + * 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.vtnrsc.portchain; + +import org.onosproject.event.EventListener; + +/** + * Entity capable of Port-Chain related events. + */ +public interface PortChainListener extends EventListener<PortChainEvent> { + +} diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/PortChainService.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/PortChainService.java index b4ff917e..5b08262b 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/PortChainService.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/PortChainService.java @@ -15,13 +15,14 @@ */ package org.onosproject.vtnrsc.portchain; +import org.onosproject.event.ListenerService; import org.onosproject.vtnrsc.PortChain; import org.onosproject.vtnrsc.PortChainId; /** * Service for interacting with the inventory of port chains. */ -public interface PortChainService { +public interface PortChainService extends ListenerService<PortChainEvent, PortChainListener> { /** * Returns if the port chain is existed. diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java index 5201a2ca..0062db48 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java @@ -27,6 +27,7 @@ import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.Service; import org.onlab.util.KryoNamespace; +import org.onosproject.event.AbstractListenerManager; import org.onosproject.store.serializers.KryoNamespaces; import org.onosproject.store.service.EventuallyConsistentMap; import org.onosproject.store.service.MultiValuedTimestamp; @@ -34,6 +35,8 @@ import org.onosproject.store.service.StorageService; import org.onosproject.store.service.WallClockTimestamp; import org.onosproject.vtnrsc.PortChain; import org.onosproject.vtnrsc.PortChainId; +import org.onosproject.vtnrsc.portchain.PortChainEvent; +import org.onosproject.vtnrsc.portchain.PortChainListener; import org.onosproject.vtnrsc.portchain.PortChainService; import org.slf4j.Logger; @@ -42,13 +45,14 @@ import org.slf4j.Logger; */ @Component(immediate = true) @Service -public class PortChainManager implements PortChainService { - - private final Logger log = getLogger(getClass()); +public class PortChainManager extends AbstractListenerManager<PortChainEvent, PortChainListener> implements + PortChainService { private static final String PORT_CHAIN_ID_NULL = "PortChain ID cannot be null"; private static final String PORT_CHAIN_NULL = "PortChain cannot be null"; + private static final String LISTENER_NOT_NULL = "Listener cannot be null"; + private final Logger log = getLogger(getClass()); private EventuallyConsistentMap<PortChainId, PortChain> portChainStore; @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/PortPairEvent.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/PortPairEvent.java new file mode 100644 index 00000000..31ecc737 --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/PortPairEvent.java @@ -0,0 +1,63 @@ +/* + * 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.vtnrsc.portpair; + +import org.onosproject.event.AbstractEvent; +import org.onosproject.vtnrsc.PortPair; + +/** + * Describes network Port-Pair event. + */ +public class PortPairEvent extends AbstractEvent<PortPairEvent.Type, PortPair> { + /** + * Type of port-pair events. + */ + public enum Type { + /** + * Signifies that port-pair has been created. + */ + PORT_PAIR_PUT, + /** + * Signifies that port-pair has been deleted. + */ + PORT_PAIR_DELETE, + /** + * Signifies that port-pair has been updated. + */ + PORT_PAIR_UPDATE + } + + /** + * Creates an event of a given type and for the specified Port-Pair. + * + * @param type Port-Pair event type + * @param portPair Port-Pair subject + */ + public PortPairEvent(Type type, PortPair portPair) { + super(type, portPair); + } + + /** + * Creates an event of a given type and for the specified Port-Pair. + * + * @param type Port-Pair event type + * @param portPair Port-Pair subject + * @param time occurrence time + */ + public PortPairEvent(Type type, PortPair portPair, long time) { + super(type, portPair, time); + } +} diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/PortPairListener.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/PortPairListener.java new file mode 100644 index 00000000..3bdb9e4e --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/PortPairListener.java @@ -0,0 +1,25 @@ +/* + * 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.vtnrsc.portpair; + +import org.onosproject.event.EventListener; + +/** + * Entity capable of Port-Pair related events. + */ +public interface PortPairListener extends EventListener<PortPairEvent> { + +} diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/PortPairService.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/PortPairService.java index f99cc2cf..e98a6a20 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/PortPairService.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/PortPairService.java @@ -77,4 +77,18 @@ public interface PortPairService { * @return true if the give port pair is deleted successfully. */ boolean removePortPair(PortPairId portPairId); + + /** + * Adds the specified listener to Port-Pair manager. + * + * @param listener Port-Pair listener + */ + void addListener(PortPairListener listener); + + /** + * Removes the specified listener to Port-Pair manager. + * + * @param listener Port-Pair listener + */ + void removeListener(PortPairListener listener); } diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java index 93c8782a..ad6fd4bb 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java @@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static org.slf4j.LoggerFactory.getLogger; import java.util.Collections; +import java.util.Set; import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; @@ -34,9 +35,12 @@ import org.onosproject.store.service.StorageService; import org.onosproject.store.service.WallClockTimestamp; import org.onosproject.vtnrsc.PortPair; import org.onosproject.vtnrsc.PortPairId; +import org.onosproject.vtnrsc.portpair.PortPairListener; import org.onosproject.vtnrsc.portpair.PortPairService; import org.slf4j.Logger; +import com.google.common.collect.Sets; + /** * Provides implementation of the portPairService. */ @@ -44,11 +48,12 @@ import org.slf4j.Logger; @Service public class PortPairManager implements PortPairService { - private final Logger log = getLogger(getClass()); - private static final String PORT_PAIR_ID_NULL = "PortPair ID cannot be null"; private static final String PORT_PAIR_NULL = "PortPair cannot be null"; + private static final String LISTENER_NOT_NULL = "Listener cannot be null"; + private final Logger log = getLogger(getClass()); + private final Set<PortPairListener> listeners = Sets.newCopyOnWriteArraySet(); private EventuallyConsistentMap<PortPairId, PortPair> portPairStore; @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) @@ -73,6 +78,7 @@ public class PortPairManager implements PortPairService { @Deactivate public void deactivate() { portPairStore.destroy(); + listeners.clear(); log.info("Stopped"); } @@ -143,4 +149,16 @@ public class PortPairManager implements PortPairService { } return true; } + + @Override + public void addListener(PortPairListener listener) { + checkNotNull(listener, LISTENER_NOT_NULL); + listeners.add(listener); + } + + @Override + public void removeListener(PortPairListener listener) { + checkNotNull(listener, LISTENER_NOT_NULL); + listeners.remove(listener); + } } diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/PortPairGroupEvent.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/PortPairGroupEvent.java new file mode 100644 index 00000000..88e1d7fb --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/PortPairGroupEvent.java @@ -0,0 +1,63 @@ +/* + * 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.vtnrsc.portpairgroup; + +import org.onosproject.event.AbstractEvent; +import org.onosproject.vtnrsc.PortPairGroup; + +/** + * Describes network Port-Pair-Group event. + */ +public class PortPairGroupEvent extends AbstractEvent<PortPairGroupEvent.Type, PortPairGroup> { + /** + * Type of port-pair-group events. + */ + public enum Type { + /** + * Signifies that port-pair-group has been created. + */ + PORT_PAIR_GROUP_PUT, + /** + * Signifies that port-pair-group has been deleted. + */ + PORT_PAIR_GROUP_DELETE, + /** + * Signifies that port-pair-group has been updated. + */ + PORT_PAIR_GROUP_UPDATE + } + + /** + * Creates an event of a given type and for the specified Port-Pair-Group. + * + * @param type Port-Pair-Group event type + * @param portPairGroup Port-Pair-Group subject + */ + public PortPairGroupEvent(Type type, PortPairGroup portPairGroup) { + super(type, portPairGroup); + } + + /** + * Creates an event of a given type and for the specified Port-Pair-Group. + * + * @param type Port-Pair-Group event type + * @param portPairGroup Port-Pair-Group subject + * @param time occurrence time + */ + public PortPairGroupEvent(Type type, PortPairGroup portPairGroup, long time) { + super(type, portPairGroup, time); + } +} diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/PortPairGroupListener.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/PortPairGroupListener.java new file mode 100644 index 00000000..637149e3 --- /dev/null +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/PortPairGroupListener.java @@ -0,0 +1,25 @@ +/* + * 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.vtnrsc.portpairgroup; + +import org.onosproject.event.EventListener; + +/** + * Entity capable of Port-Pair-Group related events. + */ +public interface PortPairGroupListener extends EventListener<PortPairGroupEvent> { + +} diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/PortPairGroupService.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/PortPairGroupService.java index 77f483fc..efee0eb9 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/PortPairGroupService.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/PortPairGroupService.java @@ -77,4 +77,18 @@ public interface PortPairGroupService { * @return true if the give port pair group is deleted successfully. */ boolean removePortPairGroup(PortPairGroupId portPairGroupId); + + /** + * Adds the specified listener to Port-Pair-Group manager. + * + * @param listener Port-Pair-Group listener + */ + void addListener(PortPairGroupListener listener); + + /** + * Removes the specified listener to Port-Pair-Group manager. + * + * @param listener Port-Pair-Group listener + */ + void removeListener(PortPairGroupListener listener); } diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java index 55fb4e43..5f80ef64 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java @@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static org.slf4j.LoggerFactory.getLogger; import java.util.Collections; +import java.util.Set; import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; @@ -34,9 +35,12 @@ import org.onosproject.store.service.StorageService; import org.onosproject.store.service.WallClockTimestamp; import org.onosproject.vtnrsc.PortPairGroup; import org.onosproject.vtnrsc.PortPairGroupId; +import org.onosproject.vtnrsc.portpairgroup.PortPairGroupListener; import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService; import org.slf4j.Logger; +import com.google.common.collect.Sets; + /** * Provides implementation of the portPairGroupService. */ @@ -44,11 +48,12 @@ import org.slf4j.Logger; @Service public class PortPairGroupManager implements PortPairGroupService { - private final Logger log = getLogger(getClass()); - private static final String PORT_PAIR_GROUP_ID_NULL = "PortPairGroup ID cannot be null"; private static final String PORT_PAIR_GROUP_NULL = "PortPairGroup cannot be null"; + private static final String LISTENER_NOT_NULL = "Listener cannot be null"; + private final Logger log = getLogger(getClass()); + private final Set<PortPairGroupListener> listeners = Sets.newCopyOnWriteArraySet(); private EventuallyConsistentMap<PortPairGroupId, PortPairGroup> portPairGroupStore; @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) @@ -73,6 +78,7 @@ public class PortPairGroupManager implements PortPairGroupService { @Deactivate public void deactivate() { portPairGroupStore.destroy(); + listeners.clear(); log.info("Stopped"); } @@ -143,4 +149,16 @@ public class PortPairGroupManager implements PortPairGroupService { } return true; } + + @Override + public void addListener(PortPairGroupListener listener) { + checkNotNull(listener, LISTENER_NOT_NULL); + listeners.add(listener); + } + + @Override + public void removeListener(PortPairGroupListener listener) { + checkNotNull(listener, LISTENER_NOT_NULL); + listeners.remove(listener); + } } diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/VtnRscService.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/VtnRscService.java index 21161ba5..bc9f4e68 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/VtnRscService.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/VtnRscService.java @@ -18,32 +18,20 @@ package org.onosproject.vtnrsc.service; import java.util.Iterator; import org.onlab.packet.MacAddress; +import org.onosproject.event.ListenerService; import org.onosproject.net.Device; import org.onosproject.net.DeviceId; import org.onosproject.net.HostId; import org.onosproject.vtnrsc.SegmentationId; import org.onosproject.vtnrsc.TenantId; import org.onosproject.vtnrsc.VirtualPortId; +import org.onosproject.vtnrsc.event.VtnRscEvent; import org.onosproject.vtnrsc.event.VtnRscListener; /** * Service for interacting with the inventory of Vtn resource. */ -public interface VtnRscService { - /** - * Adds the specified listener. - * - * @param listener VtnRsc listener - */ - void addListener(VtnRscListener listener); - - /** - * Removes the specified listener. - * - * @param listener VtnRsc listener - */ - void removeListener(VtnRscListener listener); - +public interface VtnRscService extends ListenerService<VtnRscEvent, VtnRscListener> { /** * Returns the SegmentationId of tenant. * diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java index ec9ca3ef..b21ad200 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java @@ -32,6 +32,7 @@ import org.onlab.packet.IpAddress; import org.onlab.packet.MacAddress; import org.onlab.util.KryoNamespace; import org.onosproject.core.CoreService; +import org.onosproject.event.AbstractListenerManager; import org.onosproject.net.Device; import org.onosproject.net.DeviceId; import org.onosproject.net.Host; @@ -54,6 +55,11 @@ import org.onosproject.vtnrsc.SubnetId; import org.onosproject.vtnrsc.TenantId; import org.onosproject.vtnrsc.VirtualPort; import org.onosproject.vtnrsc.VirtualPortId; +import org.onosproject.vtnrsc.PortPair; +import org.onosproject.vtnrsc.PortPairId; +import org.onosproject.vtnrsc.PortPairGroup; +import org.onosproject.vtnrsc.FlowClassifier; +import org.onosproject.vtnrsc.PortChain; import org.onosproject.vtnrsc.event.VtnRscEvent; import org.onosproject.vtnrsc.event.VtnRscEventFeedback; import org.onosproject.vtnrsc.event.VtnRscListener; @@ -70,16 +76,27 @@ import org.onosproject.vtnrsc.service.VtnRscService; import org.onosproject.vtnrsc.subnet.SubnetService; import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService; import org.onosproject.vtnrsc.virtualport.VirtualPortService; +import org.onosproject.vtnrsc.portpair.PortPairEvent; +import org.onosproject.vtnrsc.portpair.PortPairListener; +import org.onosproject.vtnrsc.portpair.PortPairService; +import org.onosproject.vtnrsc.portpairgroup.PortPairGroupEvent; +import org.onosproject.vtnrsc.portpairgroup.PortPairGroupListener; +import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService; +import org.onosproject.vtnrsc.flowclassifier.FlowClassifierEvent; +import org.onosproject.vtnrsc.flowclassifier.FlowClassifierListener; +import org.onosproject.vtnrsc.flowclassifier.FlowClassifierService; +import org.onosproject.vtnrsc.portchain.PortChainEvent; +import org.onosproject.vtnrsc.portchain.PortChainListener; +import org.onosproject.vtnrsc.portchain.PortChainService; import org.slf4j.Logger; -import com.google.common.collect.Sets; - /** * Provides implementation of the VtnRsc service. */ @Component(immediate = true) @Service -public class VtnRscManager implements VtnRscService { +public class VtnRscManager extends AbstractListenerManager<VtnRscEvent, VtnRscListener> + implements VtnRscService { @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected CoreService coreService; @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) @@ -88,11 +105,14 @@ public class VtnRscManager implements VtnRscService { protected LogicalClockService clockService; private final Logger log = getLogger(getClass()); - private final Set<VtnRscListener> listeners = Sets.newCopyOnWriteArraySet(); private HostListener hostListener = new InnerHostListener(); private FloatingIpListener floatingIpListener = new InnerFloatingIpListener(); private RouterListener routerListener = new InnerRouterListener(); private RouterInterfaceListener routerInterfaceListener = new InnerRouterInterfaceListener(); + private PortPairListener portPairListener = new InnerPortPairListener(); + private PortPairGroupListener portPairGroupListener = new InnerPortPairGroupListener(); + private FlowClassifierListener flowClassifierListener = new InnerFlowClassifierListener(); + private PortChainListener portChainListener = new InnerPortChainListener(); private EventuallyConsistentMap<TenantId, SegmentationId> l3vniMap; private EventuallyConsistentMap<TenantId, Set<DeviceId>> classifierOvsMap; @@ -125,6 +145,14 @@ public class VtnRscManager implements VtnRscService { protected TenantNetworkService tenantNetworkService; @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected DeviceService deviceService; + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected PortPairService portPairService; + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected PortPairGroupService portPairGroupService; + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected FlowClassifierService flowClassifierService; + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected PortChainService portChainService; @Activate public void activate() { @@ -132,6 +160,10 @@ public class VtnRscManager implements VtnRscService { floatingIpService.addListener(floatingIpListener); routerService.addListener(routerListener); routerInterfaceService.addListener(routerInterfaceListener); + portPairService.addListener(portPairListener); + portPairGroupService.addListener(portPairGroupListener); + flowClassifierService.addListener(flowClassifierListener); + portChainService.addListener(portChainListener); KryoNamespace.Builder serializer = KryoNamespace.newBuilder() .register(KryoNamespaces.API) @@ -161,26 +193,18 @@ public class VtnRscManager implements VtnRscService { floatingIpService.removeListener(floatingIpListener); routerService.removeListener(routerListener); routerInterfaceService.removeListener(routerInterfaceListener); + portPairService.removeListener(portPairListener); + portPairGroupService.removeListener(portPairGroupListener); + flowClassifierService.removeListener(flowClassifierListener); + portChainService.removeListener(portChainListener); + l3vniMap.destroy(); classifierOvsMap.destroy(); sffOvsMap.destroy(); - listeners.clear(); log.info("Stopped"); } @Override - public void addListener(VtnRscListener listener) { - checkNotNull(listener, LISTENER_NOT_NULL); - listeners.add(listener); - } - - @Override - public void removeListener(VtnRscListener listener) { - checkNotNull(listener, LISTENER_NOT_NULL); - listeners.add(listener); - } - - @Override public SegmentationId getL3vni(TenantId tenantId) { checkNotNull(tenantId, "tenantId cannot be null"); SegmentationId l3vni = l3vniMap.get(tenantId); @@ -282,6 +306,93 @@ public class VtnRscManager implements VtnRscService { } } + private class InnerPortPairListener implements PortPairListener { + + @Override + public void event(PortPairEvent event) { + checkNotNull(event, EVENT_NOT_NULL); + PortPair portPair = event.subject(); + if (PortPairEvent.Type.PORT_PAIR_PUT == event.type()) { + notifyListeners(new VtnRscEvent(VtnRscEvent.Type.PORT_PAIR_PUT, + new VtnRscEventFeedback(portPair))); + } else if (PortPairEvent.Type.PORT_PAIR_DELETE == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.PORT_PAIR_DELETE, + new VtnRscEventFeedback(portPair))); + } else if (PortPairEvent.Type.PORT_PAIR_UPDATE == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.PORT_PAIR_UPDATE, + new VtnRscEventFeedback(portPair))); + } + } + } + + private class InnerPortPairGroupListener implements PortPairGroupListener { + + @Override + public void event(PortPairGroupEvent event) { + checkNotNull(event, EVENT_NOT_NULL); + PortPairGroup portPairGroup = event.subject(); + if (PortPairGroupEvent.Type.PORT_PAIR_GROUP_PUT == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.PORT_PAIR_GROUP_PUT, + new VtnRscEventFeedback(portPairGroup))); + } else if (PortPairGroupEvent.Type.PORT_PAIR_GROUP_DELETE == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.PORT_PAIR_GROUP_DELETE, + new VtnRscEventFeedback(portPairGroup))); + } else if (PortPairGroupEvent.Type.PORT_PAIR_GROUP_UPDATE == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.PORT_PAIR_GROUP_UPDATE, + new VtnRscEventFeedback(portPairGroup))); + } + } + } + + private class InnerFlowClassifierListener implements FlowClassifierListener { + + @Override + public void event(FlowClassifierEvent event) { + checkNotNull(event, EVENT_NOT_NULL); + FlowClassifier flowClassifier = event.subject(); + if (FlowClassifierEvent.Type.FLOW_CLASSIFIER_PUT == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.FLOW_CLASSIFIER_PUT, + new VtnRscEventFeedback(flowClassifier))); + } else if (FlowClassifierEvent.Type.FLOW_CLASSIFIER_DELETE == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.FLOW_CLASSIFIER_DELETE, + new VtnRscEventFeedback(flowClassifier))); + } else if (FlowClassifierEvent.Type.FLOW_CLASSIFIER_UPDATE == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.FLOW_CLASSIFIER_UPDATE, + new VtnRscEventFeedback(flowClassifier))); + } + } + } + + private class InnerPortChainListener implements PortChainListener { + + @Override + public void event(PortChainEvent event) { + checkNotNull(event, EVENT_NOT_NULL); + PortChain portChain = event.subject(); + if (PortChainEvent.Type.PORT_CHAIN_PUT == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.PORT_CHAIN_PUT, + new VtnRscEventFeedback(portChain))); + } else if (PortChainEvent.Type.PORT_CHAIN_DELETE == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.PORT_CHAIN_DELETE, + new VtnRscEventFeedback(portChain))); + } else if (PortChainEvent.Type.PORT_CHAIN_UPDATE == event.type()) { + notifyListeners(new VtnRscEvent( + VtnRscEvent.Type.PORT_CHAIN_UPDATE, + new VtnRscEventFeedback(portChain))); + } + } + } + @Override public Iterator<Device> getClassifierOfTenant(TenantId tenantId) { checkNotNull(tenantId, TENANTID_NOT_NULL); @@ -333,8 +444,7 @@ public class VtnRscManager implements VtnRscService { @Override public boolean isServiceFunction(VirtualPortId portId) { - // TODO Auto-generated method stub - return false; + return portPairService.exists(PortPairId.of(portId.portId())); } @Override @@ -343,7 +453,7 @@ public class VtnRscManager implements VtnRscService { VirtualPort vmPort = virtualPortService.getPort(portId); Set<Host> hostSet = hostService.getHostsByMac(vmPort.macAddress()); for (Host host : hostSet) { - if (host.annotations().value(IFACEID).equals(vmPort.portId())) { + if (host.annotations().value(IFACEID).equals(vmPort.portId().portId())) { return host.location().deviceId(); } } @@ -467,6 +577,6 @@ public class VtnRscManager implements VtnRscService { */ private void notifyListeners(VtnRscEvent event) { checkNotNull(event, EVENT_NOT_NULL); - listeners.forEach(listener -> listener.event(event)); + post(event); } } diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortService.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortService.java index 0a3ea2cd..19548db8 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortService.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortService.java @@ -17,6 +17,7 @@ package org.onosproject.vtnrsc.virtualport; import java.util.Collection; +import org.onlab.packet.IpAddress; import org.onosproject.net.DeviceId; import org.onosproject.vtnrsc.FixedIp; import org.onosproject.vtnrsc.TenantId; @@ -53,6 +54,15 @@ public interface VirtualPortService { VirtualPort getPort(FixedIp fixedIP); /** + * Returns the virtualPort associated with the networkId and ip. + * + * @param networkId the TenantNetworkId identifier + * @param ip the ip identifier + * @return virtualPort. + */ + VirtualPort getPort(TenantNetworkId networkId, IpAddress ip); + + /** * Returns the collection of the currently known virtualPort. * @return collection of VirtualPort. */ diff --git a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java index daec7839..9639e086 100644 --- a/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java +++ b/framework/src/onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java @@ -72,6 +72,7 @@ public class VirtualPortManager implements VirtualPortService { private static final String NETWORKID_NOT_NULL = "NetworkId cannot be null"; private static final String DEVICEID_NOT_NULL = "DeviceId cannot be null"; private static final String FIXEDIP_NOT_NULL = "FixedIp cannot be null"; + private static final String IP_NOT_NULL = "Ip cannot be null"; protected Map<VirtualPortId, VirtualPort> vPortStore; protected ApplicationId appId; @@ -148,6 +149,27 @@ public class VirtualPortManager implements VirtualPortService { } @Override + public VirtualPort getPort(TenantNetworkId networkId, IpAddress ip) { + checkNotNull(networkId, NETWORKID_NOT_NULL); + checkNotNull(ip, IP_NOT_NULL); + List<VirtualPort> vPorts = new ArrayList<>(); + vPortStore.values().stream().filter(p -> p.networkId().equals(networkId)) + .forEach(p -> { + Iterator<FixedIp> fixedIps = p.fixedIps().iterator(); + while (fixedIps.hasNext()) { + if (fixedIps.next().ip().equals(ip)) { + vPorts.add(p); + break; + } + } + }); + if (vPorts.size() == 0) { + return null; + } + return vPorts.get(0); + } + + @Override public Collection<VirtualPort> getPorts() { return Collections.unmodifiableCollection(vPortStore.values()); } |