blob: 4c611437eea7074f64690aaef2c0ec91ee3090b9 [file] [log] [blame]
/*
* 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 static org.onosproject.yms.ych.YangProtocolEncodingFormat.XML;
import static org.onosproject.yms.ydt.YmsOperationType.QUERY_REPLY;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.regex.Pattern;
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.IetfSystemNetconfService;
import org.onosproject.netconf.NetconfException;
import org.onosproject.netconf.NetconfSession;
import org.onosproject.netconf.TargetConfig;
import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.IetfSystemMicrosemiService;
import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootInput;
import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootOutput;
import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.pullupdatetarfromtftp.PullUpdateTarFromTftpInput;
import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogInput;
import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogOutput;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystem;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystemOpParam;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystemService;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.systemrestart.SystemRestartInput;
/**
* Implementation of the IetfService YANG model service.
*/
@Component(immediate = true, inherit = true)
@Service
public class IetfSystemManager extends AbstractYangServiceImpl
implements IetfSystemNetconfService {
protected final Pattern regexRemoveSystem =
Pattern.compile("(<system).*(</system>)", Pattern.DOTALL);
protected final Pattern regexRemoveSystemState =
Pattern.compile("(<system-state).*(</system-state>)", Pattern.DOTALL);
protected static final String IETF_SYSTEM = "org.onosproject.drivers.microsemi.yang.ietfsystem";
@Activate
public void activate() {
appId = coreService.registerApplication(IETF_SYSTEM);
ych = ymsService.getYangCodecHandler();
ych.addDeviceSchema(IetfSystemService.class);
ych.addDeviceSchema(IetfSystemMicrosemiService.class);
log.info("IetfSystemManager Started");
}
@Deactivate
public void deactivate() {
super.deactivate();
ymsService.unRegisterService(this, IetfSystemService.class);
ymsService.unRegisterService(this, IetfSystemMicrosemiService.class);
ych = null;
log.info("IetfSystemManager 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.
* @throws NetconfException if the session has any error
*/
@Override
public IetfSystem getIetfSystem(IetfSystemOpParam ietfSystemFilter, NetconfSession session)
throws NetconfException {
return (IetfSystem) getNetconfObject(ietfSystemFilter, session);
}
@Override
public IetfSystem getIetfSystemInit(NetconfSession session) throws NetconfException {
if (session == null) {
throw new NetconfException("Session is null when calling getIetfSystemInit()");
}
String xmlResult = session.get(getInitRequestBuilder(), null);
//The result will be a <system> followed by <system-state>
//YCH can decode only one at a time - split it and send half each time
IetfSystem.IetfSystemBuilder iBuilder = new IetfSystemOpParam.IetfSystemBuilder();
String xmlResultSystem = regexRemoveSystemState.matcher(xmlResult).replaceFirst("");
List<Object> objectListState = ych.decode(xmlResultSystem, XML, QUERY_REPLY);
if (objectListState != null && objectListState.size() > 0) {
IetfSystem system = (IetfSystem) objectListState.get(0);
iBuilder.system(system.system());
}
String xmlResultSystemState = regexRemoveSystem.matcher(xmlResult).replaceFirst("");
List<Object> objectListSystemState = ych.decode(xmlResultSystemState, XML, QUERY_REPLY);
if (objectListSystemState != null && objectListSystemState.size() > 0) {
IetfSystem system = (IetfSystem) objectListSystemState.get(0);
iBuilder.systemState(system.systemState());
}
return iBuilder.build();
}
/**
* Call NETCONF edit-config with a configuration.
*/
@Override
public void setIetfSystem(IetfSystemOpParam ietfSystem, NetconfSession session, TargetConfig ncDs)
throws NetconfException {
setNetconfObject(ietfSystem, session, ncDs);
}
@Override
public void setCurrentDatetime(OffsetDateTime date, NetconfSession session)
throws NetconfException {
String xmlQueryStr = getSetCurrentDatetimeBuilder(date);
log.info("Sending <get> query on NETCONF session " + session.getSessionId() +
":\n" + xmlQueryStr);
String xmlResult = session.doWrappedRpc(xmlQueryStr);
log.info("Result from NETCONF RPC <set-current-datetime>: {}", xmlResult);
}
@Override
public void systemRestart(SystemRestartInput inputVar, NetconfSession session) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void systemShutdown(NetconfSession session) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public DoUpgradeAndRebootOutput doUpgradeAndReboot(DoUpgradeAndRebootInput inputVar, NetconfSession session)
throws NetconfException {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void pullUpdateTarFromTftp(PullUpdateTarFromTftpInput inputVar, NetconfSession session)
throws NetconfException {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public ReadFromSyslogOutput readFromSyslog(ReadFromSyslogInput inputVar, NetconfSession session)
throws NetconfException {
throw new UnsupportedOperationException("Not yet implemented");
}
/**
* Builds a request crafted to get the configuration required to create
* details descriptions for the device.
*
* @return The request string.
*/
private static String getInitRequestBuilder() {
StringBuilder rpc = new StringBuilder();
rpc.append("<system-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\" ");
rpc.append("xmlns:sysms=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">");
rpc.append("<platform>");
rpc.append("<os-release/>");
rpc.append("<sysms:device-identification>");
rpc.append("<sysms:serial-number/>");
rpc.append("</sysms:device-identification>");
rpc.append("</platform>");
rpc.append("<clock>");
rpc.append("<current-datetime/>");
rpc.append("</clock>");
rpc.append("</system-state>");
rpc.append("<system xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\" ");
rpc.append("xmlns:sysms=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">");
rpc.append("<sysms:longitude/>");
rpc.append("<sysms:latitude/>");
rpc.append("</system>");
return rpc.toString();
}
private static String getSetCurrentDatetimeBuilder(OffsetDateTime date) {
StringBuilder rpc = new StringBuilder();
rpc.append("<set-current-datetime xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\">");
rpc.append("<current-datetime>");
rpc.append(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")));
rpc.append("</current-datetime>");
rpc.append("</set-current-datetime>");
return rpc.toString();
}
}