fix conflict with netvirt 73/45173/1
authorAlex Feigin <alex.feigin@hpe.com>
Wed, 31 Aug 2016 18:20:02 +0000 (21:20 +0300)
committerAlex Feigin <alex.feigin@hpe.com>
Mon, 5 Sep 2016 16:36:13 +0000 (19:36 +0300)
fix Bug 6558 - Services created in neutron conflicts with services created in unimgr

Change-Id: Idd1b90027236f24c6b78cc30851e6e036bfd98e9
Signed-off-by: Alex Feigin <alex.feigin@hpe.com>
features/src/main/features/features.xml
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/ElanInterfaceListener.java [new file with mode: 0644]
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/ElanListener.java [new file with mode: 0644]
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcUniUtils.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefUtils.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtUtils.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NodeConnectorListener.java
netvirt/src/main/resources/org/opendaylight/blueprint/netvirt-driver.xml

index 30d07c2f6bd0902cc25297892bea0a93efb0095a..276622d9d2ac8e220b49f010331666b772cc68b1 100755 (executable)
@@ -52,6 +52,7 @@
     <feature version='${project.version}'>odl-unimgr</feature>
     <feature version='${genius.version}'>odl-genius-api</feature>
     <feature version='${vpnservice.version}'>odl-netvirt-impl</feature>
+    <feature version="${restconf.version}">odl-restconf</feature>
     <bundle>mvn:org.opendaylight.unimgr/unimgr-netvirt/{{VERSION}}</bundle>
   </feature>
 
diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/ElanInterfaceListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/ElanInterfaceListener.java
new file mode 100644 (file)
index 0000000..d6951ae
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * 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 java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.commons.lang3.StringUtils;
+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.mef.service.evc.Unis;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.UnisBuilder;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.UniBuilder;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.UniKey;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.EvcUniCeVlansBuilder;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.evc.uni.ce.vlans.EvcUniCeVlanBuilder;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.evc.uni.ce.vlans.EvcUniCeVlanKey;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.EvcUniRoleType;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan.L2vlanMode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfaces;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ElanInterfaceListener extends UnimgrDataTreeChangeListener<ElanInterfaces> {
+
+    private static final Logger log = LoggerFactory.getLogger(ElanInterfaceListener.class);
+    private ListenerRegistration<ElanInterfaceListener> elanListenerRegistration;
+
+    public ElanInterfaceListener(final DataBroker dataBroker) {
+        super(dataBroker);
+
+        registerListener();
+    }
+
+    public void registerListener() {
+        try {
+            final DataTreeIdentifier<ElanInterfaces> dataTreeIid = new DataTreeIdentifier<>(
+                    LogicalDatastoreType.CONFIGURATION, NetvirtUtils.getElanInterfacesInstanceIdentifier());
+            elanListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this);
+            log.info("ElanInterfaceDataTreeChangeListener created and registered");
+        } catch (final Exception e) {
+            log.error("ElanInterface DataChange listener registration failed !", e);
+            throw new IllegalStateException("ElanInterface registration Listener failed.", e);
+        }
+    }
+
+    @Override
+    public void close() throws Exception {
+        elanListenerRegistration.close();
+    }
+
+    @Override
+    public void add(DataTreeModification<ElanInterfaces> newDataObject) {
+        log.info("org.opendaylight.unimgr.mef.netvirt.ElanInterfaceListener in add");
+
+        handleUpdatedInterfaces(newDataObject);
+
+    }
+
+    private void handleUpdatedInterfaces(DataTreeModification<ElanInterfaces> newDataObject) {
+        ElanInterfaces instance = newDataObject.getRootNode().getDataAfter();
+        Optional<String> findFirst = instance.getElanInterface().stream().map(x -> x.getElanInstanceName()).findFirst();
+        if (!findFirst.isPresent()) {
+            log.info("empty - exiting");
+            return;
+        }
+        String elanInstanceName = findFirst.get();
+        if (!StringUtils.isNumericSpace(elanInstanceName)) {
+            elanInstanceName = String.valueOf(elanInstanceName.hashCode());
+        }
+
+        com.google.common.base.Optional<Evc> evc = MefUtils.getEvc(dataBroker, elanInstanceName);
+
+        if (MefUtils.isEvcAdminStateEnabled(dataBroker, elanInstanceName)) {
+            log.info("The EVC {} is admin state enabled, ignoring");
+            return;
+        }
+
+        final String instanceName = elanInstanceName;
+        List<Interface> ifaces = instance.getElanInterface().stream()
+                .map(x -> NetvirtUtils.getIetfInterface(dataBroker, x.getName()))//
+                .filter(x -> x.isPresent())//
+                .map(x -> x.get())//
+                .collect(Collectors.toList());
+
+        if (log.isInfoEnabled()) {
+            log.info("adding unis from interfaces [{}] are not null from [{}] interfaces are: [{}]", ifaces.size(),
+                    instance.getElanInterface().size(),
+                    StringUtils.join(
+                            instance.getElanInterface().stream().map(x -> x.getName()).collect(Collectors.toList()),
+                            ", "));
+
+        }
+        List<String> trunks = ifaces.stream().filter(x -> x.getAugmentation(IfL2vlan.class) != null)//
+                .filter(x -> x.getAugmentation(IfL2vlan.class).getL2vlanMode() == L2vlanMode.Trunk)//
+                .map(x -> x.getName()).collect(Collectors.toList());
+
+        Map<String, List<Integer>> vlans = ifaces.stream()//
+                .filter(x -> x.getAugmentation(IfL2vlan.class) != null)//
+                .filter(x -> x.getAugmentation(IfL2vlan.class)//
+                        .getL2vlanMode() == L2vlanMode.TrunkMember)//
+                .collect(//
+                        Collectors.groupingBy(//
+                                x -> x.getAugmentation(ParentRefs.class).getParentInterface(), //
+                                Collectors.mapping(//
+                                        x -> x.getAugmentation(IfL2vlan.class).getVlanId().getValue(), //
+                                        Collectors.toList())));
+
+        Unis unisObj = new UnisBuilder()
+                .setUni(Stream.concat(trunks.stream(), vlans.keySet().stream())
+                        .filter(x -> !MefUtils.EvcUniExists(dataBroker, instanceName, x))
+                        .map(x -> createElanInterfaceToUni(dataBroker, x, vlans.get(x))).collect(Collectors.toList()))
+                .build();
+        MdsalUtils.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                MefUtils.getUnisInstanceIdentifier(elanInstanceName), unisObj);
+    }
+
+    private static Uni createElanInterfaceToUni(DataBroker dataBroker, String name, List<Integer> vlans) {
+        if (log.isInfoEnabled()) {
+            String vlansstr = "null";
+            if (vlans != null) {
+                vlansstr = StringUtils.join(vlans, ",");
+            }
+            log.info("create uni: {} setAdminStateEnabled false vlans: {}", name, vlansstr);
+        }
+        UniBuilder b = new UniBuilder();
+        b.setAdminStateEnabled(false);
+        Identifier45 _uniId = new Identifier45(name);
+        b.setKey(new UniKey(_uniId));
+        b.setUniId(_uniId);
+        b.setRole(EvcUniRoleType.Root);
+        if (vlans != null) {
+            b.setEvcUniCeVlans(new EvcUniCeVlansBuilder().setEvcUniCeVlan(
+                    vlans.stream().map(x -> new EvcUniCeVlanBuilder().setKey(new EvcUniCeVlanKey(x)).build())
+                            .collect(Collectors.toList()))
+                    .build());
+        }
+        return b.build();
+    }
+
+    @Override
+    public void remove(DataTreeModification<ElanInterfaces> removedDataObject) {
+        log.info("org.opendaylight.unimgr.mef.netvirt.ElanInterfaceListener in remove");
+    }
+
+    @Override
+    public void update(DataTreeModification<ElanInterfaces> modifiedDataObject) {
+        log.info("org.opendaylight.unimgr.mef.netvirt.ElanInterfaceListener in update");
+        handleUpdatedInterfaces(modifiedDataObject);
+    }
+
+}
\ No newline at end of file
diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/ElanListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/ElanListener.java
new file mode 100644 (file)
index 0000000..db12c69
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * 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.apache.commons.lang3.StringUtils;
+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.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ElanListener extends UnimgrDataTreeChangeListener<ElanInstance> {
+
+    private static final Logger log = LoggerFactory.getLogger(ElanListener.class);
+    private ListenerRegistration<ElanListener> elanListenerRegistration;
+
+    public ElanListener(final DataBroker dataBroker) {
+        super(dataBroker);
+
+        registerListener();
+    }
+
+    public void registerListener() {
+        try {
+            final DataTreeIdentifier<ElanInstance> dataTreeIid = new DataTreeIdentifier<>(
+                    LogicalDatastoreType.CONFIGURATION, NetvirtUtils.getElanInstanceInstanceIdentifier());
+            elanListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this);
+            log.info("ElanDataTreeChangeListener created and registered");
+        } catch (final Exception e) {
+            log.error("Elan DataChange listener registration failed !", e);
+            throw new IllegalStateException("Elan registration Listener failed.", e);
+        }
+    }
+
+    @Override
+    public void close() throws Exception {
+        elanListenerRegistration.close();
+    }
+
+    @Override
+    public void add(DataTreeModification<ElanInstance> newDataObject) {
+        log.info("org.opendaylight.unimgr.mef.netvirt.ElanListener in add");
+        ElanInstance instance = newDataObject.getRootNode().getDataAfter();
+
+        String instanceName = instance.getElanInstanceName();
+        if (!StringUtils.isNumericSpace(instanceName)) {
+            instanceName = String.valueOf(instanceName.hashCode());
+        }
+        if (!MefUtils.EvcExists(dataBroker, instanceName)) {
+            log.info("creating evc {}", instance);
+            MefUtils.createEvcInstance(dataBroker, instanceName);
+        } else {
+            log.info("evc {} exists, skipping", instance);
+        }
+
+    }
+
+    @Override
+    public void remove(DataTreeModification<ElanInstance> removedDataObject) {
+        log.info("org.opendaylight.unimgr.mef.netvirt.ElanListener in remove");
+    }
+
+    @Override
+    public void update(DataTreeModification<ElanInstance> modifiedDataObject) {
+        log.info("org.opendaylight.unimgr.mef.netvirt.ElanListener in update");
+    }
+
+}
\ No newline at end of file
index 287f08a6c20b000512de6e707b2b13f8cee19a60..bab6307c910a17b67de9aa8129f69f09d859c6e4 100644 (file)
@@ -9,12 +9,12 @@
 package org.opendaylight.unimgr.mef.netvirt;
 
 import java.util.ArrayList;
