blob: ef4092813f54d977aa0a663b6e5a6a446de85088 [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 Condon0e89bda2017-03-21 14:23:19 +000018import java.util.ArrayList;
19
Sean Condonfae8e662016-12-15 10:25:13 +000020import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Deactivate;
23import org.apache.felix.scr.annotations.Service;
24import org.onosproject.drivers.microsemi.yang.MseaCfmNetconfService;
Sean Condon0e89bda2017-03-21 14:23:19 +000025import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
26import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
27import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
Sean Condon96b896d2017-12-11 12:44:29 -080028import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
Sean Condon0e89bda2017-03-21 14:23:19 +000029import org.onosproject.incubator.net.l2monitoring.soam.SoamId;
Sean Condon06613e92017-06-09 15:14:01 +010030import org.onosproject.netconf.DatastoreId;
Sean Condonfae8e662016-12-15 10:25:13 +000031import org.onosproject.netconf.NetconfException;
32import org.onosproject.netconf.NetconfSession;
Sean Condon06613e92017-06-09 15:14:01 +010033import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfm;
34import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfmOpParam;
35import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.DefaultMefCfm;
36import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.AbortLoopbackInput;
Sean Condon0e89bda2017-03-21 14:23:19 +000037import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.MaintenanceDomain;
38import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.MaintenanceAssociation;
Sean Condon0e89bda2017-03-21 14:23:19 +000039import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.MaintenanceAssociationEndPoint;
Sean Condon06613e92017-06-09 15:14:01 +010040import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceInput;
41import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceOutput;
42import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.TransmitLoopbackInput;
Sean Condon0e89bda2017-03-21 14:23:19 +000043import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.AugmentedMseaCfmMaintenanceAssociationEndPoint;
44import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.DefaultAugmentedMseaCfmMaintenanceAssociationEndPoint;
45import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.augmentedmseacfmmaintenanceassociationendpoint.delaymeasurements.DelayMeasurement;
Sean Condon96b896d2017-12-11 12:44:29 -080046import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.MepIdType;
Sean Condon06613e92017-06-09 15:14:01 +010047import org.onosproject.yang.model.DefaultModelObjectData;
48import org.onosproject.yang.model.ModelConverter;
49import org.onosproject.yang.model.ModelObject;
50import org.onosproject.yang.model.ModelObjectData;
Sean Condon0e89bda2017-03-21 14:23:19 +000051import org.onosproject.yang.model.ResourceId;
52import org.onosproject.yang.runtime.AnnotatedNodeInfo;
Sean Condon06613e92017-06-09 15:14:01 +010053import org.onosproject.yang.runtime.CompositeData;
Sean Condon0e89bda2017-03-21 14:23:19 +000054import org.onosproject.yang.runtime.DefaultAnnotatedNodeInfo;
55import org.onosproject.yang.runtime.DefaultAnnotation;
Sean Condon06613e92017-06-09 15:14:01 +010056import org.onosproject.yang.runtime.DefaultCompositeStream;
57
58import java.io.ByteArrayInputStream;
Sean Condon96b896d2017-12-11 12:44:29 -080059import java.util.Optional;
Sean Condon1dbcd712017-10-19 12:09:21 +010060import java.util.regex.Pattern;
Sean Condonfae8e662016-12-15 10:25:13 +000061
62/**
63 * Implementation of the MseaCfmServiceNetconf YANG model service.
64 */
65@Component(immediate = true, inherit = true)
66@Service
67public class MseaCfmManager extends AbstractYangServiceImpl
68 implements MseaCfmNetconfService {
69
Sean Condonbab11b22018-01-30 17:13:16 +000070 private static final String MSEA_CFM = "org.onosproject.drivers.microsemi.yang.mseacfmservice";
Sean Condonfae8e662016-12-15 10:25:13 +000071
Sean Condonbab11b22018-01-30 17:13:16 +000072 private static final String MSEA_CFM_NS = "http://www.microsemi.com/microsemi-edge-assure/msea-cfm";
73 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 +010074
75 //FIXME Remove when the issue with Null bits on onos-yang-tools is sorted
76 @Deprecated
77 protected static final Pattern REGEX_EMPTY_ACTIVE_DEFECTS =
78 Pattern.compile("(<active-defects)[ ]?(/>)", Pattern.DOTALL);
79 //FIXME Remove when the issue with Null bits on onos-yang-tools is sorted
80 @Deprecated
81 protected static final Pattern REGEX_EMPTY_LAST_DEFECT_SENT =
82 Pattern.compile("(<msea-soam-fm:last-defect-sent)[ ]?(/>)", Pattern.DOTALL);
Sean Condonbab11b22018-01-30 17:13:16 +000083 private static final String MEF_CFM = "mef-cfm";
84 private static final String MAINTENANCE_DOMAIN = "maintenance-domain";
Sean Condon96b896d2017-12-11 12:44:29 -080085 public static final String ID = "id";
Sean Condonbab11b22018-01-30 17:13:16 +000086 private static final String MAINTENANCE_ASSOCIATION = "maintenance-association";
87 private static final String TRANSMIT_LOOPBACK = "transmit-loopback";
88 private static final String ABORT_LOOPBACK = "abort-loopback";
89 private static final String MAINTENANCE_ASSOCIATION_END_POINT = "maintenance-association-end-point";
90 private static final String MEP_ID = "mep-id";
91 private static final String DELAY_MEASUREMENTS = "delay-measurements";
92 private static final String DELAY_MEASUREMENT = "delay-measurement";
93 private static final String DM_ID = "dm-id";
94 private static final String MEP_IDENTIFIER = "mep-identifier";
95 private static final String REMOTE_MEPS = "remote-meps";
Sean Condon1dbcd712017-10-19 12:09:21 +010096
Sean Condonfae8e662016-12-15 10:25:13 +000097 @Activate
98 public void activate() {
Sean Condon06613e92017-06-09 15:14:01 +010099 super.activate();
Sean Condonfae8e662016-12-15 10:25:13 +0000100 appId = coreService.registerApplication(MSEA_CFM);
Sean Condonfae8e662016-12-15 10:25:13 +0000101 log.info("MseaCfmService Started");
102 }
103
104 @Deactivate
105 public void deactivate() {
106 super.deactivate();
Sean Condonfae8e662016-12-15 10:25:13 +0000107 log.info("MseaCfmService Stopped");
108 }
109
110 @Override
Sean Condon0e89bda2017-03-21 14:23:19 +0000111 public MseaCfm getMepEssentials(MdId mdId, MaIdShort maId, MepId mepId,
112 NetconfSession session) throws NetconfException {
Sean Condonfae8e662016-12-15 10:25:13 +0000113 if (session == null) {
114 throw new NetconfException("Session is null when calling getMepEssentials()");
115 }
116
Sean Condon0e89bda2017-03-21 14:23:19 +0000117 String xmlQueryStr = buildMepEssentialsQueryString(mdId, maId, mepId);
118 log.debug("Sending <get> for MEP essentials" +
Sean Condonfae8e662016-12-15 10:25:13 +0000119 " query on NETCONF session " + session.getSessionId() +
120 ":\n" + xmlQueryStr);
121
122 String xmlResult = session.get(xmlQueryStr, null);
Sean Condon06613e92017-06-09 15:14:01 +0100123 xmlResult = removeRpcReplyData(xmlResult);
Sean Condon0e89bda2017-03-21 14:23:19 +0000124 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
125 null, new ByteArrayInputStream(xmlResult.getBytes()));
126 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
127
128 ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(
129 compositeData.resourceData());
130
131 MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
132 for (ModelObject mo:mod.modelObjects()) {
133 if (mo instanceof DefaultMefCfm) {
134 mseaCfm.mefCfm((DefaultMefCfm) mo);
135 }
136 }
137 return mseaCfm;
138 }
139
140 @Override
141 public MseaCfm getMepFull(MdId mdId, MaIdShort maId, MepId mepId,
142 NetconfSession session) throws NetconfException {
143 if (session == null) {
144 throw new NetconfException("Session is null when calling getMepFull()");
145 }
146
147 String xmlQueryStr = buildMepFullQueryString(mdId, maId, mepId);
148 log.debug("Sending <get> for full MEP" +
149 " query on NETCONF session " + session.getSessionId() +
150 ":\n" + xmlQueryStr);
151
152 String xmlResult = session.get(xmlQueryStr, null);
153 xmlResult = removeRpcReplyData(xmlResult);
Sean Condon1dbcd712017-10-19 12:09:21 +0100154 xmlResult = removeEmptyActiveDefects(xmlResult);
Sean Condon06613e92017-06-09 15:14:01 +0100155 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
156 null, new ByteArrayInputStream(xmlResult.getBytes()));
157 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
158
159 ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
160
161 MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
162 for (ModelObject mo:mod.modelObjects()) {
163 if (mo instanceof DefaultMefCfm) {
164 mseaCfm.mefCfm((DefaultMefCfm) mo);
165 }
Sean Condonfae8e662016-12-15 10:25:13 +0000166 }
Sean Condon06613e92017-06-09 15:14:01 +0100167
168 return mseaCfm;
Sean Condonfae8e662016-12-15 10:25:13 +0000169 }
170
171 @Override
Sean Condon96b896d2017-12-11 12:44:29 -0800172 public MseaCfm getMepIds(Optional<MdId> mdIdOptional, Optional<MaIdShort> maIdOptional,
173 NetconfSession session, DatastoreId targetDs) throws NetconfException {
174
175 ModelObjectData.Builder moQueryBldr = DefaultModelObjectData.builder();
176
Sean Condonbab11b22018-01-30 17:13:16 +0000177 ArrayList<AnnotatedNodeInfo> annotations = new ArrayList<>();
Sean Condon96b896d2017-12-11 12:44:29 -0800178 String xmlQueryStr = encodeMoToXmlStr(moQueryBldr.build(), annotations);
179
180 log.debug("Sending <get> for full MEP" +
181 " query on NETCONF session " + session.getSessionId() +
182 ":\n" + xmlQueryStr);
183
184 String xmlResult = session.get(xmlQueryStr, null);
185 xmlResult = removeRpcReplyData(xmlResult);
186 xmlResult = removeEmptyActiveDefects(xmlResult);
187 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
188 null, new ByteArrayInputStream(xmlResult.getBytes()));
189 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
190
191 ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
192
193 MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
194 for (ModelObject mo:mod.modelObjects()) {
195 if (mo instanceof DefaultMefCfm) {
196 mseaCfm.mefCfm((DefaultMefCfm) mo);
197 }
198 }
199
200 return mseaCfm;
201 }
202
203 @Override
Sean Condon0e89bda2017-03-21 14:23:19 +0000204 public MseaCfm getSoamDm(MdId mdName, MaIdShort maName, MepId mepId,
205 SoamId dmId, DmEntryParts parts, NetconfSession session)
206 throws NetconfException {
207 String xmlQueryStr = buildDmQueryString(mdName, maName, mepId, dmId, parts);
208 log.debug("Sending <get> for " +
209 " query on NETCONF session " + session.getSessionId() +
210 ":\n" + xmlQueryStr);
211
212 String xmlResult = session.get(xmlQueryStr, null);
213 xmlResult = removeRpcReplyData(xmlResult);
Sean Condon0e89bda2017-03-21 14:23:19 +0000214 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
215 null, new ByteArrayInputStream(xmlResult.getBytes()));
216 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
217
218 ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
219
220 MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
221 for (ModelObject mo:mod.modelObjects()) {
222 if (mo instanceof DefaultMefCfm) {
223 mseaCfm.mefCfm((DefaultMefCfm) mo);
224 }
225 }
226
227 return mseaCfm;
Sean Condonfae8e662016-12-15 10:25:13 +0000228 }
229
230 @Override
Sean Condon06613e92017-06-09 15:14:01 +0100231 public boolean setMseaCfm(MseaCfmOpParam mseaCfm, NetconfSession session,
Sean Condon0e89bda2017-03-21 14:23:19 +0000232 DatastoreId targetDs) throws NetconfException {
Sean Condon06613e92017-06-09 15:14:01 +0100233
Sean Condon0e89bda2017-03-21 14:23:19 +0000234 ModelObjectData moQuery = DefaultModelObjectData.builder()
235 .addModelObject((ModelObject) mseaCfm.mefCfm()).build();
236 return setNetconfObject(moQuery, session, targetDs, null);
Sean Condonfae8e662016-12-15 10:25:13 +0000237 }
238
Sean Condon0e89bda2017-03-21 14:23:19 +0000239 @Override
240 public boolean deleteMseaCfmDm(MseaCfmOpParam mseaCfm, NetconfSession session,
Sean Condon96b896d2017-12-11 12:44:29 -0800241 DatastoreId targetDs) throws NetconfException, CfmConfigException {
Sean Condon0e89bda2017-03-21 14:23:19 +0000242
Sean Condonbab11b22018-01-30 17:13:16 +0000243 if (mseaCfm.mefCfm() == null) {
244 throw new CfmConfigException("mefCfm object must be present before Meps can be added");
245 }
Sean Condon0e89bda2017-03-21 14:23:19 +0000246 ModelObjectData mseCfmDmList = DefaultModelObjectData.builder()
Sean Condonbab11b22018-01-30 17:13:16 +0000247 .addModelObject(mseaCfm).build();
Sean Condon0e89bda2017-03-21 14:23:19 +0000248
Sean Condonbab11b22018-01-30 17:13:16 +0000249 ArrayList<AnnotatedNodeInfo> anis = new ArrayList<>();
250 for (MaintenanceDomain md:mseaCfm.mefCfm().maintenanceDomain()) {
251 if (md.id() == 0) {
252 throw new CfmConfigException("An MD numeric ID must be given");
253 }
254 for (MaintenanceAssociation ma:md.maintenanceAssociation()) {
255 if (ma.id() == 0) {
256 throw new CfmConfigException("An MA numeric ID must be given");
Sean Condon96b896d2017-12-11 12:44:29 -0800257 }
Sean Condonbab11b22018-01-30 17:13:16 +0000258 for (MaintenanceAssociationEndPoint mep:ma.maintenanceAssociationEndPoint()) {
259 AugmentedMseaCfmMaintenanceAssociationEndPoint mepAugment =
260 mep.augmentation(DefaultAugmentedMseaCfmMaintenanceAssociationEndPoint.class);
261 if (mepAugment != null && mepAugment.delayMeasurements() != null) {
262 for (DelayMeasurement dm:mepAugment.delayMeasurements().delayMeasurement()) {
263 ResourceId.Builder ridBuilder = ResourceId.builder()
264 .addBranchPointSchema("/", null)
265 .addBranchPointSchema(MEF_CFM, MSEA_CFM_NS)
266 .addBranchPointSchema(MAINTENANCE_DOMAIN, MSEA_CFM_NS)
267 .addKeyLeaf(ID, MSEA_CFM_NS, md.id())
268 .addBranchPointSchema(MAINTENANCE_ASSOCIATION, MSEA_CFM_NS)
269 .addKeyLeaf(ID, MSEA_CFM_NS, ma.id())
270 .addBranchPointSchema(MAINTENANCE_ASSOCIATION_END_POINT, MSEA_CFM_NS)
271 .addKeyLeaf(MEP_ID, MSEA_CFM_NS, mep.mepIdentifier())
272 .addBranchPointSchema(DELAY_MEASUREMENTS, MSEA_CFM_PM_NS)
273 .addBranchPointSchema(DELAY_MEASUREMENT, MSEA_CFM_PM_NS)
274 .addKeyLeaf(DM_ID, MSEA_CFM_PM_NS, dm.dmId());
275 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
276 .resourceId(ridBuilder.build())
277 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
278 .build();
279 anis.add(ani);
Sean Condon0e89bda2017-03-21 14:23:19 +0000280 }
281 }
282 }
283 }
284 }
285
286 return setNetconfObject(mseCfmDmList, session, targetDs, anis);
287 }
288
289 @Override
290 public boolean deleteMseaMep(MseaCfmOpParam mseaCfm, NetconfSession session,
Sean Condon96b896d2017-12-11 12:44:29 -0800291 DatastoreId targetDs) throws NetconfException, CfmConfigException {
Sean Condon0e89bda2017-03-21 14:23:19 +0000292
Sean Condonbab11b22018-01-30 17:13:16 +0000293 if (mseaCfm.mefCfm() == null) {
294 throw new CfmConfigException("mefCfm object must be present before Meps can be added");
295 }
Sean Condon0e89bda2017-03-21 14:23:19 +0000296 ModelObjectData mseCfmMepList = DefaultModelObjectData.builder()
297 .addModelObject((ModelObject) mseaCfm.mefCfm()).build();
298
Sean Condonbab11b22018-01-30 17:13:16 +0000299 ArrayList<AnnotatedNodeInfo> anis = new ArrayList<>();
300 for (MaintenanceDomain md:mseaCfm.mefCfm().maintenanceDomain()) {
301 if (md.id() == 0) {
302 throw new CfmConfigException("An MD numeric ID must be given");
303 }
304 for (MaintenanceAssociation ma:md.maintenanceAssociation()) {
305 if (ma.id() == 0) {
306 throw new CfmConfigException("An MA numeric ID must be given");
Sean Condon96b896d2017-12-11 12:44:29 -0800307 }
Sean Condonbab11b22018-01-30 17:13:16 +0000308 for (MaintenanceAssociationEndPoint mep:ma.maintenanceAssociationEndPoint()) {
309 ResourceId.Builder ridBuilder = ResourceId.builder()
310 .addBranchPointSchema("/", null)
311 .addBranchPointSchema(MEF_CFM, MSEA_CFM_NS)
312 .addBranchPointSchema(MAINTENANCE_DOMAIN, MSEA_CFM_NS)
313 .addKeyLeaf(ID, MSEA_CFM_NS, md.id())
314 .addBranchPointSchema(MAINTENANCE_ASSOCIATION, MSEA_CFM_NS)
315 .addKeyLeaf(ID, MSEA_CFM_NS, ma.id())
316 .addBranchPointSchema(MAINTENANCE_ASSOCIATION_END_POINT, MSEA_CFM_NS)
317 .addKeyLeaf(MEP_IDENTIFIER, MSEA_CFM_NS, mep.mepIdentifier().uint16());
318 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
319 .resourceId(ridBuilder.build())
320 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
321 .build();
322 anis.add(ani);
Sean Condon96b896d2017-12-11 12:44:29 -0800323 }
324 }
325 }
326
327 return setNetconfObject(mseCfmMepList, session, targetDs, anis);
328 }
329
330 @Override
331 public boolean deleteMseaMa(MseaCfmOpParam mseaCfm, NetconfSession session,
332 DatastoreId targetDs) throws NetconfException, CfmConfigException {
Sean Condonbab11b22018-01-30 17:13:16 +0000333 if (mseaCfm.mefCfm() == null) {
334 throw new CfmConfigException("mefCfm object must be present before Meps can be added");
335 }
Sean Condon96b896d2017-12-11 12:44:29 -0800336
337 ModelObjectData mseCfmMepList = DefaultModelObjectData.builder()
338 .addModelObject((ModelObject) mseaCfm.mefCfm()).build();
Sean Condonbab11b22018-01-30 17:13:16 +0000339 ArrayList<AnnotatedNodeInfo> anis = new ArrayList<>();
340 for (MaintenanceDomain md:mseaCfm.mefCfm().maintenanceDomain()) {
341 if (md.id() == 0) {
342 throw new CfmConfigException("An MD numeric ID must be given");
343 }
344 for (MaintenanceAssociation ma:md.maintenanceAssociation()) {
345 if (ma.id() == 0) {
346 throw new CfmConfigException("An MA numeric ID must be given");
Sean Condon96b896d2017-12-11 12:44:29 -0800347 }
Sean Condonbab11b22018-01-30 17:13:16 +0000348 ResourceId.Builder ridBuilder = ResourceId.builder()
349 .addBranchPointSchema("/", null)
350 .addBranchPointSchema(MEF_CFM, MSEA_CFM_NS)
351 .addBranchPointSchema(MAINTENANCE_DOMAIN, MSEA_CFM_NS)
352 .addKeyLeaf(ID, MSEA_CFM_NS, md.id())
353 .addBranchPointSchema(MAINTENANCE_ASSOCIATION, MSEA_CFM_NS)
354 .addKeyLeaf(ID, MSEA_CFM_NS, ma.id());
Sean Condon96b896d2017-12-11 12:44:29 -0800355
Sean Condonbab11b22018-01-30 17:13:16 +0000356 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
357 .resourceId(ridBuilder.build())
358 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
359 .build();
360 anis.add(ani);
Sean Condon96b896d2017-12-11 12:44:29 -0800361 }
362 }
363
364 return setNetconfObject(mseCfmMepList, session, targetDs, anis);
365 }
366
367 @Override
368 public boolean deleteMseaMaRMep(MseaCfmOpParam mseaCfm, NetconfSession session,
369 DatastoreId targetDs) throws NetconfException, CfmConfigException {
Sean Condonbab11b22018-01-30 17:13:16 +0000370 if (mseaCfm.mefCfm() == null) {
371 throw new CfmConfigException("mefCfm object must be present before Meps can be added");
372 }
Sean Condon96b896d2017-12-11 12:44:29 -0800373
374 ModelObjectData mseCfmMepList = DefaultModelObjectData.builder()
375 .addModelObject((ModelObject) mseaCfm.mefCfm()).build();
Sean Condonbab11b22018-01-30 17:13:16 +0000376 ArrayList<AnnotatedNodeInfo> anis = new ArrayList<>();
377 for (MaintenanceDomain md:mseaCfm.mefCfm().maintenanceDomain()) {
378 if (md.id() == 0) {
379 throw new CfmConfigException("An MD numeric ID must be given");
380 }
381 for (MaintenanceAssociation ma:md.maintenanceAssociation()) {
382 if (ma.id() == 0) {
383 throw new CfmConfigException("An MA numeric ID must be given");
Sean Condon96b896d2017-12-11 12:44:29 -0800384 }
Sean Condonbab11b22018-01-30 17:13:16 +0000385 for (MepIdType rmep:ma.remoteMeps()) {
386 ResourceId.Builder ridBuilder = ResourceId.builder()
387 .addBranchPointSchema("/", null)
388 .addBranchPointSchema(MEF_CFM, MSEA_CFM_NS)
389 .addBranchPointSchema(MAINTENANCE_DOMAIN, MSEA_CFM_NS)
390 .addKeyLeaf(ID, MSEA_CFM_NS, md.id())
391 .addBranchPointSchema(MAINTENANCE_ASSOCIATION, MSEA_CFM_NS)
392 .addKeyLeaf(ID, MSEA_CFM_NS, ma.id())
393 .addLeafListBranchPoint(REMOTE_MEPS, MSEA_CFM_NS,
394 rmep.uint16());
395 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
396 .resourceId(ridBuilder.build())
397 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
398 .build();
399 anis.add(ani);
Sean Condon0e89bda2017-03-21 14:23:19 +0000400 }
401 }
402 }
403
404 return setNetconfObject(mseCfmMepList, session, targetDs, anis);
405 }
406
407
Sean Condon96b896d2017-12-11 12:44:29 -0800408 @Override
409 public boolean deleteMseaMd(MseaCfmOpParam mseaCfm, NetconfSession session,
410 DatastoreId targetDs) throws NetconfException, CfmConfigException {
Sean Condonbab11b22018-01-30 17:13:16 +0000411 if (mseaCfm.mefCfm() == null) {
412 throw new CfmConfigException("mefCfm object must be present before Meps can be added");
413 }
Sean Condon96b896d2017-12-11 12:44:29 -0800414 ModelObjectData mseCfmMepList = DefaultModelObjectData.builder()
415 .addModelObject((ModelObject) mseaCfm.mefCfm()).build();
416
Sean Condonbab11b22018-01-30 17:13:16 +0000417 ArrayList<AnnotatedNodeInfo> anis = new ArrayList<>();
418 for (MaintenanceDomain md:mseaCfm.mefCfm().maintenanceDomain()) {
419 if (md.id() == 0) {
420 throw new CfmConfigException("An MD numeric ID must be given");
Sean Condon96b896d2017-12-11 12:44:29 -0800421 }
Sean Condonbab11b22018-01-30 17:13:16 +0000422 ResourceId.Builder ridBuilder = ResourceId.builder()
423 .addBranchPointSchema("/", null)
424 .addBranchPointSchema(MEF_CFM, MSEA_CFM_NS)
425 .addBranchPointSchema(MAINTENANCE_DOMAIN, MSEA_CFM_NS)
426 .addKeyLeaf(ID, MSEA_CFM_NS, md.id());
427 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
428 .resourceId(ridBuilder.build())
429 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
430 .build();
431 anis.add(ani);
Sean Condon96b896d2017-12-11 12:44:29 -0800432 }
433
434 return setNetconfObject(mseCfmMepList, session, targetDs, anis);
435 }
436
Sean Condonfae8e662016-12-15 10:25:13 +0000437 /**
438 * Call RPCs on the device through NETCONF.
439 */
440 @Override
Sean Condon0e89bda2017-03-21 14:23:19 +0000441 public void transmitLoopback(TransmitLoopbackInput inputVar,
442 NetconfSession session) throws NetconfException {
443
444 ModelObjectData transLoopbackMo = DefaultModelObjectData.builder()
445 .addModelObject((ModelObject) inputVar).build();
446
447 customRpcNetconf(transLoopbackMo,
Sean Condon96b896d2017-12-11 12:44:29 -0800448 TRANSMIT_LOOPBACK, session);
Sean Condonfae8e662016-12-15 10:25:13 +0000449 }
450
451 @Override
Sean Condon0e89bda2017-03-21 14:23:19 +0000452 public void abortLoopback(AbortLoopbackInput inputVar,
453 NetconfSession session) throws NetconfException {
454 ModelObjectData abortLoopbackMo = DefaultModelObjectData.builder()
455 .addModelObject((ModelObject) inputVar).build();
456
Sean Condon96b896d2017-12-11 12:44:29 -0800457 customRpcNetconf(abortLoopbackMo, ABORT_LOOPBACK, session);
Sean Condonfae8e662016-12-15 10:25:13 +0000458 }
459
460 @Override
Sean Condon0e89bda2017-03-21 14:23:19 +0000461 public TransmitLinktraceOutput transmitLinktrace(
462 TransmitLinktraceInput inputVar, NetconfSession session)
Sean Condonfae8e662016-12-15 10:25:13 +0000463 throws NetconfException {
464 throw new UnsupportedOperationException("Not yet implemented");
465 }
466
Sean Condon1dbcd712017-10-19 12:09:21 +0100467 //FIXME Remove when the fix for null bits with onos-yang-tools
468 // https://gerrit.onosproject.org/#/c/15777/ is available
469 @Deprecated
470 private static String removeEmptyActiveDefects(String rpcReplyXml) throws NetconfException {
471 rpcReplyXml = REGEX_EMPTY_ACTIVE_DEFECTS.matcher(rpcReplyXml).replaceFirst("");
472 rpcReplyXml = REGEX_EMPTY_LAST_DEFECT_SENT.matcher(rpcReplyXml).replaceFirst("");
473
474 return rpcReplyXml;
475 }
476
Sean Condon0e89bda2017-03-21 14:23:19 +0000477 @Deprecated //Replace this with a ModelObject defintion
478 private String buildMepEssentialsQueryString(MdId mdId, MaIdShort maId,
479 MepId mepId) {
Sean Condonfae8e662016-12-15 10:25:13 +0000480 StringBuilder rpc = new StringBuilder();
481
482 rpc.append("<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" ");
483 rpc.append(" xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" ");
484 rpc.append("xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">\n");
485 rpc.append("<maintenance-domain>\n");
486 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000487 rpc.append("<name>");
488 rpc.append(mdId.mdName());
489 rpc.append("</name>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000490 rpc.append("<maintenance-association>\n");
491 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000492 rpc.append("<name>");
493 rpc.append(maId.maName());
494 rpc.append("</name>\n");
Sean Condon06613e92017-06-09 15:14:01 +0100495 rpc.append("<ccm-interval>10ms</ccm-interval>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000496 rpc.append("<remote-meps/>\n");
497 rpc.append("<component-list/>\n");
498 rpc.append("<maintenance-association-end-point>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000499 rpc.append("<mep-identifier>");
500 rpc.append(mepId.id());
501 rpc.append("</mep-identifier>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000502 rpc.append("<mac-address/>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000503 rpc.append("<remote-mep-database>\n");
504 rpc.append("<remote-mep>\n");
505 rpc.append("<remote-mep-id/>\n");
506 rpc.append("</remote-mep>\n");
507 rpc.append("</remote-mep-database>\n");
508 rpc.append("<msea-soam-pm:delay-measurements>\n");
509 rpc.append("<msea-soam-pm:delay-measurement>\n");
510 rpc.append("<msea-soam-pm:dm-id/>\n");
511 rpc.append("</msea-soam-pm:delay-measurement>\n");
512 rpc.append("</msea-soam-pm:delay-measurements>\n");
513 rpc.append("<msea-soam-pm:loss-measurements>\n");
514 rpc.append("<msea-soam-pm:loss-measurement>\n");
515 rpc.append("<msea-soam-pm:lm-id/>\n");
516 rpc.append("</msea-soam-pm:loss-measurement>\n");
517 rpc.append("</msea-soam-pm:loss-measurements>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000518 rpc.append("</maintenance-association-end-point>\n");
519 rpc.append("</maintenance-association>\n");
520 rpc.append("</maintenance-domain>\n");
521 rpc.append("</mef-cfm>");
522
523 return rpc.toString();
524 }
525
Sean Condon0e89bda2017-03-21 14:23:19 +0000526 @Deprecated //Replace this with a ModelObject defintion
527 private String buildMepFullQueryString(MdId mdId, MaIdShort maId, MepId mepId) {
Sean Condonfae8e662016-12-15 10:25:13 +0000528 StringBuilder rpc = new StringBuilder();
529
530 rpc.append("<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" ");
531 rpc.append(" xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" ");
532 rpc.append("xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">\n");
533 rpc.append("<maintenance-domain>\n");
534 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000535 rpc.append("<name>");
536 rpc.append(mdId.mdName());
537 rpc.append("</name>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000538 rpc.append("<maintenance-association>\n");
539 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000540 rpc.append("<name>");
541 rpc.append(maId.maName());
542 rpc.append("</name>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000543 rpc.append("<maintenance-association-end-point>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000544 rpc.append("<mep-identifier>");
545 rpc.append(mepId.id());
546 rpc.append("</mep-identifier>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000547 rpc.append("<interface/>\n");
548 //Direction will always be DOWN for EA1000
549 rpc.append("<primary-vid/>\n");
550 rpc.append("<administrative-state/>\n");
551 rpc.append("<mac-address/>\n");
552 rpc.append("<ccm-ltm-priority/>\n");
553 rpc.append("<continuity-check/>\n"); //Container
554 rpc.append("<loopback/>\n"); //Container
555 rpc.append("<linktrace/>\n"); //Container
556 rpc.append("<remote-mep-database/>\n"); //Container
557 rpc.append("<msea-soam-fm:operational-state/>\n");
558 rpc.append("<msea-soam-fm:connectivity-status/>\n");
559 rpc.append("<msea-soam-fm:port-status/>\n");
560 rpc.append("<msea-soam-fm:interface-status/>\n");
561 rpc.append("<msea-soam-fm:last-defect-sent/>\n");
562 rpc.append("<msea-soam-fm:rdi-transmit-status/>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000563 rpc.append("</maintenance-association-end-point>\n");
564 rpc.append("</maintenance-association>\n");
565 rpc.append("</maintenance-domain>\n");
566 rpc.append("</mef-cfm>");
567
568 return rpc.toString();
569 }
570
Sean Condon0e89bda2017-03-21 14:23:19 +0000571 @Deprecated //Replace this with a ModelObject defintion
572 private String buildDmQueryString(MdId mdId, MaIdShort maId, MepId mepId,
573 SoamId dmId, DmEntryParts parts) {
574 StringBuilder rpc = new StringBuilder();
575
576 rpc.append("<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" ");
577 rpc.append(" xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" ");
578 rpc.append("xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">\n");
579 rpc.append("<maintenance-domain>\n");
580 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000581 rpc.append("<name>");
582 rpc.append(mdId.mdName());
583 rpc.append("</name>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000584 rpc.append("<maintenance-association>\n");
585 rpc.append("<id/>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000586 rpc.append("<name>");
587 rpc.append(maId.maName());
588 rpc.append("</name>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000589 rpc.append("<maintenance-association-end-point>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000590 rpc.append("<mep-identifier>");
591 rpc.append(mepId.id());
592 rpc.append("</mep-identifier>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000593 if (dmId != null) {
594 rpc.append("<msea-soam-pm:delay-measurements>");
595 rpc.append("<msea-soam-pm:delay-measurement>\n");
Sean Condonbab11b22018-01-30 17:13:16 +0000596 rpc.append("<msea-soam-pm:dm-id>");
597 rpc.append(dmId.id());
598 rpc.append("</msea-soam-pm:dm-id>\n");
Sean Condon0e89bda2017-03-21 14:23:19 +0000599 rpc.append("<msea-soam-pm:mep-id/>");
600 rpc.append("<msea-soam-pm:mac-address/>");
601 rpc.append("<msea-soam-pm:administrative-state/>\n");
602 rpc.append("<msea-soam-pm:measurement-enable/>\n");
603 rpc.append("<msea-soam-pm:message-period/>\n");
604 rpc.append("<msea-soam-pm:priority/>\n");
605 rpc.append("<msea-soam-pm:frame-size/>\n");
606 rpc.append("<msea-soam-pm:measurement-interval/>\n");
607 rpc.append("<msea-soam-pm:number-intervals-stored/>\n");
608 rpc.append("<msea-soam-pm:session-status/>\n");
609 rpc.append("<msea-soam-pm:frame-delay-two-way/>\n");
610 rpc.append("<msea-soam-pm:inter-frame-delay-variation-two-way/>\n");
611 if (parts != null && (parts.equals(DmEntryParts.CURRENT_ONLY) ||
612 parts.equals(DmEntryParts.ALL_PARTS))) {
613 rpc.append("<msea-soam-pm:current-stats/>\n");
614 }
615 if (parts != null && (parts.equals(DmEntryParts.HISTORY_ONLY) ||
616 parts.equals(DmEntryParts.ALL_PARTS))) {
617 rpc.append("<msea-soam-pm:history-stats/>\n");
618 }
619 rpc.append("</msea-soam-pm:delay-measurement>\n");
620 rpc.append("</msea-soam-pm:delay-measurements>");
621 } else {
622 rpc.append("<msea-soam-pm:delay-measurements/>");
623 }
624 rpc.append("</maintenance-association-end-point>\n");
625 rpc.append("</maintenance-association>\n");
626 rpc.append("</maintenance-domain>\n");
627 rpc.append("</mef-cfm>");
628
629 return rpc.toString();
630 }
631
632 @Deprecated //Replace this with a ModelObject defintion
633 private String buildAbortLoopbackQueryString(Short mdId, Short maId,
634 Short mepId) {
635 StringBuilder rpc = new StringBuilder();
636
637 rpc.append("<abort-loopback xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\">");
Sean Condonbab11b22018-01-30 17:13:16 +0000638 rpc.append("<maintenance-domain>");
639 rpc.append(mdId);
640 rpc.append("</maintenance-domain>");
641 rpc.append("<maintenance-association>");
642 rpc.append(maId);
643 rpc.append("</maintenance-association>");
644 rpc.append("<maintenance-association-end-point>");
645 rpc.append(mepId);
646 rpc.append("</maintenance-association-end-point>");
Sean Condon0e89bda2017-03-21 14:23:19 +0000647 rpc.append("</abort-loopback>");
648
649 return rpc.toString();
650 }
Sean Condonfae8e662016-12-15 10:25:13 +0000651}