}\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
"[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
reference "EVC Ethernet Services Definitions YANG Modules " +\r
"(MEF XX), TBD";\r
}\r
+ \r
container mef-services {\r
description\r
"MEF Services";\r
}\r
leaf evc-status {\r
type mef-types:evc-status-type;\r
- default "inactive";\r
config false;\r
description\r
"EVC Operational Status.";\r
"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
"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
description\r
"Device Identifier.";\r
}\r
+ leaf device-name {\r
+ type string;\r
+ }\r
}\r
}\r
container connections {\r
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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);
+ }
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * 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
<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