fa4d56d5738319ebf9fdc4a868b0bf1ea94ea4c3
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / netvirt / openstack / netvirt / translator / crud / impl / NeutronLoadBalancerPoolInterface.java
1 /*
2  * Copyright (c) 2014, 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.netvirt.openstack.netvirt.translator.crud.impl;
10
11 import java.util.ArrayList;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Map.Entry;
15 import java.util.Set;
16 import java.util.concurrent.ConcurrentHashMap;
17 import java.util.concurrent.ConcurrentMap;
18
19 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
20 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronLoadBalancerPool;
21 import org.opendaylight.netvirt.openstack.netvirt.translator.Neutron_ID;
22 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronLoadBalancerPoolCRUD;
23 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronLoadBalancer_SessionPersistence;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolBase;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolHttp;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolHttps;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolTcp;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.Pools;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.Pool;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.PoolBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.pool.attributes.SessionPersistenceBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.osgi.framework.BundleContext;
36 import org.osgi.framework.ServiceRegistration;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40 import com.google.common.collect.ImmutableBiMap;
41
42 /**
43  * TODO: Migrate this to consume the MD-SAL data store, so that it can read all the data from data store.
44  * No need to worry about the write/update related methods here. OVSDB net-virt will use these CRUD Interface
45  * only for reading. We will cleanup these interface/methods later.
46  */
47
48 public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<Pool, NeutronLoadBalancerPool> implements INeutronLoadBalancerPoolCRUD {
49     private static final Logger LOGGER = LoggerFactory.getLogger(NeutronLoadBalancerPoolInterface.class);
50     private ConcurrentMap<String, NeutronLoadBalancerPool> loadBalancerPoolDB = new ConcurrentHashMap<>();
51
52     private static final ImmutableBiMap<Class<? extends ProtocolBase>,String> PROTOCOL_MAP
53             = new ImmutableBiMap.Builder<Class<? extends ProtocolBase>,String>()
54             .put(ProtocolHttp.class,"HTTP")
55             .put(ProtocolHttps.class,"HTTPS")
56             .put(ProtocolTcp.class,"TCP")
57             .build();
58
59     NeutronLoadBalancerPoolInterface(ProviderContext providerContext) {
60         super(providerContext);
61     }
62
63     @Override
64     public boolean neutronLoadBalancerPoolExists(String uuid) {
65         return loadBalancerPoolDB.containsKey(uuid);
66     }
67
68     @Override
69     public NeutronLoadBalancerPool getNeutronLoadBalancerPool(String uuid) {
70         if (!neutronLoadBalancerPoolExists(uuid)) {
71             LOGGER.debug("No LoadBalancerPool has Been Defined");
72             return null;
73         }
74         return loadBalancerPoolDB.get(uuid);
75     }
76
77     @Override
78     public List<NeutronLoadBalancerPool> getAllNeutronLoadBalancerPools() {
79         Set<NeutronLoadBalancerPool> allLoadBalancerPools = new HashSet<>();
80         for (Entry<String, NeutronLoadBalancerPool> entry : loadBalancerPoolDB.entrySet()) {
81             NeutronLoadBalancerPool loadBalancerPool = entry.getValue();
82             allLoadBalancerPools.add(loadBalancerPool);
83         }
84         LOGGER.debug("Exiting getLoadBalancerPools, Found {} OpenStackLoadBalancerPool", allLoadBalancerPools.size());
85         List<NeutronLoadBalancerPool> ans = new ArrayList<>();
86         ans.addAll(allLoadBalancerPools);
87         return ans;
88     }
89
90     @Override
91     public boolean addNeutronLoadBalancerPool(NeutronLoadBalancerPool input) {
92         if (neutronLoadBalancerPoolExists(input.getID())) {
93             return false;
94         }
95         loadBalancerPoolDB.putIfAbsent(input.getID(), input);
96         //TODO: add code to find INeutronLoadBalancerPoolAware services and call newtorkCreated on them
97         return true;
98     }
99
100     @Override
101     public boolean removeNeutronLoadBalancerPool(String uuid) {
102         if (!neutronLoadBalancerPoolExists(uuid)) {
103             return false;
104         }
105         loadBalancerPoolDB.remove(uuid);
106         //TODO: add code to find INeutronLoadBalancerPoolAware services and call newtorkDeleted on them
107         return true;
108     }
109
110     @Override
111     public boolean updateNeutronLoadBalancerPool(String uuid, NeutronLoadBalancerPool delta) {
112         if (!neutronLoadBalancerPoolExists(uuid)) {
113             return false;
114         }
115         NeutronLoadBalancerPool target = loadBalancerPoolDB.get(uuid);
116         return overwrite(target, delta);
117     }
118
119     @Override
120     public boolean neutronLoadBalancerPoolInUse(String loadBalancerPoolUUID) {
121         return !neutronLoadBalancerPoolExists(loadBalancerPoolUUID);
122     }
123
124     @Override
125     protected Pool toMd(String uuid) {
126         PoolBuilder poolsBuilder = new PoolBuilder();
127         poolsBuilder.setUuid(toUuid(uuid));
128         return poolsBuilder.build();
129     }
130
131     @Override
132     protected InstanceIdentifier<Pool> createInstanceIdentifier(Pool pools) {
133         return InstanceIdentifier.create(Neutron.class)
134                 .child(Pools.class)
135                 .child(Pool.class, pools.getKey());
136     }
137
138     @Override
139     protected Pool toMd(NeutronLoadBalancerPool pool) {
140         PoolBuilder poolBuilder = new PoolBuilder();
141         poolBuilder.setAdminStateUp(pool.getLoadBalancerPoolAdminIsStateIsUp());
142         if (pool.getNeutronLoadBalancerPoolHealthMonitorID() != null) {
143             poolBuilder.setHealthmonitorId(toUuid(pool.getNeutronLoadBalancerPoolHealthMonitorID()));
144         }
145         if (pool.getLoadBalancerPoolLbAlgorithm() != null) {
146             poolBuilder.setLbAlgorithm(pool.getLoadBalancerPoolLbAlgorithm());
147         }
148         if (pool.getLoadBalancerPoolListeners() != null) {
149             List<Uuid> listListener = new ArrayList<>();
150             for (Neutron_ID neutron_id : pool.getLoadBalancerPoolListeners()) {
151                 listListener.add(toUuid(neutron_id.getID()));
152             }
153             poolBuilder.setListeners(listListener);
154         }
155         // because members are another container, we don't want to copy
156         // it over, so just skip it here
157         if (pool.getLoadBalancerPoolName() != null) {
158             poolBuilder.setName(pool.getLoadBalancerPoolName());
159         }
160         if (pool.getLoadBalancerPoolProtocol() != null) {
161             ImmutableBiMap<String, Class<? extends ProtocolBase>> mapper =
162                 PROTOCOL_MAP.inverse();
163             poolBuilder.setProtocol(mapper.get(pool.getLoadBalancerPoolProtocol()));
164         }
165         if (pool.getLoadBalancerPoolSessionPersistence() != null) {
166             NeutronLoadBalancer_SessionPersistence sessionPersistence = pool.getLoadBalancerPoolSessionPersistence();
167             SessionPersistenceBuilder sessionPersistenceBuilder = new SessionPersistenceBuilder();
168             sessionPersistenceBuilder.setCookieName(sessionPersistence.getCookieName());
169             sessionPersistenceBuilder.setType(sessionPersistence.getType());
170             poolBuilder.setSessionPersistence(sessionPersistenceBuilder.build());
171         }
172         if (pool.getLoadBalancerPoolTenantID() != null) {
173             poolBuilder.setTenantId(toUuid(pool.getLoadBalancerPoolTenantID()));
174         }
175         if (pool.getID() != null) {
176             poolBuilder.setUuid(toUuid(pool.getID()));
177         } else {
178             LOGGER.warn("Attempting to write neutron load balancer pool without UUID");
179         }
180         return poolBuilder.build();
181     }
182
183     public static void registerNewInterface(BundleContext context,
184                                             ProviderContext providerContext,
185                                             List<ServiceRegistration<?>> registrations) {
186         NeutronLoadBalancerPoolInterface neutronLoadBalancerPoolInterface = new NeutronLoadBalancerPoolInterface(providerContext);
187         ServiceRegistration<INeutronLoadBalancerPoolCRUD> neutronLoadBalancerPoolInterfaceRegistration = context.registerService(INeutronLoadBalancerPoolCRUD.class, neutronLoadBalancerPoolInterface, null);
188         if(neutronLoadBalancerPoolInterfaceRegistration != null) {
189             registrations.add(neutronLoadBalancerPoolInterfaceRegistration);
190         }
191     }
192 }