Send both ubuntu versions to Robot VM
[demo.git] / docker_upgrade_scripts / onap_docker_upgrade.py
1 #!/usr/bin/python
2
3 import argparse
4 #import getopt
5 import json
6 import sys
7 import urllib2
8 import ConfigParser
9 import time
10 from fabric.context_managers import settings
11 from fabric.api import *
12 from fabfile import *
13
14
15 class ReadConfFile:
16
17     config = None
18
19     def __init__(self, file="onap_docker_upgrade.conf"):
20
21         """
22         Method to read from conf file specific options
23
24         :param file:
25         """
26         self.config = ConfigParser.SafeConfigParser()
27         self.config.readfp(open(file))
28
29     def read_option(self, group, name):
30         """
31         :return:
32         """
33         value = self.config.get(group, name)
34         return value
35
36
37 def getToken(url, osuser, ostenant, ospassword):
38
39     """ 
40     Returns a token to the user given a tenant, 
41     user name, password, and OpenStack API URL. 
42     """
43     url = url + '/tokens'
44     tokenRequest = urllib2.Request(url)
45     tokenRequest.add_header("Content-type", "application/json")
46     jsonPayload = json.dumps({'auth' : {'tenantName' : ostenant, 'passwordCredentials' : {'username' : osuser, 'password' : ospassword}}})
47     
48     request = urllib2.urlopen(tokenRequest, jsonPayload)
49     json_data = json.loads(request.read())
50     
51     request.close()
52     return json.dumps(json_data)
53
54 def getServers(url, token):
55     """
56     Returns a list of server in a given tenant
57     """
58     url = url + '/servers'
59     #handler=urllib2.HTTPHandler(debuglevel=1)
60     #opener = urllib2.build_opener(handler)
61     #urllib2.install_opener(opener)
62     nova_server_request = urllib2.Request(url)
63     nova_server_request.add_header("Content-type", "application/json")
64     nova_server_request.add_header("X-Auth-Token", token)
65     request = urllib2.urlopen(nova_server_request)
66     json_data = json.loads(request.read())
67     
68     request.close()
69     return json.dumps(json_data)
70
71 def getServerInfo(url, token, server):
72     """
73     Returns the server information in a given tenant
74     """
75     url = url + '/servers/' + server
76     #handler=urllib2.HTTPHandler(debuglevel=1)
77     #opener = urllib2.build_opener(handler)
78     #urllib2.install_opener(opener)
79     nova_server_request = urllib2.Request(url)
80     nova_server_request.add_header("Content-type", "application/json")
81     nova_server_request.add_header("X-Auth-Token", token)
82     request = urllib2.urlopen(nova_server_request)
83     json_data = json.loads(request.read())
84
85     request.close()
86     return json.dumps(json_data)
87
88 conf_file = ReadConfFile()
89
90 #Reading keystone_auth
91 url=conf_file.read_option('keystone_auth', 'url')
92 user=conf_file.read_option('keystone_auth', 'user')
93 password=conf_file.read_option('keystone_auth', 'password')
94 tenant=conf_file.read_option('keystone_auth', 'tenant')
95
96 #Reading onap
97 instance_prefix=conf_file.read_option('onap', 'instance_prefix')
98 deployment_type=conf_file.read_option('onap', 'deployment_type')
99 if deployment_type in ("1-nic-float" or "2-nic"):
100         onap_net_name=conf_file.read_option('onap', 'onap_net_name')
101 dcae_key_path=conf_file.read_option('onap', 'dcae_key_path')
102 onap_key_path=conf_file.read_option('onap', 'onap_key_path')
103
104 #Reading nova
105 nova_url=conf_file.read_option('nova', 'url')
106     
107 # Since we return a raw JSON payload from getToken,
108 # we need to load it into a readable object.
109 adminToken = json.loads(getToken(url, user, tenant, password))
110
111 # Access the token portion of the JSON payload and grab the token and tenant ID
112 adminTokenID = adminToken['access']['token']['id']
113 adminTokenTenantID = adminToken['access']['token']['tenant']['id']
114
115 for item in adminToken['access']['serviceCatalog']:
116     """ 
117     The "name" of each OpenStack service catalog item from
118     the item list changed between versions.  Things like 
119     "glance" became "volume" and "keystone" became "identity".  
120     You will need to update this based on your installation.
121     """
122     if nova_url:
123         adminNovaURL = nova_url + "/" + adminTokenTenantID
124     elif item['name'] == "nova": 
125         adminNovaURL = item['endpoints'][0]['adminURL']
126
127 print "------ Admin information ------"
128 print "Token ID = ", adminTokenID
129 print "Tenant ID = ", adminTokenTenantID
130 print "Nova URL = ", adminNovaURL
131 print "------ End Admin info ---------"
132
133 get_nova_servers = json.loads(getServers(adminNovaURL, adminTokenID))
134 #print get_nova_servers
135 #print get_nova_servers['servers'][0]['id']
136 execute_aai1 = False
137 for item in get_nova_servers['servers']:
138         #print item['id'], item['name']
139         if instance_prefix in item['name']:
140                 print "Found matching server name: %s with id %s" % (item['name'], item['id'])
141                 get_server_info = json.loads(getServerInfo(adminNovaURL, adminTokenID, item['id']))
142                 for net_info in get_server_info['server']['addresses']:
143                         if deployment_type in ("1-nic-float" or "2-nic"):
144                                 if onap_net_name not in net_info:
145                                         server_ip = get_server_info['server']['addresses'][net_info][0]['addr']
146                         elif deployment_type in "1-nic-nofloat":
147                                 server_ip = get_server_info['server']['addresses'][net_info][1]['addr']
148                         server_name = item['name']
149                         if "robot" in server_name:
150                                 robot_ip = server_ip
151                         elif "aai-inst1" in server_name:
152                                 aai1_ip = server_ip
153                                 is_aai2_executed = False
154                                 if not is_aai2_executed:
155                                         execute_aai1 = False
156                                         aai1_server_name = server_name
157                                 else:
158                                         execute_aai1 = True                     
159                         elif "aai-inst2" in server_name:
160                                 aai2_ip = server_ip
161                                 is_aai2_executed = True
162                         print "IP address of vm %s is %s" % (item['name'], server_ip)
163
164                         with settings(warnings=True, skip_bad_hosts=True):
165                                 if "dcae-controller" in server_name:
166                                         execute(upgrade_docker, server_name, hosts=server_ip, my_env={'key_filename':dcae_key_path, 'user':'ubuntu'})
167                                 else:
168                                         if "aai-inst1" not in server_name:
169                                                 execute(upgrade_docker, server_name, hosts=server_ip, my_env={'key_filename':onap_key_path, 'user':'ubuntu'})
170                                         elif execute_aai1:
171                                                 execute(upgrade_docker, server_name, hosts=server_ip, my_env={'key_filename':onap_key_path, 'user':'ubuntu'})
172                                         else:
173                                                 print "Skipping %s upgrade until aai2 finishes upgrade" % server_name
174                         
175 with settings(warnings=True):
176         if not execute_aai1:
177                 print "Starting %s upgrade" % aai1_ip
178                 execute(upgrade_docker, aai1_server_name, hosts=aai1_ip, my_env={'key_filename':onap_key_path, 'user':'ubuntu'})
179         time.sleep(300)
180         execute(health_checks_robot, hosts=robot_ip, my_env={'key_filename':onap_key_path, 'user':'ubuntu'})