RouterEp registration and L3 Endpoints update
[groupbasedpolicy.git] / neutron-mapper / src / main / java / org / opendaylight / groupbasedpolicy / neutron / mapper / mapping / NeutronNetworkAware.java
index 514dbef866055258874de9344f2b9ad929a3ad86..bd2a45faaa7abaddfe05cdd5481be721c38b2704 100644 (file)
@@ -11,113 +11,93 @@ import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.util.HashSet;
 import java.util.Set;
-import java.util.UUID;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.domain_extension.l2_l3.util.L2L3IidFactory;
 import org.opendaylight.groupbasedpolicy.neutron.gbp.util.NeutronGbpIidFactory;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.NetworkClient;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.NetworkService;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.group.NeutronSecurityGroupAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NeutronMapperIidFactory;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NeutronUtils;
-import org.opendaylight.groupbasedpolicy.neutron.mapper.util.Utils;
+import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NetworkUtils;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.groupbasedpolicy.util.IidFactory;
-import org.opendaylight.neutron.spi.INeutronNetworkAware;
-import org.opendaylight.neutron.spi.NeutronNetwork;
-import org.opendaylight.neutron.spi.NeutronSecurityGroup;
-import org.opendaylight.neutron.spi.NeutronSecurityRule;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.provider.physical.networks.as.l2.flood.domains.ProviderPhysicalNetworkAsL2FloodDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.provider.physical.networks.as.l2.flood.domains.ProviderPhysicalNetworkAsL2FloodDomainBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.mapper.rev150223.mappings.network.mappings.NetworkMapping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.mapper.rev150223.mappings.network.mappings.NetworkMappingBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.ForwardingContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.ForwardingContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.provider.networks.as.l2.flood.domains.ProviderPhysicalNetworkAsL2FloodDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.provider.networks.as.l2.flood.domains.ProviderPhysicalNetworkAsL2FloodDomainBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomainBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomainBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3Context;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3ContextBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ExternalImplicitGroup;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ExternalImplicitGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
 
