blob: 81581d099683c44e36d1c7771152e6f2dc4ed919 [file] [log] [blame]
Sean Condonfae8e662016-12-15 10:25:13 +00001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Sean Condonfae8e662016-12-15 10:25:13 +00003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.drivers.microsemi.yang.impl;
17
Sean Condonfae8e662016-12-15 10:25:13 +000018import org.onosproject.drivers.microsemi.yang.MseaCfmNetconfService;
Sean Condon0e89bda2017-03-21 14:23:19 +000019import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
20import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
21import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
Sean Condon96b896d2017-12-11 12:44:29 -080022import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
Sean Condon0e89bda2017-03-21 14:23:19 +000023import org.onosproject.incubator.net.l2monitoring.soam.SoamId;
Sean Condon06613e92017-06-09 15:14:01 +010024import org.onosproject.netconf.DatastoreId;
Sean Condonfae8e662016-12-15 10:25:13 +000025import org.onosproject.netconf.NetconfException;
26import org.onosproject.netconf.NetconfSession;
Sean Condon06613e92017-06-09 15:14:01 +010027import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfm;
28import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfmOpParam;
29import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.DefaultMefCfm;
30import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.AbortLoopbackInput;
Sean Condon0e89bda2017-03-21 14:23:19 +000031import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.MaintenanceDomain;
32import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.MaintenanceAssociation;
Sean Condon0e89bda2017-03-21 14:23:19 +000033import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.MaintenanceAssociationEndPoint;
Sean Condon06613e92017-06-09 15:14:01 +010034import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceInput;
35import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceOutput;
36import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.TransmitLoopbackInput;
Sean Condon0e89bda2017-03-21 14:23:19 +000037import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.AugmentedMseaCfmMaintenanceAssociationEndPoint;
38import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.DefaultAugmentedMseaCfmMaintenanceAssociationEndPoint;
39import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.augmentedmseacfmmaintenanceassociationendpoint.delaymeasurements.DelayMeasurement;
Sean Condon96b896d2017-12-11 12:44:29 -080040import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.MepIdType;
Sean Condon06613e92017-06-09 15:14:01 +010041import org.onosproject.yang.model.DefaultModelObjectData;
42import org.onosproject.yang.model.ModelConverter;
43import org.onosproject.yang.model.ModelObject;
44import org.onosproject.yang.model.ModelObjectData;
Sean Condon0e89bda2017-03-21 14:23:19 +000045import org.onosproject.yang.model.ResourceId;
46import org.onosproject.yang.runtime.AnnotatedNodeInfo;
Sean Condon06613e92017-06-09 15:14:01 +010047import org.onosproject.yang.runtime.CompositeData;
Sean Condon0e89bda2017-03-21 14:23:19 +000048import org.onosproject.yang.runtime.DefaultAnnotatedNodeInfo;
49import org.onosproject.yang.runtime.DefaultAnnotation;
Sean Condon06613e92017-06-09 15:14:01 +010050import org.onosproject.yang.runtime.DefaultCompositeStream;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070051import org.osgi.service.component.annotations.Activate;
52import org.osgi.service.component.annotations.Component;
53import org.osgi.service.component.annotations.Deactivate;
Sean Condon06613e92017-06-09 15:14:01 +010054
55import java.io.ByteArrayInputStream;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070056import java.util.ArrayList;
Sean Condon96b896d2017-12-11 12:44:29 -080057import java.util.Optional;
Sean Condon1dbcd712017-10-19 12:09:21 +010058import java.util.regex.Pattern;
Sean Condonfae8e662016-12-15 10:25:13 +000059
60/**
61 * Implementation of the MseaCfmServiceNetconf YANG model service.
62 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070063@Component(immediate = true, service = MseaCfmNetconfService.class)
Sean Condonfae8e662016-12-15 10:25:13 +000064public class MseaCfmManager extends AbstractYangServiceImpl
65 implements MseaCfmNetconfService {
66
Sean Condonbab11b22018-01-30 17:13:16 +000067 private static final String MSEA_CFM = "org.onosproject.drivers.microsemi.yang.mseacfmservice";
Sean Condonfae8e662016-12-15 10:25:13 +000068
Sean Condonbab11b22018-01-30 17:13:16 +000069 private static final String MSEA_CFM_NS = "http://www.microsemi.com/microsemi-edge-assure/msea-cfm";
70 private static final String MSEA_CFM_PM_NS = "http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm";
Sean Condon1dbcd712017-10-19 12:09:21 +010071
72 //FIXME Remove when the issue with Null bits on onos-yang-tools is sorted
73 @Deprecated
74 protected static final Pattern REGEX_EMPTY_ACTIVE_DEFECTS =
75 Pattern.compile("(<active-defects)[ ]?(/>)", Pattern.DOTALL);
76 //FIXME Remove when the issue with Null bits on onos-yang-tools is sorted
77 @Deprecated
78 protected static final Pattern REGEX_EMPTY_LAST_DEFECT_SENT =
79 Pattern.compile("(<msea-soam-fm:last-defect-sent)[ ]?(/>)", Pattern.DOTALL);
Sean Condonbab11b22018-01-30 17:13:16 +000080 private static final String MEF_CFM = "mef-cfm";
81 private static final String MAINTENANCE_DOMAIN = "maintenance-domain";
Sean Condon96b896d2017-12-11 12:44:29 -080082 public static final String ID = "id";
Sean Condonbab11b22018-01-30 17:13:16 +000083 private static final String MAINTENANCE_ASSOCIATION = "maintenance-association";
84 private static final String TRANSMIT_LOOPBACK = "transmit-loopback";
85 private static final String ABORT_LOOPBACK = "abort-loopback";
86 private static final String MAINTENANCE_ASSOCIATION_END_POINT = "maintenance-association-end-point";
87 private static final String MEP_ID = "mep-id";
88 private static final String DELAY_MEASUREMENTS = "delay-measurements";
89 private static final String DELAY_MEASUREMENT = "delay-measurement";
90 private static final String DM_ID = "dm-id";
91 private static final String MEP_IDENTIFIER = "mep-identifier";
92 private static final String REMOTE_MEPS = "remote-meps";
Sean Condon1dbcd712017-10-19 12:09:21 +010093
Sean Condonfae8e662016-12-15 10:25:13 +000094 @Activate
95 public void activate() {
Sean Condon06613e92017-06-09 15:14:01 +010096 super.activate();
Sean Condonfae8e662016-12-15 10:25:13 +000097 appId = coreService.registerApplication(MSEA_CFM);
Sean Condonfae8e662016-12-15 10:25:13 +000098 log.info("MseaCfmService Started");
99 }
100
101 @Deactivate
102 public void deactivate() {
103 super.deactivate();
Sean Condonfae8e662016-12-15 10:25:13 +0000104 log.info("MseaCfmService Stopped");
105 }
106
107 @Override
Sean Condon0e89bda2017-03-21 14:23:19 +0000108 public MseaCfm getMepEssentials(MdId mdId, MaIdShort maId, MepId mepId,
109 NetconfSession session) throws NetconfException {
Sean Condonfae8e662016-12-15 10:25:13 +0000110 if (session == null) {
111 throw new NetconfException("Session is null when calling getMepEssentials()");
112 }
113
Sean Condon0e89bda2017-03-21 14:23:19 +0000114 String xmlQueryStr = buildMepEssentialsQueryString(mdId, maId, mepId);
115 log.debug("Sending <get> for MEP essentials" +
Sean Condonfae8e662016-12-15 10:25:13 +0000116 " query on NETCONF session " + session.getSessionId() +
117 ":\n" + xmlQueryStr);
118
119 String xmlResult = session.get(xmlQueryStr, null);
Sean Condon06613e92017-06-09 15:14:01 +0100120 xmlResult = removeRpcReplyData(xmlResult);
Sean Condon0e89bda2017-03-21 14:23:19 +0000121 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
122 null, new ByteArrayInputStream(xmlResult.getBytes()));
123 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
124
125 ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(
126 compositeData.resourceData());
127
128 MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
129 for (ModelObject mo:mod.modelObjects()) {
130 if (mo instanceof DefaultMefCfm) {
131 mseaCfm.mefCfm((DefaultMefCfm) mo);
132 }
133 }
134 return mseaCfm;
135 }
136
137 @Override
138 public MseaCfm getMepFull(MdId mdId, MaIdShort maId, MepId mepId,
139 NetconfSession session) throws NetconfException {
140 if (session == null) {
141 throw new NetconfException("Session is null when calling getMepFull()");
142 }
143
144 String xmlQueryStr = buildMepFullQueryString(mdId, maId, mepId);
145 log.debug("Sending <get> for full MEP" +
146 " query on NETCONF session " + session.getSessionId() +
147 ":\n" + xmlQueryStr);
148
149 String xmlResult = session.get(xmlQueryStr, null);
150 xmlResult = removeRpcReplyData(xmlResult);
Sean Condon1dbcd712017-10-19 12:09:21 +0100151 xmlResult = removeEmptyActiveDefects(xmlResult);
Sean Condon06613e92017-06-09 15:14:01 +0100152 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
153 null, new ByteArrayInputStream(xmlResult.getBytes()));
154 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
155
156 ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
157
158 MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
159 for (ModelObject mo:mod.modelObjects()) {
160 if (mo instanceof DefaultMefCfm) {
161 mseaCfm.mefCfm((DefaultMefCfm) mo);
162 }
Sean Condonfae8e662016-12-15 10:25:13 +0000163 }
Sean Condon06613e92017-06-09 15:14:01 +0100164
165 return mseaCfm;
Sean Condonfae8e662016-12-15 10:25:13 +0000166 }
167
168 @Override
Sean Condon96b896d2017-12-11 12:44:29 -0800169 public MseaCfm getMepIds(Optional<MdId> mdIdOptional, Optional<MaIdShort> maIdOptional,
170 NetconfSession session, DatastoreId targetDs) throws NetconfException {
171
172 ModelObjectData.Builder moQueryBldr = DefaultModelObjectData.builder();
173
Sean Condonbab11b22018-01-30 17:13:16 +0000174 ArrayList<AnnotatedNodeInfo> annotations = new ArrayList<>();
Sean Condon96b896d2017-12-11 12:44:29 -0800175 String xmlQueryStr = encodeMoToXmlStr(moQueryBldr.build(), annotations);
176
177 log.debug("Sending <get> for full MEP" +
178 " query on NETCONF session " + session.getSessionId() +
179 ":\n" + xmlQueryStr);
180
181 String xmlResult = session.get(xmlQueryStr, null);
182 xmlResult = removeRpcReplyData(xmlResult);
183 xmlResult = removeEmptyActiveDefects(xmlResult);
184 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
185 null, new ByteArrayInputStream(xmlResult.getBytes()));
186 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
187
188 ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
189
190 MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
191 for (ModelObject mo:mod.modelObjects()) {
192 if (mo instanceof DefaultMefCfm) {
193 mseaCfm.mefCfm((DefaultMefCfm) mo);
194 }
195 }
196
197 return mseaCfm;
198 }
199
200 @Override
Sean Condon0e89bda2017-03-21 14:23:19 +0000201 public MseaCfm getSoamDm(MdId mdName, MaIdShort maName, MepId mepId,
202 SoamId dmId, DmEntryParts parts, NetconfSession session)
203 throws NetconfException {
204 String xmlQueryStr = buildDmQueryString(mdName, maName, mepId, dmId, parts);
205 log.debug("Sending <get> for " +
206 " query on NETCONF session " + session.getSessionId() +
207 ":\n" + xmlQueryStr);
208
209 String xmlResult = session.get(xmlQueryStr, null);
210 xmlResult = removeRpcReplyData(xmlResult);
Sean Condon0e89bda2017-03-21 14:23:19 +0000211 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
212 null, new ByteArrayInputStream(xmlResult.getBytes()));
213 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
214
215 ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
216
217 MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
218 for (ModelObject mo:mod.modelObjects()) {
219 if (mo instanceof DefaultMefCfm) {
220 mseaCfm.mefCfm((DefaultMefCfm) mo);
221 }
222 }
223
224 return mseaCfm;
Sean Condonfae8e662016-12-15 10:25:13 +0000225 }
226
227 @Override
Sean Condon06613e92017-06-09 15:14:01 +0100228 public boolean setMseaCfm(MseaCfmOpParam mseaCfm, NetconfSession session,
Sean Condon0e89bda2017-03-21 14:23:19 +0000229 DatastoreId targetDs) throws NetconfException {
Sean Condon06613e92017-06-09 15:14:01 +0100230
Sean Condon0e89bda2017-03-21 14:23:19 +0000231 ModelObjectData moQuery = DefaultModelObjectData.builder()
232 .addModelObject((ModelObject) mseaCfm.mefCfm()).build();
233 return setNetconfObject(moQuery, session, targetDs, null);
Sean Condonfae8e662016-12-15 10:25:13 +0000234 }
235
Sean Condon0e89bda2017-03-21 14:23:19 +0000236 @Override
237 public boolean deleteMseaCfmDm(MseaCfmOpParam mseaCfm, NetconfSession session,
Sean Condon96b896d2017-12-11 12:44:29 -0800238 DatastoreId targetDs) throws NetconfException, CfmConfigException {
Sean Condon0e89bda2017-03-21 14:23:19 +0000239
Sean Condonbab11b22018-01-30 17:13:16 +0000240 if (mseaCfm.mefCfm() == null) {
241 throw new CfmConfigException("mefCfm object must be present before Meps can be added");
242 }
Sean Condon0e89bda2017-03-21 14:23:19 +0000243 ModelObjectData mseCfmDmList = DefaultModelObjectData.builder()
Sean Condonbab11b22018-01-30 17:13:16 +0000244 .addModelObject(mseaCfm).build();
Sean Condon0e89bda2017-03-21 14:23:19 +0000245
Sean Condonbab11b22018-01-30 17:13:16 +0000246 ArrayList<AnnotatedNodeInfo> anis = new ArrayList<>();
247 for (MaintenanceDomain md:mseaCfm.mefCfm().maintenanceDomain()) {
248 if (md.id() == 0) {
249 throw new CfmConfigException("An MD numeric ID must be given");
250 }
251 for (MaintenanceAssociation ma:md.maintenanceAssociation()) {
252 if (ma.id() == 0) {
253 throw new CfmConfigException("An MA numeric ID must be given");
Sean Condon96b896d2017-12-11 12:44:29 -0800254 }
Sean Condonbab11b22018-01-30 17:13:16 +0000255 for (MaintenanceAssociationEndPoint mep:ma.maintenanceAssociationEndPoint()) {
256 AugmentedMseaCfmMaintenanceAssociationEndPoint mepAugment =
257 mep.augmentation(DefaultAugmentedMseaCfmMaintenanceAssociationEndPoint.class);
258 if (mepAugment != null && mepAugment.delayMeasurements() != null) {
259 for (DelayMeasurement dm:mepAugment.delayMeasurements().delayMeasurement()) {
260 ResourceId.Builder ridBuilder = ResourceId.builder()
261 .addBranchPointSchema("/", null)
262 .addBranchPointSchema(MEF_CFM, MSEA_CFM_NS)
263 .addBranchPointSchema(MAINTENANCE_DOMAIN, MSEA_CFM_NS)
264 .addKeyLeaf(ID, MSEA_CFM_NS, md.id())
265 .addBranchPointSchema(MAINTENANCE_ASSOCIATION, MSEA_CFM_NS)
266 .addKeyLeaf(ID, MSEA_CFM_NS, ma.id())
267 .addBranchPointSchema(MAINTENANCE_ASSOCIATION_END_POINT, MSEA_CFM_NS)
268 .addKeyLeaf(MEP_ID, MSEA_CFM_NS, mep.mepIdentifier())
269 .addBranchPointSchema(DELAY_MEASUREMENTS, MSEA_CFM_PM_NS)
270 .addBranchPointSchema(DELAY_MEASUREMENT, MSEA_CFM_PM_NS)
271 .addKeyLeaf(DM_ID, MSEA_CFM_PM_NS, dm.dmId());
272 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
273 .resourceId(ridBuilder.build())
274 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
275 .build();
276 anis.add(ani);
Sean Condon0e89bda2017-03-21 14:23:19 +0000277 }
278 }
279 }
280 }
281 }
282
283 return setNetconfObject(mseCfmDmList, session, targetDs, anis);
284 }
285
286 @Override
287 public boolean deleteMseaMep(MseaCfmOpParam mseaCfm, NetconfSession session,
Sean Condon96b896d2017-12-11 12:44:29 -0800288 DatastoreId targetDs) throws NetconfException, CfmConfigException {
Sean Condon0e89bda2017-03-21 14:23:19 +0000289
Sean Condonbab11b22018-01-30 17:13:16 +0000290 if (mseaCfm.mefCfm() == null) {
291 throw new CfmConfigException("mefCfm object must be present before Meps can be added");
292 }
Sean Condon0e89bda2017-03-21 14:23:19 +0000293 ModelObjectData mseCfmMepList = DefaultModelObjectData.builder()
294 .addModelObject((ModelObject) mseaCfm.mefCfm()).build();
295
Sean Condonbab11b22018-01-30 17:13:16 +0000296 ArrayList<AnnotatedNodeInfo> anis = new ArrayList<>();
297 for (MaintenanceDomain md:mseaCfm.mefCfm().maintenanceDomain()) {
298 if (md.id() == 0) {
299 throw new CfmConfigException("An MD numeric ID must be given");
300 }
301 for (MaintenanceAssociation ma:md.maintenanceAssociation()) {
302 if (ma.id() == 0) {
303 throw new CfmConfigException("An MA numeric ID must be given");
Sean Condon96b896d2017-12-11 12:44:29 -0800304 }
Sean Condonbab11b22018-01-30 17:13:16 +0000305 for (MaintenanceAssociationEndPoint mep:ma.maintenanceAssociationEndPoint()) {
306 ResourceId.Builder ridBuilder = ResourceId.builder()
307 .addBranchPointSchema("/", null)
308 .addBranchPointSchema(MEF_CFM, MSEA_CFM_NS)
309 .addBranchPointSchema(MAINTENANCE_DOMAIN, MSEA_CFM_NS)
310 .addKeyLeaf(ID, MSEA_CFM_NS, md.id())
311 .addBranchPointSchema(MAINTENANCE_ASSOCIATION, MSEA_CFM_NS)
312 .addKeyLeaf(ID, MSEA_CFM_NS, ma.id())
313 .addBranchPointSchema(MAINTENANCE_ASSOCIATION_END_POINT, MSEA_CFM_NS)
314 .addKeyLeaf(MEP_IDENTIFIER, MSEA_CFM_NS, mep.mepIdentifier().uint16());
315 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
316 .resourceId(ridBuilder.build())
317 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
318 .build();
319 anis.add(ani);
Sean Condon96b896d2017-12-11 12:44:29 -0800320 }
321 }
322 }
323
324 return setNetconfObject(mseCfmMepList, session, targetDs, anis);
325 }
326
327 @Override
328 public boolean deleteMseaMa(MseaCfmOpParam mseaCfm, NetconfSession session,
329 DatastoreId targetDs) throws NetconfException, CfmConfigException {
Sean Condonbab11b22018-01-30 17:13:16 +0000330 if (mseaCfm.mefCfm() == null) {
331 throw new CfmConfigException("mefCfm object must be present before Meps can be added");
332 }
Sean Condon96b896d2017-12-11 12:44:29 -0800333
334 ModelObjectData mseCfmMepList = DefaultModelObjectData.builder()
335 .addModelObject((ModelObject) mseaCfm.mefCfm()).build();
Sean Condonbab11b22018-01-30 17:13:16 +0000336 ArrayList<AnnotatedNodeInfo> anis = new ArrayList<>();
337 for (MaintenanceDomain md:mseaCfm.mefCfm().maintenanceDomain()) {
338 if (md.id() == 0) {
339 throw new CfmConfigException("An MD numeric ID must be given");
340 }
341 for (MaintenanceAssociation ma:md.maintenanceAssociation()) {
342 if (ma.id() == 0) {
343 throw new CfmConfigException("An MA numeric ID must be given");
Sean Condon96b896d2017-12-11 12:44:29 -0800344 }
Sean Condonbab11b22018-01-30 17:13:16 +0000345 ResourceId.Builder ridBuilder = ResourceId.builder()
346 .addBranchPointSchema("/", null)
347 .addBranchPointSchema(MEF_CFM, MSEA_CFM_NS)
348 .addBranchPointSchema(MAINTENANCE_DOMAIN, MSEA_CFM_NS)
349 .addKeyLeaf(ID, MSEA_CFM_NS, md.id())
350 .addBranchPointSchema(MAINTENANCE_ASSOCIATION, MSEA_CFM_NS)
351 .addKeyLeaf(ID, MSEA_CFM_NS, ma.id());
Sean Condon96b896d2017-12-11 12:44:29 -0800352
Sean Condonbab11b22018-01-30 17:13:16 +0000353 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
354 .resourceId(ridBuilder.build())
355 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
356 .build();
357 anis.add(ani);
Sean Condon96b896d2017-12-11 12:44:29 -0800358 }
359 }
360
361 return setNetconfObject(mseCfmMepList, session, targetDs, anis);
362 }
363
364 @Override
365 public boolean deleteMseaMaRMep(MseaCfmOpParam mseaCfm, NetconfSession session,
366 DatastoreId targetDs) throws NetconfException, CfmConfigException {
Sean Condonbab11b22018-01-30 17:13:16 +0000367 if (mseaCfm.mefCfm() == null) {
368 throw new CfmConfigException("mefCfm object must be present before Meps can be added");
369 }
Sean Condon96b896d2017-12-11 12:44:29 -0800370
371 ModelObjectData mseCfmMepList = DefaultModelObjectData.builder()
372 .addModelObject((ModelObject) mseaCfm.mefCfm()).build();
Sean Condonbab11b22018-01-30 17:13:16 +0000373 ArrayList<AnnotatedNodeInfo> anis = new ArrayList<>();
374 for (MaintenanceDomain md:mseaCfm.mefCfm().maintenanceDomain()) {
375 if (md.id() == 0) {
376 throw new CfmConfigException("An MD numeric ID must be given");
377 }
378 for (MaintenanceAssociation ma:md.maintenanceAssociation()) {
379 if (ma.id() == 0) {
380 throw new CfmConfigException("An MA numeric ID must be given");
Sean Condon96b896d2017-12-11 12:44:29 -0800381 }
Sean Condonbab11b22018-01-30 17:13:16 +0000382 for (MepIdType rmep:ma.remoteMeps()) {
383 ResourceId.Builder ridBuilder = ResourceId.builder()
384 .addBranchPointSchema("/", null)
385 .addBranchPointSchema(MEF_CFM, MSEA_CFM_NS)
386 .addBranchPointSchema(MAINTENANCE_DOMAIN, MSEA_CFM_NS)
387 .addKeyLeaf(ID, MSEA_CFM_NS, md.id())
388 .addBranchPointSchema(MAINTENANCE_ASSOCIATION, MSEA_CFM_NS)
389 .addKeyLeaf(ID, MSEA_CFM_NS, ma.id())
390 .addLeafListBranchPoint(REMOTE_MEPS, MSEA_CFM_NS,
391 rmep.uint16());
392 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
393 .resourceId(ridBuilder.build())
394 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
395 .build();
396 anis.add(ani);
Sean Condon0e89bda2017-03-21 14:23:19 +0000397 }
398 }
399 }
400
401 return setNetconfObject(mseCfmMepList, session, targetDs, anis);
402 }
403
404
Sean Condon96b896d2017-12-11 12:44:29 -0800405 @Override
406 public boolean deleteMseaMd(MseaCfmOpParam mseaCfm, NetconfSession session,
407 DatastoreId targetDs) throws NetconfException, CfmConfigException {
Sean Condonbab11b22018-01-30 17:13:16 +0000408 if (mseaCfm.mefCfm() == null) {
409 throw new CfmConfigException("mefCfm object must be present before Meps can be added");
410 }
Sean Condon96b896d2017-12-11 12:44:29 -0800411 ModelObjectData mseCfmMepList = DefaultModelObjectData.builder()
412 .addModelObject((ModelObject) mseaCfm.mefCfm()).build();
413
Sean Condonbab11b22018-01-30 17:13:16 +0000414 ArrayList<AnnotatedNodeInfo> anis = new ArrayList<>();
415 for (MaintenanceDomain md:mseaCfm.mefCfm().maintenanceDomain()) {
416 if (md.id() == 0) {
417 throw new CfmConfigException("An MD numeric ID must be given");
Sean Condon96b896d2017-12-11 12:44:29 -0800418 }
Sean Condonbab11b22018-01-30 17:13:16 +0000419 ResourceId.Builder ridBuilder = ResourceId.builder()
420 .addBranchPointSchema("/", null)
421 .addBranchPointSchema(MEF_CFM, MSEA_CFM_NS)
422 .addBranchPointSchema(MAINTENANCE_DOMAIN, MSEA_CFM_NS)
423 .addKeyLeaf(ID, MSEA_CFM_NS, md.id());
424 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
425 .resourceId(ridBuilder.build())
426 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
427 .build();
428 anis.add(ani);
Sean Condon96b896d2017-12-11 12:44:29 -0800429 }
430
431 return setNetconfObject(mseCfmMepList, session, targetDs, anis);
432 }
433
Sean Condonfae8e662016-12-15 10:25:13 +0000434 /**
435 * Call RPCs on the device through NETCONF.
436 */
437 @Override
Sean Condon0e89bda2017-03-21 14:23:19 +0000438 public void transmitLoopback(TransmitLoopbackInput inputVar,
439 NetconfSession session) throws NetconfException {
440
441 ModelObjectData transLoopbackMo = DefaultModelObjectData.builder()
442 .addModelObject((ModelObject) inputVar).build();
443
444 customRpcNetconf(transLoopbackMo,
Sean Condon96b896d2017-12-11 12:44:29 -0800445 TRANSMIT_LOOPBACK, session);
Sean Condonfae8e662016-12-15 10:25:13 +0000446 }
447
448 @Override
Sean Condon0e89bda2017-03-21 14:23:19 +0000449 public void abortLoopback(AbortLoopbackInput inputVar,
450 NetconfSession session) throws NetconfException {
451 ModelObjectData abortLoopbackMo = DefaultModelObjectData.builder()
452 .addModelObject((ModelObject) inputVar).build();
453
Sean Condon96b896d2017-12-11 12:44:29 -0800454 customRpcNetconf(abortLoopbackMo, ABORT_LOOPBACK, session);
Sean Condonfae8e662016-12-15 10:25:13 +0000455 }
456
457 @Override
Sean Condon0e89bda2017-03-21 14:23:19 +0000458 public TransmitLinktraceOutput transmitLinktrace(
459 TransmitLinktraceInput inputVar, NetconfSession session)
Sean Condonfae8e662016-12-15 10:25:13 +0000460 throws NetconfException {
461 throw new UnsupportedOperationException("Not yet implemented");
462 }
463
Sean Condon1dbcd712017-10-19 12:09:21 +0100464 //FIXME Remove when the fix for null bits with onos-yang-tools
465 // https://gerrit.onosproject.org/#/c/15777/ is available
466 @Deprecated
467 private static String removeEmptyActiveDefects(String rpcReplyXml) throws NetconfException {
468 rpcReplyXml = REGEX_EMPTY_ACTIVE_DEFECTS.matcher(rpcReplyXml).replaceFirst("");
469 rpcReplyXml = REGEX_EMPTY_LAST_DEFECT_SENT.matcher(rpcReplyXml).replaceFirst("");
470
471 return rpcReplyXml;
472 }
473
Sean Condon0e89bda2017-03-21 14:23:19 +0000474 @Deprecated //Replace this with a ModelObject defintion
475 private String buildMepEssentialsQueryString(MdId mdId, MaIdShort maId,
476 MepId mepId) {
Sean Condonfae8e662016-12-15 10:25:13 +0000477 StringBuilder rpc = new StringBuilder();
478
479 rpc.append("<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" ");
480 rpc.append(" xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" ");
481 rpc.append("xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">\n");
482 rpc.append("<maintenance-domain>\n");
483 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000484 rpc.append("<name>");
485 rpc.append(mdId.mdName());
486 rpc.append("</name>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000487 rpc.append("<maintenance-association>\n");
488 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000489 rpc.append("<name>");
490 rpc.append(maId.maName());
491 rpc.append("</name>\n");
Sean Condon06613e92017-06-09 15:14:01 +0100492 rpc.append("<ccm-interval>10ms</ccm-interval>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000493 rpc.append("<remote-meps/>\n");
494 rpc.append("<component-list/>\n");
495 rpc.append("<maintenance-association-end-point>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000496 rpc.append("<mep-identifier>");
497 rpc.append(mepId.id());
498 rpc.append("</mep-identifier>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000499 rpc.append("<mac-address/>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000500 rpc.append("<remote-mep-database>\n");
501 rpc.append("<remote-mep>\n");
502 rpc.append("<remote-mep-id/>\n");
503 rpc.append("</remote-mep>\n");
504 rpc.append("</remote-mep-database>\n");
505 rpc.append("<msea-soam-pm:delay-measurements>\n");
506 rpc.append("<msea-soam-pm:delay-measurement>\n");
507 rpc.append("<msea-soam-pm:dm-id/>\n");
508 rpc.append("</msea-soam-pm:delay-measurement>\n");
509 rpc.append("</msea-soam-pm:delay-measurements>\n");
510 rpc.append("<msea-soam-pm:loss-measurements>\n");
511 rpc.append("<msea-soam-pm:loss-measurement>\n");
512 rpc.append("<msea-soam-pm:lm-id/>\n");
513 rpc.append("</msea-soam-pm:loss-measurement>\n");
514 rpc.append("</msea-soam-pm:loss-measurements>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000515 rpc.append("</maintenance-association-end-point>\n");
516 rpc.append("</maintenance-association>\n");
517 rpc.append("</maintenance-domain>\n");
518 rpc.append("</mef-cfm>");
519
520 return rpc.toString();
521 }
522
Sean Condon0e89bda2017-03-21 14:23:19 +0000523 @Deprecated //Replace this with a ModelObject defintion
524 private String buildMepFullQueryString(MdId mdId, MaIdShort maId, MepId mepId) {
Sean Condonfae8e662016-12-15 10:25:13 +0000525 StringBuilder rpc = new StringBuilder();
526
527 rpc.append("<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" ");
528 rpc.append(" xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" ");
529 rpc.append("xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">\n");
530 rpc.append("<maintenance-domain>\n");
531 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000532 rpc.append("<name>");
533 rpc.append(mdId.mdName());
534 rpc.append("</name>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000535 rpc.append("<maintenance-association>\n");
536 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000537 rpc.append("<name>");
538 rpc.append(maId.maName());
539 rpc.append("</name>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000540 rpc.append("<maintenance-association-end-point>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000541 rpc.append("<mep-identifier>");
542 rpc.append(mepId.id());
543 rpc.append("</mep-identifier>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000544 rpc.append("<interface/>\n");
545 //Direction will always be DOWN for EA1000
546 rpc.append("<primary-vid/>\n");
547 rpc.append("<administrative-state/>\n");
548 rpc.append("<mac-address/>\n");
549 rpc.append("<ccm-ltm-priority/>\n");
550 rpc.append("<continuity-check/>\n"); //Container
551 rpc.append("<loopback/>\n"); //Container
552 rpc.append("<linktrace/>\n"); //Container
553 rpc.append("<remote-mep-database/>\n"); //Container
554 rpc.append("<msea-soam-fm:operational-state/>\n");
555 rpc.append("<msea-soam-fm:connectivity-status/>\n");
556 rpc.append("<msea-soam-fm:port-status/>\n");
557 rpc.append("<msea-soam-fm:interface-status/>\n");
558 rpc.append("<msea-soam-fm:last-defect-sent/>\n");
559 rpc.append("<msea-soam-fm:rdi-transmit-status/>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000560 rpc.append("</maintenance-association-end-point>\n");
561 rpc.append("</maintenance-association>\n");
562 rpc.append("</maintenance-domain>\n");
563 rpc.append("</mef-cfm>");
564
565 return rpc.toString();
566 }
567
Sean Condon0e89bda2017-03-21 14:23:19 +0000568 @Deprecated //Replace this with a ModelObject defintion
569 private String buildDmQueryString(MdId mdId, MaIdShort maId, MepId mepId,
570 SoamId dmId, DmEntryParts parts) {
571 StringBuilder rpc = new StringBuilder();
572
573 rpc.append("<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" ");
574 rpc.append(" xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" ");
575 rpc.append("xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">\n");
576 rpc.append("<maintenance-domain>\n");
577 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000578 rpc.append("<name>");
579 rpc.append(mdId.mdName());
580 rpc.append("</name>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000581 rpc.append("<maintenance-association>\n");
582 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000583 rpc.append("<name>");
584 rpc.append(maId.maName());
585 rpc.append("</name>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000586 rpc.append("<maintenance-association-end-point>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000587 rpc.append("<mep-identifier>");
588 rpc.append(mepId.id());
589 rpc.append("</mep-identifier>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000590 if (dmId != null) {
591 rpc.append("<msea-soam-pm:delay-measurements>");
592 rpc.append("<msea-soam-pm:delay-measurement>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000593 rpc.append("<msea-soam-pm:dm-id>");
594 rpc.append(dmId.id());
595 rpc.append("</msea-soam-pm:dm-id>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000596 rpc.append("<msea-soam-pm:mep-id/>");
597 rpc.append("<msea-soam-pm:mac-address/>");
598 rpc.append("<msea-soam-pm:administrative-state/>\n");
599 rpc.append("<msea-soam-pm:measurement-enable/>\n");
600 rpc.append("<msea-soam-pm:message-period/>\n");
601 rpc.append("<msea-soam-pm:priority/>\n");
602 rpc.append("<msea-soam-pm:frame-size/>\n");
603 rpc.append("<msea-soam-pm:measurement-interval/>\n");
604 rpc.append("<msea-soam-pm:number-intervals-stored/>\n");
605 rpc.append("<msea-soam-pm:session-status/>\n");
606 rpc.append("<msea-soam-pm:frame-delay-two-way/>\n");
607 rpc.append("<msea-soam-pm:inter-frame-delay-variation-two-way/>\n");
608 if (parts != null && (parts.equals(DmEntryParts.CURRENT_ONLY) ||
609 parts.equals(DmEntryParts.ALL_PARTS))) {
610 rpc.append("<msea-soam-pm:current-stats/>\n");
611 }
612 if (parts != null && (parts.equals(DmEntryParts.HISTORY_ONLY) ||
613 parts.equals(DmEntryParts.ALL_PARTS))) {
614 rpc.append("<msea-soam-pm:history-stats/>\n");
615 }
616 rpc.append("</msea-soam-pm:delay-measurement>\n");
617 rpc.append("</msea-soam-pm:delay-measurements>");
618 } else {
619 rpc.append("<msea-soam-pm:delay-measurements/>");
620 }
621 rpc.append("</maintenance-association-end-point>\n");
622 rpc.append("</maintenance-association>\n");
623 rpc.append("</maintenance-domain>\n");
624 rpc.append("</mef-cfm>");
625
626 return rpc.toString();
627 }
628
629 @Deprecated //Replace this with a ModelObject defintion
630 private String buildAbortLoopbackQueryString(Short mdId, Short maId,
631 Short mepId) {
632 StringBuilder rpc = new StringBuilder();
633
634 rpc.append("<abort-loopback xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\">");
Sean Condonbab11b22018-01-30 17:13:16 +0000635 rpc.append("<maintenance-domain>");
636 rpc.append(mdId);
637 rpc.append("</maintenance-domain>");
638 rpc.append("<maintenance-association>");
639 rpc.append(maId);
640 rpc.append("</maintenance-association>");
641 rpc.append("<maintenance-association-end-point>");
642 rpc.append(mepId);
643 rpc.append("</maintenance-association-end-point>");
Sean Condon0e89bda2017-03-21 14:23:19 +0000644 rpc.append("</abort-loopback>");
645
646 return rpc.toString();
647 }
Sean Condonfae8e662016-12-15 10:25:13 +0000648}