Add tenant to yang and tenant listeners. 47/46047/1
authorYakir Dorani <yakir.dorani@hpe.com>
Thu, 22 Sep 2016 11:56:04 +0000 (14:56 +0300)
committerYakir Dorani <yakir.dorani@hpe.com>
Thu, 22 Sep 2016 11:56:04 +0000 (14:56 +0300)
Change-Id: I573e88f0deb600a41da3ed89504e0504fe161d2b
Signed-off-by: Yakir Dorani <yakir.dorani@hpe.com>
legato-api/src/main/yang/mef-global.yang
legato-api/src/main/yang/mef-interfaces.yang
legato-api/src/main/yang/mef-services.yang
legato-api/src/main/yang/mef-topology.yang
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantEnhancerUtils.java [new file with mode: 0644]
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantUniListener.java [new file with mode: 0644]
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantlessEvcListener.java [new file with mode: 0644]
netvirt/src/main/resources/org/opendaylight/blueprint/netvirt-driver.xml

index 947318a515ea9c863dc0796f904c9476b8614b41..e86a7bd35233df13540068a07885ef3e6c2f72e9 100644 (file)
@@ -1499,5 +1499,30 @@ module mef-global {
         }\r
       }\r
     }\r
+    \r
+    grouping tenant {\r
+        leaf name {\r
+            type string;\r
+            description "Tenant Name";\r
+        }\r
+        leaf service_type {\r
+            type enumeration {\r
+                enum L2 {\r
+                    description "Layer 2 VPN";\r
+                }\r
+                enum L3 {\r
+                    description "Layer 3 VPN";\r
+                }\r
+            }\r
+        }\r
+    }\r
+    \r
+    container tenants-instances {\r
+        list tenant-list {\r
+            key name;\r
+            unique name;\r
+            uses tenant;\r
+        }\r
+    }\r
   }\r
 }
\ No newline at end of file
index 74b1c6aec292a74b0cb6e665614f68b5b451fd1f..359f66c4d248ec4289a6dcb44b9523f2266f91e8 100644 (file)
@@ -868,6 +868,11 @@ module mef-interfaces {
                 "[MEF45] Section 8.2. " +\r
                 "[MEF7.3] Section 10.2.2.";\r
         }\r
+        leaf tenant-id {\r
+            type leafref {\r
+                path "/mef-global:mef-global/mef-global:tenants-instances/mef-global:tenant-list/mef-global:name";\r
+            }\r
+        }        \r
       }\r
     }\r
   }\r
index f8fe3e33c95d2516b6569526b0d69aea0fdedf46..99c2979fdd4fe1d6b75d58f0f193e8971365d26a 100644 (file)
@@ -75,6 +75,7 @@ module mef-services {
     reference "EVC Ethernet Services Definitions YANG Modules " +\r
             "(MEF XX), TBD";\r
   }\r
+   \r
   container mef-services {\r
     description\r
       "MEF Services";\r
@@ -1308,7 +1309,6 @@ module mef-services {
         }\r
         leaf evc-status {\r
           type mef-types:evc-status-type;\r
-          default "inactive";\r
           config false;\r
           description\r
             "EVC Operational Status.";\r
@@ -1468,6 +1468,9 @@ module mef-services {
             "This value must be 2 for point-to-point mode.";\r
           reference "[MEF10.3] [R14]. [MEF7.3] Section 12.2.2.";\r
         }\r
+        leaf preserved-vlan {\r
+            type uint32;\r
+        }\r
         leaf preserve-ce-vlan-id {\r
           type boolean;\r
           default "false";\r
@@ -1950,6 +1953,11 @@ module mef-services {
           "MEF Service Entity.";\r
         reference "[MEF12.2] Table 3.";\r
       }\r
+      leaf tenant-id {\r
+          type leafref{\r
+              path "/mef-global:mef-global/mef-global:tenants-instances/mef-global:tenant-list/mef-global:name";\r
+          }\r
+      }      \r
     }\r
   }\r
 }
