2 * Copyright (c) 2014, 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.crud.impl;
11 import java.util.ArrayList;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Map.Entry;
16 import java.util.concurrent.ConcurrentHashMap;
17 import java.util.concurrent.ConcurrentMap;
19 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
20 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronLoadBalancerPool;
21 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronLoadBalancer_SessionPersistence;
22 import org.opendaylight.ovsdb.openstack.netvirt.translator.Neutron_ID;
23 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronLoadBalancerPoolCRUD;
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;
40 import com.google.common.collect.ImmutableBiMap;
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.
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<>();
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")
59 NeutronLoadBalancerPoolInterface(ProviderContext providerContext) {
60 super(providerContext);
64 public boolean neutronLoadBalancerPoolExists(String uuid) {
65 return loadBalancerPoolDB.containsKey(uuid);
69 public NeutronLoadBalancerPool getNeutronLoadBalancerPool(String uuid) {
70 if (!neutronLoadBalancerPoolExists(uuid)) {
71 LOGGER.debug("No LoadBalancerPool has Been Defined");
74 return loadBalancerPoolDB.get(uuid);
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);
84 LOGGER.debug("Exiting getLoadBalancerPools, Found {} OpenStackLoadBalancerPool", allLoadBalancerPools.size());
85 List<NeutronLoadBalancerPool> ans = new ArrayList<>();
86 ans.addAll(allLoadBalancerPools);
91 public boolean addNeutronLoadBalancerPool(NeutronLoadBalancerPool input) {
92 if (neutronLoadBalancerPoolExists(input.getID())) {
95 loadBalancerPoolDB.putIfAbsent(input.getID(), input);
96 //TODO: add code to find INeutronLoadBalancerPoolAware services and call newtorkCreated on them
101 public boolean removeNeutronLoadBalancerPool(String uuid) {
102 if (!neutronLoadBalancerPoolExists(uuid)) {
105 loadBalancerPoolDB.remove(uuid);
106 //TODO: add code to find INeutronLoadBalancerPoolAware services and call newtorkDeleted on them
111 public boolean updateNeutronLoadBalancerPool(String uuid, NeutronLoadBalancerPool delta) {
112 if (!neutronLoadBalancerPoolExists(uuid)) {
115 NeutronLoadBalancerPool target = loadBalancerPoolDB.get(uuid);
116 return overwrite(target, delta);
120 public boolean neutronLoadBalancerPoolInUse(String loadBalancerPoolUUID) {
121 return !neutronLoadBalancerPoolExists(loadBalancerPoolUUID);
125 protected Pool toMd(String uuid) {
126 PoolBuilder poolsBuilder = new PoolBuilder();
127 poolsBuilder.setUuid(toUuid(uuid));
128 return poolsBuilder.build();
132 protected InstanceIdentifier<Pool> createInstanceIdentifier(Pool pools) {
133 return InstanceIdentifier.create(Neutron.class)
135 .child(Pool.class, pools.getKey());
139 protected Pool toMd(NeutronLoadBalancerPool pool) {
140 PoolBuilder poolBuilder = new PoolBuilder();
141 poolBuilder.setAdminStateUp(pool.getLoadBalancerPoolAdminIsStateIsUp());
142 if (pool.getLoadBalancerPoolDescription() != null) {
143 poolBuilder.setDescr(pool.getLoadBalancerPoolDescription());
145 if (pool.getNeutronLoadBalancerPoolHealthMonitorID() != null) {
146 poolBuilder.setHealthmonitorId(toUuid(pool.getNeutronLoadBalancerPoolHealthMonitorID()));
148 if (pool.getLoadBalancerPoolLbAlgorithm() != null) {
149 poolBuilder.setLbAlgorithm(pool.getLoadBalancerPoolLbAlgorithm());
151 if (pool.getLoadBalancerPoolListeners() != null) {
152 List<Uuid> listListener = new ArrayList<>();
153 for (Neutron_ID neutron_id : pool.getLoadBalancerPoolListeners()) {
154 listListener.add(toUuid(neutron_id.getID()));
156 poolBuilder.setListeners(listListener);
158 // because members are another container, we don't want to copy
159 // it over, so just skip it here
160 if (pool.getLoadBalancerPoolName() != null) {
161 poolBuilder.setName(pool.getLoadBalancerPoolName());
163 if (pool.getLoadBalancerPoolProtocol() != null) {
164 ImmutableBiMap<String, Class<? extends ProtocolBase>> mapper =
165 PROTOCOL_MAP.inverse();
166 poolBuilder.setProtocol((Class<? extends ProtocolBase>) mapper.get(pool.getLoadBalancerPoolProtocol()));
168 if (pool.getLoadBalancerPoolSessionPersistence() != null) {
169 NeutronLoadBalancer_SessionPersistence sessionPersistence = pool.getLoadBalancerPoolSessionPersistence();
170 SessionPersistenceBuilder sessionPersistenceBuilder = new SessionPersistenceBuilder();
171 sessionPersistenceBuilder.setCookieName(sessionPersistence.getCookieName());
172 sessionPersistenceBuilder.setType(sessionPersistence.getType());
173 poolBuilder.setSessionPersistence(sessionPersistenceBuilder.build());
175 if (pool.getLoadBalancerPoolTenantID() != null) {
176 poolBuilder.setTenantId(toUuid(pool.getLoadBalancerPoolTenantID()));
178 if (pool.getID() != null) {
179 poolBuilder.setUuid(toUuid(pool.getID()));
181 LOGGER.warn("Attempting to write neutron load balancer pool without UUID");
183 return poolBuilder.build();
186 public static void registerNewInterface(BundleContext context,
187 ProviderContext providerContext,
188 List<ServiceRegistration<?>> registrations) {
189 NeutronLoadBalancerPoolInterface neutronLoadBalancerPoolInterface = new NeutronLoadBalancerPoolInterface(providerContext);
190 ServiceRegistration<INeutronLoadBalancerPoolCRUD> neutronLoadBalancerPoolInterfaceRegistration = context.registerService(INeutronLoadBalancerPoolCRUD.class, neutronLoadBalancerPoolInterface, null);
191 if(neutronLoadBalancerPoolInterfaceRegistration != null) {
192 registrations.add(neutronLoadBalancerPoolInterfaceRegistration);