2 * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. 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
8 package org.opendaylight.netvirt.neutronvpn;
10 import java.util.ArrayList;
11 import java.util.HashSet;
12 import java.util.List;
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.genius.mdsalutil.MDSALUtil;
17 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ExternalNetworks;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.RoutersBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.RoutersKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.networks.Networks;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.networks.NetworksBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.networks.NetworksKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ProviderTypes;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router.ExternalGatewayInfo;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router.external_gateway_info.ExternalFixedIps;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
32 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
36 import com.google.common.base.Optional;
38 public class NeutronvpnNatManager implements AutoCloseable {
39 private static final Logger LOG = LoggerFactory.getLogger(NeutronvpnNatManager.class);
40 private final DataBroker dataBroker;
41 private static final int EXTERNAL_NO_CHANGE = 0;
42 private static final int EXTERNAL_ADDED = 1;
43 private static final int EXTERNAL_REMOVED = 2;
44 private static final int EXTERNAL_CHANGED = 3;
47 * @param dataBroker - dataBroker reference
49 public NeutronvpnNatManager(final DataBroker dataBroker) {
50 this.dataBroker = dataBroker;
54 public void close() throws Exception {
55 LOG.info("{} close", getClass().getSimpleName());
58 public void handleExternalNetworkForRouter(Router original, Router update) {
60 Uuid routerId = update.getUuid();
61 Uuid origExtNetId = null;
62 Uuid updExtNetId = null;
64 LOG.trace("handleExternalNetwork for router " + routerId);
65 int ext_net_changed = externalNetworkChanged(original, update);
66 if (ext_net_changed != EXTERNAL_NO_CHANGE) {
67 if (ext_net_changed == EXTERNAL_ADDED) {
68 updExtNetId = update.getExternalGatewayInfo().getExternalNetworkId();
69 LOG.trace("External Network " + updExtNetId.getValue() +
70 " addition detected for router " + routerId.getValue());
71 addExternalNetworkToRouter(update);
74 if (ext_net_changed == EXTERNAL_REMOVED) {
75 origExtNetId = original.getExternalGatewayInfo().getExternalNetworkId();
76 LOG.trace("External Network removal detected " +
77 "for router " + routerId.getValue());
78 removeExternalNetworkFromRouter(origExtNetId, update);
79 //gateway mac unset handled as part of gateway clear deleting top-level routers node
82 origExtNetId = original.getExternalGatewayInfo().getExternalNetworkId();
83 updExtNetId = update.getExternalGatewayInfo().getExternalNetworkId();
84 LOG.trace("External Network changed from "+ origExtNetId.getValue() + " to "
85 + updExtNetId.getValue() + " for router " + routerId.getValue());
86 removeExternalNetworkFromRouter(origExtNetId, update);
87 addExternalNetworkToRouter(update);
91 if (snatSettingChanged(original, update)) {
92 LOG.trace("SNAT settings on gateway changed " +
93 "for router " + routerId.getValue());
94 handleSnatSettingChangeForRouter(update, dataBroker);
97 if (externalFixedIpsChanged(original, update)) {
98 LOG.trace("External Fixed IPs changed " +
99 "for router " + routerId.getValue());
100 handleExternalFixedIpsForRouter(update, dataBroker);
104 private int externalNetworkChanged(Router original, Router update) {
105 String orig_ext_net = null;
106 String new_ext_net = null;
107 if (original != null && original.getExternalGatewayInfo() != null) {
108 orig_ext_net = original.getExternalGatewayInfo().getExternalNetworkId().getValue();
111 if (update != null && update.getExternalGatewayInfo() != null) {
112 new_ext_net = update.getExternalGatewayInfo().getExternalNetworkId().getValue();
115 if (orig_ext_net == null) {
116 if (new_ext_net == null) {
117 return EXTERNAL_NO_CHANGE;
119 return EXTERNAL_ADDED;
121 if (new_ext_net == null) {
122 return EXTERNAL_REMOVED;
124 if (!orig_ext_net.equals(new_ext_net)) {
125 return EXTERNAL_CHANGED;
127 return EXTERNAL_NO_CHANGE;
131 private boolean snatSettingChanged(Router orig, Router update) {
132 ExternalGatewayInfo orig_ext_gw = null;
133 ExternalGatewayInfo new_ext_gw = null;
134 if (orig != null && orig.getExternalGatewayInfo() != null) {
135 orig_ext_gw = orig.getExternalGatewayInfo();
138 if (update != null && update.getExternalGatewayInfo() != null) {
139 new_ext_gw = update.getExternalGatewayInfo();
142 if (orig_ext_gw == null) {
143 if (new_ext_gw != null) {
146 } else if (new_ext_gw == null || orig_ext_gw.isEnableSnat() != new_ext_gw.isEnableSnat()) {
152 private boolean externalFixedIpsChanged(Router orig, Router update) {
153 ExternalGatewayInfo orig_ext_gw = null;
154 ExternalGatewayInfo new_ext_gw = null;
155 if (orig != null && orig.getExternalGatewayInfo() != null) {
156 orig_ext_gw = orig.getExternalGatewayInfo();
159 if (update != null && update.getExternalGatewayInfo() != null) {
160 new_ext_gw = update.getExternalGatewayInfo();
163 if (orig_ext_gw == null && new_ext_gw != null && new_ext_gw.getExternalFixedIps() != null && !new_ext_gw
164 .getExternalFixedIps().isEmpty()) {
168 if (new_ext_gw == null && orig_ext_gw != null && orig_ext_gw.getExternalFixedIps() != null && !orig_ext_gw
169 .getExternalFixedIps().isEmpty()) {
173 if (orig_ext_gw != null && new_ext_gw != null) {
174 if (orig_ext_gw.getExternalFixedIps() != null) {
175 if (!orig_ext_gw.getExternalFixedIps().isEmpty()) {
176 if (new_ext_gw.getExternalFixedIps() != null && !new_ext_gw.getExternalFixedIps().isEmpty()) {
177 List<ExternalFixedIps> orig_ext_fixed_ips = orig_ext_gw.getExternalFixedIps();
178 HashSet<String> orig_fixed_ip_set = new HashSet<String>();
179 for (ExternalFixedIps fixed_ip : orig_ext_fixed_ips) {
180 orig_fixed_ip_set.add(fixed_ip.getIpAddress().getIpv4Address().getValue());
182 List<ExternalFixedIps> new_ext_fixed_ips = new_ext_gw.getExternalFixedIps();
183 HashSet<String> upd_fixed_ip_set = new HashSet<String>();
184 for (ExternalFixedIps fixed_ip : new_ext_fixed_ips) {
185 upd_fixed_ip_set.add(fixed_ip.getIpAddress().getIpv4Address().getValue());
187 // returns true if external subnets have changed
188 return (!orig_fixed_ip_set.equals(upd_fixed_ip_set)) ? true : false;
191 } else if (new_ext_gw.getExternalFixedIps() != null && !new_ext_gw.getExternalFixedIps().isEmpty()){
194 } else if (new_ext_gw.getExternalFixedIps() != null && !new_ext_gw.getExternalFixedIps().isEmpty()) {
201 public void addExternalNetwork(Network net) {
202 Uuid extNetId = net.getUuid();
204 // Create and add Networks object for this External Network to the ExternalNetworks list
205 InstanceIdentifier<Networks> netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class).
206 child(Networks.class, new NetworksKey(extNetId)).build();
209 LOG.trace(" Creating/Updating a new Networks node: " + extNetId.getValue());
210 Optional<Networks> optionalNets = NeutronvpnUtils.read(dataBroker,
211 LogicalDatastoreType.CONFIGURATION,
213 if (optionalNets.isPresent()) {
214 LOG.error("External Network " + extNetId.getValue() +
215 " already detected to be present");
218 ProviderTypes provType = NeutronvpnUtils.getProviderNetworkType(net);
219 if (provType == null){
220 LOG.error("Unable to get Network Provider Type for network {}",net.getUuid());
223 NetworksBuilder builder = null;
224 builder = new NetworksBuilder().setKey(new NetworksKey(extNetId)).setId(extNetId);
225 builder.setVpnid(NeutronvpnUtils.getVpnForNetwork(dataBroker, extNetId));
226 builder.setRouterIds(new ArrayList<Uuid>());
227 builder.setProviderNetworkType(provType);
229 Networks networkss = builder.build();
230 // Add Networks object to the ExternalNetworks list
231 LOG.trace("Creating externalnetworks " + networkss);
232 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier, networkss);
233 LOG.trace("Wrote externalnetwork successfully to CONFIG Datastore");
234 } catch (Exception ex) {
235 LOG.error("Creation of External Network " +
236 extNetId.getValue() + " failed " + ex.getMessage());
240 public void removeExternalNetwork(Network net) {
241 Uuid extNetId = net.getUuid();
243 // Create and add Networks object for this External Network to the ExternalNetworks list
244 InstanceIdentifier<Networks> netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class).
245 child(Networks.class, new NetworksKey(extNetId)).build();
248 Optional<Networks> optionalNets = NeutronvpnUtils.read(dataBroker,
249 LogicalDatastoreType.CONFIGURATION,
251 LOG.trace("Removing Networks node: " + extNetId.getValue());
252 if (!optionalNets.isPresent()) {
253 LOG.info("External Network " + extNetId.getValue() +
254 " not available in the datastore");
257 // Delete Networks object from the ExternalNetworks list
258 LOG.trace("Deleting External Network " + extNetId.getValue());
259 MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier);
260 LOG.trace("Deleted External Network " + extNetId.getValue() +
261 " successfully from CONFIG Datastore");
263 } catch (Exception ex) {
264 LOG.error("Deletion of External Network " + extNetId.getValue() +
265 " failed" + ex.getMessage());
269 private void addExternalNetworkToRouter(Router update) {
270 Uuid routerId = update.getUuid();
271 Uuid extNetId = update.getExternalGatewayInfo().getExternalNetworkId();
274 Network input = NeutronvpnUtils.getNeutronNetwork(dataBroker, extNetId);
275 ProviderTypes providerNwType = NeutronvpnUtils.getProviderNetworkType(input);
276 if (providerNwType == null) {
277 LOG.error("Unable to get Network Provider Type for network {} and uuid {}", input.getName(), input.getUuid());
280 // Add this router to the ExtRouters list
281 addExternalRouter(update, dataBroker);
283 // Create and add Networks object for this External Network to the ExternalNetworks list
284 InstanceIdentifier<Networks> netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class).
285 child(Networks.class, new NetworksKey(extNetId)).build();
287 Optional<Networks> optionalNets = NeutronvpnUtils.read(dataBroker,
288 LogicalDatastoreType.CONFIGURATION,
290 NetworksBuilder builder = null;
291 if (optionalNets.isPresent()) {
292 builder = new NetworksBuilder(optionalNets.get());
294 LOG.error("External Network " + extNetId.getValue() +
295 " not present in the NVPN datamodel");
298 List<Uuid> rtrList = builder.getRouterIds();
299 if (rtrList == null) {
300 rtrList = new ArrayList<Uuid>();
302 rtrList.add(routerId);
303 builder.setRouterIds(rtrList);
304 if (providerNwType != ProviderTypes.GRE) {
305 builder.setVpnid(extNetId);
308 Networks networkss = builder.build();
309 // Add Networks object to the ExternalNetworks list
310 LOG.trace("Updating externalnetworks " + networkss);
311 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier, networkss);
312 LOG.trace("Updated externalnetworks successfully to CONFIG Datastore");
313 } catch (Exception ex) {
314 LOG.error("Creation of externalnetworks failed for " + extNetId.getValue() +
315 " with exception " + ex.getMessage());
319 public void removeExternalNetworkFromRouter(Uuid origExtNetId, Router update) {
320 Uuid routerId = update.getUuid();
322 // Remove the router to the ExtRouters list
323 removeExternalRouter(origExtNetId, update, dataBroker);
325 // Remove the router from the ExternalNetworks list
326 InstanceIdentifier<Networks> netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class).
327 child(Networks.class, new NetworksKey(origExtNetId)).build();
330 Optional<Networks> optionalNets = NeutronvpnUtils.read(dataBroker,
331 LogicalDatastoreType.CONFIGURATION,
333 LOG.trace("Removing a router from External Networks node: " +
334 origExtNetId.getValue());
335 if (optionalNets.isPresent()) {
336 NetworksBuilder builder = new NetworksBuilder(optionalNets.get());
337 List<Uuid> rtrList = builder.getRouterIds();
338 if (rtrList != null) {
339 rtrList.remove(routerId);
340 builder.setRouterIds(rtrList);
341 Networks networkss = builder.build();
342 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier, networkss);
343 LOG.trace("Removed router " + routerId + " from externalnetworks " + origExtNetId.getValue());
346 } catch (Exception ex) {
347 LOG.error("Removing externalnetwork " + origExtNetId.getValue() +
348 " from router " + routerId + " failed " + ex.getMessage());
352 public void addExternalNetworkToVpn(Network network, Uuid vpnId) {
353 Uuid extNetId = network.getUuid();
355 // Create and add Networks object for this External Network to the ExternalNetworks list
356 InstanceIdentifier<Networks> netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class).
357 child(Networks.class, new NetworksKey(extNetId)).build();
360 Optional<Networks> optionalNets = NeutronvpnUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
362 LOG.trace("Adding vpn-id into Networks node: " + extNetId.getValue());
363 NetworksBuilder builder = null;
364 if (optionalNets.isPresent()) {
365 builder = new NetworksBuilder(optionalNets.get());
367 LOG.error("External Network " + extNetId.getValue() +
368 " not present in the NVPN datamodel");
371 builder.setVpnid(vpnId);
372 Networks networkss = builder.build();
373 // Add Networks object to the ExternalNetworks list
374 LOG.trace("Setting VPN-ID for externalnetworks " + networkss);
375 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier, networkss);
376 LOG.trace("Wrote with VPN-ID successfully to CONFIG Datastore");
378 } catch (Exception ex) {
379 LOG.error("Attaching VPN-ID to externalnetwork " + extNetId.getValue() +
380 " failed with " + ex.getMessage());
384 public void removeExternalNetworkFromVpn(Network network) {
385 Uuid extNetId = network.getUuid();
387 // Create and add Networks object for this External Network to the ExternalNetworks list
388 InstanceIdentifier<Networks> netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class).
389 child(Networks.class, new NetworksKey(extNetId)).build();
392 Optional<Networks> optionalNets = NeutronvpnUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
394 LOG.trace("Removing vpn-id from Networks node: " + extNetId.getValue());
395 NetworksBuilder builder = null;
396 if (optionalNets.isPresent()) {
397 builder = new NetworksBuilder(optionalNets.get());
399 LOG.error("External Network " + extNetId.getValue() + " not present in the NVPN datamodel");
403 builder.setVpnid(null);
404 Networks networkss = builder.build();
405 // Add Networks object to the ExternalNetworks list
406 LOG.trace("Remove vpn-id for externalnetwork " + networkss);
407 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier, networkss);
408 LOG.trace("Updated extnetworks successfully to CONFIG Datastore");
410 } catch (Exception ex) {
411 LOG.error("Removing VPN-ID from externalnetworks " + extNetId.getValue() +
412 " failed with " + ex.getMessage());
416 public void addExternalRouter(Router update, DataBroker broker) {
417 Uuid routerId = update.getUuid();
418 Uuid extNetId = update.getExternalGatewayInfo().getExternalNetworkId();
419 Uuid gatewayPortId = update.getGatewayPortId();
421 // Create and add Routers object for this Router to the ExtRouters list
423 // Create a Routers object
424 InstanceIdentifier<Routers> routersIdentifier = NeutronvpnUtils.buildExtRoutersIdentifier(routerId);
427 Network input = NeutronvpnUtils.getNeutronNetwork(dataBroker, extNetId);
428 ProviderTypes providerNwType = NeutronvpnUtils.getProviderNetworkType(input);
429 if (providerNwType == null) {
430 LOG.error("Unable to get Network Provider Type for network {} and uuid{}", input.getName(), input.getUuid());
433 Optional<Routers> optionalRouters = NeutronvpnUtils.read(broker,
434 LogicalDatastoreType.CONFIGURATION,
436 LOG.trace("Creating/Updating a new Routers node: " + routerId.getValue());
437 RoutersBuilder builder = null;
438 if (optionalRouters.isPresent()) {
439 builder = new RoutersBuilder(optionalRouters.get());
441 builder = new RoutersBuilder().setKey(new RoutersKey(routerId.getValue()));
443 builder.setRouterName(routerId.getValue());
444 builder.setNetworkId(extNetId);
445 builder.setEnableSnat(update.getExternalGatewayInfo().isEnableSnat());
447 ArrayList<String> ext_fixed_ips = new ArrayList<String>();
448 for (ExternalFixedIps fixed_ips : update.getExternalGatewayInfo().getExternalFixedIps()) {
449 ext_fixed_ips.add(fixed_ips.getIpAddress().getIpv4Address().getValue());
451 builder.setExternalIps(ext_fixed_ips);
453 if (gatewayPortId != null) {
454 LOG.trace("Setting/Updating gateway Mac for router {}", routerId.getValue());
455 Port port = NeutronvpnUtils.getNeutronPort(broker, gatewayPortId);
456 if (port != null && port.getDeviceOwner().equals(NeutronConstants.DEVICE_OWNER_GATEWAY_INF)) {
457 builder.setExtGwMacAddress(port.getMacAddress().getValue());
460 List<Uuid> subList = NeutronvpnUtils.getNeutronRouterSubnetIds(broker, routerId);
461 builder.setSubnetIds(subList);
462 Routers routers = builder.build();
463 // Add Routers object to the ExtRouters list
464 LOG.trace("Creating extrouters " + routers);
465 MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, routersIdentifier, builder.build());
466 LOG.trace("Wrote successfully Routers to CONFIG Datastore");
468 } catch (Exception ex) {
469 LOG.error("Creation of extrouters failed for router " + routerId.getValue() +
470 " failed with " + ex.getMessage());
474 private void removeExternalRouter(Uuid extNetId, Router update, DataBroker broker) {
475 Uuid routerId = update.getUuid();
477 InstanceIdentifier<Routers> routersIdentifier = NeutronvpnUtils.buildExtRoutersIdentifier(routerId);
480 Optional<Routers> optionalRouters = NeutronvpnUtils.read(broker,
481 LogicalDatastoreType.CONFIGURATION,
483 LOG.trace(" Removing Routers node: " + routerId.getValue());
484 if (optionalRouters.isPresent()) {
485 RoutersBuilder builder = new RoutersBuilder(optionalRouters.get());
486 builder.setExternalIps(null);
487 builder.setSubnetIds(null);
488 MDSALUtil.syncDelete(broker, LogicalDatastoreType.CONFIGURATION, routersIdentifier);
489 LOG.trace("Removed router " + routerId.getValue() + " from extrouters ");
491 } catch (Exception ex) {
492 LOG.error("Removing extrouter " + routerId.getValue() + " from extrouters " +
493 " failed with " + ex.getMessage());
497 private void handleExternalFixedIpsForRouter(Router update, DataBroker broker) {
498 Uuid routerId = update.getUuid();
500 InstanceIdentifier<Routers> routersIdentifier = NeutronvpnUtils.buildExtRoutersIdentifier(routerId);
503 Optional<Routers> optionalRouters = NeutronvpnUtils.read(broker,
504 LogicalDatastoreType.CONFIGURATION,
506 LOG.trace("Updating External Fixed IPs Routers node: " + routerId.getValue());
507 if (optionalRouters.isPresent()) {
508 RoutersBuilder builder = new RoutersBuilder(optionalRouters.get());
509 if (builder != null) {
510 ArrayList<String> ext_fixed_ips = new ArrayList<String>();
511 for (ExternalFixedIps fixed_ips : update.getExternalGatewayInfo().getExternalFixedIps()) {
512 ext_fixed_ips.add(fixed_ips.getIpAddress().getIpv4Address().getValue());
514 builder.setExternalIps(ext_fixed_ips);
516 Routers routerss = builder.build();
517 LOG.trace("Updating external fixed ips for router " +
518 routerId.getValue() + " with value " + routerss);
519 MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, routersIdentifier, routerss);
520 LOG.trace("Added External Fixed IPs successfully for Routers to CONFIG Datastore");
522 } catch (Exception ex) {
523 LOG.error("Updating extfixedips for " + routerId.getValue() +
524 " in extrouters failed with " + ex.getMessage());
528 public void handleSubnetsForExternalRouter(Uuid routerId, DataBroker broker) {
529 InstanceIdentifier<Routers> routersIdentifier = NeutronvpnUtils.buildExtRoutersIdentifier(routerId);
532 Optional<Routers> optionalRouters = NeutronvpnUtils.read(broker,
533 LogicalDatastoreType.CONFIGURATION,
535 LOG.trace("Updating Internal subnets for Routers node: " +
536 routerId.getValue());
537 RoutersBuilder builder = null;
538 if (optionalRouters.isPresent()) {
539 builder = new RoutersBuilder(optionalRouters.get());
541 LOG.info("No Routers element found for router name " + routerId.getValue());
544 List<Uuid> subList = NeutronvpnUtils.getNeutronRouterSubnetIds(broker, routerId);
545 builder.setSubnetIds(subList);
546 Routers routerss = builder.build();
547 // Add Routers object to the ExtRouters list
548 LOG.trace("Updating extrouters " + routerss);
549 MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, routersIdentifier, routerss);
550 LOG.trace("Updated successfully Routers to CONFIG Datastore");
552 } catch (Exception ex) {
553 LOG.error("Updation of internal subnets for extrouters " +
554 "failed for router " + routerId.getValue() + " with " + ex.getMessage());
558 private void handleSnatSettingChangeForRouter(Router update, DataBroker broker) {
559 Uuid routerId = update.getUuid();
561 InstanceIdentifier<Routers> routersIdentifier = NeutronvpnUtils.buildExtRoutersIdentifier(routerId);
564 Optional<Routers> optionalRouters = NeutronvpnUtils.read(broker,
565 LogicalDatastoreType.CONFIGURATION,
567 LOG.trace("Updating Internal subnets for Routers node: " +
568 routerId.getValue());
569 RoutersBuilder builder = null;
570 if (optionalRouters.isPresent()) {
571 builder = new RoutersBuilder(optionalRouters.get());
573 LOG.trace("No Routers element found for router name " + routerId.getValue());
576 builder.setEnableSnat(update.getExternalGatewayInfo().isEnableSnat());
577 Routers routerss = builder.build();
578 // Add Routers object to the ExtRouters list
579 LOG.trace("Updating extrouters for snat change " + routerss);
580 MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, routersIdentifier, routerss);
581 LOG.trace("Updated successfully Routers to CONFIG Datastore");
583 } catch (Exception ex) {
584 LOG.error("Updation of snat for extrouters failed for router " + routerId.getValue() +
585 " with " + ex.getMessage());