diff options
Diffstat (limited to 'vnfmgr/vnfmgr_odl/vnfmgr_odl.py')
-rwxr-xr-x | vnfmgr/vnfmgr_odl/vnfmgr_odl.py | 297 |
1 files changed, 175 insertions, 122 deletions
diff --git a/vnfmgr/vnfmgr_odl/vnfmgr_odl.py b/vnfmgr/vnfmgr_odl/vnfmgr_odl.py index 4d35aebb..6ac72b28 100755 --- a/vnfmgr/vnfmgr_odl/vnfmgr_odl.py +++ b/vnfmgr/vnfmgr_odl/vnfmgr_odl.py @@ -1,11 +1,5 @@ -#! /usr/bin/env python +#!/usr/bin/env python -__author__ = "Brady Johnson" -__copyright__ = "Copyright(c) 2015, Ericsson, Inc." -__license__ = "Apache License version 2.0" -__version__ = "0.1" -__email__ = "brady.allen.johnson@ericsson.com" -__status__ = "beta" import pdb import os import time @@ -13,63 +7,88 @@ import requests import json import argparse -PUT = 'PUT' -GET = 'GET' +__author__ = "Brady Johnson" +__copyright__ = "Copyright(c) 2015, Ericsson, Inc." +__license__ = "Apache License version 2.0" +__version__ = "0.1" +__email__ = "brady.allen.johnson@ericsson.com" +__status__ = "beta" + + +PUT = 'PUT' +GET = 'GET' POST = 'POST' + class Context(object): """ Context class to hold the configuration as specified on the command line """ + def __init__(self): - self.rest_path_prefix = 'sampleConfig' - self.rest_path_sf = 'RestConf-SFs-HttpPut.json' - self.rest_path_sf_sel = 'RestConf-SFselect-HttpPut.json' - self.rest_path_sfc = 'RestConf-SFCs-HttpPut.json' - self.rest_path_sff = 'RestConf-SFFs-HttpPut.json' - self.rest_path_sfp = 'RestConf-SFPs-HttpPut.json' - self.rest_path_acl = 'RestConf-ACLs-HttpPut.json' - self.rest_path_rsp = 'RestConf-RSP-HttpPost.json' - - self.rest_url_sf = 'config/service-function:service-functions/' - self.rest_url_sf_sel = 'config/service-function-scheduler-type:service-function-scheduler-types/' - self.rest_url_sfc = 'config/service-function-chain:service-function-chains/' - self.rest_url_sff = 'config/service-function-forwarder:service-function-forwarders/' - self.rest_url_sfp = 'config/service-function-path:service-function-paths/' - self.rest_url_rsp = 'operational/rendered-service-path:rendered-service-paths/' - self.rest_url_rsp_rpc = 'operations/rendered-service-path:create-rendered-path' - self.rest_url_acl = 'config/ietf-acl:access-lists/' - - self.http_headers = {'Content-Type' : 'application/json', 'Cache-Control' : 'no-cache'} - self.http_server = 'localhost' - self.url_base = '' - self.http_port = '8181' - self.interractive = True - self.user = 'admin' - self.pw = 'admin' - self.batch_sf = False - self.batch_sf_sel = False - self.batch_sfc = False - self.batch_sff = False - self.batch_sfp = False - self.batch_acl = False - self.batch_rsp = False - self.batch_query = False + self.rest_path_prefix = 'sampleConfig' + self.rest_path_sf = 'RestConf-SFs-HttpPut.json' + self.rest_path_sf_sel = 'RestConf-SFselect-HttpPut.json' + self.rest_path_sfc = 'RestConf-SFCs-HttpPut.json' + self.rest_path_sff = 'RestConf-SFFs-HttpPut.json' + self.rest_path_sfp = 'RestConf-SFPs-HttpPut.json' + self.rest_path_acl = 'RestConf-ACLs-HttpPut.json' + self.rest_path_rsp = 'RestConf-RSP-HttpPost.json' + + self.rest_url_sf = 'config/service-function:service-functions/' + self.rest_url_sf_sel = ('config/service-function-scheduler-type:' + 'service-function-scheduler-types/') + self.rest_url_sfc = ( + 'config/service-function-chain:service-function-chains/') + self.rest_url_sff = ( + 'config/service-function-forwarder:service-function-forwarders/') + self.rest_url_sfp = ( + 'config/service-function-path:service-function-paths/') + self.rest_url_rsp = ( + 'operational/rendered-service-path:rendered-service-paths/') + self.rest_url_rsp_rpc = ( + 'operations/rendered-service-path:create-rendered-path') + self.rest_url_acl = ('config/ietf-acl:access-lists/') + + self.http_headers = { + 'Content-Type': 'application/json', 'Cache-Control': 'no-cache'} + self.http_server = 'localhost' + self.url_base = '' + self.http_port = '8181' + self.interractive = True + self.user = 'admin' + self.pw = 'admin' + self.batch_sf = False + self.batch_sf_sel = False + self.batch_sfc = False + self.batch_sff = False + self.batch_sfp = False + self.batch_acl = False + self.batch_rsp = False + self.batch_query = False def set_path_prefix_paths(self, path_prefix): self.rest_path_prefix = path_prefix - self.rest_path_sf = os.path.join(self.rest_path_prefix, self.rest_path_sf) - self.rest_path_sf_sel = os.path.join(self.rest_path_prefix, self.rest_path_sf_sel) - self.rest_path_sfc = os.path.join(self.rest_path_prefix, self.rest_path_sfc) - self.rest_path_sff = os.path.join(self.rest_path_prefix, self.rest_path_sff) - self.rest_path_sfp = os.path.join(self.rest_path_prefix, self.rest_path_sfp) - self.rest_path_acl = os.path.join(self.rest_path_prefix, self.rest_path_acl) - self.rest_path_rsp = os.path.join(self.rest_path_prefix, self.rest_path_rsp) + self.rest_path_sf = os.path.join( + self.rest_path_prefix, self.rest_path_sf) + self.rest_path_sf_sel = os.path.join( + self.rest_path_prefix, self.rest_path_sf_sel) + self.rest_path_sfc = os.path.join( + self.rest_path_prefix, self.rest_path_sfc) + self.rest_path_sff = os.path.join( + self.rest_path_prefix, self.rest_path_sff) + self.rest_path_sfp = os.path.join( + self.rest_path_prefix, self.rest_path_sfp) + self.rest_path_acl = os.path.join( + self.rest_path_prefix, self.rest_path_acl) + self.rest_path_rsp = os.path.join( + self.rest_path_prefix, self.rest_path_rsp) def get_cmd_line(context): """ - Create a command-line parser, parse the command line args, and process them. + Create a command-line parser, parse the command line args, and process + them. Populate the Context object with the processed command-line args. """ @@ -127,7 +146,8 @@ def get_cmd_line(context): opts.add_argument('--send-all', '-7', dest='send_all', action='store_true', - help='Send all (SF, SFF, SFC, SFP, RSP, ACL) REST JSON messages') + help=('Send all (SF, SFF, SFC, SFP, RSP, ACL) ' + 'REST JSON messages')) opts.add_argument('--query-sfc', '-q', dest='query_sfc', action='store_true', @@ -141,72 +161,83 @@ def get_cmd_line(context): opts.add_argument('--rest-path-sf-sel', default=context.rest_path_sf_sel, dest='rest_path_sf_sel', - help='Name of the SF Selection REST JSON file, relative to configured prefix') + help=('Name of the SF Selection REST JSON file, ' + 'relative to configured prefix')) opts.add_argument('--rest-path-sf', '-n', default=context.rest_path_sf, dest='rest_path_sf', - help='Name of the SF REST JSON file, relative to configured prefix') + help=('Name of the SF REST JSON file, relative to ' + 'configured prefix')) opts.add_argument('--rest-path-sfc', '-c', default=context.rest_path_sfc, dest='rest_path_sfc', - help='Name of the SFC REST JSON file, relative to configured prefix') + help=('Name of the SFC REST JSON file, relative to ' + 'configured prefix')) opts.add_argument('--rest-path-sff', '-f', default=context.rest_path_sff, dest='rest_path_sff', - help='Name of the SFF REST JSON file, relative toconfigured prefix') + help=('Name of the SFF REST JSON file, relative ' + 'to configured prefix')) opts.add_argument('--rest-path-sfp', '-p', default=context.rest_path_sfp, dest='rest_path_sfp', - help='Name of the SFP REST JSON file, relative to configured prefix') + help=('Name of the SFP REST JSON file, relative ' + 'to configured prefix')) opts.add_argument('--rest-path-rsp', '-r', default=context.rest_path_rsp, dest='rest_path_rsp', - help='Name of the RSP REST JSON file, relative to configured prefix') + help=('Name of the RSP REST JSON file, relative ' + 'to configured prefix')) opts.add_argument('--rest-path-acl', '-a', default=context.rest_path_acl, dest='rest_path_acl', - help='Name of the ACL REST JSON file, relative to configured prefix') + help=('Name of the ACL REST JSON file, relative ' + 'to configured prefix')) args = opts.parse_args() - context.http_server = args.http_server - context.http_port = args.http_port - context.url_base = 'http://%s:%s/restconf/' % (context.http_server, context.http_port) + context.http_server = args.http_server + context.http_port = args.http_port + context.url_base = 'http://%s:%s/restconf/' % ( + context.http_server, context.http_port) context.rest_path_prefix = args.rest_path_prefix - context.rest_path_sf = args.rest_path_sf + context.rest_path_sf = args.rest_path_sf context.rest_path_sf_sel = args.rest_path_sf_sel - context.rest_path_sfc = args.rest_path_sfc - context.rest_path_sff = args.rest_path_sff - context.rest_path_sfp = args.rest_path_sfp - context.rest_path_acl = args.rest_path_acl - context.rest_path_rsp = args.rest_path_rsp + context.rest_path_sfc = args.rest_path_sfc + context.rest_path_sff = args.rest_path_sff + context.rest_path_sfp = args.rest_path_sfp + context.rest_path_acl = args.rest_path_acl + context.rest_path_rsp = args.rest_path_rsp context.set_path_prefix_paths(context.rest_path_prefix) - for path in [context.rest_path_sf, context.rest_path_sfc, context.rest_path_sff, context.rest_path_sfp]: + for path in [context.rest_path_sf, + context.rest_path_sfc, + context.rest_path_sff, + context.rest_path_sfp]: print '\tUsing REST file: %s' % path if args.batch: context.interractive = False if args.send_all: - context.batch_sf = True - context.batch_sf_sel = True - context.batch_sfc = True - context.batch_sff = True - context.batch_sfp = True - context.batch_rsp = True + context.batch_sf = True + context.batch_sf_sel = True + context.batch_sfc = True + context.batch_sff = True + context.batch_sfp = True + context.batch_rsp = True # TODO deactivated for now - #context.batch_acl = True + # context.batch_acl = True else: - context.batch_sf = args.send_sf - context.batch_sf_sel = args.send_sf_sel - context.batch_sfc = args.send_sfc - context.batch_sff = args.send_sff - context.batch_sfp = args.send_sfp - context.batch_rsp = args.send_rsp + context.batch_sf = args.send_sf + context.batch_sf_sel = args.send_sf_sel + context.batch_sfc = args.send_sfc + context.batch_sff = args.send_sff + context.batch_sfp = args.send_sfp + context.batch_rsp = args.send_rsp # TODO deactivated for now - #context.batch_acl = args.send_acl - context.batch_query = args.query_sfc + # context.batch_acl = args.send_acl + context.batch_query = args.query_sfc return True @@ -218,7 +249,8 @@ def send_rest(context, operation, rest_url, rest_file=None): context -- specifies the destination IP/Port and user/pw operation -- specifies if the HTTP OP is one of: GET, PUT, or POST rest_url -- the operation URL - rest_file -- for PUT and POST operations, specifies where the JSON input is found + rest_file -- for PUT and POST operations, specifies where the JSON + input is found """ complete_url = '%s%s' % (context.url_base, rest_url) @@ -230,24 +262,26 @@ def send_rest(context, operation, rest_url, rest_file=None): try: if operation == GET: - r = requests.get(url = complete_url, - headers = context.http_headers, + r = requests.get(url=complete_url, + headers=context.http_headers, auth=(context.user, context.pw)) print '\nHTTP GET %s\nresult: %s' % (rest_url, r.status_code) - #if len(r.text) > 1: + # if len(r.text) > 1: if r.status_code >= 200 and r.status_code <= 299: - print json.dumps(json.loads(r.text), indent=4, separators=(',', ': ')) + print json.dumps(json.loads(r.text), + indent=4, + separators=(',', ': ')) elif operation == PUT: if not rest_file: print 'ERROR trying to PUT with empty REST file' return False - r = requests.put(url = complete_url, + r = requests.put(url=complete_url, auth=(context.user, context.pw), - data = json.dumps(json.load(open(rest_file, 'r'))), - headers = context.http_headers) + data=json.dumps(json.load(open(rest_file, 'r'))), + headers=context.http_headers) print '\nHTTP PUT %s\nresult: %s' % (rest_url, r.status_code) elif operation == POST: @@ -259,17 +293,19 @@ def send_rest(context, operation, rest_url, rest_file=None): if len(post_list) > 1: # This allows for multiple RSPs to be sent from one JSON file for entry in post_list: - r = requests.post(url = complete_url, + r = requests.post(url=complete_url, auth=(context.user, context.pw), - data = json.dumps(entry), - headers = context.http_headers) - print '\nHTTP POST %s\nresult: %s' % (rest_url, r.status_code) + data=json.dumps(entry), + headers=context.http_headers) + print '\nHTTP POST %s\nresult: %s' % (rest_url, + r.status_code) else: - r = requests.post(url = complete_url, + r = requests.post(url=complete_url, auth=(context.user, context.pw), - data = json.dumps(post_list), - headers = context.http_headers) - print '\nHTTP POST %s\nresult: %s' % (rest_url, r.status_code) + data=json.dumps(post_list), + headers=context.http_headers) + print '\nHTTP POST %s\nresult: %s' % (rest_url, + r.status_code) else: print 'ERROR: Invalid Operation: %s' % (operation) @@ -285,6 +321,7 @@ def send_rest(context, operation, rest_url, rest_file=None): return True + def validate_rest(context): """ For each JSON input file in context, validate the JSON syntax. @@ -308,6 +345,7 @@ def validate_rest(context): return True + def batch(context): """ Launch the application in batch mode and perform @@ -317,9 +355,10 @@ def batch(context): # The order of these if's is important # If send-all was set, then each of these needs to be sent, in order if context.batch_sf_sel: - send_rest(context, PUT, context.rest_url_sf_sel, context.rest_path_sf_sel) + send_rest( + context, PUT, context.rest_url_sf_sel, context.rest_path_sf_sel) if context.batch_sf: - send_rest(context, PUT, context.rest_url_sf, context.rest_path_sf) + send_rest(context, PUT, context.rest_url_sf, context.rest_path_sf) if context.batch_sff: send_rest(context, PUT, context.rest_url_sff, context.rest_path_sff) if context.batch_sfc: @@ -327,7 +366,8 @@ def batch(context): if context.batch_sfp: send_rest(context, PUT, context.rest_url_sfp, context.rest_path_sfp) if context.batch_rsp: - send_rest(context, POST, context.rest_url_rsp_rpc, context.rest_path_rsp) + send_rest( + context, POST, context.rest_url_rsp_rpc, context.rest_path_rsp) if context.batch_acl: send_rest(context, PUT, context.rest_url_acl, context.rest_path_acl) @@ -339,7 +379,7 @@ def batch(context): send_rest(context, GET, context.rest_url_sfp) send_rest(context, GET, context.rest_url_rsp) # TODO deactivated for now - #send_rest(context, GET, context.rest_url_acl) + # send_rest(context, GET, context.rest_url_acl) def CLI(context): @@ -360,37 +400,51 @@ def CLI(context): print ' 6) Send ACL REST' print ' 7) Send all ordered: (SFsel, SF, SFF, SFC, SFP, RSP)' print ' 8) Query all: (SFsel, SF, SFF, SFC, SFP, RSP)' - print ' 9) Change config file path, currently [%s]' % (context.rest_path_prefix) + print(' 9) Change config file path, currently [%s]' % ( + context.rest_path_prefix)) print '10) Validate config files JSON syntax' option = raw_input('=> ') if option == '1': - send_rest(context, PUT, context.rest_url_sf, context.rest_path_sf) + send_rest(context, PUT, context.rest_url_sf, context.rest_path_sf) elif option == '2': - send_rest(context, PUT, context.rest_url_sfc, context.rest_path_sfc) + send_rest( + context, PUT, context.rest_url_sfc, context.rest_path_sfc) elif option == '3': - send_rest(context, PUT, context.rest_url_sff, context.rest_path_sff) + send_rest( + context, PUT, context.rest_url_sff, context.rest_path_sff) elif option == '4': - send_rest(context, PUT, context.rest_url_sfp, context.rest_path_sfp) + send_rest( + context, PUT, context.rest_url_sfp, context.rest_path_sfp) elif option == '5': - send_rest(context, POST, context.rest_url_rsp_rpc, context.rest_path_rsp) + send_rest( + context, POST, context.rest_url_rsp_rpc, context.rest_path_rsp) elif option == '6': - send_rest(context, PUT, context.rest_url_acl, context.rest_path_acl) + send_rest( + context, PUT, context.rest_url_acl, context.rest_path_acl) elif option == '7': pdb.set_trace() - send_rest(context, PUT, context.rest_url_sf_sel, context.rest_path_sf_sel) - send_rest(context, PUT, context.rest_url_sf, context.rest_path_sf) - send_rest(context, PUT, context.rest_url_sff, context.rest_path_sff) - send_rest(context, PUT, context.rest_url_sfc, context.rest_path_sfc) - send_rest(context, PUT, context.rest_url_sfp, context.rest_path_sfp) - time.sleep(1); - send_rest(context, POST, context.rest_url_rsp_rpc, context.rest_path_rsp) + send_rest( + context, PUT, context.rest_url_sf_sel, + context.rest_path_sf_sel) + send_rest(context, PUT, context.rest_url_sf, context.rest_path_sf) + send_rest( + context, PUT, context.rest_url_sff, context.rest_path_sff) + send_rest( + context, PUT, context.rest_url_sfc, context.rest_path_sfc) + send_rest( + context, PUT, context.rest_url_sfp, context.rest_path_sfp) + time.sleep(1) + send_rest( + context, POST, context.rest_url_rsp_rpc, context.rest_path_rsp) # TODO ACL deactivated for now - # Need to wait until the SFC creates the RSP internally before sending the ACL - #print 'Sleeping 2 seconds while RSP being created' - #time.sleep(2); - #send_rest(context, PUT, context.rest_url_acl, context.rest_path_acl) + # Need to wait until the SFC creates the RSP internally + # before sending the ACL + # print 'Sleeping 2 seconds while RSP being created' + # time.sleep(2); + # send_rest(context, PUT, context.rest_url_acl, + # context.rest_path_acl) elif option == '8': send_rest(context, GET, context.rest_url_sf_sel) send_rest(context, GET, context.rest_url_sf) @@ -437,4 +491,3 @@ def main(): if __name__ == '__main__': main() - |