2 * Copyright © 2017-2019 AT&T, Bell Canada
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.core
19 import org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.api.DeviceInfo
20 import org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.api.DeviceResponse
21 import org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.api.NetconfException
22 import org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.api.NetconfRpcService
23 import org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.api.NetconfSession
24 import org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.utils.NetconfMessageUtils
25 import org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.utils.RpcStatus
26 import org.slf4j.LoggerFactory
27 import java.util.concurrent.TimeUnit
28 import java.util.concurrent.atomic.AtomicInteger
30 class NetconfRpcServiceImpl(private var deviceInfo: DeviceInfo) : NetconfRpcService {
32 private val log = LoggerFactory.getLogger(NetconfRpcService::class.java)
34 private var responseTimeout: Int = deviceInfo.replyTimeout
36 private lateinit var netconfSession: NetconfSession
38 private val messageIdInteger = AtomicInteger(1)
40 fun setNetconfSession(netconfSession: NetconfSession) {
41 this.netconfSession = netconfSession
44 override fun invokeRpc(rpc: String): DeviceResponse {
45 var output = DeviceResponse()
46 val messageId = messageIdInteger.getAndIncrement().toString()
47 log.info("$deviceInfo: invokeRpc: messageId($messageId)")
49 output = asyncRpc(rpc, messageId)
50 } catch (e: Exception) {
51 output.status = RpcStatus.FAILURE
52 output.errorMessage = "$deviceInfo: failed in 'invokeRpc' command ${e.message}"
57 override fun getConfig(filter: String, configTarget: String): DeviceResponse {
58 var output = DeviceResponse()
59 val messageId = messageIdInteger.getAndIncrement().toString()
60 log.info("$deviceInfo: getConfig: messageId($messageId)")
62 val message = NetconfMessageUtils.getConfig(messageId, configTarget, filter)
63 output = asyncRpc(message, messageId)
64 } catch (e: Exception) {
65 output.status = RpcStatus.FAILURE
66 output.errorMessage = "$deviceInfo: failed in 'get-config' command ${e.message}"
71 override fun deleteConfig(configTarget: String): DeviceResponse {
72 var output = DeviceResponse()
73 val messageId = messageIdInteger.getAndIncrement().toString()
74 log.info("$deviceInfo: deleteConfig: messageId($messageId)")
76 val deleteConfigMessage = NetconfMessageUtils.deleteConfig(messageId, configTarget)
77 output.requestMessage = deleteConfigMessage
78 output = asyncRpc(deleteConfigMessage, messageId)
79 } catch (e: Exception) {
80 output.status = RpcStatus.FAILURE
81 output.errorMessage = "$deviceInfo: failed in 'delete-config' command ${e.message}"
86 override fun lock(configTarget: String): DeviceResponse {
87 var output = DeviceResponse()
88 val messageId = messageIdInteger.getAndIncrement().toString()
89 log.info("$deviceInfo: lock: messageId($messageId)")
91 val lockMessage = NetconfMessageUtils.lock(messageId, configTarget)
92 output.requestMessage = lockMessage
93 output = asyncRpc(lockMessage, messageId)
94 } catch (e: Exception) {
95 output.status = RpcStatus.FAILURE
96 output.errorMessage = "$deviceInfo: failed in 'lock' command ${e.message}"
102 override fun unLock(configTarget: String): DeviceResponse {
103 var output = DeviceResponse()
104 val messageId = messageIdInteger.getAndIncrement().toString()
105 log.info("$deviceInfo: unLock: messageId($messageId)")
107 val unlockMessage = NetconfMessageUtils.unlock(messageId, configTarget)
108 output.requestMessage = unlockMessage
109 output = asyncRpc(unlockMessage, messageId)
110 } catch (e: Exception) {
111 output.status = RpcStatus.FAILURE
112 output.errorMessage = "$deviceInfo: failed in 'unLock' command ${e.message}"
117 override fun commit(confirmed: Boolean, confirmTimeout: Int, persist: String, persistId: String): DeviceResponse {
118 var output = DeviceResponse()
119 val messageId = messageIdInteger.getAndIncrement().toString()
120 log.info("$deviceInfo: commit: messageId($messageId)")
122 val messageContent = NetconfMessageUtils.commit(messageId, confirmed, confirmTimeout, persist, persistId)
123 output = asyncRpc(messageContent, messageId)
124 } catch (e: Exception) {
125 output.status = RpcStatus.FAILURE
126 output.errorMessage = "$deviceInfo: failed in 'commit' command ${e.message}"
131 override fun cancelCommit(persistId: String): DeviceResponse {
132 var output = DeviceResponse()
133 val messageId = messageIdInteger.getAndIncrement().toString()
134 log.info("$deviceInfo: cancelCommit: messageId($messageId)")
136 val messageContent = NetconfMessageUtils.cancelCommit(messageId, persistId)
137 output = asyncRpc(messageContent, messageId)
138 } catch (e: Exception) {
139 output.status = RpcStatus.FAILURE
140 output.errorMessage = "$deviceInfo: failed in 'cancelCommit' command ${e.message}"
145 override fun discardConfig(): DeviceResponse {
146 var output = DeviceResponse()
147 val messageId = messageIdInteger.getAndIncrement().toString()
148 log.info("$deviceInfo: discard: messageId($messageId)")
150 val discardChangesMessage = NetconfMessageUtils.discardChanges(messageId)
151 output.requestMessage = discardChangesMessage
152 output = asyncRpc(discardChangesMessage, messageId)
153 } catch (e: Exception) {
154 output.status = RpcStatus.FAILURE
155 output.errorMessage = "$deviceInfo: failed in 'discard-config' command ${e.message}"
160 override fun editConfig(messageContent: String, configTarget: String,
161 editDefaultOperation: String): DeviceResponse {
162 var response = DeviceResponse()
163 val messageId = messageIdInteger.getAndIncrement().toString()
164 log.info("$deviceInfo: editConfig: messageId($messageId)")
167 NetconfMessageUtils.editConfig(messageId, configTarget, editDefaultOperation, messageContent)
168 response.requestMessage = editMessage
169 response = asyncRpc(editMessage, messageId)
170 } catch (e: Exception) {
171 response.status = RpcStatus.FAILURE
172 response.errorMessage = "$deviceInfo: failed in 'editConfig' command ${e.message}"
177 override fun validate(configTarget: String): DeviceResponse {
178 var output = DeviceResponse()
179 val messageId = messageIdInteger.getAndIncrement().toString()
181 val validateMessage = NetconfMessageUtils.validate(messageId, configTarget)
182 output.requestMessage = validateMessage
183 output = asyncRpc(validateMessage, messageId)
184 } catch (e: Exception) {
185 output.status = RpcStatus.FAILURE
186 output.errorMessage = "$deviceInfo: failed in 'validate' command ${e.message}"
191 override fun closeSession(force: Boolean): DeviceResponse {
192 var output = DeviceResponse()
193 val messageId = messageIdInteger.getAndIncrement().toString()
194 log.info("$deviceInfo: closeSession: messageId($messageId)")
196 val messageContent = NetconfMessageUtils.closeSession(messageId, force)
197 output = asyncRpc(messageContent, messageId)
198 } catch (e: Exception) {
199 output.status = RpcStatus.FAILURE
200 output.errorMessage = "$deviceInfo: failed in 'closeSession' command ${e.message}"
205 @Throws(NetconfException::class)
206 override fun asyncRpc(request: String, messageId: String): DeviceResponse {
207 val response = DeviceResponse()
208 log.info("$deviceInfo: send asyncRpc with messageId($messageId)")
209 response.requestMessage = request
211 val rpcResponse = netconfSession.asyncRpc(request, messageId).get(responseTimeout.toLong(), TimeUnit.SECONDS)
212 if (!NetconfMessageUtils.checkReply(rpcResponse)) {
213 throw NetconfException(rpcResponse)
215 response.responseMessage = rpcResponse
216 response.status = RpcStatus.SUCCESS
217 response.errorMessage = null