+import java.util.Collections;
 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.AsyncDataBroker.DataChangeScope;
 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.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.Link;
@@ -88,15 +88,20 @@ public class EvcListener extends UnimgrDataTreeChangeListener<Evc> {
         try {
             Evc data = newDataObject.getRootNode().getDataAfter();
             String instanceName = data.getEvcId().getValue();
-
             boolean isEtree = data.getEvcType() == EvcType.RootedMultipoint;
-
-            log.info("Adding {} instance: {}", isEtree ? "etree" : "elan", instanceName);
-            NetvirtUtils.createElanInstance(dataBroker, instanceName, isEtree);
-
+            if (!data.isAdminStateEnabled()) {
+                log.info("add - evc {} AdminStateEnabled false", data.getEvcId().getValue());
+            } else {
+                log.info("Adding {} instance: {}", isEtree ? "etree" : "elan", instanceName);
+                NetvirtUtils.createElanInstance(dataBroker, instanceName, isEtree);
+            }
             // Create interfaces
             for (Uni uni : data.getUnis().getUni()) {
-                createInterface(instanceName, uni, isEtree);
+                if (!uni.isAdminStateEnabled()) {
+                    log.info("uni {} AdminStateEnabled false", uni.getUniId().getValue());
+                } else {
+                    createInterface(instanceName, uni, isEtree);
+                }
             }
         } catch (final Exception e) {
             log.error("Add evc failed !", e);
@@ -111,9 +116,15 @@ public class EvcListener extends UnimgrDataTreeChangeListener<Evc> {
             String instanceName = original.getEvcId().getValue();
             boolean isEtree = update.getEvcType() == EvcType.RootedMultipoint;
 
+            if (!update.isAdminStateEnabled()) {
+                log.info("update - evc {} AdminStateEnabled false", update.getEvcId().getValue());
+            }
             log.info("Updating {} instance: {}", isEtree ? "etree" : "elan", instanceName);
 
-            List<Uni> originalUni = original.getUnis().getUni();
+            List<Uni> originalUni = original.getUnis() != null ? original.getUnis().getUni() : Collections.emptyList();
+            if (update == null || update.getUnis() == null) {
+                log.info("update uni is null");
+            }
             List<Uni> updateUni = update.getUnis().getUni();
             if (updateUni != null && !updateUni.isEmpty()) {
                 List<Uni> existingClonedUni = new ArrayList<>();
@@ -124,19 +135,31 @@ public class EvcListener extends UnimgrDataTreeChangeListener<Evc> {
                     // removing the Uni which are not presented in the updated
                     // List
                     for (Uni uni : originalUni) {
-                        removeElanInterface(instanceName, uni);
+                        if (!uni.isAdminStateEnabled()) {
+                            log.info("uni {} AdminStateEnabled false", uni.getUniId().getValue());
+                        } else {
+                            removeElanInterface(instanceName, uni);
+                        }
                     }
                 }
 
                 // Adding the new Uni which are presented in the updated List
                 if (updateUni.size() > 0) {
                     for (Uni uni : updateUni) {
-                        createInterface(instanceName, uni, isEtree);
+                        if (!uni.isAdminStateEnabled()) {
+                            log.info("uni {} AdminStateEnabled false", uni.getUniId().getValue());
+                        } else {
+                            createInterface(instanceName, uni, isEtree);
+                        }
                     }
                 }
             } else if (originalUni != null && !originalUni.isEmpty()) {
                 for (Uni uni : originalUni) {
-                    removeElanInterface(instanceName, uni);
+                    if (!uni.isAdminStateEnabled()) {
+                        log.info("uni {} AdminStateEnabled false", uni.getUniId().getValue());
+                    } else {
+                        removeElanInterface(instanceName, uni);
+                    }
                 }
             }
         } catch (final Exception e) {
@@ -147,11 +170,19 @@ public class EvcListener extends UnimgrDataTreeChangeListener<Evc> {
     private void removeEvc(DataTreeModification<Evc> removedDataObject) {
         try {
             Evc data = removedDataObject.getRootNode().getDataBefore();
+            if (!data.isAdminStateEnabled()) {
+                log.info("remove - evc {} AdminStateEnabled false", data.getEvcId().getValue());
+            }
 
             String instanceName = data.getEvcId().getValue();
 
             for (Uni uni : data.getUnis().getUni()) {
-                removeElanInterface(instanceName, uni);
+                if (!uni.isAdminStateEnabled()) {
+                    log.info("uni {} AdminStateEnabled false", uni.getUniId().getValue());
+                } else {
+
+                    removeElanInterface(instanceName, uni);
+                }
             }
 
             log.info("Removing elan instance: " + instanceName);
@@ -162,16 +193,17 @@ public class EvcListener extends UnimgrDataTreeChangeListener<Evc> {
     }
 
     private void createInterface(String instanceName, Uni uni, boolean isEtree) {
+
         EvcUniUtils.addUni(dataBroker, uni);
 
         String uniId = uni.getUniId().getValue();
 
         Link link = EvcUniUtils.getLink(dataBroker, uni);
-        String interfaceName = EvcUniUtils.getInterfaceName(link, uniId);
+        String interfaceName = uniId;
 
         boolean result = waitForGeniusToUpdateInterface(interfaceName);
         if (!result) {
-            log.error("State interface {} is missing ifIndex", interfaceName);
+            log.error("State interface {} is not configured (missing ifIndex)", interfaceName);
             return;
         }
 
@@ -179,7 +211,8 @@ public class EvcListener extends UnimgrDataTreeChangeListener<Evc> {
 
         EvcUniCeVlans evcUniCeVlans = uni.getEvcUniCeVlans();
 
-        if (evcUniCeVlans != null && !evcUniCeVlans.getEvcUniCeVlan().isEmpty()) {
+        if (evcUniCeVlans != null && evcUniCeVlans.getEvcUniCeVlan() != null
+                && !evcUniCeVlans.getEvcUniCeVlan().isEmpty()) {
             for (EvcUniCeVlan x : evcUniCeVlans.getEvcUniCeVlan()) {
 
                 interfaceName = NetvirtUtils.getInterfaceNameForVlan(interfaceName, x.getVid().toString());
@@ -192,11 +225,14 @@ public class EvcListener extends UnimgrDataTreeChangeListener<Evc> {
                 } else {
                     NetvirtUtils.createElanInterface(dataBroker, instanceName, interfaceName);
                 }
-
             }
         } else {
             log.info("Adding {} interface: {}", isEtree ? "etree" : "elan", interfaceName);
-            NetvirtUtils.createEtreeInterface(dataBroker, instanceName, interfaceName, RoleToInterfaceType(role));
+            if (isEtree) {
+                NetvirtUtils.createEtreeInterface(dataBroker, instanceName, interfaceName, RoleToInterfaceType(role));
+            } else {
+                NetvirtUtils.createElanInterface(dataBroker, instanceName, interfaceName);
+            }
         }
     }
 
@@ -207,15 +243,20 @@ public class EvcListener extends UnimgrDataTreeChangeListener<Evc> {
             Optional<Interface> optional = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
                     NetvirtUtils.getStateInterfaceIdentifier(interfaceName));
 
+            if (!optional.isPresent()) {
+                log.info("State interface {} doesn't exist", interfaceName);
+                return false;
+            }
+
             Interface stateInterface = optional.get();
 
-            if (stateInterface != null && stateInterface.getIfIndex() != null) {
+            if (stateInterface.getIfIndex() != null) {
                 log.info("State interface configured with ifIndex {}", stateInterface.getIfIndex());
 
                 // Wait a bit, because if we continue too soon this will not
                 // work.
                 try {
-                    Thread.sleep(3000);
+                    Thread.sleep(1000);
                 } catch (InterruptedException e) {
                 }
 
@@ -247,7 +288,7 @@ public class EvcListener extends UnimgrDataTreeChangeListener<Evc> {
         EvcUniCeVlans evcUniCeVlans = uni.getEvcUniCeVlans();
 
         Link link = EvcUniUtils.getLink(dataBroker, uni);
-        String interfaceName = EvcUniUtils.getInterfaceName(link, uniId);
+        String interfaceName = uniId;
 
         if (evcUniCeVlans != null && !evcUniCeVlans.getEvcUniCeVlan().isEmpty()) {
             for (EvcUniCeVlan x : evcUniCeVlans.getEvcUniCeVlan()) {
index 5448f347e25e792f9cf8867e3309ec91f15446cb..68e7cf875c42d13758312c6d6530720bd69b0755 100644 (file)
@@ -70,7 +70,6 @@ public class EvcUniUtils {
             WriteTransaction tx = createTransaction(dataBroker);
 
             Link link = EvcUniUtils.getLink(dataBroker, data);
-            uniId = EvcUniUtils.getInterfaceName(link, uniId);
 
             logger.info("Removing trunk {}", uniId);
 
@@ -93,7 +92,7 @@ public class EvcUniUtils {
             String uniId = data.getUniId().getValue();
             WriteTransaction tx = createTransaction(dataBroker);
             Link link = EvcUniUtils.getLink(dataBroker, data);
-            String interfaceName = EvcUniUtils.getInterfaceName(link, uniId);
+            String interfaceName = uniId;
             addTrunkInterface(interfaceName, getTrunkParentName(link), tx);
 
             Optional<List<EvcUniCeVlan>> ceVlansOptional = getCeVlans(data);
@@ -182,7 +181,7 @@ public class EvcUniUtils {
     private static String getTrunkParentName(Link link) {
         String deviceName = link.getDevice().getValue();
         String interfaceName = link.getInterface().toString();
-        return getDeviceInterfaceName(deviceName, interfaceName);
+        return interfaceName;
     }
 
     private static Optional<List<EvcUniCeVlan>> getCeVlans(Uni uni) {
@@ -194,11 +193,6 @@ public class EvcUniUtils {
         return Optional.fromNullable(ceVlans.getEvcUniCeVlan());
     }
 
-    public static String getInterfaceName(Link link, String uniId) {
-        String device = link.getDevice().getValue();
-        return getDeviceInterfaceName(device, uniId);
-    }
-
     public static String getDeviceInterfaceName(String deviceName, String interfaceName) {
         return deviceName + IfmConstants.OF_URI_SEPARATOR + interfaceName;
     }
index 78a5a22c2477610071314997484e63d9881e8286..e14a2f55ab02242506c0756c590f930730790084 100644 (file)
@@ -8,6 +8,8 @@
 
 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.interfaces.rev150526.MefInterfaces;
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.Unis;
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni;
@@ -18,7 +20,12 @@ import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.inte
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.LinkKey;
 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.services.rev150526.mef.services.MefServiceKey;
 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.mef.service.EvcBuilder;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.EvcUniCeVlans;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.evc.uni.ce.vlans.EvcUniCeVlan;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.evc.uni.ce.vlans.EvcUniCeVlanBuilder;
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.MefTopology;
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.Devices;
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.Device;
@@ -26,11 +33,16 @@ import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topo
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.Interfaces;
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.EvcIdType;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.EvcType;
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.RetailSvcIdType;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Optional;
+
 public final class MefUtils {
     @SuppressWarnings("unused")
     private static final Logger logger = LoggerFactory.getLogger(MefUtils.class);
@@ -47,6 +59,14 @@ public final class MefUtils {
                 .child(Uni.class, new UniKey(new Identifier45(uniId))).build();
     }
 
+    public static InstanceIdentifier<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.Unis> getUnisInstanceIdentifier(
+            String evcId) {
+        return InstanceIdentifier.builder(MefServices.class)
+                .child(MefService.class, new MefServiceKey(RetailSvcIdType.getDefaultInstance(evcId))).child(Evc.class)
+                .child(org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.Unis.class)
+                .build();
+    }
+
     public static InstanceIdentifier<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni> getEvcUniInstanceIdentifier(
             String uniId) {
         return InstanceIdentifier.builder(MefServices.class).child(MefService.class).child(Evc.class)
@@ -67,4 +87,67 @@ public final class MefUtils {
     public static InstanceIdentifier<Evc> getEvcInstanceIdentifier() {
         return InstanceIdentifier.create(MefServices.class).child(MefService.class).child(Evc.class);
     }
+
+    public static void createEvcInstance(DataBroker dataBroker, String instanceName) {
+        Evc einst = createEvcInstance(instanceName);
+
+        MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                getEvcInstanceInstanceIdentifier(instanceName), einst);
+    }
+
+    private static InstanceIdentifier<Evc> getEvcInstanceInstanceIdentifier(String instanceName) {
+        return InstanceIdentifier.builder(MefServices.class)
+                .child(MefService.class, new MefServiceKey(RetailSvcIdType.getDefaultInstance(instanceName)))
+                .child(Evc.class).build();
+    }
+
+    private static InstanceIdentifier<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni> getEvcUniInstanceIdentifier(
+            String serviceName, String uniId) {
+        return InstanceIdentifier.builder(MefServices.class)
+                .child(MefService.class, new MefServiceKey(RetailSvcIdType.getDefaultInstance(serviceName)))
+                .child(Evc.class)
+                .child(org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.Unis.class)
+                .child(org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni.class, //
+                        new org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.UniKey(
+                                Identifier45.getDefaultInstance(uniId)))
+                .build();
+    }
+
+    private static Evc createEvcInstance(String instanceName) {
+        EvcBuilder evcBuilder = new EvcBuilder();
+        evcBuilder.setAdminStateEnabled(false);
+        evcBuilder.setEvcId(EvcIdType.getDefaultInstance(instanceName));
+        evcBuilder.setEvcType(EvcType.MultipointToMultipoint);
+        return evcBuilder.build();
+    }
+
+    public static Boolean EvcExists(DataBroker dataBroker, String instanceName) {
+        Optional<Evc> evc = getEvc(dataBroker, instanceName);
+        return evc.isPresent();
+    }
+
+    public static Boolean isEvcAdminStateEnabled(DataBroker dataBroker, String instanceName) {
+        Optional<Evc> evc = getEvc(dataBroker, instanceName);
+        return evc.isPresent() && evc.get().isAdminStateEnabled();
+
+    }
+
+    public static Optional<Evc> getEvc(DataBroker dataBroker, String instanceName) {
+        Optional<Evc> evc = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                getEvcInstanceInstanceIdentifier(instanceName));
+        return evc;
+    }
+
+    public static Boolean EvcUniExists(DataBroker dataBroker, String instanceName, String uniId) {
+        logger.info("searching for uni id {} in service {}", uniId, instanceName);
+        Optional<org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni> uni = MdsalUtils
+                .read(dataBroker, LogicalDatastoreType.CONFIGURATION, getEvcUniInstanceIdentifier(instanceName, uniId));
+        if (uni.isPresent()) {
+            logger.info("found uni");
+        } else {
+            logger.info("no uni");
+        }
+        return uni.isPresent();
+    }
+
 }
index a154ae901f603baa982631bee42ceb4c30315ac8..1095a7ab495802a6c92bcf6bb5038ff9e35c2fd4 100644 (file)
@@ -10,18 +10,12 @@ 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.topology.rev150526.MefTopology;
-import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.Devices;
-import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.Device;
-import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.DeviceKey;
-import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.Interfaces;
-import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.interfaces.InterfaceKey;
-import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.IetfInterfacesData;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlanBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
@@ -30,8 +24,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInstanceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInterface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInterfaceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInterface.EtreeInterfaceType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInterfaceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
@@ -40,10 +34,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceKey;
-import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 
+import com.google.common.base.Optional;
+
 public class NetvirtUtils {
     public final static String VLAN_SEPARATOR = ".";
 
@@ -147,6 +142,14 @@ public class NetvirtUtils {
         return einterfaceBuilder;
     }
 
+    public static InstanceIdentifier<ElanInstance> getElanInstanceInstanceIdentifier() {
+        return InstanceIdentifier.builder(ElanInstances.class).child(ElanInstance.class).build();
+    }
+
+    public static InstanceIdentifier<ElanInterfaces> getElanInterfacesInstanceIdentifier() {
+        return InstanceIdentifier.builder(ElanInterfaces.class).build();
+    }
+
     private static InstanceIdentifier<ElanInstance> getElanInstanceInstanceIdentifier(String instanceName) {
         return InstanceIdentifier.builder(ElanInstances.class)
                 .child(ElanInstance.class, new ElanInstanceKey(instanceName)).build();
@@ -168,4 +171,15 @@ public class NetvirtUtils {
                 .build();
         return id;
     }
+
+    public static InstanceIdentifier<Interface> getInterfaceIdentifier(String interfaceName) {
+        InstanceIdentifierBuilder<Interface> idBuilder = InstanceIdentifier.builder(Interfaces.class)
+                .child(Interface.class, new InterfaceKey(interfaceName));
+        InstanceIdentifier<Interface> id = idBuilder.build();
+        return id;
+    }
+
+    public static Optional<Interface> getIetfInterface(DataBroker dataBroker, String interfaceName) {
+        return MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, getInterfaceIdentifier(interfaceName));
+    }
 }
index fc894562c33d702e42eb2f0552744ea2d3774c3a..48a705a5c0d892ceeec35710c057f0f8079ed209 100644 (file)
@@ -160,24 +160,24 @@ public class NodeConnectorListener extends UnimgrDataTreeChangeListener<FlowCapa
 
         logger.info("Adding mef uni/device interface {} with device {}", nodeConnector.getName(), dpnId);
 
-        InstanceIdentifier interfacePath = MefUtils.getDeviceInterfaceInstanceIdentifier(dpnId,
-                nodeConnector.getName());
+        String uniName = EvcUniUtils.getDeviceInterfaceName(dpnId, nodeConnector.getName());
+        InstanceIdentifier interfacePath = MefUtils.getDeviceInterfaceInstanceIdentifier(dpnId, uniName);
         InterfaceBuilder interfaceBuilder = new InterfaceBuilder();
-        interfaceBuilder.setPhy(new Identifier45(nodeConnector.getName()));
+        interfaceBuilder.setPhy(new Identifier45(uniName));
         DataObject deviceInterface = interfaceBuilder.build();
 
         tx.merge(LogicalDatastoreType.CONFIGURATION, interfacePath, deviceInterface, true);
 
-        InstanceIdentifier uniPath = MefUtils.getUniInstanceIdentifier(nodeConnector.getName());
+        InstanceIdentifier uniPath = MefUtils.getUniInstanceIdentifier(uniName);
         UniBuilder uniBuilder = new UniBuilder();
-        uniBuilder.setUniId(new Identifier45(nodeConnector.getName()));
+        uniBuilder.setUniId(new Identifier45(uniName));
 
         PhysicalLayersBuilder physicalLayersBuilder = new PhysicalLayersBuilder();
         LinksBuilder linksBuilder = new LinksBuilder();
         List<Link> links = new ArrayList();
         LinkBuilder linkBuilder = new LinkBuilder();
         linkBuilder.setDevice(new Identifier45(dpnId));
-        linkBuilder.setInterface(nodeConnector.getName());
+        linkBuilder.setInterface(uniName);
         links.add(linkBuilder.build());
         linksBuilder.setLink(links);
         physicalLayersBuilder.setLinks(linksBuilder.build());
@@ -199,15 +199,17 @@ public class NodeConnectorListener extends UnimgrDataTreeChangeListener<FlowCapa
     private void handleNodeConnectorRemoved(DataBroker dataBroker, String dpnId,
             FlowCapableNodeConnector nodeConnector) {
 
+        String uniName = EvcUniUtils.getDeviceInterfaceName(dpnId, nodeConnector.getName());
+
         if (!handleRemovedNodeConnectors) {
             return;
         }
 
         MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                MefUtils.getDeviceInterfaceInstanceIdentifier(dpnId, nodeConnector.getName()));
+                MefUtils.getDeviceInterfaceInstanceIdentifier(dpnId, uniName));
 
         MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                MefUtils.getUniLinkInstanceIdentifier(nodeConnector.getName(), dpnId, nodeConnector.getName()));
+                MefUtils.getUniLinkInstanceIdentifier(nodeConnector.getName(), dpnId, uniName));
     }
 
     private void handleNodeConnectorUpdated(DataBroker dataBroker, String dpnFromNodeConnectorId,
index 94dc8ba3260553b37cfb932cf054f69513d6848a..d746e944d471f093f21fc38f53cacfac89907e82 100644 (file)
   <bean class="org.opendaylight.unimgr.mef.netvirt.NodeConnectorListener">
     <argument index="0" ref="dataBroker" />
   </bean>
-
+  <bean class="org.opendaylight.unimgr.mef.netvirt.ElanListener">
+    <argument index="0" ref="dataBroker" />
+  </bean>
+  <bean class="org.opendaylight.unimgr.mef.netvirt.ElanInterfaceListener">
+    <argument index="0" ref="dataBroker" />
+  </bean>
 </blueprint>
\ No newline at end of file