From: Konsta Pozdeev Date: Tue, 3 Jan 2017 08:12:36 +0000 (+0200) Subject: Reconnect port support X-Git-Tag: release/carbon~43 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=2f539c5acafa11ab939ce837c3d96d1b61af7dbb;p=unimgr.git Reconnect port support Change-Id: I9fd0bf6bccb6ee89c4025797d45122540d451a94 Signed-off-by: Konsta Pozdeev --- diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java index a513af5e..66002adc 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java @@ -30,6 +30,7 @@ import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.serv 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.EvcUniRoleType; +import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.RetailSvcIdType; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInterface.EtreeInterfaceType; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -40,18 +41,21 @@ import com.google.common.base.Optional; import jline.internal.Log; -public class EvcListener extends UnimgrDataTreeChangeListener { +public class EvcListener extends UnimgrDataTreeChangeListener implements IUniAwareService { private static final Logger log = LoggerFactory.getLogger(EvcListener.class); private ListenerRegistration evcListenerRegistration; private final IUniPortManager uniPortManager; private final UniQosManager uniQosManager; + @SuppressWarnings("unused") + private final UniAwareListener uniAwareListener; public EvcListener(final DataBroker dataBroker, final UniPortManager uniPortManager, final UniQosManager uniQosManager) { super(dataBroker); this.uniPortManager = uniPortManager; this.uniQosManager = uniQosManager; + this.uniAwareListener = new UniAwareListener(dataBroker, this); registerListener(); } @@ -96,6 +100,89 @@ public class EvcListener extends UnimgrDataTreeChangeListener { } } + @Override + public void connectUni(String uniId) { + List allEvcs = MefServicesUtils.getAllEvcsServiceIds(dataBroker); + allEvcs = (allEvcs != null) ? allEvcs : Collections.emptyList(); + + for (RetailSvcIdType evcSerId : allEvcs) { + InstanceIdentifier evcId = MefServicesUtils.getEvcInstanceIdentifier(evcSerId); + Evc evc = MefServicesUtils.getEvc(dataBroker, evcId); + if (evc == null) { + Log.error("Inconsistent data for svcId {}", evcSerId); + continue; + } + + String instanceName = evc.getEvcId().getValue(); + boolean isEtree = evc.getEvcType() == EvcType.RootedMultipoint; + + List toConnect = new ArrayList<>(); + List unis = (evc.getUnis() != null) ? evc.getUnis().getUni() : null; + unis = (unis != null) ? unis : Collections.emptyList(); + for (Uni uni : unis) { + if (uni.getUniId().getValue().equals(uniId)) { + Log.info("Connecting Uni {} to svc id {}", uniId, evcSerId); + toConnect.add(uni); + break; + } + } + + EvcElan evcElan = getOperEvcElan(evcId); + if (evcElan == null) { + NetvirtUtils.createElanInstance(dataBroker, instanceName, isEtree, evc.getSegmentationId()); + evcElan = getOperEvcElan(evcId); + if (evcElan == null) { + log.error("Evc {} has not been created as required. Nothing to reconnect", evcId); + return; + } + } + + for (Uni uni : toConnect) { + createUniElanInterfaces(evcId, instanceName, uni, isEtree); + } + updateQos(toConnect); + } + } + + @Override + public void disconnectUni(String uniId) { + List allEvcs = MefServicesUtils.getAllEvcsServiceIds(dataBroker); + allEvcs = (allEvcs != null) ? allEvcs : Collections.emptyList(); + + for (RetailSvcIdType evcSerId : allEvcs) { + InstanceIdentifier evcId = MefServicesUtils.getEvcInstanceIdentifier(evcSerId); + Evc evc = MefServicesUtils.getEvc(dataBroker, evcId); + if (evc == null) { + Log.error("Inconsistent data for svcId {}", evcSerId); + continue; + } + + String instanceName = evc.getEvcId().getValue(); + List toDisconnect = new ArrayList<>(); + List unis = (evc.getUnis() != null) ? evc.getUnis().getUni() : null; + unis = (unis != null) ? unis : Collections.emptyList(); + for (Uni uni : unis) { + if (uni.getUniId().getValue().equals(uniId)) { + Log.info("Disconnecting Uni {} from svc id {}", uniId, evcSerId); + toDisconnect.add(uni); + break; + } + } + + EvcElan evcElan = getOperEvcElan(evcId); + if (evcElan == null) { + log.error("Evc {} has not been created as required. Nothing to disconnect", evcId); + return; + } + + updateQos(toDisconnect); + for (Uni uni : toDisconnect) { + removeUniElanInterfaces(evcId, instanceName, uni); + } + } + + } + private void addEvc(DataTreeModification newDataObject) { try { Evc data = newDataObject.getRootNode().getDataAfter(); @@ -253,31 +340,31 @@ public class EvcListener extends UnimgrDataTreeChangeListener { && !evcUniCeVlans.getEvcUniCeVlan().isEmpty() ? evcUniCeVlans.getEvcUniCeVlan() : Collections.emptyList(); - for (EvcUniCeVlan ceVlan : evcUniCeVlan) { - Long vlan = safeCastVlan(ceVlan.getVid()); - uniPortManager.removeCeVlan(uni.getUniId().getValue(), vlan); - } - if (evcUniCeVlan.isEmpty()) { String interfaceName = uniPortManager.getUniVlanInterface(uni.getUniId().getValue(), Long.valueOf(0)); - if (!isOperEvcElanPort(evcId, interfaceName)) { + if (interfaceName == null || !isOperEvcElanPort(evcId, interfaceName)) { log.info("elan interface for elan {} vlan {} is not operational, nothing to remove", instanceName, 0, interfaceName); - return; + interfaceName = uniPortManager.getUniVlanInterfaceName(uni.getUniId().getValue(), null); } removeElanInterface(evcId, uni.getUniId().getValue(), interfaceName); } else { for (EvcUniCeVlan ceVlan : evcUniCeVlan) { Long vlan = safeCastVlan(ceVlan.getVid()); String interfaceName = uniPortManager.getUniVlanInterface(uni.getUniId().getValue(), vlan); - if (!isOperEvcElanPort(evcId, interfaceName)) { + if (interfaceName == null || !isOperEvcElanPort(evcId, interfaceName)) { log.info("elan interface for elan {} vlan {} is not operational, nothing to remove", instanceName, vlan, interfaceName); - return; + interfaceName = uniPortManager.getUniVlanInterfaceName(uni.getUniId().getValue(), vlan); } removeElanInterface(evcId, uni.getUniId().getValue(), interfaceName); } } + + for (EvcUniCeVlan ceVlan : evcUniCeVlan) { + Long vlan = safeCastVlan(ceVlan.getVid()); + uniPortManager.removeCeVlan(uni.getUniId().getValue(), vlan); + } } private void removeElanInterface(InstanceIdentifier identifier, String uniId, String interfaceName) { diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IUniAwareService.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IUniAwareService.java new file mode 100644 index 00000000..efa90c13 --- /dev/null +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IUniAwareService.java @@ -0,0 +1,16 @@ +/* + * 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; + +public interface IUniAwareService { + + void connectUni(String uniId); + + void disconnectUni(String uniId); +} diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IUniPortManager.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IUniPortManager.java index 270f01ac..6ce6406b 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IUniPortManager.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IUniPortManager.java @@ -24,4 +24,5 @@ public interface IUniPortManager { String getUniVlanInterface(String uniId, Long vlanId); + String getUniVlanInterfaceName(String uniId, Long vlanId); } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java index f11ea929..79b2a64e 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java @@ -26,6 +26,7 @@ import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.serv import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.VpnElans; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.unis.Uni; 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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; @@ -40,12 +41,14 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class IpvcListener extends UnimgrDataTreeChangeListener { +public class IpvcListener extends UnimgrDataTreeChangeListener implements IUniAwareService { private static final Logger Log = LoggerFactory.getLogger(IpvcListener.class); private final IUniPortManager uniPortManager; private final ISubnetManager subnetManager; private final UniQosManager uniQosManager; private ListenerRegistration ipvcListenerRegistration; + @SuppressWarnings("unused") + private final UniAwareListener uniAwareListener; public IpvcListener(final DataBroker dataBroker, final IUniPortManager uniPortManager, final ISubnetManager subnetManager, final UniQosManager uniQosManager) { @@ -53,6 +56,7 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { this.uniPortManager = uniPortManager; this.subnetManager = subnetManager; this.uniQosManager = uniQosManager; + this.uniAwareListener = new UniAwareListener(dataBroker, this); registerListener(); } @@ -97,48 +101,132 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { } } + @Override + public void connectUni(String uniId) { + List allIpvcs = MefServicesUtils.getAllIpvcsServiceIds(dataBroker); + allIpvcs = (allIpvcs != null) ? allIpvcs : Collections.emptyList(); + + for (RetailSvcIdType ipvcSerId : allIpvcs) { + InstanceIdentifier ipvcId = MefServicesUtils.getIpvcInstanceIdentifier(ipvcSerId); + Ipvc ipvc = MefServicesUtils.getIpvc(dataBroker, ipvcId); + if (ipvc == null) { + Log.error("Inconsistent data for svcId {}", ipvcSerId); + continue; + } + List toConnect = new ArrayList<>(); + + List unis = (ipvc.getUnis() != null) ? ipvc.getUnis().getUni() : null; + unis = (unis != null) ? unis : Collections.emptyList(); + for (Uni uni : unis) { + if (uni.getUniId().getValue().equals(uniId)) { + Log.info("Connecting Uni {} to svc id {}", uniId, ipvcSerId); + toConnect.add(uni); + break; + } + } + + IpvcVpn operIpvcVpn = MefServicesUtils.getOperIpvcVpn(dataBroker, ipvcId); + if (operIpvcVpn == null) { + String instanceName = ipvc.getIpvcId().getValue(); + final String vpnName = NetvirtVpnUtils.getUUidFromString(instanceName); + createVpnInstance(vpnName, ipvcId); + operIpvcVpn = MefServicesUtils.getOperIpvcVpn(dataBroker, ipvcId); + if (operIpvcVpn == null) { + Log.error("Ipvc {} hasn't been created as required, Nothing to reconnect", ipvcSerId); + return; + } + } + String vpnName = operIpvcVpn.getVpnId(); + String rd = waitForRd(vpnName); + createUnis(vpnName, ipvcId, toConnect, rd); + } + } + + @Override + public void disconnectUni(String uniId) { + + List allIpvcs = MefServicesUtils.getAllIpvcsServiceIds(dataBroker); + allIpvcs = (allIpvcs != null) ? allIpvcs : Collections.emptyList(); + + for (RetailSvcIdType ipvcSerId : allIpvcs) { + InstanceIdentifier ipvcId = MefServicesUtils.getIpvcInstanceIdentifier(ipvcSerId); + Ipvc ipvc = MefServicesUtils.getIpvc(dataBroker, ipvcId); + if (ipvc == null) { + Log.error("Inconsistent data for svcId {}", ipvcSerId); + continue; + } + List toRemove = new ArrayList<>(); + + List unis = (ipvc.getUnis() != null) ? ipvc.getUnis().getUni() : null; + unis = (unis != null) ? unis : Collections.emptyList(); + for (Uni uni : unis) { + if (uni.getUniId().getValue().equals(uniId)) { + Log.info("Disconnecting Uni {} from svc id {}", uniId, ipvcSerId); + toRemove.add(uni); + break; + } + } + + IpvcVpn operIpvcVpn = MefServicesUtils.getOperIpvcVpn(dataBroker, ipvcId); + if (operIpvcVpn == null) { + Log.error("Ipvc {} hasn't been created as required, Nothing to disconnect", ipvcSerId); + return; + } + String vpnName = operIpvcVpn.getVpnId(); + + synchronized (vpnName.intern()) { + WriteTransaction tx = MdsalUtils.createTransaction(dataBroker); + removeUnis(ipvcId, operIpvcVpn, toRemove, tx); + MdsalUtils.commitTransaction(tx); + } + } + } + private void addIpvc(DataTreeModification newDataObject) { try { Ipvc ipvc = newDataObject.getRootNode().getDataAfter(); String instanceName = ipvc.getIpvcId().getValue(); final String vpnName = NetvirtVpnUtils.getUUidFromString(instanceName); InstanceIdentifier ipvcId = newDataObject.getRootPath().getRootIdentifier(); - List unis = new ArrayList<>(); - String rd = null; - synchronized (vpnName.intern()) { - WriteTransaction tx = MdsalUtils.createTransaction(dataBroker); - Log.info("Adding vpn instance: " + instanceName); - NetvirtVpnUtils.createVpnInstance(vpnName, tx); - MefServicesUtils.addOperIpvcVpnElan(ipvcId, vpnName, tx); - MdsalUtils.commitTransaction(tx); - - InstanceIdentifier vpnId = NetvirtVpnUtils.getVpnInstanceToVpnIdIdentifier(vpnName); - DataWaitListener vpnInstanceWaiter = new DataWaitListener<>(dataBroker, vpnId, 10, - LogicalDatastoreType.CONFIGURATION, vpn -> vpn.getVrfId()); - if (!vpnInstanceWaiter.waitForData()) { - String errorMessage = String.format("Fail to wait for vrfId for vpn %s", vpnName); - Log.error(errorMessage); - throw new UnsupportedOperationException(errorMessage); - } - rd = (String) vpnInstanceWaiter.getData(); - } + createVpnInstance(vpnName, ipvcId); + String rd = waitForRd(vpnName); + List unis = new ArrayList<>(); if (ipvc.getUnis() != null && ipvc.getUnis() != null) { unis = ipvc.getUnis().getUni(); } Log.info("Number of UNI's: " + unis.size()); - // Create elan/vpn interfaces - for (Uni uni : unis) { - createInterfaces(vpnName, uni, ipvcId, rd); - } - - createUnis(ipvcId, unis); + createUnis(vpnName, ipvcId, unis, rd); } catch (final Exception e) { Log.error("Add ipvc failed !", e); } } + private void createVpnInstance(final String vpnName, InstanceIdentifier ipvcId) { + synchronized (vpnName.intern()) { + WriteTransaction tx = MdsalUtils.createTransaction(dataBroker); + Log.info("Adding vpn instance: " + vpnName); + NetvirtVpnUtils.createVpnInstance(vpnName, tx); + MefServicesUtils.addOperIpvcVpnElan(ipvcId, vpnName, tx); + MdsalUtils.commitTransaction(tx); + } + } + + private String waitForRd(final String vpnName) { + InstanceIdentifier vpnId = NetvirtVpnUtils.getVpnInstanceToVpnIdIdentifier(vpnName); + @SuppressWarnings("resource") + DataWaitListener vpnInstanceWaiter = new DataWaitListener(dataBroker, vpnId, 5, + LogicalDatastoreType.CONFIGURATION, vpn -> vpn.getVrfId()); + if (!vpnInstanceWaiter.waitForData()) { + String errorMessage = String.format("Fail to wait for vrfId for vpn %s", vpnName); + Log.error(errorMessage); + throw new UnsupportedOperationException(errorMessage); + } + String rd = (String) vpnInstanceWaiter.getData(); + return rd; + } + private void removeIpvc(DataTreeModification removedDataObject) { try { Ipvc ipvc = removedDataObject.getRootNode().getDataBefore(); @@ -192,7 +280,12 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { updateQos(uniToRemove); } - private void createUnis(InstanceIdentifier ipvcId, List uniToCreate) { + private void createUnis(String vpnName, InstanceIdentifier ipvcId, List uniToCreate, String rd) { + // Create elan/vpn interfaces + for (Uni uni : uniToCreate) { + createInterfaces(vpnName, uni, ipvcId, rd); + } + for (Uni uni : uniToCreate) { IpUni ipUni = MefInterfaceUtils.getIpUni(dataBroker, uni.getUniId(), uni.getIpUniId(), LogicalDatastoreType.CONFIGURATION); @@ -213,17 +306,7 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { return; } String vpnName = operIpvcVpn.getVpnId(); - InstanceIdentifier vpnId = NetvirtVpnUtils.getVpnInstanceToVpnIdIdentifier(vpnName); - @SuppressWarnings("resource") - DataWaitListener vpnInstanceWaiter = new DataWaitListener<>(dataBroker, vpnId, 10, - LogicalDatastoreType.CONFIGURATION, vpn -> vpn.getVrfId()); - if (!vpnInstanceWaiter.waitForData()) { - String errorMessage = String.format("Fail to wait for vrfId for vpn %s", vpnName); - Log.error(errorMessage); - throw new UnsupportedOperationException(errorMessage); - } - String rd = (String) vpnInstanceWaiter.getData(); - + String rd = (String) waitForRd(vpnName); List originalUni = origIpvc.getUnis() != null && origIpvc.getUnis().getUni() != null ? origIpvc.getUnis().getUni() : Collections.emptyList(); List updateUni = updateIpvc.getUnis() != null && updateIpvc.getUnis().getUni() != null @@ -238,19 +321,13 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { } List uniToCreate = new ArrayList<>(updateUni); uniToCreate.removeAll(originalUni); - - for (Uni uni : uniToCreate) { - createInterfaces(vpnName, uni, ipvcId, rd); - } - createUnis(ipvcId, uniToCreate); - + createUnis(vpnName, ipvcId, uniToCreate, rd); } catch (final Exception e) { Log.error("Update ipvc failed !", e); } } private void createInterfaces(String vpnName, Uni uniInService, InstanceIdentifier ipvcId, String rd) { - WriteTransaction tx = MdsalUtils.createTransaction(dataBroker); String uniId = uniInService.getUniId().getValue(); String ipUniId = uniInService.getIpUniId().getValue(); @@ -368,19 +445,12 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { private void removeInterfaces(InstanceIdentifier ipvcId, IpvcVpn ipvcVpn, Uni uniInService, IpUni ipUni, WriteTransaction tx) { String uniId = uniInService.getUniId().getValue(); - org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni uni = MefInterfaceUtils - .getUni(dataBroker, uniId, LogicalDatastoreType.OPERATIONAL); - if (uni == null) { - String errorMessage = String.format("Couldn't find uni %s for ipvc", uniId); - Log.error(errorMessage); - throw new UnsupportedOperationException(errorMessage); - } - String vpnName = ipvcVpn.getVpnId(); VpnElans vpnElans = MefServicesUtils.findVpnElanForNetwork(new Identifier45(uniId), ipUni.getIpUniId(), ipvcVpn); if (vpnElans == null) { Log.error("Trying to remome non-operational vpn/elan for Uni {} Ip-UNi {}", uniId, ipUni.getIpUniId()); + return; } NetvirtVpnUtils.removeVpnInterfaceAdjacencies(dataBroker, vpnName, vpnElans.getElanPort()); diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefServicesUtils.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefServicesUtils.java index 0438618a..3c01deac 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefServicesUtils.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefServicesUtils.java @@ -22,6 +22,8 @@ import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.serv 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.mef.service.choice.EvcChoice; +import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.IpvcChoice; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.Evc; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.Ipvc; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.Unis; @@ -46,6 +48,11 @@ public class MefServicesUtils { return getMefServiceInstanceIdentifier().child(Evc.class); } + public static InstanceIdentifier getEvcInstanceIdentifier(RetailSvcIdType svcId) { + return InstanceIdentifier.create(MefServices.class).child(MefService.class, new MefServiceKey(svcId)) + .child(Evc.class); + } + public static InstanceIdentifier getMefServiceInstanceIdentifier() { return InstanceIdentifier.create(MefServices.class).child(MefService.class); } @@ -55,10 +62,10 @@ public class MefServicesUtils { } public static InstanceIdentifier getIpvcsInstanceIdentifier() { - return InstanceIdentifier.create(MefServices.class).child(MefService.class).child(Ipvc.class); + return getMefServiceInstanceIdentifier().child(Ipvc.class); } - public static InstanceIdentifier getIpvcsInstanceIdentifier(RetailSvcIdType svcId) { + public static InstanceIdentifier getIpvcInstanceIdentifier(RetailSvcIdType svcId) { return InstanceIdentifier.create(MefServices.class).child(MefService.class, new MefServiceKey(svcId)) .child(Ipvc.class); } @@ -93,6 +100,24 @@ public class MefServicesUtils { return null; } + public static Ipvc getIpvc(DataBroker dataBroker, InstanceIdentifier identifier) { + Optional ipvcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, identifier); + if (ipvcVpn.isPresent()) { + return ipvcVpn.get(); + } else { + return null; + } + } + + public static Evc getEvc(DataBroker dataBroker, InstanceIdentifier identifier) { + Optional evcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, identifier); + if (evcVpn.isPresent()) { + return evcVpn.get(); + } else { + return null; + } + } + public static IpvcVpn getOperIpvcVpn(DataBroker dataBroker, InstanceIdentifier identifier) { InstanceIdentifier path = identifier.augmentation(IpvcVpn.class); Optional ipvcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path); @@ -200,4 +225,36 @@ public class MefServicesUtils { MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, path, ipvcVpnBuilder.build()); } + public static List getAllIpvcsServiceIds(DataBroker dataBroker) { + List toReturn = new ArrayList<>(); + + InstanceIdentifier path = MefServicesUtils.getMefServicesInstanceIdentifier(); + Optional mefServices = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path); + if (!mefServices.isPresent() || mefServices.get() == null) { + return toReturn; + } + for (MefService service : mefServices.get().getMefService()) { + if (service.getMefServiceChoice() instanceof IpvcChoice) { + toReturn.add(service.getSvcId()); + } + } + return toReturn; + } + + public static List getAllEvcsServiceIds(DataBroker dataBroker) { + List toReturn = new ArrayList<>(); + + InstanceIdentifier path = MefServicesUtils.getMefServicesInstanceIdentifier(); + Optional mefServices = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path); + if (!mefServices.isPresent() || mefServices.get() == null) { + return toReturn; + } + for (MefService service : mefServices.get().getMefService()) { + if (service.getMefServiceChoice() instanceof EvcChoice) { + toReturn.add(service.getSvcId()); + } + } + return toReturn; + } + } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NodeConnectorListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NodeConnectorListener.java index 0b2136a7..be5f9760 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NodeConnectorListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NodeConnectorListener.java @@ -48,12 +48,15 @@ public class NodeConnectorListener extends UnimgrDataTreeChangeListener nodeConnectorListenerRegistration; - public NodeConnectorListener(final DataBroker dataBroker, final UniPortManager uniPortManager) { + public NodeConnectorListener(final DataBroker dataBroker, final UniPortManager uniPortManager, + final boolean generateMac) { super(dataBroker); this.uniPortManager = uniPortManager; + NodeConnectorListener.generateMac = generateMac; registerListener(); } @@ -63,6 +66,8 @@ public class NodeConnectorListener extends UnimgrDataTreeChangeListener 1 && (splits[1].startsWith(TUNNEL_PREFIX) || splits[1].startsWith(BRIDGE_PREFIX)); } + + private void configIntegrationBridge() { + if (generateMac == true) {// default for netvirt + return; + } + + ElanConfigBuilder elanConfigBuilder = new ElanConfigBuilder(); + elanConfigBuilder.setIntBridgeGenMac(false); + InstanceIdentifier id = InstanceIdentifier.builder(ElanConfig.class).build(); + + MdsalUtils.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, id, elanConfigBuilder.build()); + } } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java index e4bbd804..c403a79f 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java @@ -317,7 +317,7 @@ public class SubnetListener extends UnimgrDataTreeChangeListener impleme for (Uni uni : unis) { if (uni.getUniId().equals(uniId) && uni.getIpUniId().equals(ipUniId)) { Log.info("Find service {} for uni {} ipuni {}", service.getSvcId(), uniId, ipUniId); - return MefServicesUtils.getIpvcsInstanceIdentifier(service.getSvcId()); + return MefServicesUtils.getIpvcInstanceIdentifier(service.getSvcId()); } } } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/UniAwareListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/UniAwareListener.java new file mode 100644 index 00000000..3e03ae69 --- /dev/null +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/UniAwareListener.java @@ -0,0 +1,70 @@ +/* + * 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.interfaces.rev150526.mef.interfaces.unis.Uni; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UniAwareListener extends UnimgrDataTreeChangeListener { + private static final Logger Log = LoggerFactory.getLogger(UniAwareListener.class); + private ListenerRegistration uniListenerRegistration; + IUniAwareService serviceSubscribe; + + public UniAwareListener(final DataBroker dataBroker, final IUniAwareService serviceSubscribe) { + super(dataBroker); + this.serviceSubscribe = serviceSubscribe; + registerListener(); + } + + public void registerListener() { + try { + final DataTreeIdentifier dataTreeIid = new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + MefInterfaceUtils.getUniListInstanceIdentifier()); + uniListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this); + Log.info("UniAwareListener created and registered for service {}", serviceSubscribe); + } catch (final Exception e) { + Log.error("UniAwareListener registration failed !", e); + throw new IllegalStateException("UniAwareListener failed.", e); + } + } + + @Override + public void close() throws Exception { + uniListenerRegistration.close(); + } + + @Override + public void add(DataTreeModification newDataObject) { + if (newDataObject.getRootPath() != null && newDataObject.getRootNode() != null) { + Log.info("Uni {} is operational", newDataObject.getRootNode().getIdentifier()); + // Uni Id is same in interface and service + serviceSubscribe.connectUni(newDataObject.getRootNode().getDataAfter().getUniId().getValue()); + } + } + + @Override + public void remove(DataTreeModification removedDataObject) { + if (removedDataObject.getRootPath() != null && removedDataObject.getRootNode() != null) { + Log.info("Remove Uni {} from operational", removedDataObject.getRootNode().getIdentifier()); + // Uni Id is same in interface and service + serviceSubscribe.disconnectUni(removedDataObject.getRootNode().getDataBefore().getUniId().getValue()); + } + } + + @Override + public void update(DataTreeModification modifiedDataObject) { + } +} diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/UniPortManager.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/UniPortManager.java index 15f20442..1bfc5998 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/UniPortManager.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/UniPortManager.java @@ -333,7 +333,7 @@ public class UniPortManager extends UnimgrDataTreeChangeListener implements @Override public void removeCeVlan(String uniId, Long vlanId) { if (getUniVlanInterfaceNoRetry(uniId, vlanId) == null) { - log.debug("No UNI {} Port for vlan {} exists already, nothing to delete", uniId, vlanId); + log.debug("No UNI {} Port for vlan {} dosn't exist already, nothing to delete", uniId, vlanId); return; } synchronized (uniId.intern()) { @@ -400,4 +400,9 @@ public class UniPortManager extends UnimgrDataTreeChangeListener implements return getUniVlanInterfaceRetry(uniId, vlanId, ++retries); } } + + @Override + public String getUniVlanInterfaceName(String uniId, Long vlanId) { + return MefInterfaceUtils.getInterfaceNameForVlan(uniId, null); + } } diff --git a/netvirt/src/main/resources/org/opendaylight/blueprint/netvirt-driver.xml b/netvirt/src/main/resources/org/opendaylight/blueprint/netvirt-driver.xml index 5d259018..51c330b0 100644 --- a/netvirt/src/main/resources/org/opendaylight/blueprint/netvirt-driver.xml +++ b/netvirt/src/main/resources/org/opendaylight/blueprint/netvirt-driver.xml @@ -23,6 +23,7 @@ class="org.opendaylight.unimgr.mef.netvirt.NodeConnectorListener"> +