\ No newline at end of file
index d4ab55deb9c62d5970171d102e55cf57fbee80e6..a90fcffbdf2234ab4f1f946620554acc97eefd6b 100644 (file)
@@ -122,6 +122,9 @@ module mef-topology {
           description\r
             "Device Identifier.";\r
         }\r
+        leaf device-name {\r
+            type string;\r
+        }\r
       }\r
     }\r
     container connections {\r
diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantEnhancerUtils.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantEnhancerUtils.java
new file mode 100644 (file)
index 0000000..1a7839e
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2016 Hewlett Packard Enterprise, Co. 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.unimgr.mef.netvirt;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefService;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefServiceBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TenantEnhancerUtils {
+    private static final Logger log = LoggerFactory.getLogger(TenantEnhancerUtils.class);
+
+    public static boolean isServiceTenanted(MefService service) {
+        return service.getTenantId().equals("");
+    }
+
+    public static boolean isUniTenanted(
+            org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni uni) {
+        return uni.getTenantId().equals("");
+    }
+
+    public static void updateService(DataBroker dataBroker, String tenant, MefService service) {
+        log.info("service is {}", service);
+
+        MefServiceBuilder builder = new MefServiceBuilder();
+        builder.setKey(service.getKey());
+        builder.setTenantId(tenant);
+        MdsalUtils.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                MefUtils.getMefServiceInstanceIdentifier(service.getSvcId()), service);
+    }
+}
\ No newline at end of file
diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantUniListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantUniListener.java
new file mode 100644 (file)
index 0000000..e86d904
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2016 Hewlett Packard Enterprise, Co. 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.unimgr.mef.netvirt;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.unimgr.api.UnimgrDataTreeChangeListener;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.MefServices;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefService;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Optional;
+
+public class TenantUniListener extends UnimgrDataTreeChangeListener<Uni> {
+
+    private static final Logger log = LoggerFactory.getLogger(TenantUniListener.class);
+    private ListenerRegistration<TenantUniListener> evcListenerRegistration;
+
+    public TenantUniListener(final DataBroker dataBroker) {
+        super(dataBroker);
+
+        registerListener();
+    }
+
+    public void registerListener() {
+        try {
+            final DataTreeIdentifier<Uni> dataTreeIid = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
+                    MefUtils.getUniListInterfaceInstanceIdentifier());
+            evcListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this);
+            log.info("TenantUniListener created and registered");
+        } catch (final Exception e) {
+            log.error("TenantUniListener registration failed !", e);
+            throw new IllegalStateException("Evc registration Listener failed.", e);
+        }
+    }
+
+    @Override
+    public void close() throws Exception {
+        evcListenerRegistration.close();
+    }
+
+    @Override
+    public void add(DataTreeModification<Uni> newDataObject) {
+        log.info("received add Uni notification");
+        handleUniChanged(newDataObject.getRootNode().getDataAfter());
+    }
+
+    @Override
+    public void remove(DataTreeModification<Uni> removedDataObject) {
+    }
+
+    @Override
+    public void update(DataTreeModification<Uni> modifiedDataObject) {
+        log.info("received update Uni notification");
+        handleUniChanged(modifiedDataObject.getRootNode().getDataAfter());
+    }
+
+    private void handleUniChanged(Uni uni) {
+        if (!TenantEnhancerUtils.isUniTenanted(uni)) {
+            return;
+        }
+
+        String tenant = uni.getTenantId();
+
+        Optional<MefServices> optionalServices = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                MefUtils.getMefServicesInstanceIdentifier());
+        if (!optionalServices.isPresent()) {
+            return;
+        }
+        for (MefService service : optionalServices.get().getMefService()) {
+            for (org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni serviceUni : service
+                    .getEvc().getUnis().getUni()) {
+                if (!TenantEnhancerUtils.isServiceTenanted(service) && serviceUni.getUniId().equals(uni.getUniId())) {
+                    log.info("instance identifier is {}", MefUtils.getMefServiceInstanceIdentifier(service.getSvcId()));
+                    TenantEnhancerUtils.updateService(dataBroker, tenant, service);
+                }
+            }
+        }
+    }
+}
diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantlessEvcListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantlessEvcListener.java
new file mode 100644 (file)
index 0000000..8579c9e
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2016 Hewlett Packard Enterprise, Co. 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.unimgr.mef.netvirt;
+
+import java.util.List;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.unimgr.api.UnimgrDataTreeChangeListener;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.Evc;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefService;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Optional;
+
+public class TenantlessEvcListener extends UnimgrDataTreeChangeListener<MefService> {
+
+    private static final Logger log = LoggerFactory.getLogger(TenantlessEvcListener.class);
+    private ListenerRegistration<TenantlessEvcListener> evcListenerRegistration;
+
+    public TenantlessEvcListener(final DataBroker dataBroker) {
+        super(dataBroker);
+
+        registerListener();
+    }
+
+    public void registerListener() {
+        try {
+            final DataTreeIdentifier<MefService> dataTreeIid = new DataTreeIdentifier<>(
+                    LogicalDatastoreType.CONFIGURATION, MefUtils.getMefServiceInstanceIdentifier());
+            evcListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this);
+            log.info("TenantlessEvcListener created and registered");
+        } catch (final Exception e) {
+            log.error("TenantlessEvcListener registration failed !", e);
+            throw new IllegalStateException("Evc registration Listener failed.", e);
+        }
+    }
+
+    @Override
+    public void close() throws Exception {
+        evcListenerRegistration.close();
+    }
+
+    @Override
+    public void add(DataTreeModification<MefService> newDataObject) {
+        if (newDataObject.getRootPath() != null && newDataObject.getRootNode() != null) {
+            log.info("service {} created", newDataObject.getRootNode().getIdentifier());
+            handleService(newDataObject.getRootNode().getDataAfter());
+        }
+    }
+
+    @Override
+    public void remove(DataTreeModification<MefService> removedDataObject) {
+    }
+
+    @Override
+    public void update(DataTreeModification<MefService> modifiedDataObject) {
+        if (modifiedDataObject.getRootPath() != null && modifiedDataObject.getRootNode() != null) {
+            log.info("service {} updated", modifiedDataObject.getRootNode().getIdentifier());
+            handleService(modifiedDataObject.getRootNode().getDataAfter());
+        }
+    }
+
+    private void handleService(MefService service) {
+        if (TenantEnhancerUtils.isServiceTenanted(service)) {
+            log.info("Service {} is already connected to a Service", service.getSvcId().getValue());
+            return;
+        }
+        Evc evc = service.getEvc();
+        if (evc.getUnis() == null) {
+            log.info("No UNI's in service {}, exiting", service.getSvcId().getValue());
+            return;
+        }
+        List<Uni> unis = evc.getUnis().getUni();
+        for (Uni uni : unis) {
+            Optional<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni> optonalUniInterface = MdsalUtils
+                    .read(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                            MefUtils.getUniInstanceIdentifier(uni.getUniId().getValue()));
+            if (optonalUniInterface.isPresent()) {
+                org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni uniInterface = optonalUniInterface
+                        .get();
+                if (TenantEnhancerUtils.isUniTenanted(uniInterface)) {
+                    String tenant = uniInterface.getTenantId();
+                    log.info("updating service {} with tenant {}", service.getSvcId().getValue(), tenant);
+                    TenantEnhancerUtils.updateService(dataBroker, tenant, service);
+                    return;
+                }
+            } else {
+                log.info("Couldn't find uni {}", uni.getUniId());
+            }
+        }
+    }
+}
\ No newline at end of file
index d746e944d471f093f21fc38f53cacfac89907e82..e4f94e2b4965f971d3679353750fd1eff09b036d 100644 (file)
   <bean class="org.opendaylight.unimgr.mef.netvirt.ElanInterfaceListener">
     <argument index="0" ref="dataBroker" />
   </bean>
+
+  <bean class="org.opendaylight.unimgr.mef.netvirt.TenantlessEvcListener">
+    <argument index="0" ref="dataBroker" />
+  </bean>
+  <bean class="org.opendaylight.unimgr.mef.netvirt.TenantUniListener">
+    <argument index="0" ref="dataBroker" />
+  </bean>  
+  
 </blueprint>
\ No newline at end of file