blob: 3673594530426f7fc0c113fb64a8d53d38a02b63 [file] [log] [blame]
Sean Condonfae8e662016-12-15 10:25:13 +00001/*
2 * Copyright 2017-present Open Networking Laboratory
3 *
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.time.OffsetDateTime;
20import java.time.format.DateTimeFormatter;
Sean Condonfae8e662016-12-15 10:25:13 +000021
22import org.apache.felix.scr.annotations.Activate;
23import org.apache.felix.scr.annotations.Component;
24import org.apache.felix.scr.annotations.Deactivate;
25import org.apache.felix.scr.annotations.Service;
26import org.onosproject.drivers.microsemi.yang.IetfSystemNetconfService;
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.ietfsystem.rev20140806.ietfsystem.DefaultSystem;
31import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.ietfsystem.DefaultSystemState;
32import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootInput;
33import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootOutput;
34import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.pullupdatetarfromtftp.PullUpdateTarFromTftpInput;
35import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogInput;
36import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogOutput;
37import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystem;
38import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystemOpParam;
39import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.ietfsystem.systemrestart.SystemRestartInput;
40import org.onosproject.yang.model.DefaultModelObjectData;
41import org.onosproject.yang.model.ModelConverter;
42import org.onosproject.yang.model.ModelObject;
43import org.onosproject.yang.model.ModelObjectData;
44import org.onosproject.yang.runtime.CompositeData;
45import org.onosproject.yang.runtime.DefaultCompositeStream;
Sean Condonfae8e662016-12-15 10:25:13 +000046
47/**
48 * Implementation of the IetfService YANG model service.
49 */
50@Component(immediate = true, inherit = true)
51@Service
52public class IetfSystemManager extends AbstractYangServiceImpl
53 implements IetfSystemNetconfService {
54
Sean Condonfae8e662016-12-15 10:25:13 +000055 protected static final String IETF_SYSTEM = "org.onosproject.drivers.microsemi.yang.ietfsystem";
56
57 @Activate
58 public void activate() {
Sean Condon06613e92017-06-09 15:14:01 +010059 super.activate();
Sean Condonfae8e662016-12-15 10:25:13 +000060 appId = coreService.registerApplication(IETF_SYSTEM);
Sean Condonfae8e662016-12-15 10:25:13 +000061 log.info("IetfSystemManager Started");
62 }
63
64 @Deactivate
65 public void deactivate() {
66 super.deactivate();
Sean Condonfae8e662016-12-15 10:25:13 +000067 log.info("IetfSystemManager Stopped");
68 }
69
70 /**
71 * Get a filtered subset of the model.
72 * This is meant to filter the current live model
73 * against the attribute(s) given in the argument
74 * and return the filtered model.
75 * @throws NetconfException if the session has any error
76 */
77 @Override
78 public IetfSystem getIetfSystem(IetfSystemOpParam ietfSystemFilter, NetconfSession session)
79 throws NetconfException {
Sean Condon06613e92017-06-09 15:14:01 +010080
81 ModelObjectData moQuery = DefaultModelObjectData.builder()
82 .addModelObject((ModelObject) ietfSystemFilter.system())
83 .build();
84
85 ModelObjectData moReply = getNetconfObject(moQuery, session);
86
87 IetfSystemOpParam ietfSystem = new IetfSystemOpParam();
88 for (ModelObject mo:moReply.modelObjects()) {
89 if (mo instanceof DefaultSystem) {
90 ietfSystem.system((DefaultSystem) mo);
91 } else if (mo instanceof DefaultSystemState) {
92 ietfSystem.systemState((DefaultSystemState) mo);
93 }
94 }
95
96 return ietfSystem;
Sean Condonfae8e662016-12-15 10:25:13 +000097 }
98
99 @Override
100 public IetfSystem getIetfSystemInit(NetconfSession session) throws NetconfException {
101 if (session == null) {
102 throw new NetconfException("Session is null when calling getIetfSystemInit()");
103 }
104
105 String xmlResult = session.get(getInitRequestBuilder(), null);
106
Sean Condon06613e92017-06-09 15:14:01 +0100107 xmlResult = removeRpcReplyData(xmlResult);
108 DefaultCompositeStream resultDcs = new DefaultCompositeStream(
109 null, new ByteArrayInputStream(xmlResult.getBytes()));
110 CompositeData compositeData = xSer.decode(resultDcs, yCtx);
Sean Condonfae8e662016-12-15 10:25:13 +0000111
Sean Condon06613e92017-06-09 15:14:01 +0100112 ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
113
114 IetfSystemOpParam ietfSystem = new IetfSystemOpParam();
115 for (ModelObject mo:mod.modelObjects()) {
116 if (mo instanceof DefaultSystem) {
117 ietfSystem.system((DefaultSystem) mo);
118 } else if (mo instanceof DefaultSystemState) {
119 ietfSystem.systemState((DefaultSystemState) mo);
120 }
Sean Condonfae8e662016-12-15 10:25:13 +0000121 }
122
Sean Condon06613e92017-06-09 15:14:01 +0100123 return ietfSystem;
Sean Condonfae8e662016-12-15 10:25:13 +0000124 }
125
126 /**
127 * Call NETCONF edit-config with a configuration.
128 */
129 @Override
Sean Condon06613e92017-06-09 15:14:01 +0100130 public boolean setIetfSystem(IetfSystemOpParam ietfSystem, NetconfSession session,
131 DatastoreId ncDs) throws NetconfException {
132 ModelObjectData mo = DefaultModelObjectData.builder()
133 .addModelObject(ietfSystem).build();
134 return setNetconfObject(mo, session, ncDs, null);
Sean Condonfae8e662016-12-15 10:25:13 +0000135 }
136
137 @Override
138 public void setCurrentDatetime(OffsetDateTime date, NetconfSession session)
139 throws NetconfException {
140 String xmlQueryStr = getSetCurrentDatetimeBuilder(date);
141 log.info("Sending <get> query on NETCONF session " + session.getSessionId() +
142 ":\n" + xmlQueryStr);
143
144 String xmlResult = session.doWrappedRpc(xmlQueryStr);
145 log.info("Result from NETCONF RPC <set-current-datetime>: {}", xmlResult);
146 }
147
148 @Override
149 public void systemRestart(SystemRestartInput inputVar, NetconfSession session) {
150 throw new UnsupportedOperationException("Not yet implemented");
151 }
152
153 @Override
154 public void systemShutdown(NetconfSession session) {
155 throw new UnsupportedOperationException("Not yet implemented");
156 }
157
158 @Override
159 public DoUpgradeAndRebootOutput doUpgradeAndReboot(DoUpgradeAndRebootInput inputVar, NetconfSession session)
160 throws NetconfException {
161 throw new UnsupportedOperationException("Not yet implemented");
162 }
163
164 @Override
165 public void pullUpdateTarFromTftp(PullUpdateTarFromTftpInput inputVar, NetconfSession session)
166 throws NetconfException {
167 throw new UnsupportedOperationException("Not yet implemented");
168 }
169
170 @Override
171 public ReadFromSyslogOutput readFromSyslog(ReadFromSyslogInput inputVar, NetconfSession session)
172 throws NetconfException {
173 throw new UnsupportedOperationException("Not yet implemented");
174 }
175
176
177 /**
178 * Builds a request crafted to get the configuration required to create
179 * details descriptions for the device.
180 *
181 * @return The request string.
182 */
183 private static String getInitRequestBuilder() {
184 StringBuilder rpc = new StringBuilder();
185 rpc.append("<system-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\" ");
186 rpc.append("xmlns:sysms=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">");
187 rpc.append("<platform>");
188 rpc.append("<os-release/>");
189 rpc.append("<sysms:device-identification>");
190 rpc.append("<sysms:serial-number/>");
191 rpc.append("</sysms:device-identification>");
192 rpc.append("</platform>");
193 rpc.append("<clock>");
194 rpc.append("<current-datetime/>");
195 rpc.append("</clock>");
196 rpc.append("</system-state>");
197 rpc.append("<system xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\" ");
198 rpc.append("xmlns:sysms=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">");
199 rpc.append("<sysms:longitude/>");
200 rpc.append("<sysms:latitude/>");
201 rpc.append("</system>");
202 return rpc.toString();
203 }
204
205 private static String getSetCurrentDatetimeBuilder(OffsetDateTime date) {
206 StringBuilder rpc = new StringBuilder();
207 rpc.append("<set-current-datetime xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\">");
208 rpc.append("<current-datetime>");
209 rpc.append(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")));
210 rpc.append("</current-datetime>");
211 rpc.append("</set-current-datetime>");
212
213 return rpc.toString();
214 }
215}