-public class NeutronNetworkAware implements INeutronNetworkAware {
+public class NeutronNetworkAware implements NeutronAware<Network> {
 
     private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkAware.class);
+    public static final InstanceIdentifier<Network> NETWORK_WILDCARD_IID =
+            InstanceIdentifier.builder(Neutron.class).child(Networks.class).child(Network.class).build();
     private final DataBroker dataProvider;
     private final Set<TenantId> tenantsWithRouterAndNetworkSeviceEntities = new HashSet<>();
-    private final NeutronSecurityGroupAware secGrpAware;
-    private final NeutronNetworkDao networkDao;
 
-    public NeutronNetworkAware(DataBroker dataProvider, NeutronSecurityGroupAware secGrpAware, NeutronNetworkDao networkDao) {
+    public NeutronNetworkAware(DataBroker dataProvider) {
         this.dataProvider = checkNotNull(dataProvider);
-        this.secGrpAware = checkNotNull(secGrpAware);
-        this.networkDao = checkNotNull(networkDao);
     }
 
-    /**
-     * @see org.opendaylight.neutron.spi.INeutronNetworkAware#canCreateNetwork(org.opendaylight.neutron.spi.NeutronNetwork)
-     */
     @Override
-    public int canCreateNetwork(NeutronNetwork network) {
-        LOG.trace("canCreateNetwork - {}", network);
-        // nothing to consider
-        return StatusCode.OK;
-    }
-
-    /**
-     * @see org.opendaylight.neutron.spi.INeutronNetworkAware#neutronNetworkCreated(org.opendaylight.neutron.spi.NeutronNetwork)
-     */
-    @Override
-    public void neutronNetworkCreated(NeutronNetwork network) {
-        LOG.trace("neutronNetworkCreated - {}", network);
+    public void onCreated(Network network, Neutron neutron) {
+        LOG.trace("created network - {}", network);
         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
-        L2FloodDomainId l2FdId = new L2FloodDomainId(network.getID());
-        TenantId tenantId = new TenantId(Utils.normalizeUuid(network.getTenantID()));
-        Name name = null;
-        if (network.getNetworkName() != null) {
+        TenantId tenantId = new TenantId(network.getTenantId().getValue());
+        Name name;
+        ContextId ctxId = new ContextId(network.getUuid().getValue());
+        ForwardingContextBuilder fwdCtxBuilder = new ForwardingContextBuilder()
+        .setContextId(ctxId)
+        .setContextType(MappingUtils.L3_CONTEXT);
+        if (!Strings.isNullOrEmpty(network.getName())) {
             try {
-                name = new Name(network.getNetworkName());
+                name = new Name(network.getName());
+                fwdCtxBuilder.setName(name);
             } catch (Exception e) {
-                name = null;
-                LOG.info("Name of Neutron Network '{}' is ignored.", network.getNetworkName());
+                LOG.info("Name of Neutron Network '{}' is ignored.", network.getName());
                 LOG.debug("Name exception", e);
             }
         }
 
-        L3ContextId l3ContextId = new L3ContextId(UUID.randomUUID().toString());
-        L3Context l3Context = new L3ContextBuilder().setId(l3ContextId).setName(name).build();
-        rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l3ContextIid(tenantId, l3ContextId), l3Context, true);
+        ForwardingContext l3Context = fwdCtxBuilder.build();
 
-        L2BridgeDomainId l2BdId = new L2BridgeDomainId(UUID.randomUUID().toString());
-        L2BridgeDomain l2Bd = new L2BridgeDomainBuilder().setId(l2BdId).setParent(l3ContextId).setName(name).build();
-        rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2BridgeDomainIid(tenantId, l2BdId), l2Bd, true);
+        fwdCtxBuilder.setContextType(MappingUtils.L2_BRDIGE_DOMAIN)
 
-        L2FloodDomain l2Fd = new L2FloodDomainBuilder().setId(l2FdId).setParent(l2BdId).setName(name).build();
-        rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2FloodDomainIid(tenantId, l2FdId), l2Fd, true);
+        .setParent(MappingUtils.createParent(ctxId, MappingUtils.L3_CONTEXT));
+        ForwardingContext l2Bd = fwdCtxBuilder.build();
 
-        NetworkMapping networkMapping = new NetworkMappingBuilder().setNetworkId(l2FdId)
-            .setL2BridgeDomainId(l2BdId)
-            .setL3ContextId(l3ContextId)
-            .build();
-        rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronMapperIidFactory.networkMappingIid(l2FdId), networkMapping,
-                true);
+        fwdCtxBuilder.setContextType(MappingUtils.L2_FLOOD_DOMAIN).setParent(
+                MappingUtils.createParent(ctxId, MappingUtils.L2_BRDIGE_DOMAIN));
+        ForwardingContext l2Fd = fwdCtxBuilder.build();
+
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.l3ContextIid(tenantId, ctxId), l3Context, true);
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.l2BridgeDomainIid(tenantId, ctxId), l2Bd, true);
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.l2FloodDomainIid(tenantId, ctxId), l2Fd, true);
+
+        createTenantNetworkDomains(network, tenantId, rwTx);
 
         if (!tenantsWithRouterAndNetworkSeviceEntities.contains(tenantId)) {
             tenantsWithRouterAndNetworkSeviceEntities.add(tenantId);
@@ -130,149 +110,125 @@ public class NeutronNetworkAware implements INeutronNetworkAware {
             NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DNS_CONTRACT_CONSUMER_SELECTOR, rwTx);
             NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.MGMT_CONTRACT_CONSUMER_SELECTOR, rwTx);
         }
-        networkDao.addNetwork(network);
-        if (network.getRouterExternal() != null && network.getRouterExternal() == true) {
-            addEigEpgExternalWithContracts(tenantId, rwTx);
-        }
-        if (!Strings.isNullOrEmpty(network.getProviderPhysicalNetwork())) {
-            String segmentationId = network.getProviderSegmentationID();
-            addProviderPhysicalNetworkMapping(tenantId, l2FdId, segmentationId, rwTx);
+        if (!NetworkUtils.getPhysicalNetwork(network).isEmpty() && !NetworkUtils.getSegmentationId(network).isEmpty()) {
+            addProviderPhysicalNetworkMapping(tenantId, ctxId, NetworkUtils.getSegmentationId(network), rwTx);
+            addProviderPhysicalNetworkMapping(tenantId, new L2FloodDomainId(ctxId.getValue()),
+                    NetworkUtils.getSegmentationId(network), rwTx);
         }
         DataStoreHelper.submitToDs(rwTx);
     }
 
