--- /dev/null
+/*
+ * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. 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.genius.itm.confighelpers;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.genius.itm.globals.ITMConstants;
+import org.opendaylight.genius.itm.impl.ItmUtils;
+import org.opendaylight.genius.itm.confighelpers.OvsdbTepAddConfigHelper;
+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.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Subnets;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.Vteps;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+public class ItmTepsNotHostedMoveWorker implements Callable<List<ListenableFuture<Void>>> {
+ private static final Logger LOG = LoggerFactory.getLogger(ItmTepsNotHostedMoveWorker.class );
+ final private List<Vteps> vTepList;
+ final private String tzName;
+
+ final private DataBroker dataBroker;
+
+
+ public ItmTepsNotHostedMoveWorker(List<Vteps> vTepList, String tzName, DataBroker broker) {
+ this.vTepList = vTepList;
+ this.tzName = tzName;
+ this.dataBroker = broker ;
+ }
+
+ @Override
+ public List<ListenableFuture<Void>> call() throws Exception {
+ List<ListenableFuture<Void>> futures = new ArrayList<>();
+ WriteTransaction wrTx = dataBroker.newWriteOnlyTransaction();
+ List<Subnets> subnetList=new ArrayList<Subnets>();
+ IpPrefix subnetMaskObj = ItmUtils.getDummySubnet();
+ IpAddress tepIpAddress = null;
+ BigInteger dpnId = BigInteger.valueOf(0);
+
+ LOG.trace("Move TEP from TepsNotHosted list to NBI configured TZ task is picked from DataStoreJobCoordinator for execution.");
+
+ // Move TEP from TepsNotHosted list to NBI configured TZ.
+ OvsdbTepAddConfigHelper.addVtepInITMConfigDS(subnetList, subnetMaskObj, vTepList, tepIpAddress, tzName, dpnId,
+ ITMConstants.DUMMY_PORT, false, wrTx);
+
+ futures.add(wrTx.submit());
+ return futures;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. 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.genius.itm.confighelpers;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.genius.itm.confighelpers.OvsdbTepRemoveConfigHelper;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+public class ItmTepsNotHostedRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
+ private static final Logger LOG = LoggerFactory.getLogger(ItmTepsNotHostedRemoveWorker.class );
+ final private IpAddress tepIpAddress;
+ final private String tzName;
+ final private BigInteger dpnId;
+ final private DataBroker dataBroker;
+
+
+ public ItmTepsNotHostedRemoveWorker(String tzName, IpAddress tepIpAddress,
+ BigInteger dpnId, DataBroker broker) {
+
+ this.tepIpAddress = tepIpAddress;
+ this.tzName = tzName;
+ this.dpnId = dpnId;
+ this.dataBroker = broker ;
+ }
+
+ @Override
+ public List<ListenableFuture<Void>> call() throws Exception {
+ List<ListenableFuture<Void>> futures = new ArrayList<>();
+ WriteTransaction wrTx = dataBroker.newWriteOnlyTransaction();
+
+ LOG.trace("Remove TEP from TepsNotHosted list task is picked from DataStoreJobCoordinator for execution.");
+
+ // Remove TEP from TepsNotHosted list.
+ OvsdbTepRemoveConfigHelper.removeUnknownTzTepFromTepsNotHosted(tzName, tepIpAddress, dpnId, dataBroker, wrTx);
+
+ futures.add(wrTx.submit());
+ return futures;
+ }
+}
/*
- * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
+ * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. 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,
import org.opendaylight.genius.itm.confighelpers.HwVtep;
import org.opendaylight.genius.itm.confighelpers.ItmTepAddWorker;
import org.opendaylight.genius.itm.confighelpers.ItmTepRemoveWorker;
+import org.opendaylight.genius.itm.confighelpers.ItmTepsNotHostedMoveWorker;
+import org.opendaylight.genius.itm.confighelpers.ItmTepsNotHostedRemoveWorker;
import org.opendaylight.genius.itm.globals.ITMConstants;
import org.opendaylight.genius.itm.impl.ITMManager;
import org.opendaylight.genius.itm.impl.ItmUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZonesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.tepsnothostedintransportzone.UnknownVteps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TepsNotHostedInTransportZone;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TepsNotHostedInTransportZoneKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Subnets;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.SubnetsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.SubnetsKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.DeviceVteps;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.Vteps;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.ItmConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsKey;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
LOG.debug("Received Transport Zone Add Event: {}, {}", key, tzNew);
List<DPNTEPsInfo> opDpnList = createDPNTepInfo(tzNew);
List<HwVtep> hwVtepList = createhWVteps(tzNew);
+ opDpnList.addAll(getDPNTepInfoFromNotHosted(tzNew));
LOG.trace("Add: Operational dpnTepInfo - Before invoking ItmManager {}", opDpnList);
if (!opDpnList.isEmpty() || !hwVtepList.isEmpty()) {
LOG.trace("Add: Invoking ItmManager with DPN List {} ", opDpnList);
}
}
- private List<DPNTEPsInfo> createDPNTepInfo(TransportZone transportZone) {
+ private List<DPNTEPsInfo> getDPNTepInfoFromNotHosted(TransportZone tzNew) {
+ List<DPNTEPsInfo> notHostedOpDpnList=new ArrayList<>();
+ if(isNewTZExistInNotHostedTZ(tzNew)){
+ notHostedOpDpnList = createDPNTepInfoFromNotHosted(tzNew);
+ }
+ return notHostedOpDpnList;
+ }
+
+ private List<DPNTEPsInfo> createDPNTepInfoFromNotHosted(TransportZone tzNew) {
+ Map<BigInteger, List<TunnelEndPoints>> mapNotHostedDPNToTunnelEndpt = new ConcurrentHashMap<>();
+ List<DPNTEPsInfo> notHostedDpnTepInfo = new ArrayList<>();
+ String newZoneName=tzNew.getZoneName();
+ List<TzMembership> zones = ItmUtils.createTransportZoneMembership(newZoneName);
+ Class<? extends TunnelTypeBase> tunnelType=tzNew.getTunnelType();
+ DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
+
+ TepsNotHostedInTransportZone tepNotHostedTransportZone=getNotHostedTransportZone(newZoneName).get();
+ if (tepNotHostedTransportZone == null) {
+ return notHostedDpnTepInfo;
+ }
+ List<UnknownVteps> unVtepsLst=tepNotHostedTransportZone.getUnknownVteps();
+ List<Vteps> vtepsList=new ArrayList<Vteps>();
+ if(unVtepsLst!=null && !unVtepsLst.isEmpty()) {
+ for (UnknownVteps vteps : unVtepsLst) {
+ BigInteger dpnID = vteps.getDpnId();
+ String port = ITMConstants.DUMMY_PORT;
+ int vlanID= ITMConstants.DUMMY_VLANID;
+ IpPrefix ipPrefix = new IpPrefix(ITMConstants.DUMMY_PREFIX.toCharArray());
+ IpAddress gatewayIP = new IpAddress(ITMConstants.DUMMY_GATEWAY_IP.toCharArray());
+ IpAddress ipAddress = vteps.getIpAddress();
+ boolean useOfTunnel = ItmUtils.falseIfNull(vteps.isOfTunnel());
+ TunnelEndPoints tunnelEndPoints =
+ ItmUtils.createTunnelEndPoints(dpnID, ipAddress, port, useOfTunnel,vlanID, ipPrefix,
+ gatewayIP, zones, tunnelType);
+ List<TunnelEndPoints> tunnelEndPointsList = mapNotHostedDPNToTunnelEndpt.get(dpnID);
+ if (tunnelEndPointsList != null) {
+ tunnelEndPointsList.add(tunnelEndPoints);
+ } else {
+ tunnelEndPointsList = new ArrayList<>();
+ tunnelEndPointsList.add(tunnelEndPoints);
+ mapNotHostedDPNToTunnelEndpt.put(dpnID, tunnelEndPointsList);
+ }
+ Vteps newVtep=createVtepFromUnKnownVteps(dpnID,ipAddress,ITMConstants.DUMMY_PORT);
+ vtepsList.add(newVtep);
+
+ // Enqueue 'remove TEP from TepsNotHosted list' operation
+ // into DataStoreJobCoordinator
+ ItmTepsNotHostedRemoveWorker
+ removeWorker = new ItmTepsNotHostedRemoveWorker(newZoneName, ipAddress, dpnID, dataBroker);
+ coordinator.enqueueJob(newZoneName, removeWorker);
+ }
+ }
+
+ // Enqueue 'add TEP received from southbound OVSDB into ITM config DS' operation
+ // into DataStoreJobCoordinator
+ ItmTepsNotHostedMoveWorker
+ moveWorker = new ItmTepsNotHostedMoveWorker(vtepsList, newZoneName, dataBroker);
+ coordinator.enqueueJob(newZoneName, moveWorker);
+
+ if(mapNotHostedDPNToTunnelEndpt.size() > 0){
+ Set<BigInteger> keys = mapNotHostedDPNToTunnelEndpt.keySet();
+ for(BigInteger key: keys){
+ DPNTEPsInfo newDpnTepsInfo = ItmUtils.createDPNTepInfo(key, mapNotHostedDPNToTunnelEndpt.get(key));
+ notHostedDpnTepInfo.add(newDpnTepsInfo);
+ }
+ }
+ return notHostedDpnTepInfo;
+
+ }
+
+ private Vteps createVtepFromUnKnownVteps(BigInteger dpnID, IpAddress ipAddress, String port) {
+ VtepsKey vtepkey = new VtepsKey(dpnID, port);
+ Vteps vtepObj = new VtepsBuilder().setDpnId(dpnID).setIpAddress(ipAddress).setKey(vtepkey)
+ .setPortname(port).build();
+ return vtepObj;
+ }
+
+ private boolean isNewTZExistInNotHostedTZ(TransportZone tzNew){
+ boolean isPresent=false;
+ if (getNotHostedTransportZone(tzNew.getZoneName()).isPresent()) {
+ isPresent=true;
+ }
+ return isPresent;
+ }
+
+ public Optional<TepsNotHostedInTransportZone> getNotHostedTransportZone(String transportZoneName) {
+ InstanceIdentifier<TepsNotHostedInTransportZone> tzonePath = InstanceIdentifier.builder(TransportZones.class)
+ .child(TepsNotHostedInTransportZone.class, new TepsNotHostedInTransportZoneKey(transportZoneName)).build();
+ Optional<TepsNotHostedInTransportZone> tZoneNotHostedOptional = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, tzonePath,
+ dataBroker);
+ return tZoneNotHostedOptional;
+ }
+
+ private List<DPNTEPsInfo> createDPNTepInfo(TransportZone transportZone){
+
Map<BigInteger, List<TunnelEndPoints>> mapDPNToTunnelEndpt = new ConcurrentHashMap<>();
List<DPNTEPsInfo> dpnTepInfo = new ArrayList<>();
List<TzMembership> zones = ItmUtils.createTransportZoneMembership(transportZone.getZoneName());