Ensure no ssh key file already exists before launch cloudify deployment
[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                         # Ensure no ssh key file already exists
76                         key_files = ["/.ssh/cloudify-manager-kp.pem", "/.ssh/cloudify-agent-kp.pem"]
77             home = os.path.expanduser("~")
78
79             for key_file in key_files:
80                 if os.path.isfile(home + key_file):
81                     os.remove(home + key_file)
82
83             if self.logger:
84                                 self.logger.info("Launching the cloudify-manager deployment")
85
86                         script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
87                         script += "cd " + self.testcase_dir + "; "
88                         script += "cfy init -r; "
89                         script += "cd cloudify-manager-blueprint; "
90                         script += "cfy local create-requirements -o requirements.txt -p openstack-manager-blueprint.yaml; "
91                         script += "pip install -r requirements.txt; "
92                         script += "cfy bootstrap --install-plugins -p openstack-manager-blueprint.yaml -i inputs.yaml; "
93                         cmd = "/bin/bash -c '" + script + "'"
94                         execute_command(cmd, self.logger)
95
96                         if self.logger:
97                                 self.logger.info("Cloudify-manager server is UP !")
98
99                         self.manager_up = True
100
101         def undeploy_manager(self):
102                 if self.logger:
103                         self.logger.info("Launching the cloudify-manager undeployment")
104
105                 self.manager_up = False
106
107                 script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
108                 script += "cd " + self.testcase_dir + "; "
109                 script += "cfy teardown -f --ignore-deployments=True; "
110                 cmd = "/bin/bash -c '" + script + "'"
111                 execute_command(cmd, self.logger)
112
113                 if self.logger:
114                         self.logger.info("Cloudify-manager server has been successfully removed!")
115
116         def download_upload_and_deploy_blueprint(self, blueprint, config, bp_name, dep_name):
117                 if self.logger:
118                         self.logger.info("Downloading the {0} blueprint".format(blueprint['file_name']))
119                 download_result = download_blueprints(blueprint['url'], blueprint['branch'],
120                                                                                                   self.testcase_dir + blueprint['destination_folder'])
121
122                 if not download_result:
123                         if self.logger:
124                                 self.logger.error("Failed to download blueprint {0}".format(blueprint['file_name']))
125                         exit(-1)
126
127                 if self.logger:
128                         self.logger.info("Writing the inputs file")
129                 with open(self.testcase_dir + blueprint['destination_folder'] + "/inputs.yaml", "w") as f:
130                         f.write(yaml.dump(config, default_style='"') )
131                 f.close()
132
133                 if self.logger:
134                         self.logger.info("Launching the {0} deployment".format(bp_name))
135                 script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
136                 script += "cd " + self.testcase_dir + blueprint['destination_folder'] + "; "
137                 script += "cfy blueprints upload -b " + bp_name + " -p openstack-blueprint.yaml; "
138                 script += "cfy deployments create -b " + bp_name  + " -d " + dep_name + " --inputs inputs.yaml; "
139                 script += "cfy executions start -w install -d " + dep_name + " --timeout 1800; "
140
141                 cmd = "/bin/bash -c '" + script + "'"
142                 execute_command(cmd, self.logger)
143
144                 if self.logger:
145                         self.logger.info("The deployment of {0} is ended".format(dep_name))
146
147         def undeploy_deployment(self, dep_name):
148                 if self.logger:
149                         self.logger.info("Launching the {0} undeployment".format(dep_name))
150                 script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
151                 script += "cd " + self.testcase_dir + "; "
152                 script += "cfy executions start -w uninstall -d " + dep_name + " --timeout 1800 ; "
153                 script += "cfy deployments delete -d " + dep_name + "; "
154
155                 cmd = "/bin/bash -c '" + script + "'"
156                 try:
157                         execute_command(cmd, self.logger)
158                 except:
159                         logger.error("Clearwater undeployment failed")
160
161
162 def execute_command(cmd, logger):
163         """
164         Execute Linux command
165         """
166         if logger:
167                 logger.debug('Executing command : {}'.format(cmd))
168         output_file = "output.txt"
169         f = open(output_file, 'w+')
170         p = subprocess.call(cmd, shell=True, stdout=f, stderr=subprocess.STDOUT)
171         f.close()
172         f = open(output_file, 'r')
173         result = f.read()
174         if result != "" and logger:
175                 logger.debug(result)
176         if p == 0:
177                 return True
178         else:
179                 if logger:
180                         logger.error("Error when executing command %s" % cmd)
181                 exit(-1)
182
183
184 def download_blueprints(blueprint_url, branch, dest_path):
185         if os.path.exists(dest_path):
186                 shutil.rmtree(dest_path)
187         try:
188                 Repo.clone_from(blueprint_url, dest_path, branch=branch)
189                 return True
190         except:
191                 return False