Merge branch 'topic/master/neutron-yang-migration' to branch 'master'
[ovsdb.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / translator / crud / impl / NeutronLoadBalancerInterface.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.ovsdb.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.ovsdb.openstack.netvirt.translator.NeutronLoadBalancer;
21 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronLoadBalancerCRUD;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.Loadbalancers;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.loadbalancers.Loadbalancer;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.loadbalancers.LoadbalancerBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 import org.osgi.framework.BundleContext;
29 import org.osgi.framework.ServiceRegistration;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 /**
34  * TODO: Migrate this to consume the MD-SAL data store, so that it can read all the data from data store.
35  * No need to worry about the write/update related methods here. OVSDB net-virt will use these CRUD Interface
36  * only for reading. We will cleanup these interface/methods later.
37  */
38 public class NeutronLoadBalancerInterface extends AbstractNeutronInterface<Loadbalancer, NeutronLoadBalancer> implements INeutronLoadBalancerCRUD {
39     private static final Logger LOGGER = LoggerFactory.getLogger(NeutronLoadBalancerInterface.class);
40     private ConcurrentMap<String, NeutronLoadBalancer> loadBalancerDB  = new ConcurrentHashMap<String, NeutronLoadBalancer>();
41
42
43     NeutronLoadBalancerInterface(ProviderContext providerContext) {
44         super(providerContext);
45     }
46
47     @Override
48     public boolean neutronLoadBalancerExists(String uuid) {
49         return loadBalancerDB.containsKey(uuid);
50     }
51
52     @Override
53     public NeutronLoadBalancer getNeutronLoadBalancer(String uuid) {
54         if (!neutronLoadBalancerExists(uuid)) {
55             LOGGER.debug("No LoadBalancer Have Been Defined");
56             return null;
57         }
58         return loadBalancerDB.get(uuid);
59     }
60
61     @Override
62     public List<NeutronLoadBalancer> getAllNeutronLoadBalancers() {
63         Set<NeutronLoadBalancer> allLoadBalancers = new HashSet<NeutronLoadBalancer>();
64         for (Entry<String, NeutronLoadBalancer> entry : loadBalancerDB.entrySet()) {
65             NeutronLoadBalancer loadBalancer = entry.getValue();
66             allLoadBalancers.add(loadBalancer);
67         }
68         LOGGER.debug("Exiting getLoadBalancers, Found {} OpenStackLoadBalancer", allLoadBalancers.size());
69         List<NeutronLoadBalancer> ans = new ArrayList<NeutronLoadBalancer>();
70         ans.addAll(allLoadBalancers);
71         return ans;
72     }
73
74     @Override
75     public boolean addNeutronLoadBalancer(NeutronLoadBalancer input) {
76         if (neutronLoadBalancerExists(input.getID())) {
77             return false;
78         }
79         loadBalancerDB.putIfAbsent(input.getID(), input);
80         //TODO: add code to find INeutronLoadBalancerAware services and call newtorkCreated on them
81         return true;
82     }
83
84     @Override
85     public boolean removeNeutronLoadBalancer(String uuid) {
86         if (!neutronLoadBalancerExists(uuid)) {
87             return false;
88         }
89         loadBalancerDB.remove(uuid);
90         //TODO: add code to find INeutronLoadBalancerAware services and call newtorkDeleted on them
91         return true;
92     }
93
94     @Override
95     public boolean updateNeutronLoadBalancer(String uuid, NeutronLoadBalancer delta) {
96         if (!neutronLoadBalancerExists(uuid)) {
97             return false;
98         }
99         NeutronLoadBalancer target = loadBalancerDB.get(uuid);
100         return overwrite(target, delta);
101     }
102
103     @Override
104     public boolean neutronLoadBalancerInUse(String loadBalancerUUID) {
105         return !neutronLoadBalancerExists(loadBalancerUUID);
106     }
107
108     @Override
109     protected Loadbalancer toMd(String uuid) {
110         LoadbalancerBuilder loadBalancersBuilder = new LoadbalancerBuilder();
111         loadBalancersBuilder.setUuid(toUuid(uuid));
112         return loadBalancersBuilder.build();
113     }
114
115     @Override
116     protected InstanceIdentifier<Loadbalancer> createInstanceIdentifier(
117             Loadbalancer loadBalancer) {
118         return InstanceIdentifier.create(Neutron.class)
119                 .child(Loadbalancers.class)
120                 .child(Loadbalancer.class, loadBalancer.getKey());
121     }
122
123     @Override
124     protected Loadbalancer toMd(NeutronLoadBalancer loadBalancer) {
125         LoadbalancerBuilder loadBalancersBuilder = new LoadbalancerBuilder();
126         loadBalancersBuilder.setAdminStateUp(loadBalancer.getLoadBalancerAdminStateUp());
127         if (loadBalancer.getLoadBalancerDescription() != null) {
128             loadBalancersBuilder.setDescr(loadBalancer.getLoadBalancerDescription());
129         }
130         if (loadBalancer.getLoadBalancerName() != null) {
131             loadBalancersBuilder.setName(loadBalancer.getLoadBalancerName());
132         }
133         if (loadBalancer.getLoadBalancerStatus() != null) {
134             loadBalancersBuilder.setStatus(loadBalancer.getLoadBalancerStatus());
135         }
136         if (loadBalancer.getLoadBalancerTenantID() != null) {
137             loadBalancersBuilder.setTenantId(toUuid(loadBalancer.getLoadBalancerTenantID()));
138         }
139         if (loadBalancer.getLoadBalancerVipAddress() != null) {
140             loadBalancersBuilder.setVipAddress(new IpAddress(loadBalancer.getLoadBalancerVipAddress().toCharArray()));
141         }
142         if (loadBalancer.getLoadBalancerVipSubnetID() != null) {
143             loadBalancersBuilder.setVipSubnetId(toUuid(loadBalancer.getLoadBalancerVipSubnetID()));
144         }
145         if (loadBalancer.getID() != null) {
146             loadBalancersBuilder.setUuid(toUuid(loadBalancer.getID()));
147         } else {
148             LOGGER.warn("Attempting to write neutron load balancer without UUID");
149         }
150         return loadBalancersBuilder.build();
151     }
152
153     public static void registerNewInterface(BundleContext context,
154                                             ProviderContext providerContext,
155                                             List<ServiceRegistration<?>> registrations) {
156         NeutronLoadBalancerInterface neutronLoadBalancerInterface = new NeutronLoadBalancerInterface(providerContext);
157         ServiceRegistration<INeutronLoadBalancerCRUD> neutronLoadBalancerInterfaceRegistration = context.registerService(INeutronLoadBalancerCRUD.class, neutronLoadBalancerInterface, null);
158         if(neutronLoadBalancerInterfaceRegistration != null) {
159             registrations.add(neutronLoadBalancerInterfaceRegistration);
160         }
161     }
162 }