-    private void addEigEpgExternalWithContracts(TenantId tenantId, ReadWriteTransaction rwTx) {
-        Uuid tenantUuid = new Uuid(tenantId.getValue());
-        NeutronSecurityRule inIpv4 = new NeutronSecurityRule();
-        inIpv4.setID("19b85ad2-bdfc-11e5-9912-ba0be0483c18");
-        inIpv4.setSecurityRuleDirection(NeutronUtils.INGRESS);
-        inIpv4.setSecurityRuleEthertype(NeutronUtils.IPv4);
-        inIpv4.setSecurityRuleGroupID(MappingUtils.EPG_EXTERNAL_ID.getValue());
-        inIpv4.setTenantID(tenantUuid);
-        NeutronSecurityRule outIpv4 = new NeutronSecurityRule();
-        outIpv4.setID("19b85eba-bdfc-11e5-9912-ba0be0483c18");
-        outIpv4.setSecurityRuleDirection(NeutronUtils.EGRESS);
-        outIpv4.setSecurityRuleEthertype(NeutronUtils.IPv4);
-        outIpv4.setSecurityRuleGroupID(MappingUtils.EPG_EXTERNAL_ID.getValue());
-        outIpv4.setTenantID(tenantUuid);
-        NeutronSecurityRule inIpv6 = new NeutronSecurityRule();
-        inIpv6.setID("19b86180-bdfc-11e5-9912-ba0be0483c18");
-        inIpv6.setSecurityRuleDirection(NeutronUtils.INGRESS);
-        inIpv6.setSecurityRuleEthertype(NeutronUtils.IPv6);
-        inIpv6.setSecurityRuleGroupID(MappingUtils.EPG_EXTERNAL_ID.getValue());
-        inIpv6.setTenantID(tenantUuid);
-        NeutronSecurityRule outIpv6 = new NeutronSecurityRule();
-        outIpv6.setID("19b86270-bdfc-11e5-9912-ba0be0483c18");
-        outIpv6.setSecurityRuleDirection(NeutronUtils.EGRESS);
-        outIpv6.setSecurityRuleEthertype(NeutronUtils.IPv6);
-        outIpv6.setSecurityRuleGroupID(MappingUtils.EPG_EXTERNAL_ID.getValue());
-        outIpv6.setTenantID(tenantUuid);
-        NeutronSecurityGroup externalSecGrp = new NeutronSecurityGroup();
-        externalSecGrp.setID(MappingUtils.EPG_EXTERNAL_ID.getValue());
-        externalSecGrp.setSecurityGroupName("EXTERNAL_group");
-        externalSecGrp.setTenantID(tenantUuid);
-        externalSecGrp.setSecurityRules(ImmutableList.of(inIpv4, outIpv4, inIpv6, outIpv6));
-        boolean isAddedNeutronSecurityGroup = secGrpAware.addNeutronSecurityGroup(externalSecGrp, rwTx);
-        if (!isAddedNeutronSecurityGroup) {
-            LOG.error("Problem with adding External Neutron Security Group representing External Implicit Group. {}", externalSecGrp);
-            return;
+    @Deprecated
+    private void createTenantNetworkDomains(Network network, TenantId tenantId, ReadWriteTransaction rwTx) {
+        Name name;
+        L3ContextBuilder l3CtxBuilder = new L3ContextBuilder();
+        L2FloodDomainBuilder l2FdBuilder = new L2FloodDomainBuilder();
+        L2BridgeDomainBuilder l2BdBuilder = new L2BridgeDomainBuilder();
+        if (!Strings.isNullOrEmpty(network.getName())) {
+            try {
+                name = new Name(network.getName());
+                l3CtxBuilder.setName(name);
+                l2FdBuilder.setName(name);
+                l2BdBuilder.setName(name);
+            } catch (Exception e) {
+                name = null;
+                LOG.info("Name of Neutron Network '{}' is ignored.", network.getName());
+                LOG.debug("Name exception", e);
+            }
         }
-        ExternalImplicitGroup eig = new ExternalImplicitGroupBuilder().setId(MappingUtils.EPG_EXTERNAL_ID).build();
-        rwTx.put(LogicalDatastoreType.CONFIGURATION,
-                IidFactory.externalImplicitGroupIid(tenantId, eig.getId()), eig, true);
+        L2FloodDomainId l2FdId = new L2FloodDomainId(network.getUuid().getValue());
+        L3ContextId l3ContextId = new L3ContextId(l2FdId);
+        L3Context l3Context = l3CtxBuilder.setId(l3ContextId).build();
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l3ContextIid(tenantId, l3Context.getId()), l3Context, true);
+
+        L2BridgeDomainId l2BdId = new L2BridgeDomainId(l2FdId);
+        L2BridgeDomain l2Bd = l2BdBuilder.setId(l2BdId).setParent(l3Context.getId()).build();
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2BridgeDomainIid(tenantId, l2BdId), l2Bd, true);
+
+        L2FloodDomain l2Fd = l2FdBuilder.setId(l2FdId).setParent(l2BdId).build();
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2FloodDomainIid(tenantId, l2FdId), l2Fd, true);
     }
 
