neutron: unbreak of neutron northbound yang model revise
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / netvirt / 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.netvirt.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.ClusteredDataChangeListener;
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
18 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
19 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
20 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronRouter;
23 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronRouter_NetworkReference;
24 import org.opendaylight.netvirt.openstack.netvirt.translator.Neutron_IPs;
25 import org.opendaylight.netvirt.openstack.netvirt.translator.iaware.INeutronRouterAware;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.l3.attributes.Routes;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;
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 ClusteredDataChangeListener, 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         if (router.getTenantId() != null) {
118             result.setTenantID(String.valueOf(router.getTenantId().getValue()));
119         }
120         result.setAdminStateUp(router.isAdminStateUp());
121         result.setStatus(router.getStatus());
122         result.setDistributed(router.isDistributed());
123         if (router.getGatewayPortId() != null) {
124             result.setGatewayPortId(String.valueOf(router.getGatewayPortId().getValue()));
125         }
126         if (router.getRoutes() != null) {
127             List<Routes> routes = new ArrayList<>();
128             for (Routes route : router.getRoutes()) {
129                 routes.add(route);
130             }
131             result.setRoutes(routes);
132         }
133
134         if (router.getExternalGatewayInfo() != null) {
135             NeutronRouter_NetworkReference extGwInfo = new NeutronRouter_NetworkReference();
136             extGwInfo.setNetworkID(String.valueOf(router.getExternalGatewayInfo().getExternalNetworkId().getValue()));
137             extGwInfo.setEnableSNAT(router.getExternalGatewayInfo().isEnableSnat());
138             if (router.getExternalGatewayInfo().getExternalFixedIps() != null) {
139                 List<Neutron_IPs> fixedIPs = new ArrayList<>();
140                 for (ExternalFixedIps mdFixedIP : router.getExternalGatewayInfo().getExternalFixedIps()) {
141                      Neutron_IPs fixedIP = new Neutron_IPs();
142                      fixedIP.setSubnetUUID(String.valueOf(mdFixedIP.getSubnetId().getValue()));
143                      fixedIP.setIpAddress(String.valueOf(mdFixedIP.getIpAddress().getValue()));
144                      fixedIPs.add(fixedIP);
145                 }
146                 extGwInfo.setExternalFixedIPs(fixedIPs);
147             }
148             result.setExternalGatewayInfo(extGwInfo);
149         }
150
151         return result;
152     }
153
154     @Override
155     public void close() throws Exception {
156         registration.close();
157     }
158 }