diff options
Diffstat (limited to 'docker_upgrade_scripts/onap_docker_upgrade.py')
-rwxr-xr-x | docker_upgrade_scripts/onap_docker_upgrade.py | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/docker_upgrade_scripts/onap_docker_upgrade.py b/docker_upgrade_scripts/onap_docker_upgrade.py new file mode 100755 index 00000000..c11163ad --- /dev/null +++ b/docker_upgrade_scripts/onap_docker_upgrade.py @@ -0,0 +1,180 @@ +#!/usr/bin/python + +import argparse +#import getopt +import json +import sys +import urllib2 +import ConfigParser +import time +from fabric.context_managers import settings +from fabric.api import * +from fabfile import * + + +class ReadConfFile: + + config = None + + def __init__(self, file="onap_docker_upgrade.conf"): + + """ + Method to read from conf file specific options + + :param file: + """ + self.config = ConfigParser.SafeConfigParser() + self.config.readfp(open(file)) + + def read_option(self, group, name): + """ + :return: + """ + value = self.config.get(group, name) + return value + + +def getToken(url, osuser, ostenant, ospassword): + + """ + Returns a token to the user given a tenant, + user name, password, and OpenStack API URL. + """ + url = url + '/tokens' + tokenRequest = urllib2.Request(url) + tokenRequest.add_header("Content-type", "application/json") + jsonPayload = json.dumps({'auth' : {'tenantName' : ostenant, 'passwordCredentials' : {'username' : osuser, 'password' : ospassword}}}) + + request = urllib2.urlopen(tokenRequest, jsonPayload) + json_data = json.loads(request.read()) + + request.close() + return json.dumps(json_data) + +def getServers(url, token): + """ + Returns a list of server in a given tenant + """ + url = url + '/servers' + #handler=urllib2.HTTPHandler(debuglevel=1) + #opener = urllib2.build_opener(handler) + #urllib2.install_opener(opener) + nova_server_request = urllib2.Request(url) + nova_server_request.add_header("Content-type", "application/json") + nova_server_request.add_header("X-Auth-Token", token) + request = urllib2.urlopen(nova_server_request) + json_data = json.loads(request.read()) + + request.close() + return json.dumps(json_data) + +def getServerInfo(url, token, server): + """ + Returns the server information in a given tenant + """ + url = url + '/servers/' + server + #handler=urllib2.HTTPHandler(debuglevel=1) + #opener = urllib2.build_opener(handler) + #urllib2.install_opener(opener) + nova_server_request = urllib2.Request(url) + nova_server_request.add_header("Content-type", "application/json") + nova_server_request.add_header("X-Auth-Token", token) + request = urllib2.urlopen(nova_server_request) + json_data = json.loads(request.read()) + + request.close() + return json.dumps(json_data) + +conf_file = ReadConfFile() + +#Reading keystone_auth +url=conf_file.read_option('keystone_auth', 'url') +user=conf_file.read_option('keystone_auth', 'user') +password=conf_file.read_option('keystone_auth', 'password') +tenant=conf_file.read_option('keystone_auth', 'tenant') + +#Reading onap +instance_prefix=conf_file.read_option('onap', 'instance_prefix') +deployment_type=conf_file.read_option('onap', 'deployment_type') +if deployment_type in ("1-nic-float" or "2-nic"): + onap_net_name=conf_file.read_option('onap', 'onap_net_name') +dcae_key_path=conf_file.read_option('onap', 'dcae_key_path') +onap_key_path=conf_file.read_option('onap', 'onap_key_path') + +#Reading nova +nova_url=conf_file.read_option('nova', 'url') + +# Since we return a raw JSON payload from getToken, +# we need to load it into a readable object. +adminToken = json.loads(getToken(url, user, tenant, password)) + +# Access the token portion of the JSON payload and grab the token and tenant ID +adminTokenID = adminToken['access']['token']['id'] +adminTokenTenantID = adminToken['access']['token']['tenant']['id'] + +for item in adminToken['access']['serviceCatalog']: + """ + The "name" of each OpenStack service catalog item from + the item list changed between versions. Things like + "glance" became "volume" and "keystone" became "identity". + You will need to update this based on your installation. + """ + if nova_url: + adminNovaURL = nova_url + "/" + adminTokenTenantID + elif item['name'] == "nova": + adminNovaURL = item['endpoints'][0]['adminURL'] + +print "------ Admin information ------" +print "Token ID = ", adminTokenID +print "Tenant ID = ", adminTokenTenantID +print "Nova URL = ", adminNovaURL +print "------ End Admin info ---------" + +get_nova_servers = json.loads(getServers(adminNovaURL, adminTokenID)) +#print get_nova_servers +#print get_nova_servers['servers'][0]['id'] +execute_aai1 = False +for item in get_nova_servers['servers']: + #print item['id'], item['name'] + if instance_prefix in item['name']: + print "Found matching server name: %s with id %s" % (item['name'], item['id']) + get_server_info = json.loads(getServerInfo(adminNovaURL, adminTokenID, item['id'])) + for net_info in get_server_info['server']['addresses']: + if deployment_type in ("1-nic-float" or "2-nic"): + if onap_net_name not in net_info: + server_ip = get_server_info['server']['addresses'][net_info][0]['addr'] + elif deployment_type in "1-nic-nofloat": + server_ip = get_server_info['server']['addresses'][net_info][1]['addr'] + server_name = item['name'] + if "robot" in server_name: + robot_ip = server_ip + elif "aai-inst1" in server_name: + aai1_ip = server_ip + is_aai2_executed = False + if not is_aai2_executed: + execute_aai1 = False + aai1_server_name = server_name + else: + execute_aai1 = True + elif "aai-inst2" in server_name: + aai2_ip = server_ip + is_aai2_executed = True + print "IP address of vm %s is %s" % (item['name'], server_ip) + + with settings(warnings=True, skip_bad_hosts=True): + if "dcae-controller" in server_name: + execute(upgrade_docker, server_name, hosts=server_ip, my_env={'key_filename':dcae_key_path, 'user':'ubuntu'}) + else: + if "aai-inst1" not in server_name: + execute(upgrade_docker, server_name, hosts=server_ip, my_env={'key_filename':onap_key_path, 'user':'ubuntu'}) + elif execute_aai1: + execute(upgrade_docker, server_name, hosts=server_ip, my_env={'key_filename':onap_key_path, 'user':'ubuntu'}) + else: + print "Skipping %s upgrade until aai2 finishes upgrade" % server_name + +with settings(warnings=True): + if not execute_aai1: + print "Starting %s upgrade" % aai1_ip + execute(upgrade_docker, aai1_server_name, hosts=aai1_ip, my_env={'key_filename':onap_key_path, 'user':'ubuntu'}) + time.sleep(300) + execute(health_checks_robot, hosts=robot_ip, my_env={'key_filename':onap_key_path, 'user':'ubuntu'}) |