2 * Copyright © 2015 ZTE 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 com.highstreet.technologies.odl.app.impl.tools;
10 import com.google.common.base.Optional;
11 import com.highstreet.technologies.odl.app.impl.delegates.LtpInOdlCreator;
12 import com.highstreet.technologies.odl.app.impl.listener.ACMListener;
13 import org.opendaylight.controller.md.sal.binding.api.*;
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
16 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.*;
17 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.local._class.g.LocalId;
18 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.local._class.g.LocalIdBuilder;
19 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp;
20 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.LpBuilder;
21 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.LpKey;
22 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.name.g.Name;
23 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.name.g.NameBuilder;
24 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.network.element.FdBuilder;
25 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.network.element.Ltp;
26 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.network.element.LtpBuilder;
27 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.network.element.LtpKey;
28 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.ltp.path.rev170526.ltp.path.ltp.path.list.LogicalTerminationPointList;
29 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwAirInterfacePac;
30 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwAirInterfacePacKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.route.rev150105.RestoreFollowTopoInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.route.rev150105.SwitchFollowTopoInputBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.route.rev150105.fc_desc.Fc;
34 import org.opendaylight.yangtools.yang.binding.ChildOf;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
40 import java.util.concurrent.ExecutionException;
42 import static com.highstreet.technologies.odl.app.impl.tools.MountPointServiceHolder.getMountPoint;
43 import static com.highstreet.technologies.odl.app.impl.tools.RPCHolder.rpc;
44 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
47 * Created by odl on 17-6-3.
49 public class NeExecutor
51 private boolean isBroken = false;
53 public NeExecutor(Fc fc, Integer vlanid, LtpInOdlCreator ltpCreator)
55 this(getMountPoint(fc.getNodeName()));
57 process(fc, vlanid, ltpCreator);
60 public NeExecutor(MountPoint mountPoint)
62 if (mountPoint != null)
64 this.dataBroker = mountPoint.getService(DataBroker.class).get();
65 mountPoint.getService(NotificationService.class).get().registerNotificationListener(new ACMListener(this));
69 LOG.warn("mount point is null");
73 private List<LogicalTerminationPointList> process(Fc fc, Integer vlanId, LtpInOdlCreator ltpInOdlCreator)
78 return new ArrayList<>();
81 // start the creation of fc
83 ltp.add(addClientLtpTo(neBuilder, vlanId, fc.getAEnd(), ltpInOdlCreator));
84 ltp.add(addClientLtpTo(neBuilder, vlanId, fc.getZEnd(), ltpInOdlCreator));
87 FdBuilder fdBuilder = new FdBuilder(neBuilder.getFd().remove(0));
88 if (fdBuilder.getFc() == null)
89 fdBuilder.setFc(new ArrayList<>());
91 fdBuilder.getFc().add(new UniversalId(buildFcName(ltp)));
93 neBuilder.getFd().add(fdBuilder.build());
96 LOG.warn(e.getMessage(), e);
102 private void getNe() throws ReadFailedException
104 InstanceIdentifier<NetworkElement> path = InstanceIdentifier.create(NetworkElement.class);
105 ReadOnlyTransaction networkElementTransaction = dataBroker.newReadOnlyTransaction();
108 Optional<NetworkElement> networkElementOpt = networkElementTransaction.read(
109 CONFIGURATION, path).checkedGet();
110 if (networkElementOpt.isPresent())
112 this.neBuilder = new NetworkElementBuilder(oldNe = networkElementOpt.get());
116 networkElementTransaction.close();
120 private LogicalTerminationPointList addClientLtpTo(
121 NetworkElementBuilder ne, int vlanid, String ltpName,
122 LtpInOdlCreator ltpInOdlCreator)
124 String clientLtpName = nameFrom(ltpName, LAYER_PROTOCOL_NAME.getValue(), vlanid);
125 String lpName = nameFrom(clientLtpName, "LP", 1);
127 // add client ltp to ltp
128 Ltp serverLTP = null;
129 Iterator<Ltp> iterator = ne.getLtp().iterator();
130 while (iterator.hasNext())
132 Ltp temp = iterator.next();
133 if (temp.getUuid().getValue().equalsIgnoreCase(ltpName))
140 if (serverLTP == null)
142 StringBuffer serverNames = new StringBuffer();
143 ne.getLtp().forEach(sltp -> serverNames.append(sltp.getKey().getUuid().getValue()).append(" | "));
144 throw new IllegalArgumentException(
145 "no proper server ltp found, input name is: " + ltpName + " and ltps from NE are: " + serverNames);
148 LtpBuilder serverBuilder = new LtpBuilder(serverLTP);
150 if (serverBuilder.getClientLtp() == null)
151 serverBuilder.setClientLtp(new ArrayList<>());
152 serverBuilder.getClientLtp().add(new UniversalId(clientLtpName));
154 // add client ltp to ltps
155 LtpBuilder clientLtpBuilder = new LtpBuilder();
156 clientLtpBuilder.setKey(new LtpKey(new UniversalId(clientLtpName)));
157 clientLtpBuilder.setName(new ArrayList<>());
158 clientLtpBuilder.getName().add(toName(clientLtpName));
159 clientLtpBuilder.setServerLtp(Arrays.asList(new UniversalId(serverLTP.getKey().getUuid())));
160 // add lp to client ltp
161 LpBuilder lpBuilder = new LpBuilder();
162 lpBuilder.setKey(new LpKey(new UniversalId(lpName)));
163 lpBuilder.setLayerProtocolName(LAYER_PROTOCOL_NAME);
164 lpBuilder.setName(new ArrayList<>());
165 lpBuilder.getName().add(toName(lpName));
167 lpBuilder.setLocalId(new ArrayList<>());
168 lpBuilder.getLocalId().add(toLocalId(lpName));
169 lpBuilder.setTerminationState(TerminationState.LpCanNeverTerminate);
170 clientLtpBuilder.setLp(Arrays.asList(lpBuilder.build()));
172 ne.getLtp().add(clientLtpBuilder.build());
173 ne.getLtp().add(serverBuilder.build());
175 return ltpInOdlCreator.create(ne.getName().get(0).getValue(), clientLtpName, serverLTP);
178 private String buildFcName(ArrayList<LogicalTerminationPointList> clientLtpsInFC)
180 // String fcName = "LTP-ETY-1.1.1-ETH-23,LTP-ETC-1.3.1-ETH-23"
181 StringBuilder fcName = new StringBuilder("");
182 for (LogicalTerminationPointList ltp : clientLtpsInFC)
184 fcName.append(ltp.getLtpReference().getValue()).append(",");
186 return fcName.deleteCharAt(fcName.length() - 1).toString();
189 private String nameFrom(String ltpName, String mediator, int vlanId)
191 return String.format(ltpName + "-%1$s-%2$d", mediator, vlanId);
194 private Name toName(String name)
196 NameBuilder nameBuilder = new NameBuilder();
197 nameBuilder.setValue(name);
198 nameBuilder.setValueName("vName");
199 return nameBuilder.build();
202 private LocalId toLocalId(String name)
204 LocalIdBuilder builder = new LocalIdBuilder();
205 builder.setValue(name);
206 builder.setValueName("vLocalId");
207 return builder.build();
210 private static final Logger LOG = LoggerFactory.getLogger(NeExecutor.class);
211 private static final LayerProtocolName LAYER_PROTOCOL_NAME = new LayerProtocolName("ETH");
212 private static boolean IS_MAIN = true;
213 private DataBroker dataBroker;
214 private Integer vlanId;
215 private ArrayList<LogicalTerminationPointList> ltp = new ArrayList<>();
216 private NetworkElementBuilder neBuilder;
217 private NetworkElement oldNe;
219 public List<LogicalTerminationPointList> getLtp()
224 public void clear(int vlanId)
228 this.neBuilder = new NetworkElementBuilder(oldNe);
231 FdBuilder fdBuilder = new FdBuilder(neBuilder.getFd().get(0));
232 fdBuilder.getFc().removeIf(fcName -> fcName.getValue().contains(LAYER_PROTOCOL_NAME.getValue() + "-" + vlanId));
233 neBuilder.setFd(Collections.singletonList(fdBuilder.build()));
235 // remove ltp created by vlan
236 neBuilder.getLtp().removeIf(
237 ltp1 -> ltp1.getUuid().getValue().endsWith(LAYER_PROTOCOL_NAME.getValue() + "-" + vlanId));
239 // remove all client ltp
240 ArrayList<Ltp> ltpList = new ArrayList<>();
241 for (Ltp ltp : neBuilder.getLtp())
243 LtpBuilder ltpBuilder = new LtpBuilder(ltp);
244 if (ltpBuilder.getClientLtp() != null)
246 ltpBuilder.getClientLtp().removeIf(
247 uuid -> uuid.getValue().endsWith(LAYER_PROTOCOL_NAME.getValue() + "-" + vlanId));
248 ltpBuilder.getLp().removeIf(
249 lp -> lp.getKey().getUuid().getValue().contains(LAYER_PROTOCOL_NAME.getValue() + "-" + vlanId));
251 ltpList.add(ltpBuilder.build());
254 neBuilder.setLtp(ltpList);
257 } catch (Exception e)
265 // submit to network element
268 ReadWriteTransaction neCommitTrans = dataBroker.newReadWriteTransaction();
269 neCommitTrans.put(CONFIGURATION, InstanceIdentifier.create(NetworkElement.class), neBuilder.build());
271 neCommitTrans.submit();
272 } catch (Exception e)
274 LOG.warn("caught exception when commit to ne, skip it", e);
278 public <T extends ChildOf<MwAirInterfacePac>> T getUnderAirPac(
279 String lpId_airInterface, Class<T> tClass,
280 LogicalDatastoreType type) throws ReadFailedException, ExecutionException, InterruptedException
282 try (ReadOnlyTransaction readOnlyTrans = dataBroker.newReadOnlyTransaction())
284 InstanceIdentifier<T> mwAirInterfaceConfigurationIID = InstanceIdentifier
285 .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(new UniversalId(lpId_airInterface)))
289 Optional<T> op = readOnlyTrans.read(type, mwAirInterfaceConfigurationIID).get();
290 return op.isPresent() ? op.get() : null;
294 public boolean isLtpOfThisOnPath(String lpName)
296 for (LogicalTerminationPointList logicalTerminationPointList : ltp)
298 String ethLtpName = logicalTerminationPointList.getLtpReference().getValue();
299 Ltp airInterface = getLtpNameByLp(lpName);
300 if (belongTo(airInterface, ethLtpName))
308 private boolean belongTo(Ltp airInterface, String ethLtpName)
310 if (airInterface == null || airInterface.getClientLtp() == null)
314 for (UniversalId clientID : airInterface.getClientLtp())
316 if (clientID.getValue().equalsIgnoreCase(ethLtpName))
318 if (belongTo(getLtpByName(clientID), ethLtpName))
326 private Ltp getLtpByName(UniversalId clientID)
328 for (Ltp ltp1 : neBuilder.getLtp())
330 if (ltp1.getKey().getUuid().equals(clientID))
338 private Ltp getLtpNameByLp(String lpId_airInterface)
340 for (Ltp ltp1 : neBuilder.getLtp())
342 for (Lp lp : ltp1.getLp())
344 if (lp.getKey().getUuid().getValue().equalsIgnoreCase(lpId_airInterface))
353 public void reportSwitch()
358 SwitchFollowTopoInputBuilder builder = new SwitchFollowTopoInputBuilder();
359 builder.setVlanid(vlanId);
360 rpc.switchFollowTopo(builder.build());
363 RestoreFollowTopoInputBuilder builder = new RestoreFollowTopoInputBuilder();
364 builder.setVlanid(vlanId);
365 rpc.restoreFollowTopo(builder.build());