c44deafbe3c25bd9bc972d10df49323e6ea165d2
[ovsdb.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / impl / ConfigurationServiceImpl.java
1 /*
2  * Copyright (C) 2013 Red Hat, Inc.
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, Sam Hague, Dave Tucker
9  */
10 package org.opendaylight.ovsdb.openstack.netvirt.impl;
11
12 import java.net.InetAddress;
13 import java.util.Map;
14
15 import org.apache.commons.lang3.tuple.ImmutablePair;
16 import org.apache.commons.lang3.tuple.Pair;
17 import org.opendaylight.ovsdb.lib.notation.Row;
18 import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
19 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
20 import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
21 import org.opendaylight.ovsdb.schema.openvswitch.OpenVSwitch;
22 import org.opendaylight.ovsdb.utils.config.ConfigProperties;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
24
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 import com.google.common.collect.Maps;
29
30 public class ConfigurationServiceImpl implements ConfigurationService {
31     static final Logger logger = LoggerFactory.getLogger(ConfigurationServiceImpl.class);
32
33     private volatile OvsdbConfigurationService ovsdbConfigurationService;
34
35     private String integrationBridgeName;
36     private String networkBridgeName;
37     private String externalBridgeName;
38     private String tunnelEndpointKey;
39
40     private Map<Pair<String, String>, String> patchPortNames = Maps.newHashMap();
41     private String providerMappingsKey;
42     private String providerMapping;
43
44     public ConfigurationServiceImpl() {
45         tunnelEndpointKey = Constants.TUNNEL_ENDPOINT_KEY;
46         integrationBridgeName = Constants.INTEGRATION_BRIDGE;
47         networkBridgeName = Constants.NETWORK_BRIDGE;
48         externalBridgeName = Constants.EXTERNAL_BRIDGE;
49         patchPortNames.put(new ImmutablePair<>(integrationBridgeName, networkBridgeName),
50                            Constants.PATCH_PORT_TO_NETWORK_BRIDGE_NAME);
51         patchPortNames.put(new ImmutablePair<>(networkBridgeName, integrationBridgeName),
52                            Constants.PATCH_PORT_TO_INTEGRATION_BRIDGE_NAME);
53         providerMappingsKey = Constants.PROVIDER_MAPPINGS_KEY;
54         providerMapping = Constants.PROVIDER_MAPPING;
55     }
56
57     @Override
58     public String getIntegrationBridgeName() {
59         return integrationBridgeName;
60     }
61
62     @Override
63     public void setIntegrationBridgeName(String integrationBridgeName) {
64         this.integrationBridgeName = integrationBridgeName;
65     }
66
67     @Override
68     public String getNetworkBridgeName() {
69         return networkBridgeName;
70     }
71
72     @Override
73     public void setNetworkBridgeName(String networkBridgeName) {
74         this.networkBridgeName = networkBridgeName;
75     }
76
77     @Override
78     public String getExternalBridgeName() {
79         return externalBridgeName;
80     }
81
82     @Override
83     public void setExternalBridgeName(String externalBridgeName) {
84         this.externalBridgeName = externalBridgeName;
85     }
86
87     @Override
88     public String getTunnelEndpointKey() {
89         return tunnelEndpointKey;
90     }
91
92     @Override
93     public void setTunnelEndpointKey(String tunnelEndpointKey) {
94         this.tunnelEndpointKey = tunnelEndpointKey;
95     }
96
97     @Override
98     public String getProviderMappingsKey() {
99         return providerMappingsKey;
100     }
101
102     @Override
103     public void setProviderMappingsKey(String providerMappingsKey) {
104         this.providerMappingsKey = providerMappingsKey;
105     }
106
107     @Override
108     public Map<Pair<String, String>, String> getPatchPortNames() {
109         return patchPortNames;
110     }
111
112     @Override
113     public void setPatchPortNames(Map<Pair<String, String>, String> patchPortNames) {
114         this.patchPortNames = patchPortNames;
115     }
116
117     @Override
118     public String getPatchPortName(Pair portTuple){
119         return this.patchPortNames.get(portTuple);
120     }
121
122     @Override
123     public String getDefaultProviderMapping() {
124         return providerMapping;
125     }
126
127     @Override
128     public void setDefaultProviderMapping(String providerMapping) {
129         this.providerMapping = providerMapping;
130     }
131
132     @Override
133     public InetAddress getTunnelEndPoint(Node node) {
134         InetAddress address = null;
135         try {
136             Map<String, Row> ovsTable = ovsdbConfigurationService.getRows(node,
137                     ovsdbConfigurationService.getTableName(node, OpenVSwitch.class));
138
139             if (ovsTable == null) {
140                 logger.error("OpenVSwitch table is null for Node {} ", node);
141                 return null;
142             }
143
144             // While there is only one entry in the HashMap, we can't access it by index...
145             for (Row row : ovsTable.values()) {
146                 OpenVSwitch ovsRow = ovsdbConfigurationService.getTypedRow(node, OpenVSwitch.class, row);
147                 Map<String, String> configs = ovsRow.getOtherConfigColumn().getData();
148
149                 if (configs == null) {
150                     logger.debug("OpenVSwitch table is null for Node {} ", node);
151                     continue;
152                 }
153
154                 String tunnelEndpoint = configs.get(tunnelEndpointKey);
155
156                 if (tunnelEndpoint == null) {
157                     continue;
158                 }
159
160                 address = InetAddress.getByName(tunnelEndpoint);
161                 logger.debug("Tunnel Endpoint for Node {} {}", node, address.getHostAddress());
162                 break;
163             }
164         }
165         catch (Exception e) {
166             logger.error("Error populating Tunnel Endpoint for Node {} ", node, e);
167         }
168
169         return address;
170     }
171
172     @Override
173     public String getOpenflowVersion(Node node) {
174         return Constants.OPENFLOW13;
175     }
176
177     @Override
178     public String getDefaultGatewayMacAddress(Node node) {
179         final String l3gatewayForNode =
180             node != null ?
181             ConfigProperties.getProperty(this.getClass(), "ovsdb.l3gateway.mac." + node.getId().getValue()) : null;
182         return l3gatewayForNode != null ?
183                l3gatewayForNode : ConfigProperties.getProperty(this.getClass(), "ovsdb.l3gateway.mac");
184     }
185 }