Merge "L3: Add eth to br-ex"
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / translator / iaware / impl / NeutronRouterChangeListener.java
1 /*
2  * Copyright (c) 2015 Brocade Communications 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.ovsdb.openstack.netvirt.translator.iaware.impl;
9
10 import java.util.ArrayList;
11 import java.util.HashMap;
12 import java.util.List;
13 import java.util.Map;
14 import java.util.Map.Entry;
15
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;
36
37 public class NeutronRouterChangeListener implements DataChangeListener, AutoCloseable{
38     private static final Logger LOG = LoggerFactory.getLogger(NeutronRouterChangeListener.class);
39
40     private ListenerRegistration<DataChangeListener> registration;
41     private DataBroker db;
42
43     public NeutronRouterChangeListener(DataBroker db){
44         this.db = db;
45         InstanceIdentifier<Router> path = InstanceIdentifier
46                 .create(Neutron.class)
47                 .child(Routers.class)
48                 .child(Router.class);
49         LOG.debug("Register listener for Neutron Router model data changes");
50         registration =
51                 this.db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, path, this, DataChangeScope.ONE);
52
53     }
54
55     @Override
56     public void onDataChanged(
57             AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
58         LOG.trace("Data changes : {}",changes);
59
60         Object[] subscribers = NeutronIAwareUtil.getInstances(INeutronRouterAware.class, this);
61         createRouter(changes, subscribers);
62         updateRouter(changes, subscribers);
63         deleteRouter(changes, subscribers);
64     }
65
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);
75                 }
76                 }
77         }
78
79     }
80
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);
90                 }
91                 }
92         }
93     }
94
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);
104                 }
105                 }
106         }
107     }
108
109     /*
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.
112      */
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()));
123         }
124         if (router.getRoutes() != null) {
125             List<String> routes = new ArrayList<>();
126             for (String route : router.getRoutes()) {
127                 routes.add(route);
128             }
129             result.setRoutes(routes);
130         }
131
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);
143                 }
144                 extGwInfo.setExternalFixedIPs(fixedIPs);
145             }
146             result.setExternalGatewayInfo(extGwInfo);
147         }
148
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);
159             }
160             result.setInterfaces(interfaces);
161         }
162         return result;
163     }
164
165     @Override
166     public void close() throws Exception {
167         registration.close();
168     }
169 }