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.apps.blueprintsprocessor.functions.netconf.executor.core
19 import org.onap.ccsdk.apps.blueprintsprocessor.functions.netconf.executor.api.DeviceInfo
20 import org.onap.ccsdk.apps.blueprintsprocessor.functions.netconf.executor.api.DeviceResponse
21 import org.onap.ccsdk.apps.blueprintsprocessor.functions.netconf.executor.api.NetconfException
22 import org.onap.ccsdk.apps.blueprintsprocessor.functions.netconf.executor.api.NetconfRpcService
23 import org.onap.ccsdk.apps.blueprintsprocessor.functions.netconf.executor.api.NetconfSession
24 import org.onap.ccsdk.apps.blueprintsprocessor.functions.netconf.executor.utils.NetconfMessageUtils
25 import org.onap.ccsdk.apps.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 getConfig(filter: String, configTarget: String): DeviceResponse {
45 var output = DeviceResponse()
46 val messageId = messageIdInteger.getAndIncrement().toString()
47 log.info("$deviceInfo: getConfig: messageId($messageId)")
49 val message = NetconfMessageUtils.getConfig(messageId, configTarget, filter)
50 output = asyncRpc(message, messageId)
51 } catch (e: Exception) {
52 output.status = RpcStatus.FAILURE
53 output.errorMessage = "$deviceInfo: failed in get-config command $e.message"
58 override fun deleteConfig(configTarget: String): DeviceResponse {
59 var output = DeviceResponse()
60 val messageId = messageIdInteger.getAndIncrement().toString()
61 log.info("$deviceInfo: deleteConfig: messageId($messageId)")
63 val deleteConfigMessage = NetconfMessageUtils.deleteConfig(messageId, configTarget)
64 output.requestMessage = deleteConfigMessage
65 output = asyncRpc(deleteConfigMessage, messageId)
66 } catch (e: Exception) {
67 output.status = RpcStatus.FAILURE
68 output.errorMessage = "$deviceInfo: failed in delete config command $e.message"
73 override fun lock(configTarget: String): DeviceResponse {
74 var output = DeviceResponse()
75 val messageId = messageIdInteger.getAndIncrement().toString()
76 log.info("$deviceInfo: lock: messageId($messageId)")
78 val lockMessage = NetconfMessageUtils.lock(messageId, configTarget)
79 output.requestMessage = lockMessage
80 output = asyncRpc(lockMessage, messageId)
81 } catch (e: Exception) {
82 output.status = RpcStatus.FAILURE
83 output.errorMessage = "$deviceInfo: failed in lock command $e.message"
89 override fun unLock(configTarget: String): DeviceResponse {
90 var output = DeviceResponse()
91 val messageId = messageIdInteger.getAndIncrement().toString()
92 log.info("$deviceInfo: unLock: messageId($messageId)")
94 val unlockMessage = NetconfMessageUtils.unlock(messageId, configTarget)
95 output.requestMessage = unlockMessage
96 output = asyncRpc(unlockMessage, messageId)
97 } catch (e: Exception) {
98 output.status = RpcStatus.FAILURE
99 output.errorMessage = "$deviceInfo: failed in lock command $e.message"
104 override fun commit(confirmed: Boolean, confirmTimeout: Int, persist: String, persistId: String): DeviceResponse {
105 var output = DeviceResponse()
106 val messageId = messageIdInteger.getAndIncrement().toString()
107 log.info("$deviceInfo: commit: messageId($messageId)")
109 val messageContent = NetconfMessageUtils.commit(messageId, confirmed, confirmTimeout, persist, persistId)
110 output = asyncRpc(messageContent, messageId)
111 } catch (e: Exception) {
112 output.status = RpcStatus.FAILURE
113 output.errorMessage = "$deviceInfo: failed in commit command $e.message"
118 override fun cancelCommit(persistId: String): DeviceResponse {
119 var output = DeviceResponse()
120 val messageId = messageIdInteger.getAndIncrement().toString()
121 log.info("$deviceInfo: cancelCommit: messageId($messageId)")
123 val messageContent = NetconfMessageUtils.cancelCommit(messageId, persistId)
124 output = asyncRpc(messageContent, messageId)
125 } catch (e: Exception) {
126 output.status = RpcStatus.FAILURE
127 output.errorMessage = "$deviceInfo: failed in cancelCommit command $e.message"
132 override fun discardConfig(): DeviceResponse {
133 var output = DeviceResponse()
134 val messageId = messageIdInteger.getAndIncrement().toString()
135 log.info("$deviceInfo: discard: messageId($messageId)")
137 val discardChangesMessage = NetconfMessageUtils.discardChanges(messageId)
138 output.requestMessage = discardChangesMessage
139 output = asyncRpc(discardChangesMessage, messageId)
140 } catch (e: Exception) {
141 output.status = RpcStatus.FAILURE
142 output.errorMessage = "$deviceInfo: failed in discard changes command " + e.message
147 override fun editConfig(messageContent: String, configTarget: String,
148 editDefaultOperation: String): DeviceResponse {
149 var response = DeviceResponse()
150 val messageId = messageIdInteger.getAndIncrement().toString()
151 log.info("$deviceInfo: editConfig: messageId($messageId)")
154 NetconfMessageUtils.editConfig(messageId, configTarget, editDefaultOperation, messageContent)
155 response.requestMessage = editMessage
156 response = asyncRpc(editMessage, messageId)
157 } catch (e: Exception) {
158 response.status = RpcStatus.FAILURE
159 response.errorMessage = e.message
164 override fun validate(configTarget: String): DeviceResponse {
165 var output = DeviceResponse()
166 val messageId = messageIdInteger.getAndIncrement().toString()
168 val validateMessage = NetconfMessageUtils.validate(messageId, configTarget)
169 output.requestMessage = validateMessage
170 output = asyncRpc(validateMessage, messageId)
171 } catch (e: Exception) {
172 output.status = RpcStatus.FAILURE
173 output.errorMessage = "$deviceInfo: failed in validate command " + e.message
178 override fun closeSession(force: Boolean): DeviceResponse {
179 var output = DeviceResponse()
180 val messageId = messageIdInteger.getAndIncrement().toString()
181 log.info("$deviceInfo: closeSession: messageId($messageId)")
183 val messageContent = NetconfMessageUtils.closeSession(messageId, force)
184 output = asyncRpc(messageContent, messageId)
185 } catch (e: Exception) {
186 output.status = RpcStatus.FAILURE
187 output.errorMessage = "$deviceInfo: failed in closeSession command " + e.message
192 @Throws(NetconfException::class)
193 override fun asyncRpc(request: String, messageId: String): DeviceResponse {
194 val response = DeviceResponse()
195 log.info("$deviceInfo: send asyncRpc with messageId($messageId)")
196 response.requestMessage = request
198 val rpcResponse = netconfSession.asyncRpc(request, messageId).get(responseTimeout.toLong(), TimeUnit.SECONDS)
199 if (!NetconfMessageUtils.checkReply(rpcResponse)) {
200 throw NetconfException(rpcResponse)
202 response.responseMessage = rpcResponse
203 response.status = RpcStatus.SUCCESS
204 response.errorMessage = null