-    private void addProviderPhysicalNetworkMapping(TenantId tenantId, L2FloodDomainId l2FdId, String segmentationId,
+    private void addProviderPhysicalNetworkMapping(TenantId tenantId, ContextId ctxId, String segmentationId,
             WriteTransaction wTx) {
-        ProviderPhysicalNetworkAsL2FloodDomain provNetAsL2Fd = new ProviderPhysicalNetworkAsL2FloodDomainBuilder()
-            .setTenantId(tenantId).setL2FloodDomainId(l2FdId).setSegmentationId(segmentationId).build();
+        ProviderPhysicalNetworkAsL2FloodDomain provNetAsL2Fd = new ProviderPhysicalNetworkAsL2FloodDomainBuilder().setTenantId(
+                tenantId)
+            .setL2FloodDomainId(ctxId)
+            .setSegmentationId(segmentationId)
+            .build();
         wTx.put(LogicalDatastoreType.OPERATIONAL,
-                NeutronGbpIidFactory.providerPhysicalNetworkAsL2FloodDomainIid(tenantId, l2FdId), provNetAsL2Fd);
-    }
-
-    /**
-     * @see org.opendaylight.neutron.spi.INeutronNetworkAware#canUpdateNetwork(org.opendaylight.neutron.spi.NeutronNetwork,
-     *      org.opendaylight.neutron.spi.NeutronNetwork)
-     */
-    @Override
-    public int canUpdateNetwork(NeutronNetwork delta, NeutronNetwork original) {
-        LOG.trace("canUpdateNetwork - delta: {} original: {}", delta, original);
-        // nothing to consider
-        return StatusCode.OK;
+                NeutronGbpIidFactory.providerPhysicalNetworkAsL2FloodDomainIid(tenantId, ctxId), provNetAsL2Fd);
     }
 
