357e263eee0efa6ab360646f0f789f6c7f91cf74
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / translator / iaware / impl / NeutronLoadBalancerPoolMemberChangeListener.java
1 /*
2  * Copyright (C) 2015 Red Hat, 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
9 package org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl;
10
11 import java.util.Map.Entry;
12
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
15 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
16 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronLoadBalancerPoolMember;
19 import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.INeutronLoadBalancerPoolMemberAware;
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.lbaasv2.rev150712.lbaas.attributes.Pools;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.Pool;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.PoolKey;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.pool.Members;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.pool.members.Member;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
27 import org.opendaylight.yangtools.concepts.ListenerRegistration;
28 import org.opendaylight.yangtools.yang.binding.DataObject;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 public class NeutronLoadBalancerPoolMemberChangeListener implements DataChangeListener, AutoCloseable {
34     private static final Logger LOG = LoggerFactory.getLogger(NeutronLoadBalancerPoolMemberChangeListener.class);
35
36     private ListenerRegistration<DataChangeListener> registration;
37     private DataBroker db;
38
39     public NeutronLoadBalancerPoolMemberChangeListener(DataBroker db){
40         this.db = db;
41         InstanceIdentifier<Member> path = InstanceIdentifier
42                 .create(Neutron.class)
43                 .child(Pools.class)
44                 .child(Pool.class)
45                 .child(Members.class)
46                 .child(Member.class);
47         LOG.debug("Register listener for Neutron Load Balancer Pool Member model data changes");
48         registration =
49                 this.db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, path, this,
50                         AsyncDataBroker.DataChangeScope.ONE);
51     }
52
53     @Override
54     public void close() throws Exception {
55         registration.close();
56     }
57
58     @Override
59     public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
60         LOG.trace("Data changes : {}", changes);
61
62         Object[] subscribers = NeutronIAwareUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
63         createPoolMember(changes, subscribers);
64         updatePoolMember(changes, subscribers);
65         deletePoolMember(changes, subscribers);
66     }
67
68     private void createPoolMember(
69             AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
70             Object[] subscribers) {
71         for (Entry<InstanceIdentifier<?>, DataObject> newPoolMember : changes.getCreatedData().entrySet()) {
72                 if(newPoolMember.getValue() instanceof Member){
73                 NeutronLoadBalancerPoolMember neutronLBPoolMember = fromMd(newPoolMember.getKey(), (Member) newPoolMember.getValue());
74                 for (Object entry : subscribers) {
75                     INeutronLoadBalancerPoolMemberAware subscriber = (INeutronLoadBalancerPoolMemberAware) entry;
76                     subscriber.neutronLoadBalancerPoolMemberCreated(neutronLBPoolMember);
77                 }
78                 }
79         }
80     }
81     private void updatePoolMember(
82             AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
83             Object[] subscribers) {
84         for (Entry<InstanceIdentifier<?>, DataObject> updatePoolMember : changes.getUpdatedData().entrySet()) {
85                 if(updatePoolMember.getValue() instanceof Member){
86                 NeutronLoadBalancerPoolMember neutronLBPoolMember =
87                         fromMd(updatePoolMember.getKey(), (Member) updatePoolMember.getValue());
88                 for(Object entry: subscribers){
89                     INeutronLoadBalancerPoolMemberAware subscriber = (INeutronLoadBalancerPoolMemberAware) entry;
90                     subscriber.neutronLoadBalancerPoolMemberUpdated(neutronLBPoolMember);
91                 }
92                 }
93         }
94     }
95     private void deletePoolMember(
96             AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
97             Object[] subscribers) {
98         for (InstanceIdentifier<?> deletedPoolMemberPath : changes.getRemovedPaths()) {
99                 if(deletedPoolMemberPath.getTargetType().equals(Member.class)){
100                 NeutronLoadBalancerPoolMember neutronLBPoolMember =
101                         fromMd(deletedPoolMemberPath, (Member) changes.getOriginalData().get(deletedPoolMemberPath));
102                 for(Object entry: subscribers){
103                     INeutronLoadBalancerPoolMemberAware subscriber = (INeutronLoadBalancerPoolMemberAware) entry;
104                     subscriber.neutronLoadBalancerPoolMemberDeleted(neutronLBPoolMember);
105                 }
106                 }
107         }
108     }
109
110     /*
111      * This method is borrowed from NeutronLoadBalancerPoolMember.java class of Neutron Northbound class.
112      * in the original location, this method is called extractFields.
113      * We will be utilizing similar code from other classes from the same package of neutron project.
114      */
115     private NeutronLoadBalancerPoolMember fromMd(InstanceIdentifier<?> iid, Member member) {
116         NeutronLoadBalancerPoolMember result = new NeutronLoadBalancerPoolMember();
117
118         final PoolKey poolsKey = iid.firstKeyOf(Pool.class, PoolKey.class);
119         if (poolsKey != null) {
120             result.setPoolID(poolsKey.getUuid().getValue());
121         }
122
123         result.setID(member.getUuid().getValue());
124         if (member.isAdminStateUp() != null) {
125             result.setPoolMemberAdminStateIsUp(member.isAdminStateUp());
126         }
127
128         final IpAddress memberIpAddress = member.getAddress();
129         if (memberIpAddress != null) {
130             if (memberIpAddress.getIpv4Address() != null) {
131                 result.setPoolMemberAddress(memberIpAddress.getIpv4Address().getValue());
132             } else if (memberIpAddress.getIpv6Address() != null) {
133                 result.setPoolMemberAddress(memberIpAddress.getIpv6Address().getValue());
134             }
135         }
136
137         if (member.getProtocolPort() != null) {
138             result.setPoolMemberProtoPort(member.getProtocolPort());
139         }
140         if (member.getSubnetId() != null) {
141             result.setPoolMemberSubnetID(member.getSubnetId().getValue());
142         }
143         if (member.getTenantId() != null) {
144             result.setPoolMemberTenantID(member.getTenantId().getValue());
145         }
146         if (member.getWeight() != null) {
147             result.setPoolMemberWeight(member.getWeight());
148         }
149
150         return result;
151     }
152 }
153