--- /dev/null
+/*
+ * Copyright (c) 2017 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.types.rev150526.RetailSvcIdType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.unimgr.unimgr.dhcp.rev161214.UnimgrDhcp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.unimgr.unimgr.dhcp.rev161214.unimgr.dhcp.UnimgrServices;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.unimgr.unimgr.dhcp.rev161214.unimgr.dhcp.unimgr.services.Network;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.unimgr.unimgr.dhcp.rev161214.unimgr.dhcp.unimgr.services.network.UnimgrAllocationPool;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DhcpAllocationPoolListener extends UnimgrDataTreeChangeListener<UnimgrAllocationPool> {
+ private static final Logger Log = LoggerFactory.getLogger(DhcpAllocationPoolListener.class);
+ private ListenerRegistration<DhcpAllocationPoolListener> subnetListenerRegistration;
+
+ public DhcpAllocationPoolListener(final DataBroker dataBroker) {
+ super(dataBroker);
+ registerListener();
+ }
+
+ public void registerListener() {
+ try {
+ final DataTreeIdentifier<UnimgrAllocationPool> dataTreeIid = new DataTreeIdentifier<>(
+ LogicalDatastoreType.CONFIGURATION,
+ InstanceIdentifier.builder(UnimgrDhcp.class).child(UnimgrServices.class).child(Network.class)
+ .child(UnimgrAllocationPool.class).build());
+ subnetListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this);
+ Log.info("DhcpAllocationPoolListener created and registered");
+ } catch (final Exception e) {
+ Log.error("DhcpAllocationPoolListener registration failed !", e);
+ throw new IllegalStateException("DhcpAllocationPoolListener registration Listener failed.", e);
+ }
+ }
+
+ @Override
+ public void close() throws Exception {
+ subnetListenerRegistration.close();
+ }
+
+ @Override
+ public void add(DataTreeModification<UnimgrAllocationPool> newDataObject) {
+ if (newDataObject.getRootPath() != null && newDataObject.getRootNode() != null) {
+ Log.info("Dhcp Allocation Pool {} created", newDataObject.getRootNode().getIdentifier());
+ addDhcpAllocationPool(newDataObject);
+ }
+ }
+
+ @Override
+ public void remove(DataTreeModification<UnimgrAllocationPool> removedDataObject) {
+ if (removedDataObject.getRootPath() != null && removedDataObject.getRootNode() != null) {
+ Log.info("Dhcp Allocation Pool {} deleted", removedDataObject.getRootNode().getIdentifier());
+ removeDhcpAllocationPool(removedDataObject);
+ }
+ }
+
+ @Override
+ public void update(DataTreeModification<UnimgrAllocationPool> modifiedDataObject) {
+ if (modifiedDataObject.getRootPath() != null && modifiedDataObject.getRootNode() != null) {
+ Log.info("subnet {} updated", modifiedDataObject.getRootNode().getIdentifier());
+ Log.info("process as delete / create");
+ }
+ }
+
+ private void addDhcpAllocationPool(DataTreeModification<UnimgrAllocationPool> newDataObject) {
+ String networkId = getAllocationPoolNetworkIdFromDataTreeMod(newDataObject);
+ RetailSvcIdType svcId = getAllocationPoolSvcIdFromDataTreeMod(newDataObject);
+ NetvirtUtils.createDhcpAllocationPool(dataBroker, newDataObject.getRootNode().getDataAfter(), networkId, svcId);
+ }
+
+ private void removeDhcpAllocationPool(DataTreeModification<UnimgrAllocationPool> removedDataObject) {
+ String networkId = getAllocationPoolNetworkIdFromDataTreeMod(removedDataObject);
+ RetailSvcIdType svcId = getAllocationPoolSvcIdFromDataTreeMod(removedDataObject);
+ IpPrefix subnet = getAllocationPoolSubnetFromDataTreeMod(removedDataObject);
+ NetvirtUtils.removeDhcpAllocationPool(dataBroker, networkId, svcId, subnet);
+ }
+
+ private IpPrefix getAllocationPoolSubnetFromDataTreeMod(
+ DataTreeModification<UnimgrAllocationPool> dataObject) {
+ return dataObject.getRootPath().getRootIdentifier().firstKeyOf(UnimgrAllocationPool.class)
+ .getSubnet();
+ }
+
+ private RetailSvcIdType getAllocationPoolSvcIdFromDataTreeMod(
+ DataTreeModification<UnimgrAllocationPool> dataObject) {
+ return dataObject.getRootPath().getRootIdentifier().firstKeyOf(UnimgrServices.class).getSvcId();
+ }
+
+ private String getAllocationPoolNetworkIdFromDataTreeMod(
+ DataTreeModification<UnimgrAllocationPool> dataObject) {
+ return dataObject.getRootPath().getRootIdentifier().firstKeyOf(Network.class).getNetworkId();
+ }
+
+}
package org.opendaylight.unimgr.mef.netvirt;
import java.math.BigInteger;
+import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.EvcElan;
+import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.IpvcVpn;
+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.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.ipvc.choice.ipvc.VpnElans;
+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.iana._if.type.rev140508.L2vlan;
+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.interfaces.rev140508.Interfaces;
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.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp_allocation_pool.rev161214.DhcpAllocationPool;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp_allocation_pool.rev161214.dhcp_allocation_pool.Network;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp_allocation_pool.rev161214.dhcp_allocation_pool.NetworkKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp_allocation_pool.rev161214.dhcp_allocation_pool.network.AllocationPool;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp_allocation_pool.rev161214.dhcp_allocation_pool.network.AllocationPoolBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp_allocation_pool.rev161214.dhcp_allocation_pool.network.AllocationPoolKey;
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.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.yang.gen.v1.urn.opendaylight.unimgr.unimgr.dhcp.rev161214.unimgr.dhcp.unimgr.services.network.UnimgrAllocationPool;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.SegmentTypeVxlan;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
private static final Logger logger = LoggerFactory.getLogger(NetvirtUtils.class);
private static final long DEFAULT_MAC_TIMEOUT = 300;
- public static void createElanInstance(DataBroker dataBroker, String instanceName, boolean isEtree, Long segmentationId) {
+ public static void createElanInstance(DataBroker dataBroker, String instanceName, boolean isEtree,
+ Long segmentationId) {
createElanInstance(dataBroker, instanceName, isEtree, segmentationId, DEFAULT_MAC_TIMEOUT);
}
- public static void createElanInstance(DataBroker dataBroker, String instanceName, boolean isEtree, Long segmentationId, Long macTimeout) {
+ public static void createElanInstance(DataBroker dataBroker, String instanceName, boolean isEtree,
+ Long segmentationId, Long macTimeout) {
ElanInstanceBuilder einstBuilder = createElanInstanceBuilder(instanceName, segmentationId, macTimeout);
if (isEtree) {
saveElanInstance(instanceName, tx, einstBuilder);
}
- public static void updateElanInstance(String instanceName, WriteTransaction tx, Long segmentationId, Long macTimeout) {
+ public static void updateElanInstance(String instanceName, WriteTransaction tx, Long segmentationId,
+ Long macTimeout) {
ElanInstanceBuilder einstBuilder = createElanInstanceBuilder(instanceName, segmentationId, macTimeout);
saveElanInstance(instanceName, tx, einstBuilder);
}
SplitHorizon sh = new SplitHorizonBuilder().setOverrideSplitHorizonProtection(true).build();
ParentRefsBuilder parentRefsBuilder = new ParentRefsBuilder().setParentInterface(parentIfaceName);
interfaceBuilder.setEnabled(true).setName(interfaceName).setType(L2vlan.class)
- .addAugmentation(SplitHorizon.class, sh)
- .addAugmentation(IfL2vlan.class, ifL2vlan).addAugmentation(ParentRefs.class, parentRefsBuilder.build());
+ .addAugmentation(SplitHorizon.class, sh).addAugmentation(IfL2vlan.class, ifL2vlan)
+ .addAugmentation(ParentRefs.class, parentRefsBuilder.build());
return interfaceBuilder.build();
}
return createElanInstanceBuilder(instanceName, segmentationId, DEFAULT_MAC_TIMEOUT);
}
- private static ElanInstanceBuilder createElanInstanceBuilder(String instanceName, Long segmentationId, Long macTimeout) {
+ private static ElanInstanceBuilder createElanInstanceBuilder(String instanceName, Long segmentationId,
+ Long macTimeout) {
if (segmentationId == null) {
segmentationId = Long.valueOf(Math.abs((short) instanceName.hashCode()));
}
} catch (InterruptedException e) {
}
}
+
public static void safeSleep(short sec) {
try {
Thread.yield();
- Thread.sleep(1000*sec);
+ Thread.sleep(1000 * sec);
} catch (InterruptedException e) {
}
}
+ public static void createDhcpAllocationPool(DataBroker dataBroker, UnimgrAllocationPool unimgrAllocationPool,
+ String unimgrNetworkId, RetailSvcIdType svcId) {
+ String networkId = convertNetworkToNetvirtNetwork(dataBroker, unimgrNetworkId, svcId);
+ if (networkId != null) {
+ // add allocation pool to netvirt
+ MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
+ createDhcpAllocationPoolInstanceIdentifier(networkId, unimgrAllocationPool.getKey().getSubnet()),
+ buildDhcpAllocationPool(unimgrAllocationPool));
+ } else {
+ logger.warn("no network found for svc-id {}", svcId);
+ }
+ }
+
+ public static void removeDhcpAllocationPool(DataBroker dataBroker, String unimgrNetworkId, RetailSvcIdType svcId,
+ IpPrefix subnet) {
+ String networkId = convertNetworkToNetvirtNetwork(dataBroker, unimgrNetworkId, svcId);
+ if (networkId != null) {
+ // remove allocation pool from netvirt
+ MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION,
+ createDhcpAllocationPoolInstanceIdentifier(networkId, subnet));
+ } else {
+ logger.warn("no network found for svc-id {}", svcId);
+ }
+ }
+
+ private static String convertNetworkToNetvirtNetwork(DataBroker dataBroker, String unimgrNetworkId,
+ RetailSvcIdType svcId) {
+ Optional<MefService> optionalOpMefService = MefServicesUtils.getOpMefServiceBySvcId(dataBroker, svcId);
+ if (!optionalOpMefService.isPresent()) {
+ logger.warn("no mef-service found for svc-id {}", svcId);
+ return null;
+ }
+ MefService opMefService = optionalOpMefService.get();
+ return MefServicesUtils.getNetworkIdFromOpMefService(opMefService, unimgrNetworkId);
+ }
+
+ private static InstanceIdentifier<AllocationPool> createDhcpAllocationPoolInstanceIdentifier(String networkId,
+ IpPrefix subnet) {
+ return InstanceIdentifier.builder(DhcpAllocationPool.class).child(Network.class, new NetworkKey(networkId))
+ .child(AllocationPool.class, new AllocationPoolKey(subnet)).build();
+ }
+
+ private static AllocationPool buildDhcpAllocationPool(UnimgrAllocationPool unimgrAllocationPool) {
+ AllocationPool allocationPool = new AllocationPoolBuilder()
+ .setKey(new AllocationPoolKey(unimgrAllocationPool.getSubnet()))
+ .setSubnet(unimgrAllocationPool.getSubnet()).setAllocateFrom(unimgrAllocationPool.getAllocateFrom())
+ .setAllocateTo(unimgrAllocationPool.getAllocateTo()).setDnsServers(unimgrAllocationPool.getDnsServers())
+ .setGateway(unimgrAllocationPool.getGateway()).build();
+ return allocationPool;
+ }
}