X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=neutron-mapper%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fgroupbasedpolicy%2Fneutron%2Fmapper%2Fmapping%2FNeutronNetworkAware.java;h=045e9624c648d1982d9cf19eac0468c703482823;hb=f918d8263f30dc26404c03ef1bc6d509e40d473c;hp=1439150b570dac8e0eb944306156eecd0017799a;hpb=a34cd6130c54bba6fba21d72c5f3292c67949d10;p=groupbasedpolicy.git diff --git a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAware.java b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAware.java index 1439150b5..045e9624c 100644 --- a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAware.java +++ b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAware.java @@ -11,49 +11,49 @@ 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.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.infrastructure.Router; import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils; -import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NeutronMapperIidFactory; -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.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Description; +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.external.networks.by.l2.flood.domains.ExternalNetworkByL2FloodDomain; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.external.networks.by.l2.flood.domains.ExternalNetworkByL2FloodDomainBuilder; -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.EndpointGroup; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupBuilder; +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; -public class NeutronNetworkAware implements INeutronNetworkAware { +public class NeutronNetworkAware implements NeutronAware { private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkAware.class); + public static final InstanceIdentifier NETWORK_WILDCARD_IID = + InstanceIdentifier.builder(Neutron.class).child(Networks.class).child(Network.class).build(); private final DataBroker dataProvider; private final Set tenantsWithRouterAndNetworkSeviceEntities = new HashSet<>(); @@ -61,184 +61,174 @@ public class NeutronNetworkAware implements INeutronNetworkAware { this.dataProvider = checkNotNull(dataProvider); } - /** - * @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())); + TenantId tenantId = new TenantId(network.getTenantId().getValue()); Name name = null; - if (network.getNetworkName() != null) { + 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, IidFactory.l3ContextIid(tenantId, ctxId), l3Context, true); + rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2BridgeDomainIid(tenantId, ctxId), l2Bd, true); + rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2FloodDomainIid(tenantId, ctxId), l2Fd, true); + + createTenantNetworkDomains(network, tenantId, rwTx); if (!tenantsWithRouterAndNetworkSeviceEntities.contains(tenantId)) { tenantsWithRouterAndNetworkSeviceEntities.add(tenantId); - Router.writeRouterEntitiesToTenant(tenantId, rwTx); - Router.writeRouterClauseWithConsProvEic(tenantId, null, rwTx); NetworkService.writeNetworkServiceEntitiesToTenant(tenantId, rwTx); NetworkService.writeDhcpClauseWithConsProvEic(tenantId, null, rwTx); NetworkService.writeDnsClauseWithConsProvEic(tenantId, null, rwTx); NetworkService.writeMgmtClauseWithConsProvEic(tenantId, null, rwTx); NetworkClient.writeNetworkClientEntitiesToTenant(tenantId, rwTx); - NetworkClient.writeConsumerNamedSelector(tenantId, Router.CONTRACT_CONSUMER_SELECTOR, rwTx); NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DHCP_CONTRACT_CONSUMER_SELECTOR, rwTx); NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DNS_CONTRACT_CONSUMER_SELECTOR, rwTx); NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.MGMT_CONTRACT_CONSUMER_SELECTOR, rwTx); } - if (network.getRouterExternal() != null && network.getRouterExternal() == true) { - addEpgExternalIfMissing(tenantId, rwTx); - addExternalNetworkIfMissing(l2Fd.getId(), 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 addExternalNetworkIfMissing(L2FloodDomainId l2FdId, ReadWriteTransaction rwTx) { - InstanceIdentifier iid = - NeutronGbpIidFactory.externalNetworkByL2FloodDomain(l2FdId); - Optional externalPresent = - DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, iid, rwTx); - if (!externalPresent.isPresent()) { - ExternalNetworkByL2FloodDomainBuilder builder = - new ExternalNetworkByL2FloodDomainBuilder().setL2FloodDomainId(l2FdId); - rwTx.put(LogicalDatastoreType.OPERATIONAL, NeutronGbpIidFactory.externalNetworkByL2FloodDomain(l2FdId), - builder.build(), true); + @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); + } } - } + 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); - private void addEpgExternalIfMissing(TenantId tenantId, ReadWriteTransaction rwTx) { - Optional potentialEpgExternal = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, - IidFactory.endpointGroupIid(tenantId, MappingUtils.EPG_EXTERNAL_ID), rwTx); - if (!potentialEpgExternal.isPresent()) { - EndpointGroup epgExternal = new EndpointGroupBuilder().setId(MappingUtils.EPG_EXTERNAL_ID) - .setName(new Name("EXTERNAL_group")) - .setDescription(new Description(MappingUtils.NEUTRON_EXTERNAL + "epg_external_networks")) - .build(); - rwTx.put(LogicalDatastoreType.CONFIGURATION, - IidFactory.endpointGroupIid(tenantId, MappingUtils.EPG_EXTERNAL_ID), epgExternal, 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); } - /** - * @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; + private void addProviderPhysicalNetworkMapping(TenantId tenantId, ContextId ctxId, String segmentationId, + WriteTransaction wTx) { + ProviderPhysicalNetworkAsL2FloodDomain provNetAsL2Fd = new ProviderPhysicalNetworkAsL2FloodDomainBuilder().setTenantId( + tenantId) + .setL2FloodDomainId(ctxId) + .setSegmentationId(segmentationId) + .build(); + wTx.put(LogicalDatastoreType.OPERATIONAL, + 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 networkMappingIid = NeutronMapperIidFactory.networkMappingIid(l2FdId); - Optional 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 potentialL2Fd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION, + IidFactory.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 potentialL2Bd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION, + IidFactory.l2BridgeDomainIid(tenantId, id), rwTx); + if (!potentialL2Bd.isPresent()) { + LOG.warn("Illegal state - l2-bridge-domain {} does not exist.", id.getValue()); return; } + Optional potentialL3Ctx = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION, + IidFactory.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 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 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 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 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); } }