blob: c0cba14c13321f512f1e5cca2f57bb275939ca44 [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 Condon06613e92017-06-09 15:14:01 +010018import java.io.ByteArrayInputStream;
Sean Condonfae8e662016-12-15 10:25:13 +000019import java.util.ArrayList;
20import java.util.List;
21import java.util.Map;
22
23import org.apache.felix.scr.annotations.Activate;
24import org.apache.felix.scr.annotations.Component;
25import org.apache.felix.scr.annotations.Deactivate;
26import org.apache.felix.scr.annotations.Service;
27import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
Sean Condon06613e92017-06-09 15:14:01 +010028import org.onosproject.netconf.DatastoreId;
Sean Condonfae8e662016-12-15 10:25:13 +000029import org.onosproject.netconf.NetconfException;
30import org.onosproject.netconf.NetconfSession;
Sean Condon06613e92017-06-09 15:14:01 +010031import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcService;
32import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcServiceOpParam;
33import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.MefServices;
34import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.BwpGroup;
35import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.UniSideInterfaceAssignmentEnum;
36import org.onosproject.yang.model.DefaultModelObjectData;
37import org.onosproject.yang.model.ModelConverter;
38import org.onosproject.yang.model.ModelObject;
39import org.onosproject.yang.model.ModelObjectData;
40import org.onosproject.yang.model.ResourceId;
41import org.onosproject.yang.runtime.AnnotatedNodeInfo;
42import org.onosproject.yang.runtime.CompositeData;
43import org.onosproject.yang.runtime.DefaultAnnotatedNodeInfo;
44import org.onosproject.yang.runtime.DefaultAnnotation;
45import org.onosproject.yang.runtime.DefaultCompositeStream;
Sean Condonfae8e662016-12-15 10:25:13 +000046
47/**
48 * Implementation of the MseaUniEvcServiceService YANG model service.
49 */
50@Component(immediate = true, inherit = true)
51@Service
52public class MseaUniEvcServiceManager extends AbstractYangServiceImpl
53 implements MseaUniEvcServiceNetconfService {
Sean Condon06613e92017-06-09 15:14:01 +010054 public static final String MSEA_UNI_EVC_SVC =
55 "org.onosproject.drivers.microsemi.yang.mseaunievcservice";
56 public static final String MSEA_UNI_EVC_SVC_NS =
57 "http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service";
Sean Condonfae8e662016-12-15 10:25:13 +000058
59 @Activate
60 public void activate() {
Sean Condon06613e92017-06-09 15:14:01 +010061 super.activate();
62 appId = coreService.registerApplication(MSEA_UNI_EVC_SVC);
Sean Condonfae8e662016-12-15 10:25:13 +000063 log.info("MseaUniEvcServiceManager Started");
64 }
65
66 @Deactivate
67 public void deactivate() {
68 super.deactivate();
Sean Condonfae8e662016-12-15 10:25:13 +000069 log.info("MseaUniEvcServiceManager Stopped");
70 }
71
72 @Override
73 public MseaUniEvcService getMseaUniEvcService(
Sean Condon06613e92017-06-09 15:14:01 +010074 MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session)
75 throws NetconfException {
76
77 return getConfigMseaUniEvcService(mseaUniEvcService, session, null);
Sean Condonfae8e662016-12-15 10:25:13 +000078 }
79
80 @Override
81 public MseaUniEvcService getConfigMseaUniEvcService(
Sean Condon06613e92017-06-09 15:14:01 +010082 MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session,
83 DatastoreId targetDs) throws NetconfException {
84
85 ModelObjectData moFilter = DefaultModelObjectData.builder()
86 .addModelObject((ModelObject) mseaUniEvcService.mefServices()).build();
87
88 ModelObjectData moReply = getConfigNetconfObject(moFilter, session, targetDs);
89
90 MseaUniEvcService reply = new MseaUniEvcServiceOpParam();
91 for (ModelObject mo:moReply.modelObjects()) {
92 if (mo instanceof MefServices) {
93 reply.mefServices((MefServices) mo);
94 }
95 }
96 return reply;
Sean Condonfae8e662016-12-15 10:25:13 +000097 }
98
99 /**
100 * Modify the configuration.
101 */
102 @Override
Sean Condon06613e92017-06-09 15:14:01 +0100103 public boolean setMseaUniEvcService(MseaUniEvcServiceOpParam mseaUniEvcService,
104 NetconfSession session, DatastoreId ncDs) throws NetconfException {
105 ModelObjectData moEdit = DefaultModelObjectData.builder()
106 .addModelObject((ModelObject) mseaUniEvcService.mefServices()).build();
107
108 return setNetconfObject(moEdit, session, ncDs, null);
Sean Condonfae8e662016-12-15 10:25:13 +0000109 }
110
Sean Condon06613e92017-06-09 15:14:01 +0100111 /**
112 * Delete the configuration.
113 */
114 @Override
115 public boolean deleteMseaUniEvcService(MseaUniEvcServiceOpParam mseaUniEvcService,
116 NetconfSession session, DatastoreId ncDs) throws NetconfException {
117 ModelObjectData moEdit = DefaultModelObjectData.builder()
118 .addModelObject((ModelObject) mseaUniEvcService.mefServices()).build();
119
120 ArrayList anis = new ArrayList<AnnotatedNodeInfo>();
121 for (BwpGroup bwpGrp:mseaUniEvcService.mefServices().profiles().bwpGroup()) {
Sean Condon06613e92017-06-09 15:14:01 +0100122
123 ResourceId.Builder ridBuilder = ResourceId.builder()
124 .addBranchPointSchema("/", null)
125 .addBranchPointSchema("mef-services", MSEA_UNI_EVC_SVC_NS)
126 .addBranchPointSchema("profiles", MSEA_UNI_EVC_SVC_NS)
127 .addBranchPointSchema("bwp-group", MSEA_UNI_EVC_SVC_NS)
Sean Condon57c4ff72017-07-29 17:38:56 +0100128 .addKeyLeaf("group-index", MSEA_UNI_EVC_SVC_NS, bwpGrp.groupIndex());
Sean Condon06613e92017-06-09 15:14:01 +0100129
130 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
131 .resourceId(ridBuilder.build())
132 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
133 .build();
134
135 anis.add(ani);
136 }
137
138
139 return setNetconfObject(moEdit, session, ncDs, anis);
140 }
141
142
Sean Condonfae8e662016-12-15 10:25:13 +0000143 @Override
144 public MseaUniEvcService getmseaUniEvcCeVlanMaps(
Sean Condon06613e92017-06-09 15:14:01 +0100145 NetconfSession session, DatastoreId ncDs)
Sean Condonfae8e662016-12-15 10:25:13 +0000146 throws NetconfException {
147 if (session == null) {
148 throw new NetconfException("Session is null when calling getMseaSaFiltering()");
149 }
150
151 String xmlResult = session.getConfig(ncDs, evcFilterQuery());
Sean Condon06613e92017-06-09 15:14:01 +0100152 xmlResult = removeRpcReplyData(xmlResult);
Sean Condonfae8e662016-12-15 10:25:13 +0000153
Sean Condon06613e92017-06-09 15:14:01 +0100154 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
155 null, new ByteArrayInputStream(xmlResult.getBytes()));
156 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
157
158 ModelObjectData moReply = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
159
160 MseaUniEvcService reply = new MseaUniEvcServiceOpParam();
161 for (ModelObject mo:moReply.modelObjects()) {
162 if (mo instanceof MefServices) {
163 reply.mefServices((MefServices) mo);
164 }
Sean Condonfae8e662016-12-15 10:25:13 +0000165 }
Sean Condon06613e92017-06-09 15:14:01 +0100166 return reply;
Sean Condonfae8e662016-12-15 10:25:13 +0000167 }
168
169 @Override
170 public void removeEvcUniFlowEntries(
171 Map<Integer, String> ceVlanUpdates,
172 Map<Integer, List<Short>> flowVlanIds,
Sean Condon06613e92017-06-09 15:14:01 +0100173 NetconfSession session, DatastoreId targetDs,
Sean Condonfae8e662016-12-15 10:25:13 +0000174 UniSideInterfaceAssignmentEnum portAssign) throws NetconfException {
175
176 List<Integer> evcAlreadyHandled = new ArrayList<>();
177 StringBuilder xmlEvcUpdate = new StringBuilder(evcUniOpener());
178 for (Integer evcKey:ceVlanUpdates.keySet()) {
179 int evcId = (evcKey & ((1 << 8) - 100)) >> 2;
180 if (evcAlreadyHandled.contains(new Integer(evcId))) {
181 continue;
182 }
183 evcAlreadyHandled.add(evcId);
184 int port = (evcKey & 3);
185 String ceVlanMapThis = ceVlanUpdates.get(evcKey);
186 String ceVlanMapOpposite = ceVlanUpdates.get(evcKey ^ 1);
187
188 if ((ceVlanMapThis == null || ceVlanMapThis.isEmpty()) &&
189 (ceVlanMapOpposite == null || ceVlanMapOpposite.isEmpty())) {
190 xmlEvcUpdate.append("<evc nc:operation=\"delete\">\n<evc-index>");
191 xmlEvcUpdate.append(Integer.toString(evcId));
192 xmlEvcUpdate.append("</evc-index>\n</evc>\n");
193 } else {
194 xmlEvcUpdate.append("<evc>\n<evc-index>");
195 xmlEvcUpdate.append(Integer.toString(evcId));
196 xmlEvcUpdate.append("</evc-index>\n<evc-per-uni>\n");
197 if (port == 0 && portAssign == UniSideInterfaceAssignmentEnum.UNI_C_ON_OPTICS ||
198 port == 1 && portAssign == UniSideInterfaceAssignmentEnum.UNI_C_ON_HOST) {
199 if (ceVlanMapThis != null) {
200 xmlEvcUpdate.append("<evc-per-uni-c>\n<ce-vlan-map nc:operation=\"replace\">");
201 xmlEvcUpdate.append(ceVlanMapThis);
202 xmlEvcUpdate.append("</ce-vlan-map>\n");
203 xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey)));
204 xmlEvcUpdate.append("</evc-per-uni-c>\n");
205 }
206 if (ceVlanMapOpposite != null) {
207 xmlEvcUpdate.append("<evc-per-uni-n>\n<ce-vlan-map nc:operation=\"replace\">");
208 xmlEvcUpdate.append(ceVlanMapOpposite);
209 xmlEvcUpdate.append("</ce-vlan-map>\n");
210 xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey ^ 1)));
211 xmlEvcUpdate.append("</evc-per-uni-n>\n");
212 }
213 } else {
214 if (ceVlanMapThis != null) {
215 xmlEvcUpdate.append("<evc-per-uni-n>\n<ce-vlan-map nc:operation=\"replace\">");
216 xmlEvcUpdate.append(ceVlanMapThis);
217 xmlEvcUpdate.append("</ce-vlan-map>\n");
218 xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey)));
219 xmlEvcUpdate.append("</evc-per-uni-n>\n");
220 }
221 if (ceVlanMapOpposite != null) {
222 xmlEvcUpdate.append("<evc-per-uni-c>\n<ce-vlan-map nc:operation=\"replace\">");
223 xmlEvcUpdate.append(ceVlanMapOpposite);
224 xmlEvcUpdate.append("</ce-vlan-map>\n");
225 xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey ^ 1)));
226 xmlEvcUpdate.append("</evc-per-uni-c>\n");
227 }
228 }
229
230 xmlEvcUpdate.append("</evc-per-uni>\n</evc>\n");
231 }
232 }
233 xmlEvcUpdate.append("</uni>\n</mef-services>");
234
235 log.info("Sending XML <edit-config> on NETCONF session " + session.getSessionId() +
236 ":\n" + xmlEvcUpdate.toString());
237
238
239 session.editConfig(targetDs, null, xmlEvcUpdate.toString());
240 }
241
242
243 private static String deleteFlowMapping(List<Short> vlanIds) {
244 if (vlanIds == null || vlanIds.size() == 0) {
245 return "";
246 }
247 StringBuilder fmXmlBuilder = new StringBuilder();
248 for (long vlanId:vlanIds) {
249 fmXmlBuilder.append("<flow-mapping nc:operation=\"delete\">\n");
250 fmXmlBuilder.append("<ce-vlan-id>");
251 fmXmlBuilder.append(String.valueOf(vlanId));
252 fmXmlBuilder.append("</ce-vlan-id>\n");
253 fmXmlBuilder.append("</flow-mapping>\n");
254 }
255
256 return fmXmlBuilder.toString();
257 }
258
259 private String evcFilterQuery() {
260 StringBuilder sb = new StringBuilder("<mef-services "
261 + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">");
262 sb.append("<uni>");
263 sb.append("<evc>");
264 sb.append("<evc-index/>");
265 sb.append("<evc-per-uni>");
266 sb.append("<evc-per-uni-c>");
267 sb.append("<ce-vlan-map/>");
268 sb.append("<flow-mapping/>");
269 sb.append("<ingress-bwp-group-index/>");
270 sb.append("</evc-per-uni-c>");
271 sb.append("<evc-per-uni-n>");
272 sb.append("<ce-vlan-map/>");
273 sb.append("<flow-mapping/>");
274 sb.append("<ingress-bwp-group-index/>");
275 sb.append("</evc-per-uni-n>");
276 sb.append("</evc-per-uni>");
277 sb.append("</evc>");
278 sb.append("</uni>");
279 sb.append("</mef-services>");
280
281 return sb.toString();
282 }
283
284 private String evcUniOpener() {
285 StringBuilder sb = new StringBuilder("<mef-services ");
286 sb.append("xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">\n");
287 sb.append("<uni>\n");
288
289 return sb.toString();
290 }
Sean Condon0e89bda2017-03-21 14:23:19 +0000291}