Bug 5212 - Neutron-mapper has dependency on Ofoverlay renderer
[groupbasedpolicy.git] / neutron-mapper / src / main / java / org / opendaylight / groupbasedpolicy / neutron / mapper / mapping / NeutronSubnetAware.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 org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
16 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils.ForwardingCtx;
17 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.Utils;
18 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
19 import org.opendaylight.groupbasedpolicy.util.IidFactory;
20 import org.opendaylight.neutron.spi.INeutronSubnetAware;
21 import org.opendaylight.neutron.spi.NeutronSubnet;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.SubnetBuilder;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 import com.google.common.base.Optional;
35 import com.google.common.base.Strings;
36
37 public class NeutronSubnetAware implements INeutronSubnetAware {
38
39     private final static Logger LOG = LoggerFactory.getLogger(NeutronSubnetAware.class);
40     private final DataBroker dataProvider;
41     private final NeutronNetworkDao networkDao;
42
43     public NeutronSubnetAware(DataBroker dataProvider, NeutronNetworkDao networkDao) {
44         this.dataProvider = checkNotNull(dataProvider);
45         this.networkDao = checkNotNull(networkDao);
46     }
47
48     /**
49      * @see org.opendaylight.neutron.spi.INeutronSubnetAware#canCreateSubnet(org.opendaylight.neutron.spi.NeutronSubnet)
50      */
51     @Override
52     public int canCreateSubnet(NeutronSubnet subnet) {
53         LOG.trace("canCreateSubnet - {}", subnet);
54         // nothing to consider
55         return StatusCode.OK;
56     }
57
58     /**
59      * @see org.opendaylight.neutron.spi.INeutronSubnetAware#neutronSubnetCreated(org.opendaylight.neutron.spi.NeutronSubnet)
60      */
61     @Override
62     public void neutronSubnetCreated(NeutronSubnet neutronSubnet) {
63         LOG.trace("neutronSubnetCreated - {}", neutronSubnet);
64         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
65         SubnetId subnetId = new SubnetId(Utils.normalizeUuid(neutronSubnet.getID()));
66         TenantId tenantId = new TenantId(Utils.normalizeUuid(neutronSubnet.getTenantID()));
67         Subnet subnet = createSubnet(neutronSubnet);
68         rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.subnetIid(tenantId, subnetId), subnet, true);
69         DataStoreHelper.submitToDs(rwTx);
70
71         rwTx = dataProvider.newReadWriteTransaction();
72         if (networkDao.isExternalNetwork(neutronSubnet.getNetworkUUID())) {
73             LOG.trace("neutronSubnetCreated - adding L3 Endpoint");
74             L2FloodDomainId l2FdId = new L2FloodDomainId(subnet.getParent().getValue());
75             ForwardingCtx fwCtx = MappingUtils.createForwardingContext(tenantId, l2FdId, rwTx);
76             IpAddress defaultGateway = Utils.createIpAddress(neutronSubnet.getGatewayIP());
77             //Create L3Endpoint for defaultGateway
78             NetworkDomainId containment = new NetworkDomainId(neutronSubnet.getID());
79             NeutronPortAware.addL3EndpointForExternalGateway(tenantId, fwCtx.getL3Context().getId(), defaultGateway, containment ,rwTx);
80             DataStoreHelper.submitToDs(rwTx);
81         }
82     }
83
84     private Subnet createSubnet(NeutronSubnet neutronSubnet) {
85         SubnetBuilder subnetBuilder = new SubnetBuilder();
86         subnetBuilder.setId(new SubnetId(neutronSubnet.getID()));
87         subnetBuilder.setParent(new ContextId(neutronSubnet.getNetworkUUID()));
88         if (!Strings.isNullOrEmpty(neutronSubnet.getName())) {
89             subnetBuilder.setName(new Name(neutronSubnet.getName()));
90         }
91         subnetBuilder.setIpPrefix(Utils.createIpPrefix(neutronSubnet.getCidr()));
92         return subnetBuilder.build();
93     }
94
95     /**
96      * @see org.opendaylight.neutron.spi.INeutronSubnetAware#canUpdateSubnet(org.opendaylight.neutron.spi.NeutronSubnet,
97      *      org.opendaylight.neutron.spi.NeutronSubnet)
98      */
99     @Override
100     public int canUpdateSubnet(NeutronSubnet delta, NeutronSubnet original) {
101         LOG.trace("canUpdateSubnet - delta: {} original: {}", delta, original);
102         // nothing to consider
103         return StatusCode.OK;
104     }
105
106     /**
107      * @see org.opendaylight.neutron.spi.INeutronSubnetAware#neutronSubnetUpdated(org.opendaylight.neutron.spi.NeutronSubnet)
108      */
109     @Override
110     public void neutronSubnetUpdated(NeutronSubnet subnet) {
111         LOG.trace("neutronSubnetUpdated - {}", subnet);
112         neutronSubnetCreated(subnet);
113     }
114
115     /**
116      * @see org.opendaylight.neutron.spi.INeutronSubnetAware#canDeleteSubnet(org.opendaylight.neutron.spi.NeutronSubnet)
117      */
118     @Override
119     public int canDeleteSubnet(NeutronSubnet subnet) {
120         LOG.trace("canDeleteSubnet - {}", subnet);
121         // nothing to consider
122         return StatusCode.OK;
123     }
124
125     /**
126      * @see org.opendaylight.neutron.spi.INeutronSubnetAware#neutronSubnetDeleted(org.opendaylight.neutron.spi.NeutronSubnet)
127      */
128     @Override
129     public void neutronSubnetDeleted(NeutronSubnet neutronSubnet) {
130         LOG.trace("neutronSubnetDeleted - {}", neutronSubnet);
131         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
132         SubnetId subnetId = new SubnetId(Utils.normalizeUuid(neutronSubnet.getID()));
133         TenantId tenantId = new TenantId(Utils.normalizeUuid(neutronSubnet.getTenantID()));
134         Optional<Subnet> potentialSubnet = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
135                 IidFactory.subnetIid(tenantId, subnetId), rwTx);
136         if (!potentialSubnet.isPresent()) {
137             LOG.warn("Illegal state - subnet {} does not exist.", subnetId.getValue());
138             rwTx.cancel();
139             return;
140         }
141         DataStoreHelper.submitToDs(rwTx);
142     }
143 }