-    /**
-     * @see org.opendaylight.neutron.spi.INeutronNetworkAware#neutronNetworkUpdated(org.opendaylight.neutron.spi.NeutronNetwork)
-     */
-    @Override
-    public void neutronNetworkUpdated(NeutronNetwork network) {
-        LOG.trace("neutronNetworkUpdated - {}", network);
-        // TODO we could update just name
+    @Deprecated
+    private void addProviderPhysicalNetworkMapping(TenantId tenantId, L2FloodDomainId l2FdId, String segmentationId,
+            WriteTransaction wTx) {
+        org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.provider.physical.networks.as.l2.flood.domains.ProviderPhysicalNetworkAsL2FloodDomain provNetAsL2Fd = new org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.provider.physical.networks.as.l2.flood.domains.ProviderPhysicalNetworkAsL2FloodDomainBuilder().setTenantId(
+                tenantId)
+            .setL2FloodDomainId(new L2FloodDomainId(l2FdId.getValue()))
+            .setSegmentationId(segmentationId)
+            .build();
+        wTx.put(LogicalDatastoreType.OPERATIONAL,
+                NeutronGbpIidFactory.providerPhysicalNetworkAsL2FloodDomainIid(tenantId, l2FdId), provNetAsL2Fd);
     }
 
-    /**
-     * @see org.opendaylight.neutron.spi.INeutronNetworkAware#canDeleteNetwork(org.opendaylight.neutron.spi.NeutronNetwork)
-     */
     @Override
-    public int canDeleteNetwork(NeutronNetwork network) {
-        LOG.trace("canDeleteNetwork - {}", network);
-        // nothing to consider
-        return StatusCode.OK;
+    public void onUpdated(Network oldItem, Network newItem, Neutron oldNeutron, Neutron newNeutron) {
+        LOG.trace("updated network - OLD: {} \nNEW: {}", oldItem, newItem);
+        // TODO only name can be updated
     }
 
-    /**
-     * @see org.opendaylight.neutron.spi.INeutronNetworkAware#neutronNetworkDeleted(org.opendaylight.neutron.spi.NeutronNetwork)
-     */
     @Override
-    public void neutronNetworkDeleted(NeutronNetwork network) {
-        LOG.trace("neutronNetworkDeleted - {}", network);
+    public void onDeleted(Network network, Neutron oldNeutron, Neutron newNeutron) {
+        LOG.trace("deleted network - {}", network);
         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
-        TenantId tenantId = new TenantId(Utils.normalizeUuid(network.getTenantID()));
-        L2FloodDomainId l2FdId = new L2FloodDomainId(network.getID());
-        InstanceIdentifier<NetworkMapping> networkMappingIid = NeutronMapperIidFactory.networkMappingIid(l2FdId);
-        Optional<NetworkMapping> potentionalNetworkMapping =
-                DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL, networkMappingIid, rwTx);
-        if (!potentionalNetworkMapping.isPresent()) {
-            LOG.warn("Illegal state - network-mapping {} does not exist.", l2FdId.getValue());
-            rwTx.cancel();
+        TenantId tenantId = new TenantId(network.getTenantId().getValue());
+        ContextId id = new ContextId(network.getUuid().getValue());
+        Optional<ForwardingContext> potentialL2Fd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
+                L2L3IidFactory.l2FloodDomainIid(tenantId, id), rwTx);
+        if (!potentialL2Fd.isPresent()) {
+            LOG.warn("Illegal state - l2-flood-domain {} does not exist.", id.getValue());
             return;
         }
-
-        NetworkMapping networkMapping = potentionalNetworkMapping.get();
-        L2BridgeDomainId l2BdId = networkMapping.getL2BridgeDomainId();
-        L3ContextId l3ContextId = networkMapping.getL3ContextId();
-        if (l2BdId == null || l3ContextId == null) {
-            LOG.warn("Illegal state - network-mapping {} is not valid.", networkMapping);
-            rwTx.cancel();
+        Optional<ForwardingContext> potentialL2Bd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
+                L2L3IidFactory.l2BridgeDomainIid(tenantId, id), rwTx);
+        if (!potentialL2Bd.isPresent()) {
+            LOG.warn("Illegal state - l2-bridge-domain {} does not exist.", id.getValue());
             return;
         }
+        Optional<ForwardingContext> potentialL3Ctx = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
+                L2L3IidFactory.l3ContextIid(tenantId, id), rwTx);
+        if (!potentialL3Ctx.isPresent()) {
+            LOG.warn("Illegal state - l3-context {} does not exist.", id.getValue());
+            return;
+        }
+        removeTenantNetworkDomains(network, tenantId, rwTx);
+        DataStoreHelper.submitToDs(rwTx);
+    }
 
+    @Deprecated
+    private void removeTenantNetworkDomains(Network network, TenantId tenantId, ReadWriteTransaction rwTx) {
+        L2FloodDomainId l2FdId = new L2FloodDomainId(network.getUuid().getValue());
         Optional<L2FloodDomain> potentialL2Fd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
                 IidFactory.l2FloodDomainIid(tenantId, l2FdId), rwTx);
         if (!potentialL2Fd.isPresent()) {
             LOG.warn("Illegal state - l2-flood-domain {} does not exist.", l2FdId.getValue());
-            rwTx.cancel();
             return;
         }
 
+        L2BridgeDomainId l2BdId = new L2BridgeDomainId(l2FdId);
         Optional<L2BridgeDomain> potentialL2Bd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
                 IidFactory.l2BridgeDomainIid(tenantId, l2BdId), rwTx);
         if (!potentialL2Bd.isPresent()) {
             LOG.warn("Illegal state - l2-bridge-domain {} does not exist.", l2BdId.getValue());
-            rwTx.cancel();
             return;
         }
-
-        Optional<L3Context> potentialL3Context = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
-                IidFactory.l3ContextIid(tenantId, l3ContextId), rwTx);
-        if (!potentialL3Context.isPresent()) {
-            LOG.warn("Illegal state - l3-context {} does not exist.", l3ContextId.getValue());
-            rwTx.cancel();
+        L3ContextId l3CtxId = new L3ContextId(l2FdId);
+        Optional<L3Context> potentialL3Ctx = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
+                IidFactory.l3ContextIid(tenantId, l3CtxId), rwTx);
+        if (!potentialL3Ctx.isPresent()) {
+            LOG.warn("Illegal state - l3-context {} does not exist.", l3CtxId.getValue());
             return;
         }
-
-        rwTx.delete(LogicalDatastoreType.OPERATIONAL, networkMappingIid);
-
-        DataStoreHelper.submitToDs(rwTx);
     }
 }