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>
<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>
--- /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 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
--- /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.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
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;
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);
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<>();
// 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) {
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);
}
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;
}
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());
} 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);
+ }
}
}
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) {
}
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()) {
WriteTransaction tx = createTransaction(dataBroker);
Link link = EvcUniUtils.getLink(dataBroker, data);
- uniId = EvcUniUtils.getInterfaceName(link, uniId);
logger.info("Removing trunk {}", uniId);
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);
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) {
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;
}
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;
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;
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);
.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)
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();
+ }
+
}
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;
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;
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 = ".";
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();
.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));
+ }
}
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());
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,
<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