diff options
Diffstat (limited to 'VNFs/DPPD-PROX/helper-scripts/rapid/createrapid.py')
-rwxr-xr-x | VNFs/DPPD-PROX/helper-scripts/rapid/createrapid.py | 309 |
1 files changed, 146 insertions, 163 deletions
diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/createrapid.py b/VNFs/DPPD-PROX/helper-scripts/rapid/createrapid.py index a1c1de60..fc5e97b4 100755 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/createrapid.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/createrapid.py @@ -1,7 +1,7 @@ #!/usr/bin/python ## -## Copyright (c) 2010-2017 Intel Corporation +## Copyright (c) 2010-2019 Intel Corporation ## ## Licensed under the Apache License, Version 2.0 (the "License"); ## you may not use this file except in compliance with the License. @@ -31,10 +31,10 @@ from logging import handlers from prox_ctrl import prox_ctrl import ConfigParser -version="19.4.15" +version="19.6.30" stack = "rapid" #Default string for stack. This is not an OpenStack Heat stack, just a group of VMs -vms = "rapidVMs" #Default string for vms file -key = "prox" # default name for kay +vms = "rapidVMs.vms" #Default string for vms file +key = "prox" # default name for key image = "rapidVM" # default name for the image image_file = "rapidVM.qcow2" dataplane_network = "dataplane-network" # default name for the dataplane network @@ -43,7 +43,6 @@ subnet_cidr="10.10.10.0/24" # cidr for dataplane internal_network="admin_internal_net" floating_network="admin_floating_net" loglevel="DEBUG" # sets log level for writing to file -runtime=10 # time in seconds for 1 test run def usage(): print("usage: createrapid [--version] [-v]") @@ -65,7 +64,7 @@ def usage(): print("optional arguments:") print(" -v, --version Show program's version number and exit") print(" --stack STACK_NAME Specify a name for the stack. Default is %s."%stack) - print(" --vms VMS_FILE Specify the vms file to be used. Default is %s.vms."%vms) + print(" --vms VMS_FILE Specify the vms file to be used. Default is %s."%vms) print(" --key KEY_NAME Specify the key to be used. Default is %s."%key) print(" --image IMAGE_NAME Specify the image to be used. Default is %s."%image) print(" --image_file IMAGE_FILE Specify the image qcow2 file to be used. Default is %s."%image_file) @@ -90,43 +89,43 @@ if args: usage() sys.exit(2) for opt, arg in opts: - if opt in ("-h", "--help"): + if opt in ["-h", "--help"]: usage() sys.exit() - if opt in ("-v", "--version"): + if opt in ["-v", "--version"]: print("Rapid Automated Performance Indication for Dataplane "+version) sys.exit() - if opt in ("--stack"): + if opt in ["--stack"]: stack = arg print ("Using '"+stack+"' as name for the stack") - elif opt in ("--vms"): + elif opt in ["--vms"]: vms = arg print ("Using Virtual Machines Description: "+vms) - elif opt in ("--key"): + elif opt in ["--key"]: key = arg print ("Using key: "+key) - elif opt in ("--image"): + elif opt in ["--image"]: image = arg print ("Using image: "+image) - elif opt in ("--image_file"): + elif opt in ["--image_file"]: image_file = arg print ("Using qcow2 file: "+image_file) - elif opt in ("--dataplane_network"): + elif opt in ["--dataplane_network"]: dataplane_network = arg print ("Using dataplane network: "+ dataplane_network) - elif opt in ("--subnet"): + elif opt in ["--subnet"]: subnet = arg print ("Using dataplane subnet: "+ subnet) - elif opt in ("--subnet_cidr"): + elif opt in ["--subnet_cidr"]: subnet_cidr = arg print ("Using dataplane subnet: "+ subnet_cidr) - elif opt in ("--internal_network"): + elif opt in ["--internal_network"]: internal_network = arg print ("Using control plane network: "+ internal_network) - elif opt in ("--floating_network"): + elif opt in ["--floating_network"]: floating_network = arg print ("Using floating ip network: "+ floating_network) - elif opt in ("--log"): + elif opt in ["--log"]: loglevel = arg print ("Log level: "+ loglevel) @@ -142,7 +141,7 @@ file_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") log = logging.getLogger() numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): - raise ValueError('Invalid log level: %s' % loglevel) + raise ValueError('Invalid log level: %s' % loglevel) log.setLevel(numeric_level) log.propagate = 0 @@ -173,58 +172,83 @@ needRoll = os.path.isfile(log_file) # This is a stale log, so roll it if needRoll: - # Add timestamp - log.debug('\n---------\nLog closed on %s.\n---------\n' % time.asctime()) - - # Roll over on application start - log.handlers[0].doRollover() + # Add timestamp + log.debug('\n---------\nLog closed on %s.\n---------\n' % time.asctime()) + # Roll over on application start + log.handlers[0].doRollover() # Add timestamp log.debug('\n---------\nLog started on %s.\n---------\n' % time.asctime()) log.debug("createrapid.py version: "+version) # Checking if the control network already exists, if not, stop the script -log.debug("Checking control plane network: "+internal_network) -cmd = 'openstack network show '+internal_network +log.debug("Checking control plane network: " + internal_network) +cmd = 'openstack network list -f value -c Name' log.debug (cmd) -cmd = cmd + ' |grep "status " | tr -s " " | cut -d" " -f 4' -NetworkExist = subprocess.check_output(cmd , shell=True).strip() -if NetworkExist == 'ACTIVE': - log.info("Control plane network ("+internal_network+") already active") +Networks = subprocess.check_output(cmd , shell=True).decode().strip() +if internal_network in Networks: + log.info("Control plane network (" + internal_network+") already active") else: log.exception("Control plane network " + internal_network + " not existing") raise Exception("Control plane network " + internal_network + " not existing") -# Checking if the floating ip network already exists, if not, stop the script -if floating_network <>'NO': - log.debug("Checking floating ip network: "+floating_network) - cmd = 'openstack network show '+floating_network - log.debug (cmd) - cmd = cmd + ' |grep "status " | tr -s " " | cut -d" " -f 4' - NetworkExist = subprocess.check_output(cmd , shell=True).strip() - if NetworkExist == 'ACTIVE': - log.info("Floating ip network ("+floating_network+") already active") +# Checking if the floating ip network should be used. If yes, check if it exists and stop the script if it doesn't +if floating_network !='NO': + log.debug("Checking floating ip network: " + floating_network) + if floating_network in Networks: + log.info("Floating ip network (" + floating_network + ") already active") else: log.exception("Floating ip network " + floating_network + " not existing") raise Exception("Floating ip network " + floating_network + " not existing") +# Checking if the dataplane network already exists, if not create it +log.debug("Checking dataplane network: " + dataplane_network) +if dataplane_network in Networks: + # If the dataplane already exists, we are assuming that this network is already created before with the proper configuration, hence we do not check if the subnet is created etc... + log.info("Dataplane network (" + dataplane_network + ") already active") +else: + log.info('Creating dataplane network ...') + cmd = 'openstack network create '+dataplane_network+' -f value -c status' + log.debug(cmd) + NetworkExist = subprocess.check_output(cmd , shell=True).decode().strip() + if 'ACTIVE' in NetworkExist: + log.info("Dataplane network created") + # Checking if the dataplane subnet already exists, if not create it + log.debug("Checking subnet: "+subnet) + cmd = 'openstack subnet list -f value -c Name' + log.debug (cmd) + Subnets = subprocess.check_output(cmd , shell=True).decode().strip() + if subnet in Subnets: + log.info("Subnet (" +subnet+ ") already exists") + else: + log.info('Creating subnet ...') + cmd = 'openstack subnet create --network ' + dataplane_network + ' --subnet-range ' + subnet_cidr +' --gateway none ' + subnet+' -f value -c name' + log.debug(cmd) + Subnets = subprocess.check_output(cmd , shell=True).decode().strip() + if subnet in Subnets: + log.info("Subnet created") + else : + log.exception("Failed to create subnet: " + subnet) + raise Exception("Failed to create subnet: " + subnet) + else : + log.exception("Failed to create dataplane network: " + dataplane_network) + raise Exception("Failed to create dataplane network: " + dataplane_network) + # Checking if the image already exists, if not create it -log.debug("Checking image: "+image) -cmd = 'openstack image show '+image +log.debug("Checking image: " + image) +cmd = 'openstack image list -f value -c Name' log.debug(cmd) -cmd = cmd +' |grep "status " | tr -s " " | cut -d" " -f 4' -ImageExist = subprocess.check_output(cmd , shell=True).strip() -if ImageExist == 'active': - log.info("Image ("+image+") already available") +Images = subprocess.check_output(cmd , shell=True).decode().strip() +if image in Images: + log.info("Image (" + image + ") already available") else: log.info('Creating image ...') - cmd = 'openstack image create --disk-format qcow2 --container-format bare --public --file ./'+image_file+ ' ' +image + cmd = 'openstack image create -f value -c status --disk-format qcow2 --container-format bare --public --file ./'+image_file+ ' ' +image log.debug(cmd) - cmd = cmd + ' |grep "status " | tr -s " " | cut -d" " -f 4' - ImageExist = subprocess.check_output(cmd , shell=True).strip() - if ImageExist == 'active': + ImageExist = subprocess.check_output(cmd , shell=True).decode().strip() + if 'active' in ImageExist: log.info('Image created and active') - cmd = 'openstack image set --property hw_vif_multiqueue_enabled="true" ' +image +# cmd = 'openstack image set --property hw_vif_multiqueue_enabled="true" ' +image # subprocess.check_call(cmd , shell=True) else : log.exception("Failed to create image") @@ -232,11 +256,10 @@ else: # Checking if the key already exists, if not create it log.debug("Checking key: "+key) -cmd = 'openstack keypair show '+key +cmd = 'openstack keypair list -f value -c Name' log.debug (cmd) -cmd = cmd + ' |grep "name " | tr -s " " | cut -d" " -f 4' -KeyExist = subprocess.check_output(cmd , shell=True).strip() -if KeyExist == key: +KeyExist = subprocess.check_output(cmd , shell=True).decode().strip() +if key in KeyExist: log.info("Key ("+key+") already installed") else: log.info('Creating key ...') @@ -245,95 +268,53 @@ else: subprocess.check_call(cmd , shell=True) cmd = 'chmod 600 ' +key+'.pem' subprocess.check_call(cmd , shell=True) - cmd = 'openstack keypair show '+key + cmd = 'openstack keypair list -f value -c Name' log.debug(cmd) - cmd = cmd + ' |grep "name " | tr -s " " | cut -d" " -f 4' - KeyExist = subprocess.check_output(cmd , shell=True).strip() - if KeyExist == key: + KeyExist = subprocess.check_output(cmd , shell=True).decode().strip() + if key in KeyExist: log.info("Key created") else : log.exception("Failed to create key: " + key) raise Exception("Failed to create key: " + key) - -# Checking if the dataplane network already exists, if not create it -log.debug("Checking dataplane network: "+dataplane_network) -cmd = 'openstack network show '+dataplane_network -log.debug (cmd) -cmd = cmd + ' |grep "status " | tr -s " " | cut -d" " -f 4' -NetworkExist = subprocess.check_output(cmd , shell=True).strip() -if NetworkExist == 'ACTIVE': - log.info("Dataplane network ("+dataplane_network+") already active") -else: - log.info('Creating dataplane network ...') - cmd = 'openstack network create '+dataplane_network - log.debug(cmd) - cmd = cmd + ' |grep "status " | tr -s " " | cut -d" " -f 4' - NetworkExist = subprocess.check_output(cmd , shell=True).strip() - if NetworkExist == 'ACTIVE': - log.info("Dataplane network created") - else : - log.exception("Failed to create dataplane network: " + dataplane_network) - raise Exception("Failed to create dataplane network: " + dataplane_network) - -# Checking if the dataplane subnet already exists, if not create it -log.debug("Checking subnet: "+subnet) -cmd = 'openstack subnet show '+ subnet -log.debug (cmd) -cmd = cmd +' |grep "name " | tr -s " " | cut -d"|" -f 3' -SubnetExist = subprocess.check_output(cmd , shell=True).strip() -if SubnetExist == subnet: - log.info("Subnet (" +subnet+ ") already exists") -else: - log.info('Creating subnet ...') - cmd = 'openstack subnet create --network ' + dataplane_network + ' --subnet-range ' + subnet_cidr +' --gateway none ' + subnet - log.debug(cmd) - cmd = cmd + ' |grep "name " | tr -s " " | cut -d"|" -f 3' - SubnetExist = subprocess.check_output(cmd , shell=True).strip() - if SubnetExist == subnet: - log.info("Subnet created") - else : - log.exception("Failed to create subnet: " + subnet) - raise Exception("Failed to create subnet: " + subnet) - ServerToBeCreated=[] ServerName=[] config = ConfigParser.RawConfigParser() vmconfig = ConfigParser.RawConfigParser() -vmconfig.read(vms+'.vms') +vmname = os.path.dirname(os.path.realpath(__file__))+'/' + vms +#vmconfig.read_file(open(vmname)) +vmconfig.readfp(open(vmname)) total_number_of_VMs = vmconfig.get('DEFAULT', 'total_number_of_vms') +cmd = 'openstack server list -f value -c Name' +log.debug (cmd) +Servers = subprocess.check_output(cmd , shell=True).decode().strip() +cmd = 'openstack flavor list -f value -c Name' +log.debug (cmd) +Flavors = subprocess.check_output(cmd , shell=True).decode().strip() for vm in range(1, int(total_number_of_VMs)+1): flavor_info = vmconfig.get('VM%d'%vm, 'flavor_info') flavor_meta_data = vmconfig.get('VM%d'%vm, 'flavor_meta_data') boot_info = vmconfig.get('VM%d'%vm, 'boot_info') SRIOV_port = vmconfig.get('VM%d'%vm, 'SRIOV_port') + SRIOV_mgmt_port = vmconfig.get('VM%d'%vm, 'SRIOV_mgmt_port') ServerName.append('%s-VM%d'%(stack,vm)) flavor_name = '%s-VM%d-flavor'%(stack,vm) - log.debug("Checking server: "+ServerName[-1]) - cmd = 'openstack server show '+ServerName[-1] - log.debug (cmd) - cmd = cmd + ' |grep "\sname\s" | tr -s " " | cut -d" " -f 4' - ServerExist = subprocess.check_output(cmd , shell=True).strip() - if ServerExist == ServerName[-1]: - log.info("Server ("+ServerName[-1]+") already active") + log.debug("Checking server: " + ServerName[-1]) + if ServerName[-1] in Servers: + log.info("Server (" + ServerName[-1] + ") already active") ServerToBeCreated.append("no") else: ServerToBeCreated.append("yes") # Checking if the flavor already exists, if not create it - log.debug("Checking flavor: "+flavor_name) - cmd = 'openstack flavor show '+flavor_name - log.debug (cmd) - cmd = cmd + ' |grep "\sname\s" | tr -s " " | cut -d" " -f 4' - FlavorExist = subprocess.check_output(cmd , shell=True).strip() - if FlavorExist == flavor_name: - log.info("Flavor ("+flavor_name+") already installed") + log.debug("Checking flavor: " + flavor_name) + if flavor_name in Flavors: + log.info("Flavor (" + flavor_name+") already installed") else: log.info('Creating flavor ...') - cmd = 'openstack flavor create %s %s'%(flavor_name,flavor_info) + cmd = 'openstack flavor create %s %s -f value -c name'%(flavor_name,flavor_info) log.debug(cmd) - cmd = cmd + ' |grep "\sname\s" | tr -s " " | cut -d" " -f 4' - FlavorExist = subprocess.check_output(cmd , shell=True).strip() - if FlavorExist == flavor_name: + NewFlavor = subprocess.check_output(cmd , shell=True).decode().strip() + if flavor_name in NewFlavor: cmd = 'openstack flavor set %s %s'%(flavor_name, flavor_meta_data) log.debug(cmd) subprocess.check_call(cmd , shell=True) @@ -341,55 +322,60 @@ for vm in range(1, int(total_number_of_VMs)+1): else : log.exception("Failed to create flavor: " + flavor_name) raise Exception("Failed to create flavor: " + flavor_name) + if SRIOV_mgmt_port == 'NO': + nic_info = '--nic net-id=%s'%(internal_network) + else: + nic_info = '--nic port-id=%s'%(SRIOV_mgmt_port) if SRIOV_port == 'NO': - nic_info = '--nic net-id=%s --nic net-id=%s'%(internal_network,dataplane_network) + nic_info = nic_info + ' --nic net-id=%s'%(dataplane_network) else: - nic_info = '--nic net-id=%s'%(internal_network) for port in SRIOV_port.split(','): nic_info = nic_info + ' --nic port-id=%s'%(port) if vm==int(total_number_of_VMs): # For the last server, we want to wait for the server creation to complete, so the next operations will succeeed (e.g. IP allocation) # Note that this waiting is not bullet proof. Imagine, we loop through all the VMs, and the last VM was already running, while the previous # VMs still needed to be created. Or the previous server creations take much longer than the last one. - # In that case, we might be to fast when we query for the IP & MAC addresses. - wait = ' --wait ' + # In that case, we might be too fast when we query for the IP & MAC addresses. + wait = '--wait' else: - wait = ' ' + wait = '' log.info("Creating server...") - cmd = 'openstack server create --flavor %s --key-name %s --image %s %s %s%s%s'%(flavor_name,key,image,nic_info,boot_info,wait,ServerName[-1]) + cmd = 'openstack server create --flavor %s --key-name %s --image %s %s %s %s %s'%(flavor_name,key,image,nic_info,boot_info,wait,ServerName[-1]) log.debug(cmd) - cmd = cmd + ' |grep "\sname\s" | tr -s " " | cut -d" " -f 4' - ServerExist = subprocess.check_output(cmd , shell=True).strip() -if floating_network <> 'NO': + output = subprocess.check_output(cmd , shell=True).decode().strip() +if floating_network != 'NO': for vm in range(0, int(total_number_of_VMs)): if ServerToBeCreated[vm] =="yes": - log.info('Creating & Associating floating IP for ('+ServerName[vm]+')...') - cmd = 'openstack server show %s -c addresses -f value |grep -Eo "%s=[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | cut -d"=" -f2'%(ServerName[vm],internal_network) - log.debug(cmd) - vmportIP = subprocess.check_output(cmd , shell=True).strip() - cmd = 'openstack port list -c ID -c "Fixed IP Addresses" | grep %s' %(vmportIP) - cmd = cmd + ' | cut -d" " -f 2 ' - log.debug(cmd) - vmportID = subprocess.check_output(cmd , shell=True).strip() - cmd = 'openstack floating ip create --port %s %s'%(vmportID,floating_network) - log.debug(cmd) - output = subprocess.check_output(cmd , shell=True).strip() - + log.info('Creating & Associating floating IP for ('+ServerName[vm]+')...') + cmd = 'openstack server show %s -c addresses -f value |grep -Eo "%s=[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | cut -d"=" -f2'%(ServerName[vm],internal_network) + log.debug(cmd) + vmportIP = subprocess.check_output(cmd , shell=True).decode().strip() + cmd = 'openstack port list -c ID -c "Fixed IP Addresses" | grep %s | cut -d" " -f 2 ' %(vmportIP) + log.debug(cmd) + vmportID = subprocess.check_output(cmd , shell=True).decode().strip() + cmd = 'openstack floating ip create --port %s %s'%(vmportID,floating_network) + log.debug(cmd) + output = subprocess.check_output(cmd , shell=True).decode().strip() + +config.add_section('rapid') +config.set('rapid', 'loglevel', loglevel) +config.set('rapid', 'version', version) +config.set('rapid', 'total_number_of_machines', total_number_of_VMs) for vm in range(1, int(total_number_of_VMs)+1): cmd = 'openstack server show %s'%(ServerName[vm-1]) log.debug(cmd) - output = subprocess.check_output(cmd , shell=True).strip() - searchString = '.*%s=([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)' %(dataplane_network) - matchObj = re.search(searchString, output, re.DOTALL) + output = subprocess.check_output(cmd , shell=True).decode().strip() + searchString = '.*%s=([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)' %(dataplane_network) + matchObj = re.search(searchString, output, re.DOTALL) vmDPIP = matchObj.group(1) - searchString = '.*%s=([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+),*\s*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)*' %(internal_network) - matchObj = re.search(searchString, output, re.DOTALL) + searchString = '.*%s=([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+),*\s*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)*' %(internal_network) + matchObj = re.search(searchString, output, re.DOTALL) vmAdminIP = matchObj.group(2) if vmAdminIP == None: vmAdminIP = matchObj.group(1) cmd = 'openstack port list |egrep "\\b%s\\b" | tr -s " " | cut -d"|" -f 4'%(vmDPIP) log.debug(cmd) - vmDPmac = subprocess.check_output(cmd , shell=True).strip() + vmDPmac = subprocess.check_output(cmd , shell=True).decode().strip() config.add_section('M%d'%vm) config.set('M%d'%vm, 'name', ServerName[vm-1]) config.set('M%d'%vm, 'admin_ip', vmAdminIP) @@ -397,22 +383,19 @@ for vm in range(1, int(total_number_of_VMs)+1): config.set('M%d'%vm, 'dp_mac', vmDPmac) log.info('%s: (admin IP: %s), (dataplane IP: %s), (dataplane MAC: %s)' % (ServerName[vm-1],vmAdminIP,vmDPIP,vmDPmac)) -config.add_section('OpenStack') -config.set('OpenStack', 'stack', stack) -config.set('OpenStack', 'VMs', vms) -config.set('OpenStack', 'key', key) -config.set('OpenStack', 'image', image) -config.set('OpenStack', 'image_file', image_file) -config.set('OpenStack', 'dataplane_network', dataplane_network) -config.set('OpenStack', 'subnet', subnet) -config.set('OpenStack', 'subnet_cidr', subnet_cidr) -config.set('OpenStack', 'internal_network', internal_network) -config.set('OpenStack', 'floating_network', floating_network) -config.add_section('rapid') -config.set('rapid', 'loglevel', loglevel) -config.set('rapid', 'version', version) -config.set('rapid', 'total_number_of_machines', total_number_of_VMs) -config.set('DEFAULT', 'admin_ip', 'none') +config.add_section('ssh') +config.set('ssh', 'key', key) +config.add_section('Varia') +config.set('Varia', 'VIM', 'OpenStack') +config.set('Varia', 'stack', stack) +config.set('Varia', 'VMs', vms) +config.set('Varia', 'image', image) +config.set('Varia', 'image_file', image_file) +config.set('Varia', 'dataplane_network', dataplane_network) +config.set('Varia', 'subnet', subnet) +config.set('Varia', 'subnet_cidr', subnet_cidr) +config.set('Varia', 'internal_network', internal_network) +config.set('Varia', 'floating_network', floating_network) # Writing the environment file with open(stack+'.env', 'wb') as envfile: - config.write(envfile) + config.write(envfile) |