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