Refactoring of cisco-xr-driver and impl modules.
[unimgr.git] / cisco-xr-driver / src / main / java / org / opendaylight / unimgr / mef / nrp / cisco / xr / l2vpn / activator / AbstractL2vpnActivator.java
1 /*
2  * Copyright (c) 2016 Cisco Systems 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 package org.opendaylight.unimgr.mef.nrp.cisco.xr.l2vpn.activator;
9
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;
39
40 /**
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.
43  *
44  * @author krzysztof.bijakowski@amartus.com
45  */
46 public abstract class AbstractL2vpnActivator implements ResourceActivator {
47
48     private static final Logger LOG = LoggerFactory.getLogger(AbstractL2vpnActivator.class);
49
50     protected DataBroker dataBroker;
51
52     private MountPointService mountService;
53
54     protected AbstractL2vpnActivator(DataBroker dataBroker, MountPointService mountService) {
55         this.dataBroker = dataBroker;
56         this.mountService = mountService;
57     }
58
59     @Override
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);
66
67         doActivate(nodeName, outerName, innerName, interfaceConfigurations, l2vpn, qosConfig);
68     }
69
70     @Override
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);
74
75         doDeactivate(nodeName, outerName, innerName, xconnectId, interfaceConfigurationId);
76     }
77
78     protected void doActivate(String nodeName,
79                               String outerName,
80                               String innerName,
81                               InterfaceConfigurations interfaceConfigurations,
82                               L2vpn l2vpn,
83                               java.util.Optional<PolicyManager> qosConfig) throws TransactionCommitFailedException {
84
85         Optional<DataBroker> optional = MountPointHelper.getDataBroker(mountService, nodeName);
86         if (!optional.isPresent()) {
87             LOG.error("Could not retrieve MountPoint for {}", nodeName);
88             return;
89         }
90
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();
95     }
96
97     protected void doDeactivate(String nodeName,
98                                 String outerName,
99                                 String innerName,
100                                 InstanceIdentifier<P2pXconnect> xconnectId,
101                                 InstanceIdentifier<InterfaceConfiguration> interfaceConfigurationId) throws TransactionCommitFailedException {
102
103         Optional<DataBroker> optional = MountPointHelper.getDataBroker(mountService, nodeName);
104         if (!optional.isPresent()) {
105             LOG.error("Could not retrieve MountPoint for {}", nodeName);
106             return;
107         }
108
109         WriteTransaction transaction = optional.get().newWriteOnlyTransaction();
110         transaction.delete(LogicalDatastoreType.CONFIGURATION, xconnectId);
111         transaction.delete(LogicalDatastoreType.CONFIGURATION, interfaceConfigurationId);
112         transaction.submit().checkedGet();
113     }
114
115     protected abstract java.util.Optional<PolicyManager> activateQos(String name, FcPort port);
116
117     protected abstract InterfaceConfigurations activateInterface(FcPort portA, FcPort portZ, long mtu);
118
119     protected abstract Pseudowires activatePseudowire(FcPort neighbor);
120
121     protected abstract XconnectGroups activateXConnect(String outerName, String innerName, FcPort portA, FcPort portZ, Pseudowires pseudowires);
122
123     protected abstract L2vpn activateL2Vpn(XconnectGroups xconnectGroups);
124
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)))
131                 .build();
132     }
133
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)))
137                 .build();
138     }
139 }