Merge dev/fluorine work across to master
[unimgr.git] / netvirt / src / main / java / org / opendaylight / unimgr / mef / netvirt / SubnetListener.java
diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java
deleted file mode 100644 (file)
index 74c668f..0000000
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * 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.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-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.interfaces.rev150526.mef.interfaces.Subnets;
-import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.subnets.Subnet;
-import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.ip.unis.IpUni;
-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.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.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;
-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.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.unis.Uni;
-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.inet.types.rev130715.IpAddress;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Optional;
-
-public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> implements ISubnetManager {
-    private static final Logger Log = LoggerFactory.getLogger(SubnetListener.class);
-    private ListenerRegistration<SubnetListener> subnetListenerRegistration;
-    private final IGwMacListener gwMacListener;
-
-    public SubnetListener(final DataBroker dataBroker, final IGwMacListener gwMacListener) {
-        super(dataBroker);
-        this.gwMacListener = gwMacListener;
-        registerListener();
-    }
-
-    public void registerListener() {
-        try {
-            final DataTreeIdentifier<Subnet> dataTreeIid = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
-                    MefInterfaceUtils.getSubnetsInstanceIdentifier());
-            subnetListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this);
-            Log.info("SubnetListener created and registered");
-        } catch (final Exception e) {
-            Log.error("SubnetListener listener registration failed !", e);
-            throw new IllegalStateException("SubnetListener registration Listener failed.", e);
-        }
-    }
-
-    @Override
-    public void close() throws Exception {
-        subnetListenerRegistration.close();
-    }
-
-    @Override
-    public void add(DataTreeModification<Subnet> newDataObject) {
-        if (newDataObject.getRootPath() != null && newDataObject.getRootNode() != null) {
-            Log.info("subnet {} created", newDataObject.getRootNode().getIdentifier());
-        }
-
-        createNetwork(newDataObject);
-    }
-
-    @Override
-    public void remove(DataTreeModification<Subnet> removedDataObject) {
-        if (removedDataObject.getRootPath() != null && removedDataObject.getRootNode() != null) {
-            Log.info("subnet {} deleted", removedDataObject.getRootNode().getIdentifier());
-        }
-        removeNetwork(removedDataObject);
-    }
-
-    @Override
-    public void update(DataTreeModification<Subnet> modifiedDataObject) {
-        if (modifiedDataObject.getRootPath() != null && modifiedDataObject.getRootNode() != null) {
-            Log.info("subnet {} updated", modifiedDataObject.getRootNode().getIdentifier());
-            Log.info("process as delete / create");
-            removeNetwork(modifiedDataObject);
-            createNetwork(modifiedDataObject);
-        }
-    }
-
-    @Override
-    public void assignIpUniNetworks(Identifier45 uniId, Identifier45 ipUniId, InstanceIdentifier<Ipvc> ipvcId) {
-        InstanceIdentifier<Subnets> id = MefInterfaceUtils.getSubnetListInstanceIdentifier();
-        Optional<Subnets> allList = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
-        Subnets allSubnets = allList.isPresent() ? allList.get() : null;
-        List<Subnet> allSubnet = allSubnets != null && allSubnets.getSubnet() != null ? allSubnets.getSubnet()
-                : Collections.emptyList();
-        List<Subnet> ipUniSubnets = allSubnet.stream()
-                .filter(s -> s.getUniId().equals(uniId) && s.getIpUniId().equals(ipUniId)).collect(Collectors.toList());
-        // recreate networks on restart
-        ipUniSubnets.forEach(s -> createNetwork(s, uniId, ipUniId));
-    }
-
-    @Override
-    public void unAssignIpUniNetworks(Identifier45 uniId, Identifier45 ipUniId, InstanceIdentifier<Ipvc> ipvcId) {
-        InstanceIdentifier<Subnets> id = MefInterfaceUtils.getSubnetListInstanceIdentifier();
-        Optional<Subnets> allList = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
-        Subnets allSubnets = allList.isPresent() ? allList.get() : null;
-        List<Subnet> allSubnet = allSubnets != null && allSubnets.getSubnet() != null ? allSubnets.getSubnet()
-                : Collections.emptyList();
-        List<Subnet> ipUniSubnets = allSubnet.stream()
-                .filter(s -> s.getUniId().equals(uniId) && s.getIpUniId().equals(ipUniId)).collect(Collectors.toList());
-        ipUniSubnets.forEach(s -> removeNetwork(s, uniId, ipUniId, ipvcId));
-    }
-
-    private void createNetwork(DataTreeModification<Subnet> newDataObject) {
-        Subnet newSubnet = newDataObject.getRootNode().getDataAfter();
-
-        Identifier45 nwUniId = newSubnet.getUniId();
-        Identifier45 nwIpUniId = newSubnet.getIpUniId();
-
-        createNetwork(newSubnet, nwUniId, nwIpUniId);
-    }
-
-    private void createNetwork(Subnet newSubnet, Identifier45 nwUniId, Identifier45 nwIpUniId) {
-        String subnetStr = NetvirtVpnUtils.ipPrefixToString(newSubnet.getSubnet());
-
-        synchronized (subnetStr.intern()) {
-            InstanceIdentifier<Ipvc> ipvcId = findService(nwUniId, nwIpUniId, getMefServices());
-            if (ipvcId == null) {
-                Log.info("Subnet Uni {} IpUNI {} is not assosiated to service", nwUniId, nwIpUniId);
-                return;
-            }
-            IpvcVpn ipvcVpn = MefServicesUtils.getOperIpvcVpn(dataBroker, ipvcId);
-            if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
-                Log.error("Subnet Uni {} IpUNI {} is not operational", nwUniId, nwIpUniId);
-                return;
-            }
-            VpnElans vpnElan = MefServicesUtils.findVpnForNetwork(newSubnet, ipvcVpn);
-            if (vpnElan == null) {
-                Log.error("Subnet Uni {} IpUNI {} for network {} is not operational", nwUniId, nwIpUniId, subnetStr);
-                return;
-            }
-            if (MefServicesUtils.findNetwork(newSubnet, vpnElan) != null) {
-                Log.info("Network {} exists already", subnetStr);
-                return;
-            }
-
-            if (newSubnet.getGateway() == null) {
-                Log.trace("Direct subnet removed {}", newSubnet.getSubnet());
-            } else {
-                createNonDirectNetwork(newSubnet, ipvcVpn, ipvcId, vpnElan);
-            }
-
-            MefServicesUtils.addOperIpvcVpnElan(dataBroker, ipvcId, ipvcVpn.getVpnId(), nwUniId, nwIpUniId,
-                    vpnElan.getElanId(), vpnElan.getElanPort(), Collections.singletonList(subnetStr));
-        }
-
-    }
-
-    private void createNonDirectNetwork(Subnet newSubnet, IpvcVpn ipvcVpn, InstanceIdentifier<Ipvc> ipvcId,
-            VpnElans vpnElan) {
-        if (newSubnet.getGateway() == null) {
-            return;
-        }
-
-        Identifier45 nwUniId = newSubnet.getUniId();
-        Identifier45 nwIpUniId = newSubnet.getIpUniId();
-        String subnetStr = NetvirtVpnUtils.ipPrefixToString(newSubnet.getSubnet());
-
-        IpUni ipUni = MefInterfaceUtils.getIpUni(dataBroker, nwUniId, nwIpUniId, LogicalDatastoreType.CONFIGURATION);
-        if (ipUni == null) {
-            Log.error("Uni {} IpUni {}  for network {} is not operational", nwUniId, nwIpUniId, subnetStr);
-            return;
-        }
-
-        String srcTpAddressStr = NetvirtVpnUtils
-                .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
-        IpAddress srcIpAddress = new IpAddress(srcTpAddressStr.toCharArray());
-        String subnet = NetvirtVpnUtils.ipPrefixToString(newSubnet.getSubnet());
-        gwMacListener.resolveGwMac(ipvcVpn.getVpnId(), vpnElan.getElanPort(), srcIpAddress, newSubnet.getGateway(),
-                subnet);
-    }
-
-    private void removeNetwork(DataTreeModification<Subnet> deletedDataObject) {
-        Subnet deletedSubnet = deletedDataObject.getRootNode().getDataBefore();
-        Identifier45 dlUniId = deletedSubnet.getUniId();
-        Identifier45 dlIpUniId = deletedSubnet.getIpUniId();
-        InstanceIdentifier<Ipvc> ipvcId = findServiceOper(dlUniId, dlIpUniId, getMefServicesOper());
-        if (ipvcId == null) {
-            Log.info("Subnet Uni {} IpUNI {} for deleted network is not assosiated to service", dlUniId, dlIpUniId);
-            return;
-        }
-        removeNetwork(deletedSubnet, dlUniId, dlIpUniId, ipvcId);
-    }
-
-    private void removeNetwork(Subnet dlSubnet, Identifier45 dlUniId, Identifier45 dlIpUniId,
-            InstanceIdentifier<Ipvc> ipvcId) {
-        String subnetStr = NetvirtVpnUtils.ipPrefixToString(dlSubnet.getSubnet());
-        synchronized (subnetStr.intern()) {
-
-            IpvcVpn ipvcVpn = MefServicesUtils.getOperIpvcVpn(dataBroker, ipvcId);
-            if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
-                Log.error("Subnet Uni {} IpUNI {} is not operational", dlUniId, dlIpUniId);
-                return;
-            }
-            VpnElans vpnElan = MefServicesUtils.findVpnForNetwork(dlSubnet, ipvcVpn);
-            if (vpnElan == null) {
-                Log.error("Trying to remove non-operational network {}", subnetStr);
-                return;
-            }
-            if (MefServicesUtils.findNetwork(dlSubnet, vpnElan) == null) {
-                Log.error("Trying to remove non-operational network {}", subnetStr);
-                return;
-            }
-
-            if (dlSubnet.getGateway() == null) {
-                Log.trace("Direct subnet removed {}", dlSubnet.getSubnet());
-            } else {
-                removeNonDirectNetwork(dlSubnet, ipvcVpn, ipvcId);
-            }
-
-            MefServicesUtils.removeOperIpvcSubnet(dataBroker, ipvcId, ipvcVpn.getVpnId(), dlUniId, dlIpUniId,
-                    vpnElan.getElanId(), vpnElan.getElanPort(), subnetStr);
-        }
-    }
-
-    private void removeNonDirectNetwork(Subnet deletedSubnet, IpvcVpn ipvcVpn, InstanceIdentifier<Ipvc> ipvcId) {
-        if (deletedSubnet.getGateway() == null) {
-            return;
-        }
-
-        Identifier45 nwUniId = deletedSubnet.getUniId();
-        Identifier45 nwIpUniId = deletedSubnet.getIpUniId();
-        String subnetStr = NetvirtVpnUtils.ipPrefixToString(deletedSubnet.getSubnet());
-        VpnElans vpnElan = MefServicesUtils.findVpnForNetwork(deletedSubnet, ipvcVpn);
-        if (vpnElan == null) {
-            Log.error("Network {} has not been created as required, nothing to remove", subnetStr);
-            return;
-        }
-
-        IpUni ipUni = MefInterfaceUtils.getIpUni(dataBroker, nwUniId, nwIpUniId, LogicalDatastoreType.CONFIGURATION);
-        if (ipUni == null) {
-            Log.error("Uni {} IpUni {}  for network {} is not operational", nwUniId, nwIpUniId, subnetStr);
-            return;
-        }
-
-        String srcTpAddressStr = NetvirtVpnUtils
-                .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
-        IpAddress srcIpAddress = new IpAddress(srcTpAddressStr.toCharArray());
-        String subnet = NetvirtVpnUtils.ipPrefixToString(deletedSubnet.getSubnet());
-        gwMacListener.unResolveGwMac(ipvcVpn.getVpnId(), vpnElan.getElanPort(), srcIpAddress,
-                deletedSubnet.getGateway(), subnet);
-
-        NetvirtVpnUtils.removeVpnInterfaceAdjacency(dataBroker, vpnElan.getElanPort(), deletedSubnet.getSubnet());
-        NetvirtVpnUtils.removeVpnInterfaceAdjacency(dataBroker, vpnElan.getElanPort(), deletedSubnet.getGateway());
-    }
-
-    Optional<MefServices> getMefServices() {
-        InstanceIdentifier<MefServices> path = MefServicesUtils.getMefServicesInstanceIdentifier();
-        return MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path);
-    }
-
-    Optional<MefServices> getMefServicesOper() {
-        InstanceIdentifier<MefServices> path = MefServicesUtils.getMefServicesInstanceIdentifier();
-        return MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
-    }
-
-    private InstanceIdentifier<Ipvc> findService(Identifier45 uniId, Identifier45 ipUniId,
-            Optional<MefServices> mefServices) {
-        if (!mefServices.isPresent() || mefServices.get() == null) {
-            Log.info("Uni {} IpUni {} is not assosiated with service", uniId, ipUniId);
-            return null;
-        }
-        for (MefService service : mefServices.get().getMefService()) {
-            if (service.getMefServiceChoice() instanceof IpvcChoice) {
-                Ipvc ipvc = ((IpvcChoice) service.getMefServiceChoice()).getIpvc();
-                if (ipvc.getUnis() == null || ipvc.getUnis().getUni() == null) {
-                    continue;
-                }
-                List<Uni> unis = ipvc.getUnis().getUni();
-                for (Uni uni : unis) {
-                    if (uni.getUniId().equals(uniId) && uni.getIpUniId().equals(ipUniId)) {
-                        Log.info("Find service {} for uni {} ipuni {}", service.getSvcId(), uniId, ipUniId);
-                        return MefServicesUtils.getIpvcInstanceIdentifier(service.getSvcId());
-                    }
-                }
-            }
-        }
-        Log.info("Uni {} IpUni {} is not assosiated with service", uniId, ipUniId);
-        return null;
-    }
-
-    private InstanceIdentifier<Ipvc> findServiceOper(Identifier45 uniId, Identifier45 ipUniId,
-            Optional<MefServices> mefServices) {
-        if (!mefServices.isPresent() || mefServices.get() == null) {
-            Log.info("Uni {} IpUni {} is not assosiated with service", uniId, ipUniId);
-            return null;
-        }
-        for (MefService service : mefServices.get().getMefService()) {
-            if (service.getMefServiceChoice() instanceof IpvcChoice) {
-                Ipvc ipvc = ((IpvcChoice) service.getMefServiceChoice()).getIpvc();
-                IpvcVpn ipvcVpn = ipvc.getAugmentation(IpvcVpn.class);
-                if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
-                    Log.info("Uni {} IpUni {} is not assosiated with service", uniId, ipUniId);
-                    return null;
-                }
-                List<VpnElans> vpnElans = ipvcVpn.getVpnElans();
-                for (VpnElans vpnElan : vpnElans) {
-                    if (vpnElan.getUniId().equals(uniId) && vpnElan.getIpUniId().equals(ipUniId)) {
-                        Log.info("Find service {} for uni {} ipuni {}", service.getSvcId(), uniId, ipUniId);
-                        return MefServicesUtils.getIpvcInstanceIdentifier(service.getSvcId());
-                    }
-                }
-            }
-        }
-        Log.info("Uni {} IpUni {} is not assosiated with service", uniId, ipUniId);
-        return null;
-    }
-}