Introducing RPCs for remote calls to VPP
[groupbasedpolicy.git] / neutron-vpp-mapper / src / main / java / org / opendaylight / groupbasedpolicy / neutron / vpp / mapper / processors / NetworkAware.java
index 03c27ecb0d899dd549ad0a3fcd4b0d2a32d1ad5e..577e36eaf96ce17c506d4022f5861d2155748cdb 100644 (file)
-/*\r
- * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.processors;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;\r
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
-import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.FlatNetwork;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.NetworkTypeBase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VlanNetwork;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomain;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomainBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomainKey;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.bridge.domain.PhysicalLocationRef;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.bridge.domain.PhysicalLocationRefBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;\r
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;\r
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;\r
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;\r
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;\r
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;\r
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import com.google.common.annotations.VisibleForTesting;\r
-import com.google.common.base.Function;\r
-import com.google.common.base.Optional;\r
-import com.google.common.collect.Lists;\r
-\r
-public class NetworkAware implements MappingProvider<Network> {\r
-\r
-    private static final Logger LOG = LoggerFactory.getLogger(NetworkAware.class);\r
-\r
-    private final DataBroker dataBroker;\r
-\r
-    public NetworkAware(DataBroker dataBroker) {\r
-        this.dataBroker = dataBroker;\r
-    }\r
-\r
-    @Override\r
-    public InstanceIdentifier<Network> getNeutronDtoIid() {\r
-        return InstanceIdentifier.builder(Neutron.class).child(Networks.class).child(Network.class).build();\r
-    }\r
-\r
-    @Override\r
-    public void processCreatedNeutronDto(Network network) {\r
-        BridgeDomain bridgeDomain = createBridgeDomain(network);\r
-        if (bridgeDomain != null) {\r
-            ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
-            rwTx.put(LogicalDatastoreType.CONFIGURATION, getBridgeDomainIid(bridgeDomain.getId()), bridgeDomain);\r
-            DataStoreHelper.submitToDs(rwTx);\r
-        }\r
-    }\r
-\r
-    @VisibleForTesting\r
-    BridgeDomain createBridgeDomain(Network network) {\r
-        BridgeDomainBuilder bridgeDomainBuilder = new BridgeDomainBuilder();\r
-        String description = (network.getName() != null) ? network.getName() : "Neutron network";\r
-        bridgeDomainBuilder.setDescription(description);\r
-        bridgeDomainBuilder.setId(network.getUuid().getValue());\r
-        NetworkProviderExtension providerAug = network.getAugmentation(NetworkProviderExtension.class);\r
-        if (providerAug == null || providerAug.getNetworkType() == null) {\r
-            LOG.error("Cannot create VPP bridge domain. Network type not specified in neutron network: {}", network);\r
-            return null;\r
-        }\r
-        bridgeDomainBuilder.setPhysicalLocationRef(resolveDomainLocations(providerAug));\r
-        bridgeDomainBuilder.setType(convertNetworkType(providerAug.getNetworkType()));\r
-        if (providerAug.getNetworkType().isAssignableFrom(NetworkTypeVlan.class)\r
-                && providerAug.getSegmentationId() != null) {\r
-            try {\r
-                bridgeDomainBuilder.setVlan(new VlanId(Integer.valueOf(providerAug.getSegmentationId())));\r
-            } catch (NumberFormatException e) {\r
-                LOG.error("Neutron network {}. Cannot create VLAN ID from segmentation-id: {}. {}",\r
-                        providerAug.getSegmentationId(), network.getUuid(), e);\r
-                return null;\r
-            }\r
-        }\r
-        return bridgeDomainBuilder.build();\r
-    }\r
-\r
-    @VisibleForTesting\r
-    List<PhysicalLocationRef> resolveDomainLocations(NetworkProviderExtension providerAug) {\r
-        List<PhysicalLocationRef> locationRefs = new ArrayList<>();\r
-        ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
-        if (providerAug.getPhysicalNetwork() == null) {\r
-            return null;\r
-        }\r
-        Optional<Topology> readTopology = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
-                getTopologyIid(new TopologyId(providerAug.getPhysicalNetwork())), rTx);\r
-        if (readTopology.isPresent()) {\r
-            Topology topology = readTopology.get();\r
-            for (Node node : topology.getNode()) {\r
-                PhysicalLocationRefBuilder location = new PhysicalLocationRefBuilder();\r
-                location.setNodeId(node.getNodeId());\r
-                location.setInterface(Lists.transform(node.getTerminationPoint(),\r
-                        new Function<TerminationPoint, String>() {\r
-\r
-                            @Override\r
-                            public String apply(TerminationPoint input) {\r
-                                return input.getTpId().getValue();\r
-                            }\r
-                        }));\r
-                locationRefs.add(location.build());\r
-            }\r
-        }\r
-        return locationRefs;\r
-    }\r
-\r
-    public static Class<? extends NetworkTypeBase> convertNetworkType(\r
-            Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase> base) {\r
-        if (base.isAssignableFrom(NetworkTypeFlat.class)) {\r
-            return FlatNetwork.class;\r
-        }\r
-        if (base.isAssignableFrom(NetworkTypeVlan.class)) {\r
-            return VlanNetwork.class;\r
-        }\r
-        throw new IllegalStateException("Unsupported network type: " + base);\r
-    }\r
-\r
-    InstanceIdentifier<Topology> getTopologyIid(TopologyId topologyId) {\r
-        return InstanceIdentifier.builder(NetworkTopology.class)\r
-            .child(Topology.class, new TopologyKey(topologyId))\r
-            .build();\r
-    }\r
-\r
-    InstanceIdentifier<BridgeDomain> getBridgeDomainIid(String id) {\r
-        return InstanceIdentifier.builder(Config.class).child(BridgeDomain.class, new BridgeDomainKey(id)).build();\r
-    }\r
-\r
-    @Override\r
-    public void processUpdatedNeutronDto(Network originalNetwork, Network updatedNetwork) {\r
-        InstanceIdentifier<BridgeDomain> bdId = getBridgeDomainIid(originalNetwork.getUuid().getValue());\r
-        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
-        rwTx.delete(LogicalDatastoreType.CONFIGURATION, bdId);\r
-        rwTx.put(LogicalDatastoreType.CONFIGURATION, bdId, createBridgeDomain(updatedNetwork));\r
-        DataStoreHelper.submitToDs(rwTx);\r
-    }\r
-\r
-    @Override\r
-    public void processDeletedNeutronDto(Network network) {\r
-        InstanceIdentifier<BridgeDomain> bdId = getBridgeDomainIid(network.getUuid().getValue());\r
-        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
-        rwTx.delete(LogicalDatastoreType.CONFIGURATION, bdId);\r
-        DataStoreHelper.submitToDs(rwTx);\r
-    }\r
-}\r
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.processors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.FlatNetwork;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.NetworkTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VlanNetwork;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.bridge.domain.base.attributes.PhysicalLocationRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.bridge.domain.base.attributes.PhysicalLocationRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.common.collect.Lists;
+
+public class NetworkAware implements MappingProvider<Network> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(NetworkAware.class);
+
+    private final DataBroker dataBroker;
+
+    public NetworkAware(DataBroker dataBroker) {
+        this.dataBroker = dataBroker;
+    }
+
+    @Override
+    public InstanceIdentifier<Network> getNeutronDtoIid() {
+        return InstanceIdentifier.builder(Neutron.class).child(Networks.class).child(Network.class).build();
+    }
+
+    @Override
+    public void processCreatedNeutronDto(Network network) {
+        GbpBridgeDomain bridgeDomain = createGbpBridgeDomain(network);
+        if (bridgeDomain != null) {
+            ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
+            rwTx.put(LogicalDatastoreType.CONFIGURATION, getGbpBridgeDomainIid(bridgeDomain.getId()), bridgeDomain, true);
+            DataStoreHelper.submitToDs(rwTx);
+        }
+    }
+
+    @VisibleForTesting
+    GbpBridgeDomain createGbpBridgeDomain(Network network) {
+        GbpBridgeDomainBuilder bridgeDomainBuilder = new GbpBridgeDomainBuilder();
+        String description = (network.getName() != null) ? network.getName() : "Neutron network";
+        bridgeDomainBuilder.setDescription(description);
+        bridgeDomainBuilder.setId(network.getUuid().getValue());
+        NetworkProviderExtension providerAug = network.getAugmentation(NetworkProviderExtension.class);
+        if (providerAug == null || providerAug.getNetworkType() == null) {
+            LOG.error("Cannot create VPP bridge domain. Network type not specified in neutron network: {}", network);
+            return null;
+        }
+        Class<? extends NetworkTypeBase> netType = convertNetworkType(providerAug.getNetworkType());
+        if (netType == null) {
+            return null;
+        }
+        bridgeDomainBuilder.setPhysicalLocationRef(resolveDomainLocations(providerAug));
+        bridgeDomainBuilder.setType(netType);
+        if (providerAug.getNetworkType().isAssignableFrom(NetworkTypeVlan.class)
+                && providerAug.getSegmentationId() != null) {
+            try {
+                bridgeDomainBuilder.setVlan(new VlanId(Integer.valueOf(providerAug.getSegmentationId())));
+            } catch (NumberFormatException e) {
+                LOG.error("Neutron network {}. Cannot create VLAN ID from segmentation-id: {}. {}",
+                        providerAug.getSegmentationId(), network.getUuid(), e);
+                return null;
+            }
+        }
+        return bridgeDomainBuilder.build();
+    }
+
+    @VisibleForTesting
+    List<PhysicalLocationRef> resolveDomainLocations(NetworkProviderExtension providerAug) {
+        List<PhysicalLocationRef> locationRefs = new ArrayList<>();
+        ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
+        if (providerAug.getPhysicalNetwork() == null) {
+            return null;
+        }
+        Optional<Topology> readTopology = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
+                getTopologyIid(new TopologyId(providerAug.getPhysicalNetwork())), rTx);
+        if (readTopology.isPresent()) {
+            Topology topology = readTopology.get();
+            for (Node node : topology.getNode()) {
+                PhysicalLocationRefBuilder location = new PhysicalLocationRefBuilder();
+                location.setNodeId(node.getNodeId());
+                location.setInterface(Lists.transform(node.getTerminationPoint(),
+                        new Function<TerminationPoint, String>() {
+
+                            @Override
+                            public String apply(TerminationPoint input) {
+                                return input.getTpId().getValue();
+                            }
+                        }));
+                locationRefs.add(location.build());
+            }
+        }
+        return locationRefs;
+    }
+
+    public static Class<? extends NetworkTypeBase> convertNetworkType(
+            Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase> base) {
+        if (base.isAssignableFrom(NetworkTypeFlat.class)) {
+            return FlatNetwork.class;
+        }
+        if (base.isAssignableFrom(NetworkTypeVlan.class)) {
+            return VlanNetwork.class;
+        }
+        return null;
+    }
+
+    InstanceIdentifier<Topology> getTopologyIid(TopologyId topologyId) {
+        return InstanceIdentifier.builder(NetworkTopology.class)
+            .child(Topology.class, new TopologyKey(topologyId))
+            .build();
+    }
+
+    InstanceIdentifier<GbpBridgeDomain> getGbpBridgeDomainIid(String id) {
+        return InstanceIdentifier.builder(Config.class).child(GbpBridgeDomain.class, new GbpBridgeDomainKey(id)).build();
+    }
+
+    @Override
+    public void processUpdatedNeutronDto(Network originalNetwork, Network updatedNetwork) {
+        InstanceIdentifier<GbpBridgeDomain> bdIid = getGbpBridgeDomainIid(originalNetwork.getUuid().getValue());
+        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
+        deleteBridgeDomainIfPresent(rwTx, bdIid);
+        GbpBridgeDomain updatedBridgeDomain = createGbpBridgeDomain(updatedNetwork);
+        if (updatedBridgeDomain != null) {
+            rwTx.put(LogicalDatastoreType.CONFIGURATION, bdIid, updatedBridgeDomain, true);
+        }
+        DataStoreHelper.submitToDs(rwTx);
+    }
+
+    private void deleteBridgeDomainIfPresent(ReadWriteTransaction rwTx, InstanceIdentifier<GbpBridgeDomain> bdIid) {
+        Optional<GbpBridgeDomain> readFromDs = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, bdIid, rwTx);
+        if (readFromDs.isPresent()) {
+            rwTx.delete(LogicalDatastoreType.CONFIGURATION, bdIid);
+        }
+    }
+
+    @Override
+    public void processDeletedNeutronDto(Network network) {
+        InstanceIdentifier<GbpBridgeDomain> bdIid = getGbpBridgeDomainIid(network.getUuid().getValue());
+        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
+        deleteBridgeDomainIfPresent(rwTx, bdIid);
+        DataStoreHelper.submitToDs(rwTx);
+    }
+}