blob: 284c7327ae3d8917eb79d2c729c69c3f9d5f2dbe [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Foundation
*
* 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.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
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, service = AbstractYangServiceImpl.class)
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.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();
}
}