Add blueprint wiring for openstack/net-virt
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / netvirt / openstack / netvirt / translator / crud / impl / NeutronRouterInterface.java
1 /*
2  * Copyright (c) 2013, 2015 IBM Corporation 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
9 package org.opendaylight.netvirt.openstack.netvirt.translator.crud.impl;
10
11 import java.util.ArrayList;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Set;
15 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronRouterCRUD;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronRouter;
18 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronRouter_NetworkReference;
19 import org.opendaylight.netvirt.openstack.netvirt.translator.Neutron_IPs;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.l3.attributes.Routes;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.RouterBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router.ExternalGatewayInfo;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router.ExternalGatewayInfoBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router.external_gateway_info.ExternalFixedIps;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router.external_gateway_info.ExternalFixedIpsBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.osgi.framework.BundleContext;
32 import org.osgi.framework.ServiceRegistration;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 public class NeutronRouterInterface extends  AbstractNeutronInterface<Router, NeutronRouter> implements INeutronRouterCRUD {
37     private static final Logger LOGGER = LoggerFactory.getLogger(NeutronRouterInterface.class);
38     // methods needed for creating caches
39
40
41     NeutronRouterInterface(final DataBroker dataBroker) {
42         super(dataBroker);
43     }
44
45
46     // IfNBRouterCRUD Interface methods
47
48     @Override
49     public boolean routerExists(String uuid) {
50         Router router = readMd(createInstanceIdentifier(toMd(uuid)));
51         return router != null;
52     }
53
54     @Override
55     public NeutronRouter getRouter(String uuid) {
56         Router router = readMd(createInstanceIdentifier(toMd(uuid)));
57         if (router == null) {
58             return null;
59         }
60         return fromMd(router);
61     }
62
63     @Override
64     public List<NeutronRouter> getAllRouters() {
65         Set<NeutronRouter> allRouters = new HashSet<>();
66         Routers routers = readMd(createInstanceIdentifier());
67         if (routers != null) {
68             for (Router router: routers.getRouter()) {
69                 allRouters.add(fromMd(router));
70             }
71         }
72         LOGGER.debug("Exiting getAllRouters, Found {} Routers", allRouters.size());
73         List<NeutronRouter> ans = new ArrayList<>();
74         ans.addAll(allRouters);
75         return ans;
76     }
77
78     @Override
79     public boolean addRouter(NeutronRouter input) {
80         if (routerExists(input.getID())) {
81             return false;
82         }
83         addMd(input);
84         return true;
85     }
86
87     @Override
88     public boolean removeRouter(String uuid) {
89         if (!routerExists(uuid)) {
90             return false;
91         }
92         return removeMd(toMd(uuid));
93     }
94
95     @Override
96     public boolean updateRouter(String uuid, NeutronRouter delta) {
97         if (!routerExists(uuid)) {
98             return false;
99         }
100         updateMd(delta);
101         return true;
102     }
103
104     @Override
105     public boolean routerInUse(String routerUUID) {
106         return !routerExists(routerUUID);
107     }
108
109     @Override
110     protected Router toMd(NeutronRouter router) {
111
112         RouterBuilder routerBuilder = new RouterBuilder();
113
114         if (router.getRouterUUID() != null) {
115             routerBuilder.setUuid(toUuid(router.getRouterUUID()));
116         }
117         if (router.getName() != null) {
118             routerBuilder.setName(router.getName());
119         }
120         if (router.getTenantID() != null && !router.getTenantID().isEmpty()) {
121             routerBuilder.setTenantId(toUuid(router.getTenantID()));
122         }
123         if (router.getStatus() != null) {
124             routerBuilder.setStatus(router.getStatus());
125         }
126         if (router.getGatewayPortId() != null && !router.getGatewayPortId().isEmpty()) {
127             routerBuilder.setGatewayPortId(toUuid(router.getGatewayPortId()));
128         }
129         routerBuilder.setAdminStateUp(router.getAdminStateUp());
130         routerBuilder.setDistributed(router.getDistributed());
131         if (router.getRoutes() != null) {
132             List<Routes> routes = new ArrayList<>();
133             for (Routes route : router.getRoutes()) {
134                 routes.add(route);
135             }
136             routerBuilder.setRoutes(routes);
137         }
138         if (router.getExternalGatewayInfo() != null) {
139             ExternalGatewayInfo externalGatewayInfo = null;
140             List<NeutronRouter_NetworkReference> neutronRouter_NetworkReferences = new ArrayList<>();
141             neutronRouter_NetworkReferences.add(router.getExternalGatewayInfo());
142             for (NeutronRouter_NetworkReference externalGatewayInfos : neutronRouter_NetworkReferences) {
143                 ExternalGatewayInfoBuilder builder = new ExternalGatewayInfoBuilder();
144                 builder.setEnableSnat(externalGatewayInfos.getEnableSNAT());
145                 builder.setExternalNetworkId(toUuid(externalGatewayInfos.getNetworkID()));
146                 if (externalGatewayInfos.getExternalFixedIPs() != null) {
147                     List<ExternalFixedIps> externalFixedIps = new ArrayList<>();
148                     for (Neutron_IPs eIP : externalGatewayInfos.getExternalFixedIPs()) {
149                         ExternalFixedIpsBuilder eFixedIpBuilder = new ExternalFixedIpsBuilder();
150                         eFixedIpBuilder.setIpAddress(new IpAddress(eIP.getIpAddress().toCharArray()));
151                         eFixedIpBuilder.setSubnetId(toUuid(eIP.getSubnetUUID()));
152                         externalFixedIps.add(eFixedIpBuilder.build());
153                     }
154                     builder.setExternalFixedIps(externalFixedIps);
155                 }
156                 externalGatewayInfo = builder.build();
157             }
158             routerBuilder.setExternalGatewayInfo(externalGatewayInfo);
159         }
160         if (router.getID() != null) {
161             routerBuilder.setUuid(toUuid(router.getID()));
162         } else {
163             LOGGER.warn("Attempting to write neutron router without UUID");
164         }
165         return routerBuilder.build();
166     }
167
168     @Override
169     protected InstanceIdentifier<Router> createInstanceIdentifier(Router router) {
170         return InstanceIdentifier.create(Neutron.class)
171                  .child(Routers.class)
172                  .child(Router.class, router.getKey());
173     }
174
175     protected InstanceIdentifier<Routers> createInstanceIdentifier() {
176         return InstanceIdentifier.create(Neutron.class).child(Routers.class);
177     }
178
179     @Override
180     protected Router toMd(String uuid) {
181         RouterBuilder routerBuilder = new RouterBuilder();
182         routerBuilder.setUuid(toUuid(uuid));
183         return routerBuilder.build();
184     }
185
186     public NeutronRouter fromMd(Router router) {
187         NeutronRouter result = new NeutronRouter();
188         result.setID(String.valueOf(router.getUuid().getValue()));
189         result.setName(router.getName());
190         result.setTenantID(String.valueOf(router.getTenantId().getValue()));
191         result.setAdminStateUp(router.isAdminStateUp());
192         result.setStatus(router.getStatus());
193         result.setDistributed(router.isDistributed());
194         if (router.getGatewayPortId() != null) {
195             result.setGatewayPortId(String.valueOf(router.getGatewayPortId().getValue()));
196         }
197         if (router.getRoutes() != null) {
198             List<Routes> routes = new ArrayList<>();
199             for (Routes route : router.getRoutes()) {
200                 routes.add(route);
201             }
202             result.setRoutes(routes);
203         }
204
205         if (router.getExternalGatewayInfo() != null) {
206             NeutronRouter_NetworkReference extGwInfo = new NeutronRouter_NetworkReference();
207             extGwInfo.setNetworkID(String.valueOf(router.getExternalGatewayInfo().getExternalNetworkId().getValue()));
208             extGwInfo.setEnableSNAT(router.getExternalGatewayInfo().isEnableSnat());
209             if (router.getExternalGatewayInfo().getExternalFixedIps() != null) {
210                 List<Neutron_IPs> fixedIPs = new ArrayList<>();
211                 for (ExternalFixedIps mdFixedIP : router.getExternalGatewayInfo().getExternalFixedIps()) {
212                      Neutron_IPs fixedIP = new Neutron_IPs();
213                      fixedIP.setSubnetUUID(String.valueOf(mdFixedIP.getSubnetId().getValue()));
214                      fixedIP.setIpAddress(String.valueOf(mdFixedIP.getIpAddress().getValue()));
215                      fixedIPs.add(fixedIP);
216                 }
217                 extGwInfo.setExternalFixedIPs(fixedIPs);
218             }
219             result.setExternalGatewayInfo(extGwInfo);
220         }
221
222         return result;
223     }
224
225     public static void registerNewInterface(BundleContext context,
226             final DataBroker dataBroker,
227             List<ServiceRegistration<?>> registrations) {
228         NeutronRouterInterface neutronRouterInterface = new NeutronRouterInterface(dataBroker);
229         ServiceRegistration<INeutronRouterCRUD> neutronRouterInterfaceRegistration = context
230                 .registerService(INeutronRouterCRUD.class,neutronRouterInterface, null);
231         if (neutronRouterInterfaceRegistration != null) {
232             registrations.add(neutronRouterInterfaceRegistration);
233         }
234     }
235 }