From c5a79f06449a144464e46cd35c9c0d3883ec2f8d Mon Sep 17 00:00:00 2001 From: Philip Joseph Date: Fri, 20 Jan 2017 02:11:09 +0530 Subject: [PATCH] Bug 159 : Update charm script to ssh to VNF and do http Signed-off-by: Philip Joseph --- src/nsd/ping_pong_ns/ping_pong_nsd.yaml | 6 +- src/nsd/ping_pong_ns/scripts/start_traffic.py | 85 ++++++++++++------- src/vnfd/ping_vnf/ping_vnfd.yaml | 2 +- src/vnfd/pong_vnf/pong_vnfd.yaml | 2 +- 4 files changed, 59 insertions(+), 36 deletions(-) diff --git a/src/nsd/ping_pong_ns/ping_pong_nsd.yaml b/src/nsd/ping_pong_ns/ping_pong_nsd.yaml index 07915766..7f213cd9 100644 --- a/src/nsd/ping_pong_ns/ping_pong_nsd.yaml +++ b/src/nsd/ping_pong_ns/ping_pong_nsd.yaml @@ -22,7 +22,7 @@ nsd:nsd-catalog: nsd:name: ping_pong_ns nsd:short-name: ping_pong_ns nsd:vendor: RIFT.io - nsd:version: '1.0' + nsd:version: '1.1' nsd:description: RIFT.io sample ping pong network service nsd:constituent-vnfd: - nsd:member-vnf-index: '1' @@ -34,6 +34,10 @@ nsd:nsd-catalog: nsd:parameter: - nsd:name: port nsd:value: 5555 + - nsd:name: ssh-username + nsd:value: fedora + - nsd:name: ssh-password + nsd:value: fedora nsd:seq: '1' nsd:user-defined-script: start_traffic.py nsd:input-parameter-xpath: diff --git a/src/nsd/ping_pong_ns/scripts/start_traffic.py b/src/nsd/ping_pong_ns/scripts/start_traffic.py index f98bece2..87c309fd 100755 --- a/src/nsd/ping_pong_ns/scripts/start_traffic.py +++ b/src/nsd/ping_pong_ns/scripts/start_traffic.py @@ -19,6 +19,7 @@ import argparse import logging +import paramiko import os import subprocess import sys @@ -27,55 +28,71 @@ import time import yaml +def ssh(cmd, host, user, password): + """ Run an arbitrary command over SSH. """ + + client = paramiko.SSHClient() + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + client.connect(host, port=22, username=user, password=password) + + stdin, stdout, stderr = client.exec_command(cmd, get_pty=True) + retcode = stdout.channel.recv_exit_status() + client.close() + + return ( + retcode, + stdout.read().decode('utf-8').strip(), + stderr.read().decode('utf-8').strip() + ) + + def start_traffic(yaml_cfg, logger): '''Use curl and set admin status to enable on pong and ping vnfs''' curl_fmt = 'curl -D /dev/stdout -H "Accept: application/vnd.yang.data' \ '+xml" -H "Content-Type: application/vnd.yang.data+json" ' \ - '-X POST -d "{{ {data} }}" http://{mgmt_ip}:' \ + '-X POST -d "{{ {data} }}" http://127.0.0.1:' \ '{mgmt_port}/api/v1/{vnf_type}/{url}' - def setup_service(mgmt_ip, port, vnf_type, service_ip, service_port): - data = '\\"ip\\":\\"{}\\", \\"port\\":5555'.format(service_ip) - curl_cmd = curl_fmt.format( - mgmt_ip=mgmt_ip, - mgmt_port=port, - vnf_type=vnf_type, - data=data, - url='server' - ) - - logger.debug("Executing cmd: %s", curl_cmd) - proc = subprocess.run(curl_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + # Get userid and password for the VNF + user = yaml_cfg['parameter']['ssh-username'] + passwd = yaml_cfg['parameter']['ssh-password'] - logger.debug("Process: {}".format(proc)) + # Get port from user parameter + service_port = yaml_cfg['parameter']['port'] - return proc.returncode + service_ip = None - def enable_service(mgmt_ip, port, vnf_type): + def exec_cmd(vnf_type, mgmt_ip, port, url, data): curl_cmd = curl_fmt.format( - mgmt_ip=mgmt_ip, mgmt_port=port, vnf_type=vnf_type, - data='\\"enable\\":true', - url='adminstatus/state' + data=data, + url=url ) logger.debug("Executing cmd: %s", curl_cmd) - proc = subprocess.run(curl_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + rc, out, err = ssh(curl_cmd, mgmt_ip, user, passwd) - logger.debug("Process: {}".format(proc)) + if rc != 0: + logger.error("cmd={}, rc={}, stderr={}, stdout={}". + format(curl_cmd, rc, err, out)) + else: + logger.debug("cmd={}, rc={}, stderr={}, stdout={}". + format(curl_cmd, rc, err, out)) - return proc.returncode + return rc - # Get port from user parameter - service_port = yaml_cfg['parameter']['port'] + def setup_service(mgmt_ip, port, vnf_type): + data = '\\"ip\\":\\"{}\\", \\"port\\":5555'.format(service_ip) + return exec_cmd(vnf_type, mgmt_ip, port, 'server', data) + + def enable_service(mgmt_ip, port, vnf_type): + data='\\"enable\\":true' + url='adminstatus/state' + return exec_cmd(vnf_type, mgmt_ip, port, url, data) - service_ip = None # Enable pong service first for index, vnfr in yaml_cfg['vnfr'].items(): logger.debug("VNFR {}: {}".format(index, vnfr)) @@ -95,7 +112,7 @@ def start_traffic(yaml_cfg, logger): max_tries = 60 tries = 0 while tries < max_tries: - rc = setup_service(mgmt_ip, port, vnf_type, service_ip, service_port) + rc = setup_service(mgmt_ip, port, vnf_type) tries += 1 if rc != 0: logger.error("Setup service for pong failed ({}): {}". @@ -104,13 +121,14 @@ def start_traffic(yaml_cfg, logger): return rc else: time.sleep(1) # Sleep for 1 seconds + else: + break rc = enable_service(mgmt_ip, port, vnf_type) if rc != 0: logger.error("Enable service for pong failed: {}". format(rc)) return rc - break # Add a delay to provide pong port to come up time.sleep(1) @@ -131,7 +149,7 @@ def start_traffic(yaml_cfg, logger): max_tries = 30 tries = 0 while tries < max_tries: - rc = setup_service(mgmt_ip, port, vnf_type, service_ip, service_port) + rc = setup_service(mgmt_ip, port, vnf_type) tries += 1 if rc != 0: logger.error("Setup service for ping failed ({}): {}". @@ -140,12 +158,13 @@ def start_traffic(yaml_cfg, logger): return rc else: time.sleep(1) # Sleep for 1 seconds + else: + break rc = enable_service(mgmt_ip, port, vnf_type) if rc != 0: logger.error("Enable service for ping failed: {}". format(rc)) - break return rc diff --git a/src/vnfd/ping_vnf/ping_vnfd.yaml b/src/vnfd/ping_vnf/ping_vnfd.yaml index 44f09ab5..f5e577c8 100644 --- a/src/vnfd/ping_vnf/ping_vnfd.yaml +++ b/src/vnfd/ping_vnf/ping_vnfd.yaml @@ -22,7 +22,7 @@ vnfd:vnfd-catalog: short-name: ping_vnf logo: rift_logo.png vendor: RIFT.io - version: '1.0' + version: '1.1' description: This is an example RIFT.ware VNF connection-point: - name: ping_vnfd/cp0 diff --git a/src/vnfd/pong_vnf/pong_vnfd.yaml b/src/vnfd/pong_vnf/pong_vnfd.yaml index fb7c53c8..50f537f5 100644 --- a/src/vnfd/pong_vnf/pong_vnfd.yaml +++ b/src/vnfd/pong_vnf/pong_vnfd.yaml @@ -22,7 +22,7 @@ vnfd:vnfd-catalog: short-name: pong_vnf logo: rift_logo.png vendor: RIFT.io - version: '1.0' + version: '1.1' description: This is an example RIFT.ware VNF connection-point: - name: pong_vnfd/cp0 -- 2.25.1