1c0b349ca2fb012fb29411668673e999fb7119b6
[groupbasedpolicy.git] / neutron-mapper / src / main / java / org / opendaylight / groupbasedpolicy / neutron / mapper / mapping / NeutronNetworkAware.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
3  *
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
7  */
8 package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping;
9
10 import static com.google.common.base.Preconditions.checkNotNull;
11
12 import java.util.HashSet;
13 import java.util.Set;
14
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;
44
45 import com.google.common.base.Optional;
46 import com.google.common.base.Strings;
47
48 public class NeutronNetworkAware implements NeutronAware<Network> {
49
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<>();
55
56     public NeutronNetworkAware(DataBroker dataProvider) {
57         this.dataProvider = checkNotNull(dataProvider);
58     }
59
60     @Override
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());
66         Name name = null;
67         if (!Strings.isNullOrEmpty(network.getName())) {
68             try {
69                 name = new Name(network.getName());
70             } catch (Exception e) {
71                 name = null;
72                 LOG.info("Name of Neutron Network '{}' is ignored.", network.getName());
73                 LOG.debug("Name exception", e);
74             }
75         }
76
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);
80
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);
84
85         L2FloodDomain l2Fd = new L2FloodDomainBuilder().setId(l2FdId).setParent(l2BdId).setName(name).build();
86         rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2FloodDomainIid(tenantId, l2FdId), l2Fd, true);
87
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);
98         }
99         if (!NetworkUtils.getPhysicalNetwork(network).isEmpty() && !NetworkUtils.getSegmentationId(network).isEmpty()) {
100             addProviderPhysicalNetworkMapping(tenantId, l2FdId, NetworkUtils.getSegmentationId(network), rwTx);
101         }
102         DataStoreHelper.submitToDs(rwTx);
103     }
104
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);
111     }
112
113     @Override
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
117     }
118
119     @Override
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());
129             return;
130         }
131
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());
137             return;
138         }
139
140         DataStoreHelper.submitToDs(rwTx);
141     }
142
143 }