2 * Copyright (c) 2015 Brocade Communications Systems, Inc. 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.ovsdb.openstack.netvirt.translator.iaware.impl;
10 import java.util.ArrayList;
11 import java.util.HashMap;
12 import java.util.List;
14 import java.util.Map.Entry;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
18 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
19 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
20 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
21 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronRouter;
22 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronRouter_Interface;
23 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronRouter_NetworkReference;
24 import org.opendaylight.ovsdb.openstack.netvirt.translator.Neutron_IPs;
25 import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.INeutronRouterAware;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;
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.Interfaces;
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.rev150712.Neutron;
31 import org.opendaylight.yangtools.concepts.ListenerRegistration;
32 import org.opendaylight.yangtools.yang.binding.DataObject;
33 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
37 public class NeutronRouterChangeListener implements DataChangeListener, AutoCloseable{
38 private static final Logger LOG = LoggerFactory.getLogger(NeutronRouterChangeListener.class);
40 private ListenerRegistration<DataChangeListener> registration;
41 private DataBroker db;
43 public NeutronRouterChangeListener(DataBroker db){
45 InstanceIdentifier<Router> path = InstanceIdentifier
46 .create(Neutron.class)
49 LOG.debug("Register listener for Neutron Router model data changes");
51 this.db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, path, this, DataChangeScope.ONE);
56 public void onDataChanged(
57 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
58 LOG.trace("Data changes : {}",changes);
60 Object[] subscribers = NeutronIAwareUtil.getInstances(INeutronRouterAware.class, this);
61 createRouter(changes, subscribers);
62 updateRouter(changes, subscribers);
63 deleteRouter(changes, subscribers);
66 private void createRouter(
67 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
68 Object[] subscribers) {
69 for (Entry<InstanceIdentifier<?>, DataObject> newRouter : changes.getCreatedData().entrySet()) {
70 if(newRouter.getValue() instanceof Router){
71 NeutronRouter router = fromMd((Router)newRouter.getValue());
72 for(Object entry: subscribers){
73 INeutronRouterAware subscriber = (INeutronRouterAware)entry;
74 subscriber.neutronRouterCreated(router);
81 private void updateRouter(
82 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
83 Object[] subscribers) {
84 for (Entry<InstanceIdentifier<?>, DataObject> updateRouter : changes.getUpdatedData().entrySet()) {
85 if(updateRouter.getValue() instanceof Router){
86 NeutronRouter router = fromMd((Router)updateRouter.getValue());
87 for(Object entry: subscribers){
88 INeutronRouterAware subscriber = (INeutronRouterAware)entry;
89 subscriber.neutronRouterUpdated(router);
95 private void deleteRouter(
96 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
97 Object[] subscribers) {
98 for (InstanceIdentifier<?> deletedRouterPath : changes.getRemovedPaths()) {
99 if(deletedRouterPath.getTargetType().equals(Router.class)){
100 NeutronRouter router = fromMd((Router)changes.getOriginalData().get(deletedRouterPath));
101 for(Object entry: subscribers){
102 INeutronRouterAware subscriber = (INeutronRouterAware)entry;
103 subscriber.neutronRouterDeleted(router);
110 * This method is borrowed from NeutronRouterInterface.java class of Neutron Northbound class.
111 * We will be utilizing similar code from other classes from the same package of neutron project.
113 private NeutronRouter fromMd(Router router) {
114 NeutronRouter result = new NeutronRouter();
115 result.setID(String.valueOf(router.getUuid().getValue()));
116 result.setName(router.getName());
117 result.setTenantID(String.valueOf(router.getTenantId().getValue()));
118 result.setAdminStateUp(router.isAdminStateUp());
119 result.setStatus(router.getStatus());
120 result.setDistributed(router.isDistributed());
121 if (router.getGatewayPortId() != null) {
122 result.setGatewayPortId(String.valueOf(router.getGatewayPortId().getValue()));
124 if (router.getRoutes() != null) {
125 List<String> routes = new ArrayList<>();
126 for (String route : router.getRoutes()) {
129 result.setRoutes(routes);
132 if (router.getExternalGatewayInfo() != null) {
133 NeutronRouter_NetworkReference extGwInfo = new NeutronRouter_NetworkReference();
134 extGwInfo.setNetworkID(String.valueOf(router.getExternalGatewayInfo().getExternalNetworkId().getValue()));
135 extGwInfo.setEnableSNAT(router.getExternalGatewayInfo().isEnableSnat());
136 if (router.getExternalGatewayInfo().getExternalFixedIps() != null) {
137 List<Neutron_IPs> fixedIPs = new ArrayList<>();
138 for (ExternalFixedIps mdFixedIP : router.getExternalGatewayInfo().getExternalFixedIps()) {
139 Neutron_IPs fixedIP = new Neutron_IPs();
140 fixedIP.setSubnetUUID(String.valueOf(mdFixedIP.getSubnetId().getValue()));
141 fixedIP.setIpAddress(String.valueOf(mdFixedIP.getIpAddress().getValue()));
142 fixedIPs.add(fixedIP);
144 extGwInfo.setExternalFixedIPs(fixedIPs);
146 result.setExternalGatewayInfo(extGwInfo);
149 if (router.getInterfaces() != null) {
150 Map<String, NeutronRouter_Interface> interfaces = new HashMap<>();
151 for (Interfaces mdInterface : router.getInterfaces()) {
152 NeutronRouter_Interface pojoInterface = new NeutronRouter_Interface();
153 String id = String.valueOf(mdInterface.getUuid().getValue());
154 pojoInterface.setID(id);
155 pojoInterface.setTenantID(String.valueOf(mdInterface.getTenantId().getValue()));
156 pojoInterface.setSubnetUUID(String.valueOf(mdInterface.getSubnetId().getValue()));
157 pojoInterface.setPortUUID(String.valueOf(mdInterface.getPortId().getValue()));
158 interfaces.put(id, pojoInterface);
160 result.setInterfaces(interfaces);
166 public void close() throws Exception {
167 registration.close();