2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping;
10 import static com.google.common.base.Preconditions.checkNotNull;
12 import java.util.HashSet;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
17 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.groupbasedpolicy.neutron.gbp.util.NeutronGbpIidFactory;
20 import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.NetworkClient;
21 import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.NetworkService;
22 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NetworkUtils;
23 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
24 import org.opendaylight.groupbasedpolicy.util.IidFactory;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
30 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;
31 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;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomain;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomainBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomain;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomainBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3Context;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3ContextBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
45 import com.google.common.base.Optional;
46 import com.google.common.base.Strings;
48 public class NeutronNetworkAware implements NeutronAware<Network> {
50 private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkAware.class);
51 public static final InstanceIdentifier<Network> NETWORK_WILDCARD_IID =
52 InstanceIdentifier.builder(Neutron.class).child(Networks.class).child(Network.class).build();
53 private final DataBroker dataProvider;
54 private final Set<TenantId> tenantsWithRouterAndNetworkSeviceEntities = new HashSet<>();
56 public NeutronNetworkAware(DataBroker dataProvider) {
57 this.dataProvider = checkNotNull(dataProvider);
61 public void onCreated(Network network, Neutron neutron) {
62 LOG.trace("created network - {}", network);
63 ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
64 L2FloodDomainId l2FdId = new L2FloodDomainId(network.getUuid().getValue());
65 TenantId tenantId = new TenantId(network.getTenantId().getValue());
67 if (!Strings.isNullOrEmpty(network.getName())) {
69 name = new Name(network.getName());
70 } catch (Exception e) {
72 LOG.info("Name of Neutron Network '{}' is ignored.", network.getName());
73 LOG.debug("Name exception", e);
77 L3ContextId l3ContextId = new L3ContextId(l2FdId);
78 L3Context l3Context = new L3ContextBuilder().setId(l3ContextId).setName(name).build();
79 rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l3ContextIid(tenantId, l3Context.getId()), l3Context, true);
81 L2BridgeDomainId l2BdId = new L2BridgeDomainId(l2FdId);
82 L2BridgeDomain l2Bd = new L2BridgeDomainBuilder().setId(l2BdId).setParent(l3Context.getId()).setName(name).build();
83 rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2BridgeDomainIid(tenantId, l2BdId), l2Bd, true);
85 L2FloodDomain l2Fd = new L2FloodDomainBuilder().setId(l2FdId).setParent(l2BdId).setName(name).build();
86 rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2FloodDomainIid(tenantId, l2FdId), l2Fd, true);
88 if (!tenantsWithRouterAndNetworkSeviceEntities.contains(tenantId)) {
89 tenantsWithRouterAndNetworkSeviceEntities.add(tenantId);
90 NetworkService.writeNetworkServiceEntitiesToTenant(tenantId, rwTx);
91 NetworkService.writeDhcpClauseWithConsProvEic(tenantId, null, rwTx);
92 NetworkService.writeDnsClauseWithConsProvEic(tenantId, null, rwTx);
93 NetworkService.writeMgmtClauseWithConsProvEic(tenantId, null, rwTx);
94 NetworkClient.writeNetworkClientEntitiesToTenant(tenantId, rwTx);
95 NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DHCP_CONTRACT_CONSUMER_SELECTOR, rwTx);
96 NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DNS_CONTRACT_CONSUMER_SELECTOR, rwTx);
97 NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.MGMT_CONTRACT_CONSUMER_SELECTOR, rwTx);
99 if (!NetworkUtils.getPhysicalNetwork(network).isEmpty() && !NetworkUtils.getSegmentationId(network).isEmpty()) {
100 addProviderPhysicalNetworkMapping(tenantId, l2FdId, NetworkUtils.getSegmentationId(network), rwTx);
102 DataStoreHelper.submitToDs(rwTx);
105 private void addProviderPhysicalNetworkMapping(TenantId tenantId, L2FloodDomainId l2FdId, String segmentationId,
106 WriteTransaction wTx) {
107 ProviderPhysicalNetworkAsL2FloodDomain provNetAsL2Fd = new ProviderPhysicalNetworkAsL2FloodDomainBuilder()
108 .setTenantId(tenantId).setL2FloodDomainId(l2FdId).setSegmentationId(segmentationId).build();
109 wTx.put(LogicalDatastoreType.OPERATIONAL,
110 NeutronGbpIidFactory.providerPhysicalNetworkAsL2FloodDomainIid(tenantId, l2FdId), provNetAsL2Fd);
114 public void onUpdated(Network oldItem, Network newItem, Neutron oldNeutron, Neutron newNeutron) {
115 LOG.trace("updated network - OLD: {} \nNEW: {}", oldItem, newItem);
116 // TODO only name can be updated
120 public void onDeleted(Network network, Neutron oldNeutron, Neutron newNeutron) {
121 LOG.trace("deleted network - {}", network);
122 ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
123 TenantId tenantId = new TenantId(network.getTenantId().getValue());
124 L2FloodDomainId l2FdId = new L2FloodDomainId(network.getUuid().getValue());
125 Optional<L2FloodDomain> potentialL2Fd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
126 IidFactory.l2FloodDomainIid(tenantId, l2FdId), rwTx);
127 if (!potentialL2Fd.isPresent()) {
128 LOG.warn("Illegal state - l2-flood-domain {} does not exist.", l2FdId.getValue());
132 L2BridgeDomainId l2BdId = new L2BridgeDomainId(l2FdId);
133 Optional<L2BridgeDomain> potentialL2Bd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
134 IidFactory.l2BridgeDomainIid(tenantId, l2BdId), rwTx);
135 if (!potentialL2Bd.isPresent()) {
136 LOG.warn("Illegal state - l2-bridge-domain {} does not exist.", l2BdId.getValue());
140 DataStoreHelper.submitToDs(rwTx);