3 # jose.lausuch@ericsson.com
4 # valentin.boucher@orange.com
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
23 import functest.ci.tier_builder as tb
26 """ global variables """
27 REPOS_DIR = os.getenv('repos_dir')
28 FUNCTEST_REPO = ("%s/functest/" % REPOS_DIR)
31 # ----------------------------------------------------------
35 # -----------------------------------------------------------
36 def check_internet_connectivity(url='http://www.opnfv.org/'):
38 Check if there is access to the internet
41 urllib2.urlopen(url, timeout=5)
43 except urllib2.URLError:
47 def download_url(url, dest_path):
49 Download a file to a destination path given a URL
51 name = url.rsplit('/')[-1]
52 dest = dest_path + "/" + name
54 response = urllib2.urlopen(url)
55 except (urllib2.HTTPError, urllib2.URLError):
58 with open(dest, 'wb') as f:
59 shutil.copyfileobj(response, f)
63 # ----------------------------------------------------------
67 # -----------------------------------------------------------
68 def get_git_branch(repo_path):
72 repo = Repo(repo_path)
73 branch = repo.active_branch
77 def get_installer_type(logger=None):
79 Get installer type (fuel, apex, joid, compass)
82 installer = os.environ['INSTALLER_TYPE']
85 logger.error("Impossible to retrieve the installer type")
86 installer = "Unknown_installer"
91 def get_scenario(logger=None):
96 scenario = os.environ['DEPLOY_SCENARIO']
99 logger.error("Impossible to retrieve the scenario")
100 scenario = "Unknown_scenario"
105 def get_version(logger=None):
109 # Use the build tag to retrieve the version
110 # By default version is unknown
111 # if launched through CI the build tag has the following format
112 # jenkins-<project>-<installer>-<pod>-<job>-<branch>-<id>
113 # e.g. jenkins-functest-fuel-opnfv-jump-2-daily-master-190
114 # use regex to match branch info
115 rule = "daily-(.+?)-[0-9]*"
116 build_tag = get_build_tag(logger)
117 m = re.search(rule, build_tag)
124 def get_pod_name(logger=None):
126 Get PoD Name from env variable NODE_NAME
129 return os.environ['NODE_NAME']
133 "Unable to retrieve the POD name from environment. " +
134 "Using pod name 'unknown-pod'")
138 def get_build_tag(logger=None):
140 Get build tag of jenkins jobs
143 build_tag = os.environ['BUILD_TAG']
146 logger.error("Impossible to retrieve the build tag")
147 build_tag = "unknown_build_tag"
152 def get_db_url(logger=None):
156 with open(os.environ["CONFIG_FUNCTEST_YAML"]) as f:
157 functest_yaml = yaml.safe_load(f)
159 db_url = functest_yaml.get("results").get("test_db_url")
163 def push_results_to_db(project, case_name, logger,
164 start_date, stop_date, criteria, details):
166 POST results to the Result target DB
168 # Retrieve params from CI and conf
169 url = get_db_url(logger) + "/results"
170 installer = get_installer_type(logger)
171 scenario = get_scenario(logger)
172 version = get_version(logger)
173 pod_name = get_pod_name(logger)
174 build_tag = get_build_tag(logger)
176 params = {"project_name": project, "case_name": case_name,
177 "pod_name": pod_name, "installer": installer,
178 "version": version, "scenario": scenario, "criteria": criteria,
179 "build_tag": build_tag, "start_date": start_date,
180 "stop_date": stop_date, "details": details}
182 headers = {'Content-Type': 'application/json'}
184 r = requests.post(url, data=json.dumps(params), headers=headers)
189 print ("Error [push_results_to_db('%s', '%s', '%s', " +
190 "'%s', '%s', '%s', '%s', '%s', '%s')]:" %
191 (url, project, case_name, pod_name, version,
192 scenario, criteria, build_tag, details)), e
196 def get_resolvconf_ns():
198 Get nameservers from current resolv.conf
201 rconf = open("/etc/resolv.conf", "r")
202 line = rconf.readline()
204 ip = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", line)
205 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
207 result = sock.connect_ex((ip.group(), 53))
209 nameservers.append(ip.group())
210 line = rconf.readline()
214 def get_ci_envvars():
216 Get the CI env variables
219 "installer": os.environ.get('INSTALLER_TYPE'),
220 "scenario": os.environ.get('DEPLOY_SCENARIO')}
224 def execute_command(cmd, logger=None,
230 error_msg = ("The command '%s' failed." % cmd)
231 msg_exec = ("Executing command: '%s'" % cmd)
235 logger.info(msg_exec)
237 logger.debug(msg_exec)
240 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
242 line = p.stdout.readline().replace('\n', '')
253 if p.returncode != 0:
256 logger.error(error_msg)
265 def get_deployment_dir(logger=None):
267 Returns current Rally deployment directory
269 with open(os.environ["CONFIG_FUNCTEST_YAML"]) as f:
270 functest_yaml = yaml.safe_load(f)
272 deployment_name = functest_yaml.get("rally").get("deployment_name")
273 rally_dir = functest_yaml.get("general").get("directories").get(
275 cmd = ("rally deployment list | awk '/" + deployment_name +
277 p = subprocess.Popen(cmd, shell=True,
278 stdout=subprocess.PIPE,
279 stderr=subprocess.STDOUT)
280 deployment_uuid = p.stdout.readline().rstrip()
281 if deployment_uuid == "":
283 logger.error("Rally deployment not found.")
285 deployment_dir = (rally_dir + "/tempest/for-deployment-" +
287 return deployment_dir
290 def get_criteria_by_test(testname):
292 file = FUNCTEST_REPO + "/ci/testcases.yaml"
293 tiers = tb.TierBuilder("", "", file)
294 for tier in tiers.get_tiers():
295 for test in tier.get_tests():
296 if test.get_name() == testname:
297 criteria = test.get_criteria()