2 * Copyright (c) 2013, 2015 IBM Corporation and others. All rights reserved.
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
9 package org.opendaylight.netvirt.openstack.netvirt.translator.crud.impl;
11 import java.util.ArrayList;
12 import java.util.HashSet;
13 import java.util.List;
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;
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
41 NeutronRouterInterface(final DataBroker dataBroker) {
46 // IfNBRouterCRUD Interface methods
49 public boolean routerExists(String uuid) {
50 Router router = readMd(createInstanceIdentifier(toMd(uuid)));
51 return router != null;
55 public NeutronRouter getRouter(String uuid) {
56 Router router = readMd(createInstanceIdentifier(toMd(uuid)));
60 return fromMd(router);
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));
72 LOGGER.debug("Exiting getAllRouters, Found {} Routers", allRouters.size());
73 List<NeutronRouter> ans = new ArrayList<>();
74 ans.addAll(allRouters);
79 public boolean addRouter(NeutronRouter input) {
80 if (routerExists(input.getID())) {
88 public boolean removeRouter(String uuid) {
89 if (!routerExists(uuid)) {
92 return removeMd(toMd(uuid));
96 public boolean updateRouter(String uuid, NeutronRouter delta) {
97 if (!routerExists(uuid)) {
105 public boolean routerInUse(String routerUUID) {
106 return !routerExists(routerUUID);
110 protected Router toMd(NeutronRouter router) {
112 RouterBuilder routerBuilder = new RouterBuilder();
114 if (router.getRouterUUID() != null) {
115 routerBuilder.setUuid(toUuid(router.getRouterUUID()));
117 if (router.getName() != null) {
118 routerBuilder.setName(router.getName());
120 if (router.getTenantID() != null && !router.getTenantID().isEmpty()) {
121 routerBuilder.setTenantId(toUuid(router.getTenantID()));
123 if (router.getStatus() != null) {
124 routerBuilder.setStatus(router.getStatus());
126 if (router.getGatewayPortId() != null && !router.getGatewayPortId().isEmpty()) {
127 routerBuilder.setGatewayPortId(toUuid(router.getGatewayPortId()));
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()) {
136 routerBuilder.setRoutes(routes);
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());
154 builder.setExternalFixedIps(externalFixedIps);
156 externalGatewayInfo = builder.build();
158 routerBuilder.setExternalGatewayInfo(externalGatewayInfo);
160 if (router.getID() != null) {
161 routerBuilder.setUuid(toUuid(router.getID()));
163 LOGGER.warn("Attempting to write neutron router without UUID");
165 return routerBuilder.build();
169 protected InstanceIdentifier<Router> createInstanceIdentifier(Router router) {
170 return InstanceIdentifier.create(Neutron.class)
171 .child(Routers.class)
172 .child(Router.class, router.getKey());
175 protected InstanceIdentifier<Routers> createInstanceIdentifier() {
176 return InstanceIdentifier.create(Neutron.class).child(Routers.class);
180 protected Router toMd(String uuid) {
181 RouterBuilder routerBuilder = new RouterBuilder();
182 routerBuilder.setUuid(toUuid(uuid));
183 return routerBuilder.build();
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()));
197 if (router.getRoutes() != null) {
198 List<Routes> routes = new ArrayList<>();
199 for (Routes route : router.getRoutes()) {
202 result.setRoutes(routes);
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);
217 extGwInfo.setExternalFixedIPs(fixedIPs);
219 result.setExternalGatewayInfo(extGwInfo);
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);