2 * Copyright (C) 2015 Red Hat, 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
9 package org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.Map.Entry;
15 import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
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;
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.NeutronLoadBalancerPool;
22 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronLoadBalancerPoolMember;
23 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronLoadBalancer_SessionPersistence;
24 import org.opendaylight.ovsdb.openstack.netvirt.translator.Neutron_ID;
25 import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.INeutronLoadBalancerPoolAware;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolBase;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolHttp;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolHttps;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolIcmp;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolTcp;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.Pools;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.Pool;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.pool.members.Member;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
36 import org.opendaylight.yangtools.concepts.ListenerRegistration;
37 import org.opendaylight.yangtools.yang.binding.DataObject;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
42 import com.google.common.collect.ImmutableBiMap;
44 public class NeutronLoadBalancerPoolChangeListener implements ClusteredDataChangeListener, AutoCloseable {
45 private static final Logger LOG = LoggerFactory.getLogger(NeutronLoadBalancerPoolChangeListener.class);
47 private static final ImmutableBiMap<Class<? extends ProtocolBase>,String> PROTOCOL_MAP
48 = new ImmutableBiMap.Builder<Class<? extends ProtocolBase>,String>()
49 .put(ProtocolHttp.class, "HTTP")
50 .put(ProtocolHttps.class, "HTTPS")
51 .put(ProtocolIcmp.class, "ICMP")
52 .put(ProtocolTcp.class,"TCP")
55 private ListenerRegistration<DataChangeListener> registration;
56 private DataBroker db;
58 public NeutronLoadBalancerPoolChangeListener(DataBroker db){
60 InstanceIdentifier<Pool> path = InstanceIdentifier
61 .create(Neutron.class)
64 LOG.debug("Register listener for Neutron Load Balancer Pool model data changes");
66 this.db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, path, this, AsyncDataBroker.DataChangeScope.ONE);
70 public void close() throws Exception {
75 public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
76 LOG.trace("Data changes : {}", changes);
78 Object[] subscribers = NeutronIAwareUtil.getInstances(INeutronLoadBalancerPoolAware.class, this);
79 createPool(changes, subscribers);
80 updatePool(changes, subscribers);
81 deletePool(changes, subscribers);
84 private void createPool(
85 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
86 Object[] subscribers) {
87 for (Entry<InstanceIdentifier<?>, DataObject> newPool : changes.getCreatedData().entrySet()) {
88 if(newPool.getValue() instanceof Pool){
89 NeutronLoadBalancerPool loadBalancerPool = fromMd((Pool) newPool.getValue());
90 for (Object entry : subscribers) {
91 INeutronLoadBalancerPoolAware subscriber = (INeutronLoadBalancerPoolAware) entry;
92 subscriber.neutronLoadBalancerPoolCreated(loadBalancerPool);
97 private void updatePool(
98 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
99 Object[] subscribers) {
100 for (Entry<InstanceIdentifier<?>, DataObject> updatePool : changes.getUpdatedData().entrySet()) {
101 if(updatePool.getValue() instanceof Pool){
102 NeutronLoadBalancerPool loadBalancerPool = fromMd((Pool)updatePool.getValue());
103 for(Object entry: subscribers){
104 INeutronLoadBalancerPoolAware subscriber = (INeutronLoadBalancerPoolAware) entry;
105 subscriber.neutronLoadBalancerPoolUpdated(loadBalancerPool);
110 private void deletePool(
111 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
112 Object[] subscribers) {
113 for (InstanceIdentifier<?> deletedPoolPath : changes.getRemovedPaths()) {
114 if(deletedPoolPath.getTargetType().equals(Pool.class)){
115 NeutronLoadBalancerPool loadBalancerPool = fromMd((Pool)changes.getOriginalData().get(deletedPoolPath));
116 for(Object entry: subscribers){
117 INeutronLoadBalancerPoolAware subscriber = (INeutronLoadBalancerPoolAware) entry;
118 subscriber.neutronLoadBalancerPoolDeleted(loadBalancerPool);
125 * This method is borrowed from NeutronLoadBalancerPool.java class of Neutron Northbound class.
126 * in the original location, this method is called extractFields.
127 * We will be utilizing similar code from other classes from the same package of neutron project.
129 private NeutronLoadBalancerPool fromMd(Pool pool) {
130 NeutronLoadBalancerPool result = new NeutronLoadBalancerPool();
132 result.setID(pool.getUuid().getValue());
133 if (pool.getTenantId() != null) {
134 result.setLoadBalancerPoolTenantID(pool.getTenantId().getValue());
136 if (pool.getName() != null) {
137 result.setLoadBalancerPoolName(pool.getName());
139 if (pool.getDescr() != null) {
140 result.setLoadBalancerPoolDescription(pool.getDescr());
142 if (pool.getProtocol() != null) {
143 result.setLoadBalancerPoolProtocol(PROTOCOL_MAP.get(pool.getProtocol()));
145 if (pool.getLbAlgorithm() != null) {
146 result.setLoadBalancerPoolLbAlgorithm(pool.getLbAlgorithm());
149 // TODO: setNeutronLoadBalancerPoolHealthMonitorID is a list? Fill in, when its needed.
150 if (pool.getHealthmonitorId() != null) {
151 result.setNeutronLoadBalancerPoolHealthMonitorID(pool.getHealthmonitorId().getValue());
154 if (pool.isAdminStateUp() != null) {
155 result.setLoadBalancerPoolAdminStateIsUp(pool.isAdminStateUp());
158 List<Neutron_ID> listeners = new ArrayList();
159 if (pool.getListeners() != null) {
160 for (Uuid listenerUuid : pool.getListeners()) {
161 listeners.add(new Neutron_ID(listenerUuid.getValue()));
164 result.setLoadBalancerPoolListeners(listeners);
166 if (pool.getSessionPersistence() != null) {
167 NeutronLoadBalancer_SessionPersistence sessionPersistence = new NeutronLoadBalancer_SessionPersistence();
168 sessionPersistence.setCookieName(pool.getSessionPersistence().getCookieName());
169 sessionPersistence.setType(pool.getSessionPersistence().getType());
170 result.setLoadBalancerSessionPersistence(sessionPersistence);
173 List<NeutronLoadBalancerPoolMember> loadBalancerPoolMembers = new ArrayList();
174 if (pool.getMembers() != null) {
175 for (Member member : pool.getMembers().getMember()) {
176 NeutronLoadBalancerPoolMember neutronMember = new NeutronLoadBalancerPoolMember();
178 neutronMember.setPoolID(pool.getUuid().getValue());
179 neutronMember.setPoolMemberID(member.getUuid().getValue());
181 // TODO: locate and populate remainder attributes, when its needed
182 // member.setPoolMemberAddress(xxx);
183 // member.setPoolMemberAdminStateIsUp(xxx);
184 // member.setPoolMemberProtoPort(xxx);
185 // member.setPoolMemberSubnetID(xxx);
186 // member.setPoolMemberTenantID(xxx);
187 // member.setPoolMemberWeight(xxx);
189 loadBalancerPoolMembers.add(neutronMember);
192 result.setLoadBalancerPoolMembers(loadBalancerPoolMembers);