Merge "Support for customized tempest case list"
[functest.git] / testcases / vIMS / CI / orchestrator.py
1 #!/usr/bin/python
2 # coding: utf8
3 #######################################################################
4 #
5 #   Copyright (c) 2015 Orange
6 #   valentin.boucher@orange.com
7 #
8 # All rights reserved. This program and the accompanying materials
9 # are made available under the terms of the Apache License, Version 2.0
10 # which accompanies this distribution, and is available at
11 # http://www.apache.org/licenses/LICENSE-2.0
12 ########################################################################
13 import sys, subprocess, os, shutil, yaml
14 from git import Repo
15
16 class orchestrator:
17
18         def __init__(self, testcase_dir, inputs={}, logger=None):
19                 self.testcase_dir = testcase_dir
20                 self.blueprint_dir = testcase_dir + 'cloudify-manager-blueprint/'
21                 self.input_file = 'inputs.yaml'
22                 self.manager_blueprint = False
23                 self.config = inputs
24                 self.logger = logger
25                 self.manager_up = False
26
27         def set_credentials(self, username, password, tenant_name, auth_url):
28                 self.config['keystone_username'] = username
29                 self.config['keystone_password'] = password
30                 self.config['keystone_url'] = auth_url
31                 self.config['keystone_tenant_name'] = tenant_name
32
33         def set_flavor_id(self, flavor_id):
34                 self.config['flavor_id'] = flavor_id
35
36         def set_image_id(self, image_id):
37                 self.config['image_id'] = image_id
38
39         def set_external_network_name(self, external_network_name):
40                 self.config['external_network_name'] = external_network_name
41
42         def set_ssh_user(self, ssh_user):
43                 self.config['ssh_user'] = ssh_user
44
45         def set_logger(self, logger):
46                 self.logger = logger
47
48         def download_manager_blueprint(self, manager_blueprint_url, manager_blueprint_branch):
49                 if self.manager_blueprint:
50                         if self.logger:
51                                 self.logger.info("cloudify manager server blueprint is already downloaded !")
52                 else:
53                         if self.logger:
54                                 self.logger.info("Downloading the cloudify manager server blueprint")
55                         download_result = download_blueprints(manager_blueprint_url, manager_blueprint_branch, self.blueprint_dir)
56
57                         if not download_result:
58                                 if self.logger:
59                                         self.logger.error("Failed to download manager blueprint")
60                                 exit(-1)
61                         else:
62                                 self.manager_blueprint = True
63
64         def manager_up(self):
65                 return manager_up
66
67         def deploy_manager(self):
68                 if self.manager_blueprint:
69                         if self.logger:
70                                 self.logger.info("Writing the inputs file")
71                         with open( self.blueprint_dir + "inputs.yaml", "w") as f:
72                                 f.write(yaml.dump(self.config, default_style='"') )
73                         f.close()
74
75                         if self.logger:
76                                 self.logger.info("Launching the cloudify-manager deployment")
77                         script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
78                         script += "cd " + self.testcase_dir + "; "
79                         script += "cfy init -r; "
80                         script += "cd cloudify-manager-blueprint; "
81                         script += "cfy local create-requirements -o requirements.txt -p openstack-manager-blueprint.yaml; "
82                         script += "pip install -r requirements.txt; "
83                         script += "cfy bootstrap --install-plugins -p openstack-manager-blueprint.yaml -i inputs.yaml; "
84                         cmd = "/bin/bash -c '" + script + "'"
85                         execute_command(cmd, self.logger)
86
87                         if self.logger:
88                                 self.logger.info("Cloudify-manager server is UP !")
89
90                         self.manager_up = True
91
92         def undeploy_manager(self):
93                 if self.logger:
94                         self.logger.info("Launching the cloudify-manager undeployment")
95
96                 self.manager_up = False
97
98                 script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
99                 script += "cd " + self.testcase_dir + "; "
100                 script += "cfy teardown -f; "
101                 cmd = "/bin/bash -c '" + script + "'"
102                 execute_command(cmd, self.logger)
103
104                 if self.logger:
105                         self.logger.info("Cloudify-manager server has been successfully removed!")
106
107         def download_upload_and_deploy_blueprint(self, blueprint, config, bp_name, dep_name):
108                 if self.logger:
109                         self.logger.info("Downloading the {0} blueprint".format(blueprint['file_name']))
110                 download_result = download_blueprints(blueprint['url'], blueprint['branch'],
111                                                                                                   self.testcase_dir + blueprint['destination_folder'])
112
113                 if not download_result:
114                         if self.logger:
115                                 self.logger.error("Failed to download blueprint {0}".format(blueprint['file_name']))
116                         exit(-1)
117
118                 if self.logger:
119                         self.logger.info("Writing the inputs file")
120                 with open(self.testcase_dir + blueprint['destination_folder'] + "/inputs.yaml", "w") as f:
121                         f.write(yaml.dump(config, default_style='"') )
122                 f.close()
123
124                 if self.logger:
125                         self.logger.info("Launching the {0} deployment".format(bp_name))
126                 script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
127                 script += "cd " + self.testcase_dir + blueprint['destination_folder'] + "; "
128                 script += "cfy blueprints upload -b " + bp_name + " -p openstack-blueprint.yaml; "
129                 script += "cfy deployments create -b " + bp_name  + " -d " + dep_name + " --inputs inputs.yaml; "
130                 script += "cfy executions start -w install -d " + dep_name + " --timeout 1800; "
131
132                 cmd = "/bin/bash -c '" + script + "'"
133                 execute_command(cmd, self.logger)
134
135                 if self.logger:
136                         self.logger.info("The deployment of {0} is ended".format(dep_name))
137
138         def undeploy_deployment(self, dep_name):
139                 if self.logger:
140                         self.logger.info("Launching the {0} undeployment".format(dep_name))
141                 script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
142                 script += "cd " + self.testcase_dir + "; "
143                 script += "cfy executions start -w uninstall -d " + dep_name + " --timeout 1800 ; "
144                 script += "cfy deployments delete -d " + dep_name + "; "
145
146                 cmd = "/bin/bash -c '" + script + "'"
147                 execute_command(cmd, self.logger)
148
149
150 def execute_command(cmd, logger):
151         """
152         Execute Linux command
153         """
154         if logger:
155                 logger.debug('Executing command : {}'.format(cmd))
156         output_file = "output.txt"
157         f = open(output_file, 'w+')
158         p = subprocess.call(cmd, shell=True, stdout=f, stderr=subprocess.STDOUT)
159         f.close()
160         f = open(output_file, 'r')
161         result = f.read()
162         if result != "" and logger:
163                 logger.debug(result)
164         if p == 0:
165                 return True
166         else:
167                 if logger:
168                         logger.error("Error when executing command %s" % cmd)
169                 exit(-1)
170
171
172 def download_blueprints(blueprint_url, branch, dest_path):
173         if os.path.exists(dest_path):
174                 shutil.rmtree(dest_path)
175         try:
176                 Repo.clone_from(blueprint_url, dest_path, branch=branch)
177                 return True
178         except:
179                 return False