2 * Copyright © 2019 IBM.
3 * Modifications Copyright © 2018-2019 IBM, Bell Canada
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 package org.onap.ccsdk.cds.blueprintsprocessor.functions.restconf.executor
20 import org.hibernate.annotations.common.util.impl.LoggerFactory
21 import org.onap.ccsdk.cds.blueprintsprocessor.rest.restClientService
22 import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.BlueprintWebClientService
23 import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractScriptComponentFunction
24 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintRetryException
25 import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintDependencyService
28 * Register the Restconf module exposed dependency
31 val log = LoggerFactory.logger(AbstractScriptComponentFunction::class.java)!!
33 fun AbstractScriptComponentFunction.restconfClientService(selector: String): BlueprintWebClientService {
34 return BluePrintDependencyService.restClientService(selector)
38 * Generic Mount function
41 suspend fun AbstractScriptComponentFunction.restconfMountDevice(webClientService: BlueprintWebClientService,
44 headers: Map<String, String> = mutableMapOf("Content-Type" to "application/xml")) {
46 val mountUrl = "restconf/config/network-topology:network-topology/topology/topology-netconf/node/$deviceId"
47 log.info("sending mount request, url: $mountUrl")
48 webClientService.exchangeResource("PUT", mountUrl, payload as String, headers)
50 /** Check device has mounted */
51 val mountCheckUrl = "restconf/operational/network-topology:network-topology/topology/topology-netconf/node/$deviceId"
53 val expectedResult = """"netconf-node-topology:connection-status":"connected""""
54 val mountCheckExecutionBlock: suspend (Int) -> String = { tryCount: Int ->
55 val result = webClientService.exchangeResource("GET", mountCheckUrl, "")
56 if (result.body.contains(expectedResult)) {
57 log.info("NF was mounted successfully on ODL")
60 throw BluePrintRetryException("Wait for device($deviceId) to mount")
64 log.info("url for ODL status check: $mountCheckUrl")
65 webClientService.retry<String>(10, 0, 1000, mountCheckExecutionBlock)
69 * Generic Configure function
71 suspend fun AbstractScriptComponentFunction.restconfApplyDeviceConfig(webClientService: BlueprintWebClientService,
72 deviceId: String, configletResourcePath: String,
73 configletToApply: Any,
74 additionalHeaders: Map<String, String > = mutableMapOf("Content-Type" to "application/yang.patch+xml")) {
76 log.debug("headers: $additionalHeaders")
77 log.info("configuring device: $deviceId, Configlet: $configletToApply")
78 val applyConfigUrl = "restconf/config/network-topology:network-topology/topology/topology-netconf/node/" +
79 "$deviceId/$configletResourcePath"
80 val result:Any = webClientService.exchangeResource("PATCH", applyConfigUrl, configletToApply as String, additionalHeaders)
81 log.info("Configuration application result: $result")
85 suspend fun AbstractScriptComponentFunction.restconfDeviceConfig(webClientService: BlueprintWebClientService,
86 deviceId: String, configletResourcePath: String)
87 : BlueprintWebClientService.WebClientResponse<String> {
89 val configPathUrl = "restconf/config/network-topology:network-topology/topology/topology-netconf/node/" +
90 "$deviceId/$configletResourcePath"
91 log.debug("sending GET request, url: $configPathUrl")
92 return webClientService.exchangeResource("GET", configPathUrl, "")
96 * Generic UnMount function
98 suspend fun AbstractScriptComponentFunction.restconfUnMountDevice(webClientService: BlueprintWebClientService,
99 deviceId: String, payload: String) {
100 val unMountUrl = "restconf/config/network-topology:network-topology/topology/topology-netconf/node/$deviceId"
101 log.info("sending unMount request, url: $unMountUrl")
102 webClientService.exchangeResource("DELETE", unMountUrl, "")