blob: 36f48c4b8a0edfe59326d228ec514b105f9f4f93 [file] [log] [blame]
Sean Condonfae8e662016-12-15 10:25:13 +00001/*
2 * Copyright 2017-present Open Networking Laboratory
3 *
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.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
21import org.apache.felix.scr.annotations.Service;
22import org.onosproject.drivers.microsemi.yang.MseaCfmNetconfService;
Sean Condon06613e92017-06-09 15:14:01 +010023import org.onosproject.netconf.DatastoreId;
Sean Condonfae8e662016-12-15 10:25:13 +000024import org.onosproject.netconf.NetconfException;
25import org.onosproject.netconf.NetconfSession;
Sean Condon06613e92017-06-09 15:14:01 +010026import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfm;
27import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfmOpParam;
28import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.DefaultMefCfm;
29import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.AbortLoopbackInput;
30import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceInput;
31import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceOutput;
32import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.TransmitLoopbackInput;
33import org.onosproject.yang.model.DefaultModelObjectData;
34import org.onosproject.yang.model.ModelConverter;
35import org.onosproject.yang.model.ModelObject;
36import org.onosproject.yang.model.ModelObjectData;
37import org.onosproject.yang.runtime.CompositeData;
38import org.onosproject.yang.runtime.DefaultCompositeStream;
39
40import java.io.ByteArrayInputStream;
Sean Condonfae8e662016-12-15 10:25:13 +000041
42/**
43 * Implementation of the MseaCfmServiceNetconf YANG model service.
44 */
45@Component(immediate = true, inherit = true)
46@Service
47public class MseaCfmManager extends AbstractYangServiceImpl
48 implements MseaCfmNetconfService {
49
50 public static final String MSEA_CFM = "org.onosproject.drivers.microsemi.yang.mseacfmservice";
51
52 @Activate
53 public void activate() {
Sean Condon06613e92017-06-09 15:14:01 +010054 super.activate();
Sean Condonfae8e662016-12-15 10:25:13 +000055 appId = coreService.registerApplication(MSEA_CFM);
Sean Condonfae8e662016-12-15 10:25:13 +000056 log.info("MseaCfmService Started");
57 }
58
59 @Deactivate
60 public void deactivate() {
61 super.deactivate();
Sean Condonfae8e662016-12-15 10:25:13 +000062 log.info("MseaCfmService Stopped");
63 }
64
65 @Override
66 public MseaCfm getMepEssentials(String mdName, String maName, int mepId,
67 NetconfSession session) throws NetconfException {
68 if (session == null) {
69 throw new NetconfException("Session is null when calling getMepEssentials()");
70 }
71
72 String xmlQueryStr = buildMepQueryString(mdName, maName, mepId);
73 log.debug("Sending <get> for " +
74 " query on NETCONF session " + session.getSessionId() +
75 ":\n" + xmlQueryStr);
76
77 String xmlResult = session.get(xmlQueryStr, null);
Sean Condonfae8e662016-12-15 10:25:13 +000078
Sean Condon06613e92017-06-09 15:14:01 +010079 xmlResult = removeRpcReplyData(xmlResult);
80 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
81 null, new ByteArrayInputStream(xmlResult.getBytes()));
82 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
83
84 ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
85
86 MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
87 for (ModelObject mo:mod.modelObjects()) {
88 if (mo instanceof DefaultMefCfm) {
89 mseaCfm.mefCfm((DefaultMefCfm) mo);
90 }
Sean Condonfae8e662016-12-15 10:25:13 +000091 }
Sean Condon06613e92017-06-09 15:14:01 +010092
93 return mseaCfm;
Sean Condonfae8e662016-12-15 10:25:13 +000094 }
95
96 @Override
97 public MseaCfm getSoamDm(String mdName, String maName, int mepId,
98 int dmId, NetconfSession session) throws NetconfException {
99 String xmlQueryStr = buildDmQueryString(mdName, maName, mepId, dmId);
Sean Condon06613e92017-06-09 15:14:01 +0100100 throw new UnsupportedOperationException("Not yet implemented");
Sean Condonfae8e662016-12-15 10:25:13 +0000101 }
102
103 @Override
Sean Condon06613e92017-06-09 15:14:01 +0100104 public boolean setMseaCfm(MseaCfmOpParam mseaCfm, NetconfSession session,
105 DatastoreId targetDs) throws NetconfException {
106 ModelObjectData moEdit = DefaultModelObjectData.builder()
107 .addModelObject(mseaCfm).build();
108
109 return setNetconfObject(moEdit, session, targetDs, null);
Sean Condonfae8e662016-12-15 10:25:13 +0000110 }
111
112 /**
113 * Call RPCs on the device through NETCONF.
114 */
115 @Override
116 public void transmitLoopback(TransmitLoopbackInput inputVar, NetconfSession session) throws NetconfException {
117 throw new UnsupportedOperationException("Not yet implemented");
118 }
119
120 @Override
121 public void abortLoopback(AbortLoopbackInput inputVar, NetconfSession session) throws NetconfException {
122 throw new UnsupportedOperationException("Not yet implemented");
123 }
124
125 @Override
126 public TransmitLinktraceOutput transmitLinktrace(TransmitLinktraceInput inputVar, NetconfSession session)
127 throws NetconfException {
128 throw new UnsupportedOperationException("Not yet implemented");
129 }
130
Sean Condonfae8e662016-12-15 10:25:13 +0000131 private String buildMepQueryString(String mdName, String maName, int mepId) {
132 StringBuilder rpc = new StringBuilder();
133
134 rpc.append("<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" ");
135 rpc.append(" xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" ");
136 rpc.append("xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">\n");
137 rpc.append("<maintenance-domain>\n");
138 rpc.append("<id/>\n");
139 rpc.append("<name>" + mdName + "</name>\n");
140 rpc.append("<md-level/>\n");
141 rpc.append("<maintenance-association>\n");
142 rpc.append("<id/>\n");
143 rpc.append("<name>" + maName + "</name>\n");
Sean Condon06613e92017-06-09 15:14:01 +0100144 rpc.append("<ccm-interval>10ms</ccm-interval>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000145 rpc.append("<remote-meps/>\n");
146 rpc.append("<component-list/>\n");
147 rpc.append("<maintenance-association-end-point>\n");
148 rpc.append("<mep-identifier>" + mepId + "</mep-identifier>\n");
149 rpc.append("<interface/>\n");
150 rpc.append("<primary-vid/>\n");
151 rpc.append("<administrative-state/>\n");
152 rpc.append("<ccm-ltm-priority/>\n");
153 rpc.append("<continuity-check/>\n");
154 rpc.append("<mac-address/>\n");
155 rpc.append("<msea-soam-fm:port-status/>\n");
156 rpc.append("<msea-soam-fm:interface-status/>\n");
Sean Condon06613e92017-06-09 15:14:01 +0100157 rpc.append("<msea-soam-fm:last-defect-sent/>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000158 rpc.append("<msea-soam-fm:rdi-transmit-status/>\n");
159 rpc.append("<loopback/>\n");
160 rpc.append("<remote-mep-database/>\n");
161 rpc.append("<linktrace/>\n");
162 rpc.append("</maintenance-association-end-point>\n");
163 rpc.append("</maintenance-association>\n");
164 rpc.append("</maintenance-domain>\n");
165 rpc.append("</mef-cfm>");
166
167 return rpc.toString();
168 }
169
170
171 private String buildDmQueryString(String mdName, String maName, int mepId, int dmId) {
172 StringBuilder rpc = new StringBuilder();
173
174 rpc.append("<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" ");
175 rpc.append(" xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" ");
176 rpc.append("xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">\n");
177 rpc.append("<maintenance-domain>\n");
178 rpc.append("<id/>\n");
179 rpc.append("<name>" + mdName + "</name>\n");
180 rpc.append("<md-level/>\n");
181 rpc.append("<maintenance-association>\n");
182 rpc.append("<id/>\n");
183 rpc.append("<name>" + maName + "</name>\n");
Sean Condon06613e92017-06-09 15:14:01 +0100184 rpc.append("<ccm-interval>10ms</ccm-interval>\n");
Sean Condonfae8e662016-12-15 10:25:13 +0000185 rpc.append("<maintenance-association-end-point>\n");
186 rpc.append("<mep-identifier>" + mepId + "</mep-identifier>\n");
187 rpc.append("<msea-soam-pm:delay-measurements>");
188 rpc.append("<msea-soam-pm:delay-measurement>");
189 rpc.append("<msea-soam-pm:dm-id>" + dmId + "</msea-soam-pm:dm-id>");
190 rpc.append("</msea-soam-pm:delay-measurement>");
191 rpc.append("</msea-soam-pm:delay-measurements>");
192 rpc.append("</maintenance-association-end-point>\n");
193 rpc.append("</maintenance-association>\n");
194 rpc.append("</maintenance-domain>\n");
195 rpc.append("</mef-cfm>");
196
197 return rpc.toString();
198 }
199
200}