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
9 package org.opendaylight.unimgr.mef.nrp.cisco.xr;
11 import java.util.LinkedList;
12 import java.util.List;
14 import java.util.concurrent.atomic.AtomicLong;
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;
69 import com.google.common.base.Optional;
70 import com.google.common.collect.ImmutableMap;
72 public class L2vpnXconnectActivator implements ResourceActivator {
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;
80 public L2vpnXconnectActivator(DataBroker dataBroker, MountPointService mountService) {
81 this.mountService = mountService;
85 public void activate(String nodeName, String outerName, String innerName, GFcPort port, GFcPort neighbor, long mtu) {
87 String portLtpId = port.getLtpRefList().get(0).getValue();
88 String neighborLtpId = neighbor.getLtpRefList().get(0).getValue();
90 String neighborHostname = neighborLtpId.split(":")[0];
91 InterfaceName interfaceName = new InterfaceName(portLtpId.split(":")[1]);
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";
100 Ipv4AddressNoZone neighborAddress = new Ipv4AddressNoZone(neighborLoopback);
101 InterfaceActive intActive = new InterfaceActive("act");
103 // XXX: need to implement real pseudowire-id generator
104 long pwIdVal = pwIdGenerator.getAndIncrement();
106 MtuBuilder mtuBuilder = new MtuBuilder();
107 mtuBuilder.setMtu(mtu);
108 mtuBuilder.setOwner(new CiscoIosXrString("GigabitEthernet"));
110 List<Mtu> mtus = new LinkedList<>();
111 mtus.add(mtuBuilder.build());
112 MtusBuilder mtusBuilder = new MtusBuilder();
113 mtusBuilder.setMtu(mtus);
115 InterfaceConfigurationBuilder intConfigBuilder = new InterfaceConfigurationBuilder();
116 intConfigBuilder.setInterfaceName(interfaceName).setActive(intActive).setMtus(mtusBuilder.build())
117 .setShutdown(Boolean.FALSE);
119 L2Transport l2transport = new L2TransportBuilder().setEnabled(true).build();
120 InterfaceConfiguration3 augmentation = new InterfaceConfiguration3Builder().setL2Transport(l2transport).build();
121 intConfigBuilder.addAugmentation(InterfaceConfiguration3.class, augmentation);
123 List<InterfaceConfiguration> intConfigs = new LinkedList<>();
124 intConfigs.add(intConfigBuilder.build());
125 InterfaceConfigurationsBuilder intConfigsBuilder = new InterfaceConfigurationsBuilder();
126 intConfigsBuilder.setInterfaceConfiguration(intConfigs);
128 InstanceIdentifier<InterfaceConfigurations> intConfigsId = InstanceIdentifier
129 .builder(InterfaceConfigurations.class).build();
131 AttachmentCircuitBuilder attachmentCircuitBuilder = new AttachmentCircuitBuilder();
132 attachmentCircuitBuilder.setName(interfaceName).setEnable(Boolean.TRUE);
134 List<AttachmentCircuit> attachmentCircuits = new LinkedList<>();
135 attachmentCircuits.add(attachmentCircuitBuilder.build());
136 AttachmentCircuitsBuilder attachmentCircuitsBuilder = new AttachmentCircuitsBuilder();
137 attachmentCircuitsBuilder.setAttachmentCircuit(attachmentCircuits);
139 PseudowireLabelRange label = new PseudowireLabelRange(pwIdVal);
140 MplsStaticLabelsBuilder labelBuilder = new MplsStaticLabelsBuilder();
141 labelBuilder.setLocalStaticLabel(label).setRemoteStaticLabel(label);
143 NeighborBuilder neighborBuilder = new NeighborBuilder();
144 neighborBuilder.setNeighbor(neighborAddress).setMplsStaticLabels(labelBuilder.build())
145 .setXmlClass(new CiscoIosXrString("static"));
147 List<Neighbor> neighbors = new LinkedList<>();
148 neighbors.add(neighborBuilder.build());
151 PseudowireIdRange pwId = new PseudowireIdRange(pwIdVal);
152 PseudowireBuilder pseudowireBuilder = new PseudowireBuilder();
153 pseudowireBuilder.setNeighbor(neighbors).setPseudowireId(pwId);
155 List<Pseudowire> pseudowires = new LinkedList<>();
156 pseudowires.add(pseudowireBuilder.build());
157 PseudowiresBuilder pseudowiresBuilder = new PseudowiresBuilder();
158 pseudowiresBuilder.setPseudowire(pseudowires);
160 P2pXconnectBuilder p2pXconnectBuilder = new P2pXconnectBuilder();
161 p2pXconnectBuilder.setName(new CiscoIosXrString(innerName))
162 .setAttachmentCircuits(attachmentCircuitsBuilder.build()).setPseudowires(pseudowiresBuilder.build());
164 List<P2pXconnect> p2pXconnects = new LinkedList<>();
165 p2pXconnects.add(p2pXconnectBuilder.build());
166 P2pXconnectsBuilder p2pXconnectsBuilder = new P2pXconnectsBuilder();
167 p2pXconnectsBuilder.setP2pXconnect(p2pXconnects);
169 XconnectGroupBuilder xconnectGroupBuilder = new XconnectGroupBuilder();
170 xconnectGroupBuilder.setKey(new XconnectGroupKey(new CiscoIosXrString(outerName)));
171 xconnectGroupBuilder.setName(new CiscoIosXrString(outerName)).setP2pXconnects(p2pXconnectsBuilder.build());
173 List<XconnectGroup> xconnectGroups = new LinkedList<>();
174 xconnectGroups.add(xconnectGroupBuilder.build());
175 XconnectGroupsBuilder xconnectGroupsBuilder = new XconnectGroupsBuilder();
176 xconnectGroupsBuilder.setXconnectGroup(xconnectGroups);
178 DatabaseBuilder dbBuilder = new DatabaseBuilder();
179 dbBuilder.setXconnectGroups(xconnectGroupsBuilder.build());
181 L2vpnBuilder l2vpnBuilder = new L2vpnBuilder();
182 l2vpnBuilder.setDatabase(dbBuilder.build());
184 InstanceIdentifier<L2vpn> l2vpnId = InstanceIdentifier.builder(L2vpn.class).build();
186 Optional<DataBroker> optional = MountPointHelper.getDataBroker(mountService, nodeName);
187 if (optional.isPresent() == false) {
188 log.error("Could not retrieve MountPoint for {}", nodeName);
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());
197 w.submit().checkedGet();
198 log.info("Service activated: {} {} {}", nodeName, outerName, innerName);
199 } catch (TransactionCommitFailedException e) {
200 log.error("Transaction failed", e);
205 public void deactivate(String nodeName, String outerName, String innerName, GFcPort port, GFcPort neighbor,
207 String portLtpId = port.getLtpRefList().get(0).getValue();
208 String neighborLtpId = neighbor.getLtpRefList().get(0).getValue();
210 String neighborHostname = neighborLtpId.split(":")[0];
211 InterfaceName interfaceName = new InterfaceName(portLtpId.split(":")[1]);
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";
220 InterfaceActive intActive = new InterfaceActive("act");
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)))
228 InstanceIdentifier<InterfaceConfiguration> intConfigId = InstanceIdentifier
229 .builder(InterfaceConfigurations.class)
230 .child(InterfaceConfiguration.class, new InterfaceConfigurationKey(intActive, interfaceName)).build();
232 Optional<DataBroker> optional = MountPointHelper.getDataBroker(mountService, nodeName);
233 if (optional.isPresent() == false) {
234 log.error("Could not retrieve MountPoint for {}", nodeName);
237 DataBroker nodeDataBroker = optional.get();
238 WriteTransaction w = nodeDataBroker.newWriteOnlyTransaction();
239 w.delete(LogicalDatastoreType.CONFIGURATION, p2pId);
240 w.delete(LogicalDatastoreType.CONFIGURATION, intConfigId);
243 w.submit().checkedGet();
244 log.info("Service deactivated: {} {} {}", nodeName, outerName, innerName);
245 } catch (TransactionCommitFailedException e) {
246 log.error("Transaction failed", e);