Migrate to using blueprints for unimgr initialisation.
[unimgr.git] / cisco-xr-driver / src / main / java / org / opendaylight / unimgr / mef / nrp / cisco / xr / L2vpnXconnectActivator.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
9 package org.opendaylight.unimgr.mef.nrp.cisco.xr;
10
11 import java.util.LinkedList;
12 import java.util.List;
13 import java.util.Map;
14 import java.util.concurrent.atomic.AtomicLong;
15
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.MountPointService;
18 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
21 import org.opendaylight.unimgr.mef.nrp.common.MountPointHelper;
22 import org.opendaylight.unimgr.mef.nrp.common.ResourceActivator;
23 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730.InterfaceActive;
24 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730.InterfaceConfigurations;
25 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730.InterfaceConfigurationsBuilder;
26 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730._interface.configurations.InterfaceConfiguration;
27 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730._interface.configurations.InterfaceConfigurationBuilder;
28 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730._interface.configurations.InterfaceConfigurationKey;
29 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730._interface.configurations._interface.configuration.MtusBuilder;
30 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730._interface.configurations._interface.configuration.mtus.Mtu;
31 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.ifmgr.cfg.rev150730._interface.configurations._interface.configuration.mtus.MtuBuilder;
32 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.InterfaceConfiguration3;
33 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.InterfaceConfiguration3Builder;
34 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.L2vpn;
35 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.L2vpnBuilder;
36 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.PseudowireIdRange;
37 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.PseudowireLabelRange;
38 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109._interface.configurations._interface.configuration.L2Transport;
39 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109._interface.configurations._interface.configuration.L2TransportBuilder;
40 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.Database;
41 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.DatabaseBuilder;
42 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.XconnectGroups;
43 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.XconnectGroupsBuilder;
44 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.XconnectGroup;
45 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.XconnectGroupBuilder;
46 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.XconnectGroupKey;
47 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.xconnect.group.P2pXconnects;
48 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.l2vpn.cfg.rev151109.l2vpn.database.xconnect.groups.xconnect.group.P2pXconnectsBuilder;
49 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;
50 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.P2pXconnectBuilder;
51 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;
52 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.AttachmentCircuitsBuilder;
53 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.PseudowiresBuilder;
54 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.attachment.circuits.AttachmentCircuit;
55 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.attachment.circuits.AttachmentCircuitBuilder;
56 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.Pseudowire;
57 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.PseudowireBuilder;
58 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.pseudowire.Neighbor;
59 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.pseudowire.NeighborBuilder;
60 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.pseudowire.pseudowire.content.MplsStaticLabelsBuilder;
61 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.xr.types.rev150629.CiscoIosXrString;
62 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.xr.types.rev150629.InterfaceName;
63 import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corenetworkmodule.objectclasses.rev160413.GFcPort;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
65 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
68
69 import com.google.common.base.Optional;
70 import com.google.common.collect.ImmutableMap;
71
72 public class L2vpnXconnectActivator implements ResourceActivator {
73
74     private static final Logger log = LoggerFactory.getLogger(L2vpnXconnectActivator.class);
75     private static final Map<String, String> loopbackMap = ImmutableMap.of("asr-101", "192.168.0.1", "asr-102",
76             "192.168.0.2", "asr-103", "192.168.0.3");
77     private static final AtomicLong pwIdGenerator = new AtomicLong(2000L);
78     private MountPointService mountService;
79
80     public L2vpnXconnectActivator(DataBroker dataBroker, MountPointService mountService) {
81         this.mountService = mountService;
82     }
83
84     @Override
85     public void activate(String nodeName, String outerName, String innerName, GFcPort port, GFcPort neighbor, long mtu) {
86
87         String portLtpId = port.getLtpRefList().get(0).getValue();
88         String neighborLtpId = neighbor.getLtpRefList().get(0).getValue();
89
90         String neighborHostname = neighborLtpId.split(":")[0];
91         InterfaceName interfaceName = new InterfaceName(portLtpId.split(":")[1]);
92
93         // XXX: need to flesh out real method to find neighbor's loopback
94         String neighborLoopback = loopbackMap.get(neighborHostname);
95         if (neighborLoopback == null) {
96             log.warn("No loopback address found for {}", neighborHostname);
97             neighborLoopback = "127.0.0.1";
98         }
99
100         Ipv4AddressNoZone neighborAddress = new Ipv4AddressNoZone(neighborLoopback);
101         InterfaceActive intActive = new InterfaceActive("act");
102
103         // XXX: need to implement real pseudowire-id generator
104         long pwIdVal = pwIdGenerator.getAndIncrement();
105
106         MtuBuilder mtuBuilder = new MtuBuilder();
107         mtuBuilder.setMtu(mtu);
108         mtuBuilder.setOwner(new CiscoIosXrString("GigabitEthernet"));
109
110         List<Mtu> mtus = new LinkedList<>();
111         mtus.add(mtuBuilder.build());
112         MtusBuilder mtusBuilder = new MtusBuilder();
113         mtusBuilder.setMtu(mtus);
114
115         InterfaceConfigurationBuilder intConfigBuilder = new InterfaceConfigurationBuilder();
116         intConfigBuilder.setInterfaceName(interfaceName).setActive(intActive).setMtus(mtusBuilder.build())
117                 .setShutdown(Boolean.FALSE);
118
119         L2Transport l2transport = new L2TransportBuilder().setEnabled(true).build();
120         InterfaceConfiguration3 augmentation = new InterfaceConfiguration3Builder().setL2Transport(l2transport).build();
121         intConfigBuilder.addAugmentation(InterfaceConfiguration3.class, augmentation);
122
123         List<InterfaceConfiguration> intConfigs = new LinkedList<>();
124         intConfigs.add(intConfigBuilder.build());
125         InterfaceConfigurationsBuilder intConfigsBuilder = new InterfaceConfigurationsBuilder();
126         intConfigsBuilder.setInterfaceConfiguration(intConfigs);
127
128         InstanceIdentifier<InterfaceConfigurations> intConfigsId = InstanceIdentifier
129                 .builder(InterfaceConfigurations.class).build();
130
131         AttachmentCircuitBuilder attachmentCircuitBuilder = new AttachmentCircuitBuilder();
132         attachmentCircuitBuilder.setName(interfaceName).setEnable(Boolean.TRUE);
133
134         List<AttachmentCircuit> attachmentCircuits = new LinkedList<>();
135         attachmentCircuits.add(attachmentCircuitBuilder.build());
136         AttachmentCircuitsBuilder attachmentCircuitsBuilder = new AttachmentCircuitsBuilder();
137         attachmentCircuitsBuilder.setAttachmentCircuit(attachmentCircuits);
138
139         PseudowireLabelRange label = new PseudowireLabelRange(pwIdVal);
140         MplsStaticLabelsBuilder labelBuilder = new MplsStaticLabelsBuilder();
141         labelBuilder.setLocalStaticLabel(label).setRemoteStaticLabel(label);
142
143         NeighborBuilder neighborBuilder = new NeighborBuilder();
144         neighborBuilder.setNeighbor(neighborAddress).setMplsStaticLabels(labelBuilder.build())
145                 .setXmlClass(new CiscoIosXrString("static"));
146
147         List<Neighbor> neighbors = new LinkedList<>();
148         neighbors.add(neighborBuilder.build());
149
150         // XXX
151         PseudowireIdRange pwId = new PseudowireIdRange(pwIdVal);
152         PseudowireBuilder pseudowireBuilder = new PseudowireBuilder();
153         pseudowireBuilder.setNeighbor(neighbors).setPseudowireId(pwId);
154
155         List<Pseudowire> pseudowires = new LinkedList<>();
156         pseudowires.add(pseudowireBuilder.build());
157         PseudowiresBuilder pseudowiresBuilder = new PseudowiresBuilder();
158         pseudowiresBuilder.setPseudowire(pseudowires);
159
160         P2pXconnectBuilder p2pXconnectBuilder = new P2pXconnectBuilder();
161         p2pXconnectBuilder.setName(new CiscoIosXrString(innerName))
162                 .setAttachmentCircuits(attachmentCircuitsBuilder.build()).setPseudowires(pseudowiresBuilder.build());
163
164         List<P2pXconnect> p2pXconnects = new LinkedList<>();
165         p2pXconnects.add(p2pXconnectBuilder.build());
166         P2pXconnectsBuilder p2pXconnectsBuilder = new P2pXconnectsBuilder();
167         p2pXconnectsBuilder.setP2pXconnect(p2pXconnects);
168
169         XconnectGroupBuilder xconnectGroupBuilder = new XconnectGroupBuilder();
170         xconnectGroupBuilder.setKey(new XconnectGroupKey(new CiscoIosXrString(outerName)));
171         xconnectGroupBuilder.setName(new CiscoIosXrString(outerName)).setP2pXconnects(p2pXconnectsBuilder.build());
172
173         List<XconnectGroup> xconnectGroups = new LinkedList<>();
174         xconnectGroups.add(xconnectGroupBuilder.build());
175         XconnectGroupsBuilder xconnectGroupsBuilder = new XconnectGroupsBuilder();
176         xconnectGroupsBuilder.setXconnectGroup(xconnectGroups);
177
178         DatabaseBuilder dbBuilder = new DatabaseBuilder();
179         dbBuilder.setXconnectGroups(xconnectGroupsBuilder.build());
180
181         L2vpnBuilder l2vpnBuilder = new L2vpnBuilder();
182         l2vpnBuilder.setDatabase(dbBuilder.build());
183
184         InstanceIdentifier<L2vpn> l2vpnId = InstanceIdentifier.builder(L2vpn.class).build();
185
186         Optional<DataBroker> optional = MountPointHelper.getDataBroker(mountService, nodeName);
187         if (optional.isPresent() == false) {
188             log.error("Could not retrieve MountPoint for {}", nodeName);
189             return;
190         }
191         DataBroker nodeDataBroker = optional.get();
192         WriteTransaction w = nodeDataBroker.newWriteOnlyTransaction();
193         w.merge(LogicalDatastoreType.CONFIGURATION, intConfigsId, intConfigsBuilder.build());
194         w.merge(LogicalDatastoreType.CONFIGURATION, l2vpnId, l2vpnBuilder.build());
195
196         try {
197             w.submit().checkedGet();
198             log.info("Service activated: {} {} {}", nodeName, outerName, innerName);
199         } catch (TransactionCommitFailedException e) {
200             log.error("Transaction failed", e);
201         }
202     }
203
204     @Override
205     public void deactivate(String nodeName, String outerName, String innerName, GFcPort port, GFcPort neighbor,
206             long mtu) {
207         String portLtpId = port.getLtpRefList().get(0).getValue();
208         String neighborLtpId = neighbor.getLtpRefList().get(0).getValue();
209
210         String neighborHostname = neighborLtpId.split(":")[0];
211         InterfaceName interfaceName = new InterfaceName(portLtpId.split(":")[1]);
212
213         // XXX: need to flesh out real method to find neighbor's loopback
214         String neighborLoopback = loopbackMap.get(neighborHostname);
215         if (neighborLoopback == null) {
216             log.warn("No loopback address found for {}", neighborHostname);
217             neighborLoopback = "127.0.0.1";
218         }
219
220         InterfaceActive intActive = new InterfaceActive("act");
221
222         InstanceIdentifier<P2pXconnect> p2pId = InstanceIdentifier.builder(L2vpn.class).child(Database.class)
223                 .child(XconnectGroups.class)
224                 .child(XconnectGroup.class, new XconnectGroupKey(new CiscoIosXrString(outerName)))
225                 .child(P2pXconnects.class).child(P2pXconnect.class, new P2pXconnectKey(new CiscoIosXrString(innerName)))
226                 .build();
227
228         InstanceIdentifier<InterfaceConfiguration> intConfigId = InstanceIdentifier
229                 .builder(InterfaceConfigurations.class)
230                 .child(InterfaceConfiguration.class, new InterfaceConfigurationKey(intActive, interfaceName)).build();
231
232         Optional<DataBroker> optional = MountPointHelper.getDataBroker(mountService, nodeName);
233         if (optional.isPresent() == false) {
234             log.error("Could not retrieve MountPoint for {}", nodeName);
235             return;
236         }
237         DataBroker nodeDataBroker = optional.get();
238         WriteTransaction w = nodeDataBroker.newWriteOnlyTransaction();
239         w.delete(LogicalDatastoreType.CONFIGURATION, p2pId);
240         w.delete(LogicalDatastoreType.CONFIGURATION, intConfigId);
241
242         try {
243             w.submit().checkedGet();
244             log.info("Service deactivated: {} {} {}", nodeName, outerName, innerName);
245         } catch (TransactionCommitFailedException e) {
246             log.error("Transaction failed", e);
247         }
248     }
249
250 }