apply checkstyle check during build for neutron-mapper
[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 com.google.common.base.Optional;
13 import com.google.common.base.Strings;
14
15 import java.util.HashSet;
16 import java.util.Set;
17
18 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
19 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
20 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.groupbasedpolicy.domain_extension.l2_l3.util.L2L3IidFactory;
23 import org.opendaylight.groupbasedpolicy.neutron.gbp.util.NeutronGbpIidFactory;
24 import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.MetadataService;
25 import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.NetworkClient;
26 import org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure.NetworkService;
27 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
28 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NetworkUtils;
29 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
30 import org.opendaylight.groupbasedpolicy.util.IidFactory;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.ForwardingContext;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.ForwardingContextBuilder;
39 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;
40 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;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomain;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomainBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomain;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomainBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3Context;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3ContextBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
50 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54 public class NeutronNetworkAware implements NeutronAware<Network> {
55
56     private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkAware.class);
57     public static final InstanceIdentifier<Network> NETWORK_WILDCARD_IID =
58             InstanceIdentifier.builder(Neutron.class).child(Networks.class).child(Network.class).build();
59     private final DataBroker dataProvider;
60     private final Set<TenantId> tenantsWithRouterAndNetworkServiceEntities = new HashSet<>();
61     private final long metadataTcpPort;
62
63     public NeutronNetworkAware(DataBroker dataProvider, long metadataPort) {
64         this.dataProvider = checkNotNull(dataProvider);
65         this.metadataTcpPort = metadataPort;
66     }
67
68     @Override
69     public void onCreated(Network network, Neutron neutron) {
70         LOG.trace("created network - {}", network);
71         Name name;
72         ContextId ctxId = new ContextId(network.getUuid().getValue());
73         ForwardingContextBuilder fwdCtxBuilder = new ForwardingContextBuilder()
74             .setContextId(ctxId)
75             .setContextType(MappingUtils.L3_CONTEXT);
76         if (!Strings.isNullOrEmpty(network.getName())) {
77             try {
78                 name = new Name(network.getName());
79                 fwdCtxBuilder.setName(name);
80             } catch (NullPointerException | IllegalArgumentException e) {
81                 LOG.info("Name of Neutron Network '{}' is ignored.", network.getName());
82                 LOG.debug("Name exception", e);
83             }
84         }
85
86         ForwardingContext l3Context = fwdCtxBuilder.build();
87
88         fwdCtxBuilder.setContextType(MappingUtils.L2_BRDIGE_DOMAIN)
89             .setParent(MappingUtils.createParent(ctxId, MappingUtils.L3_CONTEXT));
90         ForwardingContext l2Bd = fwdCtxBuilder.build();
91
92         fwdCtxBuilder.setContextType(MappingUtils.L2_FLOOD_DOMAIN)
93             .setParent(MappingUtils.createParent(ctxId, MappingUtils.L2_BRDIGE_DOMAIN));
94         ForwardingContext l2Fd = fwdCtxBuilder.build();
95
96         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
97         TenantId tenantId = new TenantId(network.getTenantId().getValue());
98         rwTx.put(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.l3ContextIid(tenantId, ctxId), l3Context, true);
99         rwTx.put(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.l2BridgeDomainIid(tenantId, ctxId), l2Bd, true);
100         rwTx.put(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.l2FloodDomainIid(tenantId, ctxId), l2Fd, true);
101
102         createTenantNetworkDomains(network, tenantId, rwTx);
103
104         if (!tenantsWithRouterAndNetworkServiceEntities.contains(tenantId)) {
105             tenantsWithRouterAndNetworkServiceEntities.add(tenantId);
106             NetworkService.writeNetworkServiceEntitiesToTenant(tenantId, rwTx);
107             NetworkService.writeDhcpClauseWithConsProvEic(tenantId, null, rwTx);
108             NetworkService.writeDnsClauseWithConsProvEic(tenantId, null, rwTx);
109             NetworkService.writeMgmtClauseWithConsProvEic(tenantId, null, rwTx);
110             NetworkClient.writeNetworkClientEntitiesToTenant(tenantId, rwTx);
111             NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DHCP_CONTRACT_CONSUMER_SELECTOR, rwTx);
112             NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.DNS_CONTRACT_CONSUMER_SELECTOR, rwTx);
113             NetworkClient.writeConsumerNamedSelector(tenantId, NetworkService.MGMT_CONTRACT_CONSUMER_SELECTOR, rwTx);
114             MetadataService.writeMetadataClauseWithConsProvEic(tenantId, null, rwTx);
115             if (metadataTcpPort != 0) {
116                 MetadataService.writeNetworkServiceEntitiesToTenant(tenantId, rwTx, metadataTcpPort);
117                 MetadataService.writeMetadataClauseWithConsProvEic(tenantId, null, rwTx);
118                 NetworkClient.writeConsumerNamedSelector(tenantId, MetadataService.METADATA_CONTRACT_CONSUMER_SELECTOR,
119                     rwTx);
120             }
121         }
122         if (!NetworkUtils.getPhysicalNetwork(network).isEmpty() && !NetworkUtils.getSegmentationId(network).isEmpty()) {
123             addProviderPhysicalNetworkMapping(tenantId, ctxId, NetworkUtils.getSegmentationId(network), rwTx);
124             addProviderPhysicalNetworkMapping(tenantId, new L2FloodDomainId(ctxId.getValue()),
125                     NetworkUtils.getSegmentationId(network), rwTx);
126         }
127         DataStoreHelper.submitToDs(rwTx);
128     }
129
130     @Deprecated
131     private void createTenantNetworkDomains(Network network, TenantId tenantId, ReadWriteTransaction rwTx) {
132         Name name;
133         L3ContextBuilder l3CtxBuilder = new L3ContextBuilder();
134         L2FloodDomainBuilder l2FdBuilder = new L2FloodDomainBuilder();
135         L2BridgeDomainBuilder l2BdBuilder = new L2BridgeDomainBuilder();
136         if (!Strings.isNullOrEmpty(network.getName())) {
137             try {
138                 name = new Name(network.getName());
139                 l3CtxBuilder.setName(name);
140                 l2FdBuilder.setName(name);
141                 l2BdBuilder.setName(name);
142             } catch (NullPointerException | IllegalArgumentException e) {
143                 LOG.info("Name of Neutron Network '{}' is ignored.", network.getName());
144                 LOG.debug("Name exception", e);
145             }
146         }
147         L2FloodDomainId l2FdId = new L2FloodDomainId(network.getUuid().getValue());
148         L3ContextId l3ContextId = new L3ContextId(l2FdId);
149         L3Context l3Context = l3CtxBuilder.setId(l3ContextId).build();
150         rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l3ContextIid(tenantId, l3Context.getId()), l3Context,
151             true);
152
153         L2BridgeDomainId l2BdId = new L2BridgeDomainId(l2FdId);
154         L2BridgeDomain l2Bd = l2BdBuilder.setId(l2BdId).setParent(l3Context.getId()).build();
155         rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2BridgeDomainIid(tenantId, l2BdId), l2Bd, true);
156
157         L2FloodDomain l2Fd = l2FdBuilder.setId(l2FdId).setParent(l2BdId).build();
158         rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.l2FloodDomainIid(tenantId, l2FdId), l2Fd, true);
159     }
160
161     private void addProviderPhysicalNetworkMapping(TenantId tenantId, ContextId ctxId, String segmentationId,
162             WriteTransaction writeTx) {
163         ProviderPhysicalNetworkAsL2FloodDomain provNetAsL2Fd =
164             new ProviderPhysicalNetworkAsL2FloodDomainBuilder().setTenantId(tenantId)
165             .setL2FloodDomainId(ctxId)
166             .setSegmentationId(segmentationId)
167             .build();
168         writeTx.put(LogicalDatastoreType.OPERATIONAL,
169                 NeutronGbpIidFactory.providerPhysicalNetworkAsL2FloodDomainIid(tenantId, ctxId), provNetAsL2Fd);
170     }
171
172     @Deprecated
173     @SuppressWarnings("checkstyle:LineLength") // Longer lines in this method are caused by long package names,
174                                                // this will be removed when deprecated classes will be cleared.
175     private void addProviderPhysicalNetworkMapping(TenantId tenantId, L2FloodDomainId l2FdId, String segmentationId,
176             WriteTransaction writeTx) {
177         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(
178                 tenantId)
179             .setL2FloodDomainId(new L2FloodDomainId(l2FdId.getValue()))
180             .setSegmentationId(segmentationId)
181             .build();
182         writeTx.put(LogicalDatastoreType.OPERATIONAL,
183                 NeutronGbpIidFactory.providerPhysicalNetworkAsL2FloodDomainIid(tenantId, l2FdId), provNetAsL2Fd);
184     }
185
186     @Override
187     public void onUpdated(Network oldItem, Network newItem, Neutron oldNeutron, Neutron newNeutron) {
188         LOG.trace("updated network - OLD: {} \nNEW: {}", oldItem, newItem);
189         // TODO only name can be updated
190     }
191
192     @Override
193     public void onDeleted(Network network, Neutron oldNeutron, Neutron newNeutron) {
194         LOG.trace("deleted network - {}", network);
195         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
196         TenantId tenantId = new TenantId(network.getTenantId().getValue());
197         ContextId id = new ContextId(network.getUuid().getValue());
198         Optional<ForwardingContext> potentialL2Fd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
199                 L2L3IidFactory.l2FloodDomainIid(tenantId, id), rwTx);
200         if (!potentialL2Fd.isPresent()) {
201             LOG.warn("Illegal state - l2-flood-domain {} does not exist.", id.getValue());
202             return;
203         }
204         Optional<ForwardingContext> potentialL2Bd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
205                 L2L3IidFactory.l2BridgeDomainIid(tenantId, id), rwTx);
206         if (!potentialL2Bd.isPresent()) {
207             LOG.warn("Illegal state - l2-bridge-domain {} does not exist.", id.getValue());
208             return;
209         }
210         Optional<ForwardingContext> potentialL3Ctx = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
211                 L2L3IidFactory.l3ContextIid(tenantId, id), rwTx);
212         if (!potentialL3Ctx.isPresent()) {
213             LOG.warn("Illegal state - l3-context {} does not exist.", id.getValue());
214             return;
215         }
216         removeTenantNetworkDomains(network, tenantId, rwTx);
217         DataStoreHelper.submitToDs(rwTx);
218     }
219
220     @Deprecated
221     private void removeTenantNetworkDomains(Network network, TenantId tenantId, ReadWriteTransaction rwTx) {
222         L2FloodDomainId l2FdId = new L2FloodDomainId(network.getUuid().getValue());
223         Optional<L2FloodDomain> potentialL2Fd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
224                 IidFactory.l2FloodDomainIid(tenantId, l2FdId), rwTx);
225         if (!potentialL2Fd.isPresent()) {
226             LOG.warn("Illegal state - l2-flood-domain {} does not exist.", l2FdId.getValue());
227             return;
228         }
229
230         L2BridgeDomainId l2BdId = new L2BridgeDomainId(l2FdId);
231         Optional<L2BridgeDomain> potentialL2Bd = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
232                 IidFactory.l2BridgeDomainIid(tenantId, l2BdId), rwTx);
233         if (!potentialL2Bd.isPresent()) {
234             LOG.warn("Illegal state - l2-bridge-domain {} does not exist.", l2BdId.getValue());
235             return;
236         }
237         L3ContextId l3CtxId = new L3ContextId(l2FdId);
238         Optional<L3Context> potentialL3Ctx = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
239                 IidFactory.l3ContextIid(tenantId, l3CtxId), rwTx);
240         if (!potentialL3Ctx.isPresent()) {
241             LOG.warn("Illegal state - l3-context {} does not exist.", l3CtxId.getValue());
242             return;
243         }
244     }
245 }