Leaving deprecated API in Neutron-Mapper
[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 java.util.ArrayList;
13 import java.util.List;
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.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
19 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils.ForwardingCtx;
20 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.Utils;
21 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
22 import org.opendaylight.groupbasedpolicy.util.IidFactory;
23 import org.opendaylight.neutron.spi.NeutronSubnet;
24 import org.opendaylight.neutron.spi.NeutronSubnetIPAllocationPool;
25 import org.opendaylight.neutron.spi.NeutronSubnet_HostRoute;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.SubnetBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.Dhcpv6Base;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.Dhcpv6Off;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.Dhcpv6Slaac;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.Dhcpv6Stateful;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.Dhcpv6Stateless;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionBase;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionV4;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionV6;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnet.attributes.AllocationPools;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnet.attributes.HostRoutes;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 import com.google.common.base.Optional;
49 import com.google.common.base.Strings;
50 import com.google.common.collect.ImmutableBiMap;
51
52 public class NeutronSubnetAware implements MappingProcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet, NeutronSubnet> {
53
54     private final static Logger LOG = LoggerFactory.getLogger(NeutronSubnetAware.class);
55     private final DataBroker dataProvider;
56     private final NeutronNetworkDao networkDao;
57
58     public NeutronSubnetAware(DataBroker dataProvider, NeutronNetworkDao networkDao) {
59         this.dataProvider = checkNotNull(dataProvider);
60         this.networkDao = checkNotNull(networkDao);
61     }
62
63     // copied from Neutron's NeutronSubnetInterface
64     static final ImmutableBiMap<Class<? extends IpVersionBase>,Integer> IPV_MAP
65     = new ImmutableBiMap.Builder<Class<? extends IpVersionBase>,Integer>()
66     .put(IpVersionV4.class, 4)
67     .put(IpVersionV6.class, 6)
68     .build();
69
70     // copied from Neutron's NeutronSubnetInterface
71     private static final ImmutableBiMap<Class<? extends Dhcpv6Base>,String> DHCPV6_MAP
72     = new ImmutableBiMap.Builder<Class<? extends Dhcpv6Base>,String>()
73     .put(Dhcpv6Off.class,"off")
74     .put(Dhcpv6Stateful.class,"dhcpv6-stateful")
75     .put(Dhcpv6Slaac.class,"slaac")
76     .put(Dhcpv6Stateless.class,"dhcpv6-stateless")
77     .build();
78
79     @Override
80     public NeutronSubnet convertToNeutron(
81             org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet subnet) {
82         return toNeutron(subnet);
83     }
84
85     @SuppressWarnings("deprecation")
86     static NeutronSubnet toNeutron(
87             org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet subnet) {
88         NeutronSubnet result = new NeutronSubnet();
89         result.setName(subnet.getName());
90         result.setTenantID(subnet.getTenantId());
91         result.setNetworkUUID(subnet.getNetworkId().getValue());
92         result.setIpVersion(IPV_MAP.get(subnet.getIpVersion()));
93         result.setCidr(subnet.getCidr());
94         if (subnet.getGatewayIp() != null) {
95             result.setGatewayIP(String.valueOf(subnet.getGatewayIp().getValue()));
96         }
97         if (subnet.getIpv6RaMode() != null) {
98             result.setIpV6RaMode(DHCPV6_MAP.get(subnet.getIpv6RaMode()));
99         }
100         if (subnet.getIpv6AddressMode() != null) {
101             result.setIpV6AddressMode(DHCPV6_MAP.get(subnet.getIpv6AddressMode()));
102         }
103         result.setEnableDHCP(subnet.isEnableDhcp());
104         if (subnet.getAllocationPools() != null) {
105             List<NeutronSubnetIPAllocationPool> allocationPools = new ArrayList<NeutronSubnetIPAllocationPool>();
106             for (AllocationPools allocationPool : subnet.getAllocationPools()) {
107                 NeutronSubnetIPAllocationPool pool = new NeutronSubnetIPAllocationPool();
108                 pool.setPoolStart(allocationPool.getStart());
109                 pool.setPoolEnd(allocationPool.getEnd());
110                 allocationPools.add(pool);
111             }
112             result.setAllocationPools(allocationPools);
113         }
114         if (subnet.getDnsNameservers() != null) {
115             List<String> dnsNameServers = new ArrayList<String>();
116             for (IpAddress dnsNameServer : subnet.getDnsNameservers()) {
117                 dnsNameServers.add(String.valueOf(dnsNameServer.getValue()));
118             }
119             result.setDnsNameservers(dnsNameServers);
120         }
121         if (subnet.getHostRoutes() != null) {
122             List<NeutronSubnet_HostRoute> hostRoutes = new ArrayList<NeutronSubnet_HostRoute>();
123             for (HostRoutes hostRoute : subnet.getHostRoutes()) {
124                 NeutronSubnet_HostRoute nsHostRoute = new NeutronSubnet_HostRoute();
125                 nsHostRoute.setDestination(String.valueOf(hostRoute.getDestination().getValue()));
126                 nsHostRoute.setNextHop(String.valueOf(hostRoute.getNexthop().getValue()));
127                 hostRoutes.add(nsHostRoute);
128             }
129             result.setHostRoutes(hostRoutes);
130         }
131         result.setID(subnet.getUuid().getValue());
132         return result;
133     }
134
135     @Override
136     public int canCreate(NeutronSubnet subnet) {
137         LOG.trace("canCreate subnet - {}", subnet);
138         // nothing to consider
139         return StatusCode.OK;
140     }
141
142     @Override
143     public void created(NeutronSubnet neutronSubnet) {
144         LOG.trace("created subnet - {}", neutronSubnet);
145         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
146         SubnetId subnetId = new SubnetId(Utils.normalizeUuid(neutronSubnet.getID()));
147         TenantId tenantId = new TenantId(Utils.normalizeUuid(neutronSubnet.getTenantID()));
148         Subnet subnet = createSubnet(neutronSubnet);
149         rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.subnetIid(tenantId, subnetId), subnet, true);
150         DataStoreHelper.submitToDs(rwTx);
151
152         rwTx = dataProvider.newReadWriteTransaction();
153         if (networkDao.isExternalNetwork(neutronSubnet.getNetworkUUID())) {
154             LOG.trace("created - adding L3 Endpoint");
155             L2FloodDomainId l2FdId = new L2FloodDomainId(subnet.getParent().getValue());
156             ForwardingCtx fwCtx = MappingUtils.createForwardingContext(tenantId, l2FdId, rwTx);
157             IpAddress defaultGateway = Utils.createIpAddress(neutronSubnet.getGatewayIP());
158             //Create L3Endpoint for defaultGateway
159             NetworkDomainId containment = new NetworkDomainId(neutronSubnet.getID());
160             NeutronPortAware.addL3EndpointForExternalGateway(tenantId, fwCtx.getL3Context().getId(), defaultGateway, containment ,rwTx);
161             DataStoreHelper.submitToDs(rwTx);
162         }
163     }
164
165     private Subnet createSubnet(NeutronSubnet neutronSubnet) {
166         SubnetBuilder subnetBuilder = new SubnetBuilder();
167         subnetBuilder.setId(new SubnetId(neutronSubnet.getID()));
168         subnetBuilder.setParent(new ContextId(neutronSubnet.getNetworkUUID()));
169         if (!Strings.isNullOrEmpty(neutronSubnet.getName())) {
170             subnetBuilder.setName(new Name(neutronSubnet.getName()));
171         }
172         subnetBuilder.setIpPrefix(Utils.createIpPrefix(neutronSubnet.getCidr()));
173         return subnetBuilder.build();
174     }
175
176     @Override
177     public int canUpdate(NeutronSubnet delta, NeutronSubnet original) {
178         LOG.trace("canUpdate subnet - delta: {} original: {}", delta, original);
179         // nothing to consider
180         return StatusCode.OK;
181     }
182
183     @Override
184     public void updated(NeutronSubnet subnet) {
185         LOG.trace("updated subnet - {}", subnet);
186         created(subnet);
187     }
188
189     @Override
190     public int canDelete(NeutronSubnet subnet) {
191         LOG.trace("canDelete subnet - {}", subnet);
192         // nothing to consider
193         return StatusCode.OK;
194     }
195
196     @Override
197     public void deleted(NeutronSubnet neutronSubnet) {
198         LOG.trace("deleted subnet - {}", neutronSubnet);
199         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
200         SubnetId subnetId = new SubnetId(Utils.normalizeUuid(neutronSubnet.getID()));
201         TenantId tenantId = new TenantId(Utils.normalizeUuid(neutronSubnet.getTenantID()));
202         Optional<Subnet> potentialSubnet = DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
203                 IidFactory.subnetIid(tenantId, subnetId), rwTx);
204         if (!potentialSubnet.isPresent()) {
205             LOG.warn("Illegal state - subnet {} does not exist.", subnetId.getValue());
206             rwTx.cancel();
207             return;
208         }
209         DataStoreHelper.submitToDs(rwTx);
210     }
211 }