Remove OvsdbConfigurationService
[ovsdb.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / impl / TenantNetworkManagerImpl.java
1 /*
2  * Copyright (C) 2013 Red Hat, Inc. and others...
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  * Authors : Madhu Venugopal, Brent Salisbury, Dave Tucker
9  */
10 package org.opendaylight.ovsdb.openstack.netvirt.impl;
11
12 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
13 import org.opendaylight.neutron.spi.INeutronPortCRUD;
14 import org.opendaylight.neutron.spi.NeutronNetwork;
15 import org.opendaylight.neutron.spi.NeutronPort;
16 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
17 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
18 import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
21
22 import java.util.List;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 public class TenantNetworkManagerImpl implements TenantNetworkManager {
27     static final Logger logger = LoggerFactory.getLogger(TenantNetworkManagerImpl.class);
28
29     // The implementation for each of these services is resolved by the OSGi Service Manager
30     private volatile INeutronNetworkCRUD neutronNetworkCache;
31     private volatile INeutronPortCRUD neutronPortCache;
32     private volatile VlanConfigurationCache vlanConfigurationCache;
33
34     void init() {
35         logger.info(">>>>>> init {}", this.getClass());
36     }
37
38     @Override
39     public int getInternalVlan(Node node, String networkId) {
40         Integer vlan = vlanConfigurationCache.getInternalVlan(node, networkId);
41         if (vlan == null) return 0;
42         return vlan;
43     }
44
45     @Override
46     public void reclaimInternalVlan(Node node, NeutronNetwork network) {
47         int vlan = vlanConfigurationCache.reclaimInternalVlan(node, network.getID());
48         if (vlan <= 0) {
49             logger.debug("Unable to get an internalVlan for Network {}", network);
50             return;
51         }
52         logger.debug("Removed Vlan {} on {}", vlan);
53     }
54
55     @Override
56     public void programInternalVlan(Node node, OvsdbTerminationPointAugmentation tp, NeutronNetwork network) {
57         int vlan = vlanConfigurationCache.getInternalVlan(node, network.getID());
58         logger.debug("Programming Vlan {} on {}", vlan, tp);
59         if (vlan <= 0) {
60             logger.debug("Unable to get an internalVlan for Network {}", network);
61             return;
62         }
63
64         MdsalUtils.addVlanToTp(vlan);
65     }
66
67     @Override
68     public boolean isTenantNetworkPresentInNode(Node node, String segmentationId) {
69         String networkId = this.getNetworkId(segmentationId);
70         if (networkId == null) {
71             logger.debug("Tenant Network not found with Segmenation-id {}",segmentationId);
72             return false;
73         }
74
75         try {
76             List<OvsdbTerminationPointAugmentation> ports = MdsalUtils.getPorts(node);
77             for (OvsdbTerminationPointAugmentation port : ports) {
78                 String ifaceId = MdsalUtils.getInterfaceExternalIdsValue(port, Constants.EXTERNAL_ID_INTERFACE_ID);
79                 if (ifaceId != null && isInterfacePresentInTenantNetwork(ifaceId, networkId)) {
80                     logger.debug("Tenant Network {} with Segmentation-id {} is present in Node {} / Interface {}",
81                             networkId, segmentationId, node, port);
82                     return true;
83                 }
84             }
85         } catch (Exception e) {
86             logger.error("Error while trying to determine if network is present on node", e);
87             return false;
88         }
89
90         logger.debug("Tenant Network {} with Segmenation-id {} is NOT present in Node {}",
91                 networkId, segmentationId, node);
92
93         return false;
94     }
95
96     @Override
97     public String getNetworkId(String segmentationId) {
98         List <NeutronNetwork> networks = neutronNetworkCache.getAllNetworks();
99         for (NeutronNetwork network : networks) {
100             if (network.getProviderSegmentationID().equalsIgnoreCase(segmentationId)) return network.getNetworkUUID();
101         }
102         return null;
103     }
104
105     @Override
106     public NeutronNetwork getTenantNetwork(OvsdbTerminationPointAugmentation terminationPointAugmentation) {
107         NeutronNetwork neutronNetwork = null;
108         logger.trace("getTenantNetwork for {}", terminationPointAugmentation.getName());
109         String neutronPortId = MdsalUtils.getInterfaceExternalIdsValue(terminationPointAugmentation,
110                 Constants.EXTERNAL_ID_INTERFACE_ID);
111         if (neutronPortId != null) {
112             NeutronPort neutronPort = neutronPortCache.getPort(neutronPortId);
113             if (neutronPort != null) {
114                 neutronNetwork = neutronNetworkCache.getNetwork(neutronPort.getNetworkUUID());
115                 if (neutronNetwork != null) {
116                     logger.debug("mapped to {}", neutronNetwork);
117                 }
118             }
119         }
120         if (neutronNetwork != null) {
121             logger.debug("mapped to {}", neutronNetwork);
122         } else {
123             logger.warn("getTenantPort did not find network for {}", terminationPointAugmentation.getName());
124         }
125         return neutronNetwork;
126     }
127
128     @Override
129     public NeutronPort getTenantPort(OvsdbTerminationPointAugmentation terminationPointAugmentation) {
130         NeutronPort neutronPort = null;
131         logger.trace("getTenantPort for {}", terminationPointAugmentation.getName());
132         String neutronPortId = MdsalUtils.getInterfaceExternalIdsValue(terminationPointAugmentation,
133             Constants.EXTERNAL_ID_INTERFACE_ID);
134         if (neutronPortId != null) {
135             neutronPort = neutronPortCache.getPort(neutronPortId);
136         }
137         if (neutronPort != null) {
138             logger.debug("mapped to {}", neutronPort);
139         } else {
140             logger.warn("getTenantPort did not find port for {}", terminationPointAugmentation.getName());
141         }
142
143         return neutronPort;
144     }
145
146     @Override
147     public int networkCreated (Node node, String networkId) {
148         return vlanConfigurationCache.assignInternalVlan(node, networkId);
149     }
150
151     @Override
152     public void networkDeleted(String id) {
153         //ToDo: Delete? This method does nothing since container support was dropped...
154     }
155
156     private boolean isInterfacePresentInTenantNetwork (String portId, String networkId) {
157         NeutronPort neutronPort = neutronPortCache.getPort(portId);
158         return neutronPort != null && neutronPort.getNetworkUUID().equalsIgnoreCase(networkId);
159     }
160 }