8d8e0ea4605869628807d37d4218e27be7d85a4f
[ccsdk/cds.git] /
1 /*
2  * Copyright © 2017-2019 AT&T, Bell Canada
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  */
16
17 package org.onap.ccsdk.apps.blueprintsprocessor.functions.netconf.executor.core
18
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
29
30 class NetconfRpcServiceImpl(private var deviceInfo: DeviceInfo) : NetconfRpcService {
31
32     private val log = LoggerFactory.getLogger(NetconfRpcService::class.java)
33
34     private var responseTimeout: Int = deviceInfo.replyTimeout
35
36     private lateinit var netconfSession: NetconfSession
37
38     private val messageIdInteger = AtomicInteger(1)
39
40     fun setNetconfSession(netconfSession: NetconfSession) {
41         this.netconfSession = netconfSession
42     }
43
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)")
48         try {
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"
54         }
55         return output
56     }
57
58     override fun deleteConfig(configTarget: String): DeviceResponse {
59         var output = DeviceResponse()
60         val messageId = messageIdInteger.getAndIncrement().toString()
61         log.info("$deviceInfo: deleteConfig: messageId($messageId)")
62         try {
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"
69         }
70         return output
71     }
72
73     override fun lock(configTarget: String): DeviceResponse {
74         var output = DeviceResponse()
75         val messageId = messageIdInteger.getAndIncrement().toString()
76         log.info("$deviceInfo: lock: messageId($messageId)")
77         try {
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"
84         }
85
86         return output
87     }
88
89     override fun unLock(configTarget: String): DeviceResponse {
90         var output = DeviceResponse()
91         val messageId = messageIdInteger.getAndIncrement().toString()
92         log.info("$deviceInfo: unLock: messageId($messageId)")
93         try {
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"
100         }
101         return output
102     }
103
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)")
108         try {
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"
114         }
115         return output
116     }
117
118     override fun cancelCommit(persistId: String): DeviceResponse {
119         var output = DeviceResponse()
120         val messageId = messageIdInteger.getAndIncrement().toString()
121         log.info("$deviceInfo: cancelCommit: messageId($messageId)")
122         try {
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"
128         }
129         return output
130     }
131
132     override fun discardConfig(): DeviceResponse {
133         var output = DeviceResponse()
134         val messageId = messageIdInteger.getAndIncrement().toString()
135         log.info("$deviceInfo: discard: messageId($messageId)")
136         try {
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
143         }
144         return output
145     }
146
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)")
152         try {
153             val editMessage =
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
160         }
161         return response
162     }
163
164     override fun validate(configTarget: String): DeviceResponse {
165         var output = DeviceResponse()
166         val messageId = messageIdInteger.getAndIncrement().toString()
167         try {
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
174         }
175         return output
176     }
177
178     override fun closeSession(force: Boolean): DeviceResponse {
179         var output = DeviceResponse()
180         val messageId = messageIdInteger.getAndIncrement().toString()
181         log.info("$deviceInfo: closeSession: messageId($messageId)")
182         try {
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
188         }
189         return output
190     }
191
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
197
198         val rpcResponse = netconfSession.asyncRpc(request, messageId).get(responseTimeout.toLong(), TimeUnit.SECONDS)
199         if (!NetconfMessageUtils.checkReply(rpcResponse)) {
200             throw NetconfException(rpcResponse)
201         }
202         response.responseMessage = rpcResponse
203         response.status = RpcStatus.SUCCESS
204         response.errorMessage = null
205         return response
206     }
207 }