Updating Microsemi Driver to onos-yang-tools 2.x
Change-Id: I80e3348087518a8f9a742c813b6238371a3f8f97
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
new file mode 100644
index 0000000..01af138
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang.impl;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.drivers.microsemi.yang.MseaSaFilteringNetconfService;
+import org.onosproject.netconf.DatastoreId;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFilteringOpParam;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.SourceIpaddressFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.SourceAddressRange;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+import org.onosproject.yang.runtime.CompositeData;
+import org.onosproject.yang.runtime.DefaultAnnotatedNodeInfo;
+import org.onosproject.yang.runtime.DefaultAnnotation;
+import org.onosproject.yang.runtime.DefaultCompositeStream;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Implementation of the MseaSaFiltering YANG model service.
+ */
+@Component(immediate = true, inherit = true)
+@Service
+public class MseaSaFilteringManager extends AbstractYangServiceImpl
+ implements MseaSaFilteringNetconfService {
+ public static final String MSEA_SA_FILTERING =
+ "org.onosproject.drivers.microsemi.yang.mseasafiltering";
+ public static final String MSEA_SA_FILTERING_NS =
+ "http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering";
+
+ @Activate
+ public void activate() {
+ super.activate();
+ appId = coreService.registerApplication(MSEA_SA_FILTERING);
+ log.info("MseaSaFilteringManager Started");
+ }
+
+ @Deactivate
+ public void deactivate() {
+ super.deactivate();
+ log.info("MseaSaFilteringManager Stopped");
+ }
+
+ /**
+ * Get a filtered subset of the model.
+ * This is meant to filter the current live model
+ * against the attribute(s) given in the argument
+ * and return the filtered model.
+ */
+ @Override
+ public MseaSaFiltering getMseaSaFiltering(
+ MseaSaFilteringOpParam mseaSaFilteringFilter, NetconfSession session)
+ throws NetconfException {
+ ModelObjectData moQuery = DefaultModelObjectData.builder()
+ .addModelObject((ModelObject) mseaSaFilteringFilter
+ .sourceIpaddressFiltering())
+ .build();
+
+
+ ModelObjectData moReply = getNetconfObject(moQuery, session);
+
+ MseaSaFiltering reply = new MseaSaFilteringOpParam();
+ for (ModelObject mo:moReply.modelObjects()) {
+ if (mo instanceof SourceIpaddressFiltering) {
+ reply.sourceIpaddressFiltering((SourceIpaddressFiltering) mo);
+ }
+ }
+ return reply;
+ }
+
+ /**
+ * Get a filtered subset of the config model (from running)
+ * This is meant to filter the current live model
+ * against the attribute(s) given in the argument
+ * and return the filtered model.
+ */
+ @Override
+ public List<SourceAddressRange> getConfigMseaSaFilterIds(NetconfSession session)
+ throws NetconfException {
+
+ String xmlResult = session.getConfig(DatastoreId.RUNNING, saFilterQuery());
+ xmlResult = removeRpcReplyData(xmlResult);
+
+ DefaultCompositeStream resultDcs = new DefaultCompositeStream(
+ null, new ByteArrayInputStream(xmlResult.getBytes()));
+ CompositeData compositeData = xSer.decode(resultDcs, yCtx);
+
+ ModelObjectData moReply = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
+
+ MseaSaFiltering reply = new MseaSaFilteringOpParam();
+ for (ModelObject mo:moReply.modelObjects()) {
+ if (mo instanceof SourceIpaddressFiltering) {
+ reply.sourceIpaddressFiltering((SourceIpaddressFiltering) mo);
+ }
+ }
+ if (reply != null && reply.sourceIpaddressFiltering() != null &&
+ reply.sourceIpaddressFiltering().interfaceEth0() != null) {
+ return reply.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange();
+ } else {
+ return new ArrayList<SourceAddressRange>();
+ }
+ }
+
+ /**
+ * Call NETCONF edit-config with a configuration.
+ */
+ @Override
+ public boolean setMseaSaFiltering(MseaSaFilteringOpParam mseaSaFiltering,
+ NetconfSession session, DatastoreId ncDs) throws NetconfException {
+
+ ModelObjectData moQuery = DefaultModelObjectData.builder()
+ .addModelObject((ModelObject) mseaSaFiltering
+ .sourceIpaddressFiltering()).build();
+
+ return setNetconfObject(moQuery, session, ncDs, null);
+ }
+
+ @Override
+ public boolean deleteMseaSaFilteringRange(MseaSaFilteringOpParam mseaSaFiltering,
+ NetconfSession session, DatastoreId ncDs) throws NetconfException {
+
+ ModelObjectData moQuery = DefaultModelObjectData.builder()
+ .addModelObject((ModelObject) mseaSaFiltering
+ .sourceIpaddressFiltering()).build();
+
+ ArrayList anis = new ArrayList<AnnotatedNodeInfo>();
+ if (mseaSaFiltering.sourceIpaddressFiltering().interfaceEth0() != null &&
+ mseaSaFiltering.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange() != null) {
+
+ for (SourceAddressRange sar:mseaSaFiltering.sourceIpaddressFiltering()
+ .interfaceEth0().sourceAddressRange()) {
+ String sarRangeIdStr = String.valueOf(sar.rangeId());
+
+ ResourceId.Builder ridBuilder = ResourceId.builder()
+ .addBranchPointSchema("/", null)
+ .addBranchPointSchema("source-ipaddress-filtering", MSEA_SA_FILTERING_NS)
+ .addBranchPointSchema("interface-eth0", MSEA_SA_FILTERING_NS)
+ .addBranchPointSchema("source-address-range", MSEA_SA_FILTERING_NS)
+ .addKeyLeaf("range-id", MSEA_SA_FILTERING_NS, sarRangeIdStr);
+
+ AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
+ .resourceId(ridBuilder.build())
+ .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
+ .build();
+
+ anis.add(ani);
+ }
+ } else {
+ //Delete all
+ ResourceId.Builder ridBuilder = ResourceId.builder()
+ .addBranchPointSchema("/", null)
+ .addBranchPointSchema("source-ipaddress-filtering", MSEA_SA_FILTERING_NS);
+ AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
+ .resourceId(ridBuilder.build())
+ .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
+ .build();
+ anis.add(ani);
+ }
+
+ return setNetconfObject(moQuery, session, ncDs, anis);
+ }
+
+
+ private static String saFilterQuery() {
+ StringBuilder sb = new StringBuilder("<source-ipaddress-filtering " +
+ "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering\">");
+ sb.append("<interface-eth0>");
+ sb.append("<filter-admin-state>blacklist</filter-admin-state>");
+ sb.append("<source-address-range>");
+ sb.append("<range-id/>");
+ sb.append("</source-address-range>");
+ sb.append("</interface-eth0>");
+ sb.append("</source-ipaddress-filtering>");
+ return sb.toString();
+ }
+}