#!/usr/bin/python3 ################################################################################ # Copyright 2022 highstreet technologies GmbH # # Licensed under the Apache License, Version 2.0 (the 'License'); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an 'AS IS' BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ################################################################################ # Script for adding this running NTS Topology Server to the allowed-devices list of the # local OpenDaylight instance, for enabling NETCONF CallHome import http.client import time import base64 import os TIMEOUT=1000 INTERVAL=30 # default ODL credentials username = os.getenv("SDN_CONTROLLER_USERNAME") password = os.getenv("SDN_CONTROLLER_PASSWORD") cred_string = username + ":" + password certreadyCmd="GET" certreadyUrl="/rests/data/odl-netconf-callhome-server:netconf-callhome-server" timePassed=0 headers = {'Authorization':'Basic %s' % base64.b64encode(cred_string.encode()).decode(), 'Accept':"application/json", 'Content-type':"application/yang-data+json"} # ODL NETCONF CallHome allowed devices URL callhomeConfigUrl = "/rests/data/odl-netconf-callhome-server:netconf-callhome-server/allowed-devices/device=o-ran-sc-topology-service" # ODL NETCONF CallHome allowed devices payload; private key will be replaced with the one generated on the device at runtime callhomeConfigPayload = "{\"odl-netconf-callhome-server:device\":[{\"odl-netconf-callhome-server:unique-id\":\"o-ran-sc-topology-service\", \"odl-netconf-callhome-server:ssh-client-params\": {\"odl-netconf-callhome-server:host-key\":\"@priv_key@\",\"odl-netconf-callhome-server:credentials\":{\"odl-netconf-callhome-server:username\":\"netconf\",\"odl-netconf-callhome-server:passwords\":[\"netconf!\"]}}}]}" # checking if RESTCONF and NETCONF CallHome feature are functional in ODL def makeHealthcheckCall(headers, timePassed): connected = False # WAIT 10 minutes maximum and test every 30 seconds if HealthCheck API is returning 200 while timePassed < TIMEOUT: try: conn = http.client.HTTPConnection("127.0.0.1",8181) req = conn.request(certreadyCmd, certreadyUrl,headers=headers) res = conn.getresponse() res.read() httpStatus = res.status if httpStatus == 200: print("Healthcheck Passed in %d seconds." %timePassed) connected = True break else: print("Sleep: %d seconds before testing if Healthcheck worked. Total wait time up now is: %d seconds. Timeout is: %d seconds. Problem code was: %d" %(INTERVAL, timePassed, TIMEOUT, httpStatus)) except: print("Cannot execute REST call. Sleep: %d seconds before testing if Healthcheck worked. Total wait time up now is: %d seconds. Timeout is: %d seconds." %(INTERVAL, timePassed, TIMEOUT)) timePassed = timeIncrement(timePassed) if timePassed > TIMEOUT: print("TIME OUT: Healthcheck not passed in %d seconds... Could cause problems for testing activities..." %TIMEOUT) return connected def timeIncrement(timePassed): time.sleep(INTERVAL) timePassed = timePassed + INTERVAL return timePassed # add current NTS in allowed devices list for NETCONF CallHome def configureNetconfCallhome(): connected = makeHealthcheckCall(headers, timePassed) if connected: with open('/home/netconf/.ssh/melacon.server.key.pub', 'r') as file: data = file.read().rstrip() words = data.split() publicKey = words[1] payload = callhomeConfigPayload.replace("@priv_key@", publicKey) conn = http.client.HTTPConnection("localhost",8181) req = conn.request("PUT", callhomeConfigUrl,headers=headers, body=payload) res = conn.getresponse() res.read() httpStatus = res.status if httpStatus >= 200 and httpStatus < 300: print("Successfully enabled CallHome for device with key=%s" % publicKey) else: print("Could not allow device...") print("Starting NETCONF Callhome configuration...") configureNetconfCallhome()