blob: 531faf973ad74474c11e5b705ee8f03ac5fdcba1 [file] [log] [blame]
#!/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()