From: Yakir Dorani Date: Thu, 22 Sep 2016 11:56:04 +0000 (+0300) Subject: Add tenant to yang and tenant listeners. X-Git-Tag: release/carbon~77 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=83626dbbdae3664d2e7dce0283f59a74768dc1d6;p=unimgr.git Add tenant to yang and tenant listeners. Change-Id: I573e88f0deb600a41da3ed89504e0504fe161d2b Signed-off-by: Yakir Dorani --- diff --git a/legato-api/src/main/yang/mef-global.yang b/legato-api/src/main/yang/mef-global.yang index 947318a5..e86a7bd3 100644 --- a/legato-api/src/main/yang/mef-global.yang +++ b/legato-api/src/main/yang/mef-global.yang @@ -1499,5 +1499,30 @@ module mef-global { } } } + + grouping tenant { + leaf name { + type string; + description "Tenant Name"; + } + leaf service_type { + type enumeration { + enum L2 { + description "Layer 2 VPN"; + } + enum L3 { + description "Layer 3 VPN"; + } + } + } + } + + container tenants-instances { + list tenant-list { + key name; + unique name; + uses tenant; + } + } } } \ No newline at end of file diff --git a/legato-api/src/main/yang/mef-interfaces.yang b/legato-api/src/main/yang/mef-interfaces.yang index 74b1c6ae..359f66c4 100644 --- a/legato-api/src/main/yang/mef-interfaces.yang +++ b/legato-api/src/main/yang/mef-interfaces.yang @@ -868,6 +868,11 @@ module mef-interfaces { "[MEF45] Section 8.2. " + "[MEF7.3] Section 10.2.2."; } + leaf tenant-id { + type leafref { + path "/mef-global:mef-global/mef-global:tenants-instances/mef-global:tenant-list/mef-global:name"; + } + } } } } diff --git a/legato-api/src/main/yang/mef-services.yang b/legato-api/src/main/yang/mef-services.yang index f8fe3e33..99c2979f 100644 --- a/legato-api/src/main/yang/mef-services.yang +++ b/legato-api/src/main/yang/mef-services.yang @@ -75,6 +75,7 @@ module mef-services { reference "EVC Ethernet Services Definitions YANG Modules " + "(MEF XX), TBD"; } + container mef-services { description "MEF Services"; @@ -1308,7 +1309,6 @@ module mef-services { } leaf evc-status { type mef-types:evc-status-type; - default "inactive"; config false; description "EVC Operational Status."; @@ -1468,6 +1468,9 @@ module mef-services { "This value must be 2 for point-to-point mode."; reference "[MEF10.3] [R14]. [MEF7.3] Section 12.2.2."; } + leaf preserved-vlan { + type uint32; + } leaf preserve-ce-vlan-id { type boolean; default "false"; @@ -1950,6 +1953,11 @@ module mef-services { "MEF Service Entity."; reference "[MEF12.2] Table 3."; } + leaf tenant-id { + type leafref{ + path "/mef-global:mef-global/mef-global:tenants-instances/mef-global:tenant-list/mef-global:name"; + } + } } } } \ No newline at end of file diff --git a/legato-api/src/main/yang/mef-topology.yang b/legato-api/src/main/yang/mef-topology.yang index d4ab55de..a90fcffb 100644 --- a/legato-api/src/main/yang/mef-topology.yang +++ b/legato-api/src/main/yang/mef-topology.yang @@ -122,6 +122,9 @@ module mef-topology { description "Device Identifier."; } + leaf device-name { + type string; + } } } container connections { 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 index 00000000..1a7839e2 --- /dev/null +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantEnhancerUtils.java @@ -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 index 00000000..e86d9048 --- /dev/null +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantUniListener.java @@ -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 { + + private static final Logger log = LoggerFactory.getLogger(TenantUniListener.class); + private ListenerRegistration evcListenerRegistration; + + public TenantUniListener(final DataBroker dataBroker) { + super(dataBroker); + + registerListener(); + } + + public void registerListener() { + try { + final DataTreeIdentifier 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 newDataObject) { + log.info("received add Uni notification"); + handleUniChanged(newDataObject.getRootNode().getDataAfter()); + } + + @Override + public void remove(DataTreeModification removedDataObject) { + } + + @Override + public void update(DataTreeModification 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 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 index 00000000..8579c9e8 --- /dev/null +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/TenantlessEvcListener.java @@ -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 { + + private static final Logger log = LoggerFactory.getLogger(TenantlessEvcListener.class); + private ListenerRegistration evcListenerRegistration; + + public TenantlessEvcListener(final DataBroker dataBroker) { + super(dataBroker); + + registerListener(); + } + + public void registerListener() { + try { + final DataTreeIdentifier 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 newDataObject) { + if (newDataObject.getRootPath() != null && newDataObject.getRootNode() != null) { + log.info("service {} created", newDataObject.getRootNode().getIdentifier()); + handleService(newDataObject.getRootNode().getDataAfter()); + } + } + + @Override + public void remove(DataTreeModification removedDataObject) { + } + + @Override + public void update(DataTreeModification 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 unis = evc.getUnis().getUni(); + for (Uni uni : unis) { + Optional 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 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 d746e944..e4f94e2b 100644 --- a/netvirt/src/main/resources/org/opendaylight/blueprint/netvirt-driver.xml +++ b/netvirt/src/main/resources/org/opendaylight/blueprint/netvirt-driver.xml @@ -22,4 +22,12 @@ + + + + + + + + \ No newline at end of file