2 * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. 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
8 package org.opendaylight.genius.itm.impl;
10 import com.google.common.base.Preconditions;
11 import java.math.BigInteger;
12 import java.util.List;
13 import java.util.concurrent.ExecutionException;
14 import java.util.concurrent.Future;
15 import java.util.regex.Matcher;
16 import java.util.regex.Pattern;
18 import org.apache.felix.service.command.CommandSession;
20 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
23 import org.opendaylight.genius.itm.api.IITMProvider;
24 import org.opendaylight.genius.itm.cli.TepCommandHelper;
25 import org.opendaylight.genius.itm.listeners.cache.DpnTepsInfoListener;
26 import org.opendaylight.genius.itm.cli.TepException;
27 import org.opendaylight.genius.itm.globals.ITMConstants;
28 import org.opendaylight.genius.itm.listeners.InterfaceStateListener;
29 import org.opendaylight.genius.itm.listeners.TransportZoneListener;
30 import org.opendaylight.genius.itm.listeners.cache.StateTunnelListListener;
31 import org.opendaylight.genius.itm.listeners.TunnelMonitorChangeListener;
32 import org.opendaylight.genius.itm.listeners.TunnelMonitorIntervalListener;
33 import org.opendaylight.genius.itm.listeners.VtepConfigSchemaListener;
34 import org.opendaylight.genius.itm.listeners.cache.ItmMonitoringIntervalListener;
35 import org.opendaylight.genius.itm.listeners.cache.ItmMonitoringListener;
36 import org.opendaylight.genius.itm.monitoring.ItmTunnelEventListener;
37 import org.opendaylight.genius.itm.rpc.ItmManagerRpcService;
38 import org.opendaylight.genius.itm.snd.ITMStatusMonitor;
39 import org.opendaylight.genius.mdsalutil.MDSALUtil;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.VtepConfigSchemas;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.vtep.config.schemas.VtepConfigSchema;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.vtep.config.schemas.VtepConfigSchemaBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.AddExternalTunnelEndpointInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.RemoveExternalTunnelEndpointInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.AddExternalTunnelEndpointInputBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.RemoveExternalTunnelEndpointInputBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelList;
53 import org.opendaylight.yangtools.yang.common.RpcResult;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
57 import javax.annotation.PostConstruct;
58 import javax.annotation.PreDestroy;
59 import javax.inject.Inject;
60 import javax.inject.Singleton;
63 public class ItmProvider implements AutoCloseable, IITMProvider /*,ItmStateService */{
65 private static final Logger LOG = LoggerFactory.getLogger(ItmProvider.class);
66 private ITMManager itmManager;
67 private DataBroker dataBroker;
68 private ItmManagerRpcService itmRpcService ;
69 private IdManagerService idManager;
70 private TepCommandHelper tepCommandHelper;
71 private TransportZoneListener tzChangeListener;
72 private TunnelMonitorChangeListener tnlToggleListener;
73 private TunnelMonitorIntervalListener tnlIntervalListener;
74 private VtepConfigSchemaListener vtepConfigSchemaListener;
75 private InterfaceStateListener ifStateListener;
76 private RpcProviderRegistry rpcProviderRegistry;
77 private static final ITMStatusMonitor itmStatusMonitor = ITMStatusMonitor.getInstance();
78 private ItmTunnelEventListener itmStateListener;
79 private ItmMonitoringListener itmMonitoringListener;
80 private ItmMonitoringIntervalListener itmMonitoringIntervalListener;
81 static short flag = 0;
82 private StateTunnelListListener tunnelStateListener ;
83 private DpnTepsInfoListener dpnTepsInfoListener ;
86 public ItmProvider(DataBroker dataBroker,
87 DpnTepsInfoListener dpnTepsInfoListener,
88 IdManagerService idManagerService,
89 InterfaceStateListener interfaceStateListener,
90 ITMManager itmManager,
91 ItmManagerRpcService itmManagerRpcService,
92 ItmMonitoringListener itmMonitoringListener,
93 ItmMonitoringIntervalListener itmMonitoringIntervalListener,
94 ItmTunnelEventListener itmTunnelEventListener,
95 StateTunnelListListener stateTunnelListListener,
96 TepCommandHelper tepCommandHelper,
97 TunnelMonitorChangeListener tunnelMonitorChangeListener,
98 TunnelMonitorIntervalListener tunnelMonitorIntervalListener,
99 TransportZoneListener transportZoneListener,
100 VtepConfigSchemaListener vtepConfigSchemaListener) {
101 LOG.info("ItmProvider Before register MBean");
102 itmStatusMonitor.registerMbean();
103 this.dataBroker = dataBroker;
104 this.dpnTepsInfoListener = dpnTepsInfoListener;
105 this.idManager = idManagerService;
106 this.ifStateListener = interfaceStateListener;
107 this.itmManager = itmManager;
108 this.itmRpcService = itmManagerRpcService;
109 this.itmMonitoringListener = itmMonitoringListener;
110 this.itmMonitoringIntervalListener = itmMonitoringIntervalListener;
111 this.itmStateListener = itmTunnelEventListener;
112 this.tunnelStateListener = stateTunnelListListener;
113 this.tepCommandHelper = tepCommandHelper;
114 this.tnlToggleListener = tunnelMonitorChangeListener;
115 this.tnlIntervalListener = tunnelMonitorIntervalListener;
116 this.tzChangeListener = transportZoneListener;
117 this.vtepConfigSchemaListener = vtepConfigSchemaListener;
121 public void start() throws Exception {
123 LOG.info("ItmProvider Started");
128 public void close() throws Exception {
129 if (itmManager != null) {
132 if (tzChangeListener != null) {
133 tzChangeListener.close();
135 if (tnlIntervalListener != null) {
136 tnlIntervalListener.close();
138 if(tnlToggleListener!= null){
139 tnlToggleListener.close();
141 if(tunnelStateListener!= null){
142 tunnelStateListener.close();
144 if(dpnTepsInfoListener!= null){
145 dpnTepsInfoListener.close();
147 LOG.info("ItmProvider Closed");
150 private void createIdPool() {
151 CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
152 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
153 .setLow(ITMConstants.ITM_IDPOOL_START)
154 .setHigh(new BigInteger(ITMConstants.ITM_IDPOOL_SIZE).longValue())
157 Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
158 if ((result != null) && (result.get().isSuccessful())) {
159 LOG.debug("Created IdPool for ITM Service");
161 } catch (InterruptedException | ExecutionException e) {
162 LOG.error("Failed to create idPool for ITM Service",e);
167 public DataBroker getDataBroker() {
171 public void addExternalEndpoint(Class<? extends TunnelTypeBase> tunnelType, IpAddress dcgwIP) {
172 AddExternalTunnelEndpointInput addExternalTunnelEndpointInput =
173 new AddExternalTunnelEndpointInputBuilder().setTunnelType(tunnelType)
174 .setDestinationIp(dcgwIP).build();
175 itmRpcService.addExternalTunnelEndpoint(addExternalTunnelEndpointInput);
178 public void remExternalEndpoint(Class<? extends TunnelTypeBase> tunnelType, IpAddress dcgwIP) {
179 RemoveExternalTunnelEndpointInput removeExternalTunnelEndpointInput =
180 new RemoveExternalTunnelEndpointInputBuilder().setTunnelType(tunnelType)
181 .setDestinationIp(dcgwIP).build();
182 itmRpcService.removeExternalTunnelEndpoint(removeExternalTunnelEndpointInput);
185 public void createLocalCache(BigInteger dpnId, String portName, Integer vlanId, String ipAddress, String subnetMask,
186 String gatewayIp, String transportZone, CommandSession session) {
187 if (tepCommandHelper != null) {
189 tepCommandHelper.createLocalCache(dpnId, portName, vlanId, ipAddress, subnetMask, gatewayIp, transportZone, session);
190 } catch (TepException e) {
191 LOG.error(e.getMessage());
194 LOG.trace("tepCommandHelper doesnt exist");
199 public void commitTeps() {
201 tepCommandHelper.deleteOnCommit();
202 tepCommandHelper.buildTeps();
203 } catch (Exception e) {
204 LOG.debug("unable to configure teps" + e.toString());
209 public void showTeps(CommandSession session) {
211 tepCommandHelper.showTeps(itmManager.getTunnelMonitorEnabledFromConfigDS(), ItmUtils.determineMonitorInterval(this.dataBroker), session);
212 } catch (TepException e) {
213 LOG.error(e.getMessage());
217 public void showState(List<StateTunnelList> tunnels,CommandSession session) {
218 if (tunnels != null) {
220 tepCommandHelper.showState(tunnels, itmManager.getTunnelMonitorEnabledFromConfigDS(), session);
221 }catch(TepException e) {
222 LOG.error(e.getMessage());
225 LOG.debug("No tunnels available");
229 public void showCache( String cacheName) {
230 tepCommandHelper.showCache(cacheName);
233 public void deleteVtep(BigInteger dpnId, String portName, Integer vlanId, String ipAddress, String subnetMask,
234 String gatewayIp, String transportZone, CommandSession session) {
236 tepCommandHelper.deleteVtep(dpnId, portName, vlanId, ipAddress, subnetMask, gatewayIp, transportZone, session);
237 } catch (Exception e) {
238 LOG.error(e.getMessage());
243 public void configureTunnelType(String transportZone, String tunnelType) {
244 LOG .debug("ItmProvider: configureTunnelType {} for transportZone {}", tunnelType, transportZone);
245 tepCommandHelper.configureTunnelType(transportZone,tunnelType);
249 public void addVtepConfigSchema(VtepConfigSchema vtepConfigSchema) {
250 VtepConfigSchema validatedSchema = ItmUtils.validateForAddVtepConfigSchema(vtepConfigSchema,
251 getAllVtepConfigSchemas());
253 String schemaName = validatedSchema.getSchemaName();
254 VtepConfigSchema existingSchema = getVtepConfigSchema(schemaName);
255 if (existingSchema != null) {
256 Preconditions.checkArgument(false, String.format("VtepConfigSchema [%s] already exists!", schemaName));
258 MDSALUtil.syncWrite(this.dataBroker, LogicalDatastoreType.CONFIGURATION,
259 ItmUtils.getVtepConfigSchemaIdentifier(schemaName), validatedSchema);
260 LOG.debug("Vtep config schema {} added to config DS", schemaName);
264 public VtepConfigSchema getVtepConfigSchema(String schemaName) {
265 return ItmUtils.read(LogicalDatastoreType.CONFIGURATION, ItmUtils.getVtepConfigSchemaIdentifier(schemaName),
266 this.dataBroker).orNull();
270 public List<VtepConfigSchema> getAllVtepConfigSchemas() {
271 return ItmUtils.read(LogicalDatastoreType.CONFIGURATION, ItmUtils.getVtepConfigSchemasIdentifier(),
272 this.dataBroker).transform(VtepConfigSchemas::getVtepConfigSchema).orNull();
276 public void updateVtepSchema(String schemaName, List<BigInteger> lstDpnsForAdd, List<BigInteger> lstDpnsForDelete) {
277 LOG.trace("Updating VTEP schema {} by adding DPN's {} and deleting DPN's {}.", schemaName, lstDpnsForAdd,
280 VtepConfigSchema schema = ItmUtils.validateForUpdateVtepSchema(schemaName, lstDpnsForAdd, lstDpnsForDelete,
282 VtepConfigSchemaBuilder builder = new VtepConfigSchemaBuilder(schema);
283 /* if (ItmUtils.getDpnIdList(schema.getDpnIds()).isEmpty()) {
284 builder.setDpnIds(schema.getDpnIds());
286 if (lstDpnsForAdd != null && !lstDpnsForAdd.isEmpty()) {
287 List<BigInteger> originalDpnList = ItmUtils.getDpnIdList(schema.getDpnIds()) ;
288 originalDpnList.addAll(lstDpnsForAdd) ;
289 builder.setDpnIds(ItmUtils.getDpnIdsListFromBigInt(originalDpnList));
291 if (lstDpnsForDelete != null && !lstDpnsForDelete.isEmpty()) {
292 List<BigInteger> originalDpnList = ItmUtils.getDpnIdList(schema.getDpnIds()) ;
293 originalDpnList.removeAll(lstDpnsForDelete) ;
294 builder.setDpnIds(ItmUtils.getDpnIdsListFromBigInt(originalDpnList)) ;
295 // schema.setDpnIds(ItmUtils.getDpnIdsListFromBigInt(ItmUtils.getDpnIdList(schema.getDpnIds()).removeAll(lstDpnsForAdd)));
298 schema = builder.build();
299 MDSALUtil.syncWrite(this.dataBroker, LogicalDatastoreType.CONFIGURATION,
300 ItmUtils.getVtepConfigSchemaIdentifier(schemaName), schema);
301 LOG.debug("Vtep config schema {} updated to config DS with DPN's {}", schemaName, ItmUtils.getDpnIdList(schema.getDpnIds()));
305 public void deleteAllVtepSchemas() {
306 List<VtepConfigSchema> lstSchemas = getAllVtepConfigSchemas();
307 if (lstSchemas != null && !lstSchemas.isEmpty()) {
308 for (VtepConfigSchema schema : lstSchemas) {
309 MDSALUtil.syncDelete(this.dataBroker, LogicalDatastoreType.CONFIGURATION,
310 ItmUtils.getVtepConfigSchemaIdentifier(schema.getSchemaName()));
313 LOG.debug("Deleted all Vtep schemas from config DS");
316 public void configureTunnelMonitorParams(boolean monitorEnabled, String monitorProtocol) {
317 tepCommandHelper.configureTunnelMonitorParams(monitorEnabled, monitorProtocol);
320 public void configureTunnelMonitorInterval(int interval) {
321 tepCommandHelper.configureTunnelMonitorInterval(interval);
324 public boolean validateIP (final String ip){
325 if (ip == null || ip.equals("")) {
328 final String PATTERN =
329 "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
330 Pattern pattern = Pattern.compile(PATTERN);
331 Matcher matcher = pattern.matcher(ip);
332 return matcher.matches();