2 * Copyright (c) 2016 Cisco Systems 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
8 package org.opendaylight.unimgr.mef.nrp.cisco.xr.l2vpn.activator;
10 import com.google.common.base.Optional;
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.controller.md.sal.binding.api.MountPointService;
13 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
16 import org.opendaylight.unimgr.mef.nrp.cisco.xr.common.helper.InterfaceHelper;
17 import org.opendaylight.unimgr.mef.nrp.cisco.xr.l2vpn.helper.L2vpnHelper;
18 import org.opendaylight.unimgr.mef.nrp.common.MountPointHelper;
19 import org.opendaylight.unimgr.mef.nrp.common.ResourceActivator;
20 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.PolicyManager;
21 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730.InterfaceActive;
22 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730.InterfaceConfigurations;
23 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730._interface.configurations.InterfaceConfiguration;
24 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730._interface.configurations.InterfaceConfigurationKey;
25 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.L2vpn;
26 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.Database;
27 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.XconnectGroups;
28 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.XconnectGroup;
29 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.XconnectGroupKey;
30 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.xconnect.group.P2pXconnects;
31 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.xconnect.group.p2p.xconnects.P2pXconnect;
32 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.xconnect.group.p2p.xconnects.P2pXconnectKey;
33 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.xconnect.group.p2p.xconnects.p2p.xconnect.Pseudowires;
34 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.xr.types.rev150629.CiscoIosXrString;
35 import org.opendaylight.yang.gen.v1.urn.onf.core.network.module.rev160630.g_forwardingconstruct.FcPort;
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
41 * Abstarct activator of VPLS-based L2 VPN on IOS-XR devices. It is responsible for handling activation and deactivation
42 * process of VPN configuration and it provides generic transaction designated for this purpose.
44 * @author krzysztof.bijakowski@amartus.com
46 public abstract class AbstractL2vpnActivator implements ResourceActivator {
48 private static final Logger LOG = LoggerFactory.getLogger(AbstractL2vpnActivator.class);
50 protected DataBroker dataBroker;
52 private MountPointService mountService;
54 protected AbstractL2vpnActivator(DataBroker dataBroker, MountPointService mountService) {
55 this.dataBroker = dataBroker;
56 this.mountService = mountService;
60 public void activate(String nodeName, String outerName, String innerName, FcPort port, FcPort neighbor, long mtu) throws TransactionCommitFailedException {
61 java.util.Optional<PolicyManager> qosConfig = activateQos(innerName, port);
62 InterfaceConfigurations interfaceConfigurations = activateInterface(port, neighbor, mtu);
63 Pseudowires pseudowires = activatePseudowire(neighbor);
64 XconnectGroups xconnectGroups = activateXConnect(outerName, innerName, port, neighbor, pseudowires);
65 L2vpn l2vpn = activateL2Vpn(xconnectGroups);
67 doActivate(nodeName, outerName, innerName, interfaceConfigurations, l2vpn, qosConfig);
71 public void deactivate(String nodeName, String outerName, String innerName, FcPort port, FcPort neighbor, long mtu) throws TransactionCommitFailedException {
72 InstanceIdentifier<P2pXconnect> xconnectId = deactivateXConnect(outerName, innerName);
73 InstanceIdentifier<InterfaceConfiguration> interfaceConfigurationId = deactivateInterface(port);
75 doDeactivate(nodeName, outerName, innerName, xconnectId, interfaceConfigurationId);
78 protected void doActivate(String nodeName,
81 InterfaceConfigurations interfaceConfigurations,
83 java.util.Optional<PolicyManager> qosConfig) throws TransactionCommitFailedException {
85 Optional<DataBroker> optional = MountPointHelper.getDataBroker(mountService, nodeName);
86 if (!optional.isPresent()) {
87 LOG.error("Could not retrieve MountPoint for {}", nodeName);
91 WriteTransaction transaction = optional.get().newWriteOnlyTransaction();
92 transaction.merge(LogicalDatastoreType.CONFIGURATION, InterfaceHelper.getInterfaceConfigurationsId(), interfaceConfigurations);
93 transaction.merge(LogicalDatastoreType.CONFIGURATION, L2vpnHelper.getL2vpnId(), l2vpn);
94 transaction.submit().checkedGet();
97 protected void doDeactivate(String nodeName,
100 InstanceIdentifier<P2pXconnect> xconnectId,
101 InstanceIdentifier<InterfaceConfiguration> interfaceConfigurationId) throws TransactionCommitFailedException {
103 Optional<DataBroker> optional = MountPointHelper.getDataBroker(mountService, nodeName);
104 if (!optional.isPresent()) {
105 LOG.error("Could not retrieve MountPoint for {}", nodeName);
109 WriteTransaction transaction = optional.get().newWriteOnlyTransaction();
110 transaction.delete(LogicalDatastoreType.CONFIGURATION, xconnectId);
111 transaction.delete(LogicalDatastoreType.CONFIGURATION, interfaceConfigurationId);
112 transaction.submit().checkedGet();
115 protected abstract java.util.Optional<PolicyManager> activateQos(String name, FcPort port);
117 protected abstract InterfaceConfigurations activateInterface(FcPort portA, FcPort portZ, long mtu);
119 protected abstract Pseudowires activatePseudowire(FcPort neighbor);
121 protected abstract XconnectGroups activateXConnect(String outerName, String innerName, FcPort portA, FcPort portZ, Pseudowires pseudowires);
123 protected abstract L2vpn activateL2Vpn(XconnectGroups xconnectGroups);
125 private InstanceIdentifier<P2pXconnect> deactivateXConnect(String outerName, String innerName) {
126 return InstanceIdentifier.builder(L2vpn.class)
127 .child(Database.class)
128 .child(XconnectGroups.class)
129 .child(XconnectGroup.class, new XconnectGroupKey(new CiscoIosXrString(outerName)))
130 .child(P2pXconnects.class).child(P2pXconnect.class, new P2pXconnectKey(new CiscoIosXrString(innerName)))
134 private InstanceIdentifier<InterfaceConfiguration> deactivateInterface(FcPort port) {
135 return InstanceIdentifier.builder(InterfaceConfigurations.class)
136 .child(InterfaceConfiguration.class, new InterfaceConfigurationKey(new InterfaceActive("act"), InterfaceHelper.getInterfaceName(port)))