blob: 8d2b5566ad2afcbc988130743f045fb6a30a26a7 [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
Ray Milkeyd84f89b2018-08-17 14:54:17 -070023import org.osgi.service.component.annotations.Activate;
24import org.osgi.service.component.annotations.Component;
25import org.osgi.service.component.annotations.Deactivate;
Sean Condonfae8e662016-12-15 10:25:13 +000026import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
Sean Condon06613e92017-06-09 15:14:01 +010027import org.onosproject.netconf.DatastoreId;
Sean Condonfae8e662016-12-15 10:25:13 +000028import org.onosproject.netconf.NetconfException;
29import org.onosproject.netconf.NetconfSession;
Sean Condon06613e92017-06-09 15:14:01 +010030import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcService;
31import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcServiceOpParam;
32import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.MefServices;
33import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.BwpGroup;
34import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.UniSideInterfaceAssignmentEnum;
35import org.onosproject.yang.model.DefaultModelObjectData;
36import org.onosproject.yang.model.ModelConverter;
37import org.onosproject.yang.model.ModelObject;
38import org.onosproject.yang.model.ModelObjectData;
39import org.onosproject.yang.model.ResourceId;
40import org.onosproject.yang.runtime.AnnotatedNodeInfo;
41import org.onosproject.yang.runtime.CompositeData;
42import org.onosproject.yang.runtime.DefaultAnnotatedNodeInfo;
43import org.onosproject.yang.runtime.DefaultAnnotation;
44import org.onosproject.yang.runtime.DefaultCompositeStream;
Sean Condonfae8e662016-12-15 10:25:13 +000045
46/**
47 * Implementation of the MseaUniEvcServiceService YANG model service.
48 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070049@Component(immediate = true, service = MseaUniEvcServiceNetconfService.class)
Sean Condonfae8e662016-12-15 10:25:13 +000050public class MseaUniEvcServiceManager extends AbstractYangServiceImpl
51 implements MseaUniEvcServiceNetconfService {
Sean Condon06613e92017-06-09 15:14:01 +010052 public static final String MSEA_UNI_EVC_SVC =
53 "org.onosproject.drivers.microsemi.yang.mseaunievcservice";
54 public static final String MSEA_UNI_EVC_SVC_NS =
55 "http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service";
Sean Condonfae8e662016-12-15 10:25:13 +000056
57 @Activate
58 public void activate() {
Sean Condon06613e92017-06-09 15:14:01 +010059 super.activate();
60 appId = coreService.registerApplication(MSEA_UNI_EVC_SVC);
Sean Condonfae8e662016-12-15 10:25:13 +000061 log.info("MseaUniEvcServiceManager Started");
62 }
63
64 @Deactivate
65 public void deactivate() {
66 super.deactivate();
Sean Condonfae8e662016-12-15 10:25:13 +000067 log.info("MseaUniEvcServiceManager Stopped");
68 }
69
70 @Override
71 public MseaUniEvcService getMseaUniEvcService(
Sean Condon06613e92017-06-09 15:14:01 +010072 MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session)
73 throws NetconfException {
74
75 return getConfigMseaUniEvcService(mseaUniEvcService, session, null);
Sean Condonfae8e662016-12-15 10:25:13 +000076 }
77
78 @Override
79 public MseaUniEvcService getConfigMseaUniEvcService(
Sean Condon06613e92017-06-09 15:14:01 +010080 MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session,
81 DatastoreId targetDs) throws NetconfException {
82
83 ModelObjectData moFilter = DefaultModelObjectData.builder()
84 .addModelObject((ModelObject) mseaUniEvcService.mefServices()).build();
85
86 ModelObjectData moReply = getConfigNetconfObject(moFilter, session, targetDs);
87
88 MseaUniEvcService reply = new MseaUniEvcServiceOpParam();
89 for (ModelObject mo:moReply.modelObjects()) {
90 if (mo instanceof MefServices) {
91 reply.mefServices((MefServices) mo);
92 }
93 }
94 return reply;
Sean Condonfae8e662016-12-15 10:25:13 +000095 }
96
97 /**
98 * Modify the configuration.
99 */
100 @Override
Sean Condon06613e92017-06-09 15:14:01 +0100101 public boolean setMseaUniEvcService(MseaUniEvcServiceOpParam mseaUniEvcService,
102 NetconfSession session, DatastoreId ncDs) throws NetconfException {
103 ModelObjectData moEdit = DefaultModelObjectData.builder()
104 .addModelObject((ModelObject) mseaUniEvcService.mefServices()).build();
105
106 return setNetconfObject(moEdit, session, ncDs, null);
Sean Condonfae8e662016-12-15 10:25:13 +0000107 }
108
Sean Condon06613e92017-06-09 15:14:01 +0100109 /**
110 * Delete the configuration.
111 */
112 @Override
113 public boolean deleteMseaUniEvcService(MseaUniEvcServiceOpParam mseaUniEvcService,
114 NetconfSession session, DatastoreId ncDs) throws NetconfException {
115 ModelObjectData moEdit = DefaultModelObjectData.builder()
116 .addModelObject((ModelObject) mseaUniEvcService.mefServices()).build();
117
118 ArrayList anis = new ArrayList<AnnotatedNodeInfo>();
119 for (BwpGroup bwpGrp:mseaUniEvcService.mefServices().profiles().bwpGroup()) {
Sean Condon06613e92017-06-09 15:14:01 +0100120
121 ResourceId.Builder ridBuilder = ResourceId.builder()
122 .addBranchPointSchema("/", null)
123 .addBranchPointSchema("mef-services", MSEA_UNI_EVC_SVC_NS)
124 .addBranchPointSchema("profiles", MSEA_UNI_EVC_SVC_NS)
125 .addBranchPointSchema("bwp-group", MSEA_UNI_EVC_SVC_NS)
Sean Condon57c4ff72017-07-29 17:38:56 +0100126 .addKeyLeaf("group-index", MSEA_UNI_EVC_SVC_NS, bwpGrp.groupIndex());
Sean Condon06613e92017-06-09 15:14:01 +0100127
128 AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
129 .resourceId(ridBuilder.build())
130 .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
131 .build();
132
133 anis.add(ani);
134 }
135
136
137 return setNetconfObject(moEdit, session, ncDs, anis);
138 }
139
140
Sean Condonfae8e662016-12-15 10:25:13 +0000141 @Override
142 public MseaUniEvcService getmseaUniEvcCeVlanMaps(
Sean Condon06613e92017-06-09 15:14:01 +0100143 NetconfSession session, DatastoreId ncDs)
Sean Condonfae8e662016-12-15 10:25:13 +0000144 throws NetconfException {
145 if (session == null) {
146 throw new NetconfException("Session is null when calling getMseaSaFiltering()");
147 }
148
149 String xmlResult = session.getConfig(ncDs, evcFilterQuery());
Sean Condon06613e92017-06-09 15:14:01 +0100150 xmlResult = removeRpcReplyData(xmlResult);
Sean Condonfae8e662016-12-15 10:25:13 +0000151
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 moReply = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
157
158 MseaUniEvcService reply = new MseaUniEvcServiceOpParam();
159 for (ModelObject mo:moReply.modelObjects()) {
160 if (mo instanceof MefServices) {
161 reply.mefServices((MefServices) mo);
162 }
Sean Condonfae8e662016-12-15 10:25:13 +0000163 }
Sean Condon06613e92017-06-09 15:14:01 +0100164 return reply;
Sean Condonfae8e662016-12-15 10:25:13 +0000165 }
166
167 @Override
168 public void removeEvcUniFlowEntries(
169 Map<Integer, String> ceVlanUpdates,
170 Map<Integer, List<Short>> flowVlanIds,
Sean Condon06613e92017-06-09 15:14:01 +0100171 NetconfSession session, DatastoreId targetDs,
Sean Condonfae8e662016-12-15 10:25:13 +0000172 UniSideInterfaceAssignmentEnum portAssign) throws NetconfException {
173
174 List<Integer> evcAlreadyHandled = new ArrayList<>();
175 StringBuilder xmlEvcUpdate = new StringBuilder(evcUniOpener());
176 for (Integer evcKey:ceVlanUpdates.keySet()) {
177 int evcId = (evcKey & ((1 << 8) - 100)) >> 2;
178 if (evcAlreadyHandled.contains(new Integer(evcId))) {
179 continue;
180 }
181 evcAlreadyHandled.add(evcId);
182 int port = (evcKey & 3);
183 String ceVlanMapThis = ceVlanUpdates.get(evcKey);
184 String ceVlanMapOpposite = ceVlanUpdates.get(evcKey ^ 1);
185
186 if ((ceVlanMapThis == null || ceVlanMapThis.isEmpty()) &&
187 (ceVlanMapOpposite == null || ceVlanMapOpposite.isEmpty())) {
188 xmlEvcUpdate.append("<evc nc:operation=\"delete\">\n<evc-index>");
189 xmlEvcUpdate.append(Integer.toString(evcId));
190 xmlEvcUpdate.append("</evc-index>\n</evc>\n");
191 } else {
192 xmlEvcUpdate.append("<evc>\n<evc-index>");
193 xmlEvcUpdate.append(Integer.toString(evcId));
194 xmlEvcUpdate.append("</evc-index>\n<evc-per-uni>\n");
195 if (port == 0 && portAssign == UniSideInterfaceAssignmentEnum.UNI_C_ON_OPTICS ||
196 port == 1 && portAssign == UniSideInterfaceAssignmentEnum.UNI_C_ON_HOST) {
197 if (ceVlanMapThis != null) {
198 xmlEvcUpdate.append("<evc-per-uni-c>\n<ce-vlan-map nc:operation=\"replace\">");
199 xmlEvcUpdate.append(ceVlanMapThis);
200 xmlEvcUpdate.append("</ce-vlan-map>\n");
201 xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey)));
202 xmlEvcUpdate.append("</evc-per-uni-c>\n");
203 }
204 if (ceVlanMapOpposite != null) {
205 xmlEvcUpdate.append("<evc-per-uni-n>\n<ce-vlan-map nc:operation=\"replace\">");
206 xmlEvcUpdate.append(ceVlanMapOpposite);
207 xmlEvcUpdate.append("</ce-vlan-map>\n");
208 xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey ^ 1)));
209 xmlEvcUpdate.append("</evc-per-uni-n>\n");
210 }
211 } else {
212 if (ceVlanMapThis != null) {
213 xmlEvcUpdate.append("<evc-per-uni-n>\n<ce-vlan-map nc:operation=\"replace\">");
214 xmlEvcUpdate.append(ceVlanMapThis);
215 xmlEvcUpdate.append("</ce-vlan-map>\n");
216 xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey)));
217 xmlEvcUpdate.append("</evc-per-uni-n>\n");
218 }
219 if (ceVlanMapOpposite != null) {
220 xmlEvcUpdate.append("<evc-per-uni-c>\n<ce-vlan-map nc:operation=\"replace\">");
221 xmlEvcUpdate.append(ceVlanMapOpposite);
222 xmlEvcUpdate.append("</ce-vlan-map>\n");
223 xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey ^ 1)));
224 xmlEvcUpdate.append("</evc-per-uni-c>\n");
225 }
226 }
227
228 xmlEvcUpdate.append("</evc-per-uni>\n</evc>\n");
229 }
230 }
231 xmlEvcUpdate.append("</uni>\n</mef-services>");
232
233 log.info("Sending XML <edit-config> on NETCONF session " + session.getSessionId() +
234 ":\n" + xmlEvcUpdate.toString());
235
236
237 session.editConfig(targetDs, null, xmlEvcUpdate.toString());
238 }
239
240
241 private static String deleteFlowMapping(List<Short> vlanIds) {
242 if (vlanIds == null || vlanIds.size() == 0) {
243 return "";
244 }
245 StringBuilder fmXmlBuilder = new StringBuilder();
246 for (long vlanId:vlanIds) {
247 fmXmlBuilder.append("<flow-mapping nc:operation=\"delete\">\n");
248 fmXmlBuilder.append("<ce-vlan-id>");
249 fmXmlBuilder.append(String.valueOf(vlanId));
250 fmXmlBuilder.append("</ce-vlan-id>\n");
251 fmXmlBuilder.append("</flow-mapping>\n");
252 }
253
254 return fmXmlBuilder.toString();
255 }
256
257 private String evcFilterQuery() {
258 StringBuilder sb = new StringBuilder("<mef-services "
259 + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">");
260 sb.append("<uni>");
261 sb.append("<evc>");
262 sb.append("<evc-index/>");
263 sb.append("<evc-per-uni>");
264 sb.append("<evc-per-uni-c>");
265 sb.append("<ce-vlan-map/>");
266 sb.append("<flow-mapping/>");
267 sb.append("<ingress-bwp-group-index/>");
268 sb.append("</evc-per-uni-c>");
269 sb.append("<evc-per-uni-n>");
270 sb.append("<ce-vlan-map/>");
271 sb.append("<flow-mapping/>");
272 sb.append("<ingress-bwp-group-index/>");
273 sb.append("</evc-per-uni-n>");
274 sb.append("</evc-per-uni>");
275 sb.append("</evc>");
276 sb.append("</uni>");
277 sb.append("</mef-services>");
278
279 return sb.toString();
280 }
281
282 private String evcUniOpener() {
283 StringBuilder sb = new StringBuilder("<mef-services ");
284 sb.append("xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">\n");
285 sb.append("<uni>\n");
286
287 return sb.toString();
288 }
Sean Condon0e89bda2017-03-21 14:23:19 +0000289}