Merge "Update tempest.conf to enable tempest from external server"
[functest.git] / functest / opnfv_tests / vnf / ims / orchestrator_cloudify.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
14 import os
15 import shutil
16 import subprocess32 as subprocess
17 import yaml
18
19 from git import Repo
20
21 import functest.utils.functest_logger as ft_logger
22
23
24 class Orchestrator(object):
25
26     def __init__(self, testcase_dir, inputs={}):
27         self.testcase_dir = testcase_dir
28         self.blueprint_dir = testcase_dir + 'cloudify-manager-blueprint/'
29         self.input_file = 'inputs.yaml'
30         self.manager_blueprint = False
31         self.config = inputs
32         self.logger = ft_logger.Logger("Orchestrator").getLogger()
33         self.manager_up = False
34
35     def set_credentials(self, username, password, tenant_name, auth_url):
36         self.config['keystone_username'] = username
37         self.config['keystone_password'] = password
38         self.config['keystone_url'] = auth_url
39         self.config['keystone_tenant_name'] = tenant_name
40
41     def set_flavor_id(self, flavor_id):
42         self.config['flavor_id'] = flavor_id
43
44     def set_image_id(self, image_id):
45         self.config['image_id'] = image_id
46
47     def set_external_network_name(self, external_network_name):
48         self.config['external_network_name'] = external_network_name
49
50     def set_ssh_user(self, ssh_user):
51         self.config['ssh_user'] = ssh_user
52
53     def set_nova_url(self, nova_url):
54         self.config['nova_url'] = nova_url
55
56     def set_neutron_url(self, neutron_url):
57         self.config['neutron_url'] = neutron_url
58
59     def set_nameservers(self, nameservers):
60         if 0 < len(nameservers):
61             self.config['dns_subnet_1'] = nameservers[0]
62
63     def download_manager_blueprint(self, manager_blueprint_url,
64                                    manager_blueprint_branch):
65         if self.manager_blueprint:
66             self.logger.info(
67                 "cloudify manager server blueprint is "
68                 "already downloaded !")
69         else:
70             self.logger.info(
71                 "Downloading the cloudify manager server blueprint")
72             download_result = self._download_blueprints(
73                 manager_blueprint_url,
74                 manager_blueprint_branch,
75                 self.blueprint_dir)
76
77             if not download_result:
78                 self.logger.error("Failed to download manager blueprint")
79                 exit(-1)
80             else:
81                 self.manager_blueprint = True
82
83     def manager_up(self):
84         return self.manager_up
85
86     def deploy_manager(self):
87         if self.manager_blueprint:
88             self.logger.info("Writing the inputs file")
89             with open(self.blueprint_dir + "inputs.yaml", "w") as f:
90                 f.write(yaml.dump(self.config, default_style='"'))
91             f.close()
92
93             # Ensure no ssh key file already exists
94             key_files = ["/.ssh/cloudify-manager-kp.pem",
95                          "/.ssh/cloudify-agent-kp.pem"]
96             home = os.path.expanduser("~")
97
98             for key_file in key_files:
99                 if os.path.isfile(home + key_file):
100                     os.remove(home + key_file)
101
102             self.logger.info("Launching the cloudify-manager deployment")
103             script = "set -e; "
104             script += ("source " + self.testcase_dir +
105                        "venv_cloudify/bin/activate; ")
106             script += "cd " + self.testcase_dir + "; "
107             script += "cfy init -r; "
108             script += "cd cloudify-manager-blueprint; "
109             script += ("cfy local create-requirements -o requirements.txt " +
110                        "-p openstack-manager-blueprint.yaml; ")
111             script += "pip install -r requirements.txt; "
112             script += ("cfy bootstrap --install-plugins " +
113                        "-p openstack-manager-blueprint.yaml -i inputs.yaml; ")
114             cmd = "/bin/bash -c '" + script + "'"
115             error = execute_command(cmd, self.logger)
116             if error:
117                 self.logger.error("Failed to deploy cloudify-manager")
118                 return error
119
120             self.logger.info("Cloudify-manager server is UP !")
121
122             self.manager_up = True
123
124     def undeploy_manager(self):
125         self.logger.info("Launching the cloudify-manager undeployment")
126
127         self.manager_up = False
128
129         script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
130         script += "cd " + self.testcase_dir + "; "
131         script += "cfy teardown -f --ignore-deployments; "
132         cmd = "/bin/bash -c '" + script + "'"
133         execute_command(cmd, self.logger)
134
135         self.logger.info(
136             "Cloudify-manager server has been successfully removed!")
137
138     def download_upload_and_deploy_blueprint(self, blueprint, config,
139                                              bp_name, dep_name):
140         self.logger.info("Downloading the {0} blueprint".format(
141             blueprint['file_name']))
142         destination_folder = os.path.join(self.testcase_dir,
143                                           blueprint['destination_folder'])
144         download_result = self._download_blueprints(blueprint['url'],
145                                                     blueprint['branch'],
146                                                     destination_folder)
147
148         if not download_result:
149             self.logger.error(
150                 "Failed to download blueprint {0}".
151                 format(blueprint['file_name']))
152             exit(-1)
153
154         self.logger.info("Writing the inputs file")
155
156         with open(self.testcase_dir + blueprint['destination_folder'] +
157                   "/inputs.yaml", "w") as f:
158             f.write(yaml.dump(config, default_style='"'))
159         f.close()
160
161         self.logger.info("Launching the {0} deployment".format(bp_name))
162         script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
163         script += ("cd " + self.testcase_dir +
164                    blueprint['destination_folder'] + "; ")
165         script += ("cfy blueprints upload -b " +
166                    bp_name + " -p openstack-blueprint.yaml; ")
167         script += ("cfy deployments create -b " + bp_name +
168                    " -d " + dep_name + " --inputs inputs.yaml; ")
169         script += ("cfy executions start -w install -d " +
170                    dep_name + " --timeout 1800; ")
171
172         cmd = "/bin/bash -c '" + script + "'"
173         error = execute_command(cmd, self.logger, 2000)
174         if error:
175             self.logger.error("Failed to deploy blueprint")
176             return error
177         self.logger.info("The deployment of {0} is ended".format(dep_name))
178
179     def undeploy_deployment(self, dep_name):
180         self.logger.info("Launching the {0} undeployment".format(dep_name))
181         script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; "
182         script += "cd " + self.testcase_dir + "; "
183         script += ("cfy executions start -w uninstall -d " + dep_name +
184                    " --timeout 1800 ; ")
185         script += "cfy deployments delete -d " + dep_name + "; "
186
187         cmd = "/bin/bash -c '" + script + "'"
188         try:
189             execute_command(cmd, self.logger)
190         except:
191             self.logger.error("Clearwater undeployment failed")
192
193     def _download_blueprints(self, blueprint_url, branch, dest_path):
194         if os.path.exists(dest_path):
195             shutil.rmtree(dest_path)
196         try:
197             Repo.clone_from(blueprint_url, dest_path, branch=branch)
198             return True
199         except:
200             return False
201
202
203 def execute_command(cmd, logger, timeout=1800):
204     """
205     Execute Linux command
206     """
207     if logger:
208         logger.debug('Executing command : {}'.format(cmd))
209     timeout_exception = False
210     output_file = "output.txt"
211     f = open(output_file, 'w+')
212     try:
213         p = subprocess.call(cmd, shell=True, stdout=f,
214                             stderr=subprocess.STDOUT, timeout=timeout)
215     except subprocess.TimeoutExpired:
216         timeout_exception = True
217         if logger:
218             logger.error("TIMEOUT when executing command %s" % cmd)
219         pass
220
221     f.close()
222     f = open(output_file, 'r')
223     result = f.read()
224     if result != "" and logger:
225         logger.debug(result)
226     if p == 0:
227         return False
228     else:
229         if logger and not timeout_exception:
230             logger.error("Error when executing command %s" % cmd)
231         f = open(output_file, 'r')
232         lines = f.readlines()
233         return lines[-5:]