blob: ddffe0847043dc3bf03c14c0cbf1500f42873161 [file] [log] [blame]
Saqib Khanfb1f6ae2017-04-26 13:24:41 -05001#!/usr/bin/env python
2
3r"""
4This module is the python counterpart to test_uploadimage.robot.
5"""
6
7import os
8import sys
9import re
10import string
11import tarfile
12import time
13
14robot_pgm_dir_path = os.path.dirname(__file__) + os.sep
15repo_lib_path = re.sub('/extended/', '/lib', robot_pgm_dir_path)
16repo_data_path = re.sub('/extended/', '/data', robot_pgm_dir_path)
17sys.path.append(repo_lib_path)
18sys.path.append(repo_data_path)
19
20import gen_robot_keyword as grk
21import gen_print as gp
22import variables as var
23from robot.libraries.BuiltIn import BuiltIn
24
25
26###############################################################################
27def get_latest_file(dir_path):
28
29 r"""
30 Get the path to the latest uploaded file.
31
32 Description of argument(s):
33 dir_path Path to the dir from which the name of the last
34 updated file or folder will be returned to the
35 calling function.
36 """
37
38 grk.run_key_u("Open Connection And Log In")
39 status, ret_values =\
40 grk.run_key("Execute Command On BMC cd " + dir_path
41 + "; stat -c '%Y %n' * | sort -k1,1nr | head -n 1", ignore=1)
42 return ret_values.split(" ")[-1]
43
44###############################################################################
45
46
47###############################################################################
48def get_version_tar(tar_file_path):
49
50 r"""
51 Read the image version from the MANIFEST inside the tarball.
52
53 Description of argument(s):
54 tar_file_path The path to a tar file that holds the image
55 version inside the MANIFEST.
56 """
57
58 tar = tarfile.open(tar_file_path)
59 for member in tar.getmembers():
60 f=tar.extractfile(member)
61 content=f.read()
62 if "version=" in content:
63 content = content.split("\n")
64 content = [x for x in content if "version=" in x]
65 version = content[0].split("=")[-1]
66 break
67 tar.close()
68 return version
69
70###############################################################################
71
72
73###############################################################################
74def get_image_version(file_path):
75
76 r"""
77 Read the file for a version object.
78
79 Description of argument(s):
80 file_path The path to a file that holds the image version.
81 """
82
83 grk.run_key_u("Open Connection And Log In")
84 status, ret_values =\
85 grk.run_key("Execute Command On BMC cat "
Saqib Khanbb8b63f2017-05-24 10:58:01 -050086 + file_path + " | grep \"version=\"", ignore=1)
87 return (ret_values.split("\n")[0]).split("=")[-1]
Saqib Khanfb1f6ae2017-04-26 13:24:41 -050088
89###############################################################################
90
91
92###############################################################################
93def get_image_purpose(file_path):
94
95 r"""
96 Read the file for a purpose object.
97
98 Description of argument(s):
99 file_path The path to a file that holds the image purpose.
100 """
101
102 grk.run_key_u("Open Connection And Log In")
103 status, ret_values =\
104 grk.run_key("Execute Command On BMC cat "
Saqib Khanbb8b63f2017-05-24 10:58:01 -0500105 + file_path + " | grep \"purpose=\"", ignore=1)
Saqib Khanfb1f6ae2017-04-26 13:24:41 -0500106 return ret_values.split("=")[-1]
107
108###############################################################################
109
110
111###############################################################################
112def get_image_path(image_version):
113
114 r"""
115 Query the upload image dir for the presence of image matching
116 the version that was read from the MANIFEST before uploading
117 the image. Based on the purpose verify the activation object
118 exists and is either READY or INVALID.
119
120 Description of argument(s):
121 image_version The version of the image that should match one
122 of the images in the upload dir.
123 """
124
Saqib Khanbb8b63f2017-05-24 10:58:01 -0500125 upload_dir = BuiltIn().get_variable_value("${upload_dir_path}")
Saqib Khanfb1f6ae2017-04-26 13:24:41 -0500126 grk.run_key_u("Open Connection And Log In")
127 status, image_list =\
128 grk.run_key("Execute Command On BMC ls -d " + upload_dir
129 + "*/")
130
131 image_list = image_list.split("\n")
132 retry = 0
133 while (retry < 10):
134 for i in range(0, len(image_list)):
135 version = get_image_version(image_list[i] + "MANIFEST")
136 if (version == image_version):
137 return image_list[i]
138 time.sleep(10)
139 retry += 1
140
141###############################################################################
142
143
144###############################################################################
145def verify_image_upload():
146
147 r"""
148 Verify the image was uploaded correctly and that it created
149 a valid d-bus object
150 """
151
Saqib Khanbb8b63f2017-05-24 10:58:01 -0500152 image_version = BuiltIn().get_variable_value("${image_version}")
Saqib Khanfb1f6ae2017-04-26 13:24:41 -0500153 image_path = get_image_path(image_version)
154 image_version_id = image_path.split("/")[-2]
Saqib Khanbb8b63f2017-05-24 10:58:01 -0500155 BuiltIn().set_global_variable("${version_id}", image_version_id)
Saqib Khanfb1f6ae2017-04-26 13:24:41 -0500156
157 grk.run_key_u("Open Connection And Log In")
158 image_purpose = get_image_purpose(image_path + "MANIFEST")
Saqib Khanbb8b63f2017-05-24 10:58:01 -0500159 if (image_purpose == var.VERSION_PURPOSE_BMC or
160 image_purpose == var.VERSION_PURPOSE_HOST):
George Keishingff1e3ec2017-07-20 01:58:21 -0500161 uri = var.SOFTWARE_VERSION_URI + image_version_id
Saqib Khanfb1f6ae2017-04-26 13:24:41 -0500162 status, ret_values =\
163 grk.run_key("Read Attribute " + uri + " Activation")
164
165 if ((ret_values == var.READY) or (ret_values == var.INVALID)
166 or (ret_values == var.ACTIVE)):
167 return True
168 else:
169 gp.print_var(ret_values)
170 return False
171 else:
Saqib Khanbb8b63f2017-05-24 10:58:01 -0500172 gp.print_var(image_purpose)
Saqib Khanfb1f6ae2017-04-26 13:24:41 -0500173 return False
174
175###############################################################################
Charles P. Hofer1d20acd2017-07-05 15:24:40 -0500176
177
178###############################################################################
179def verify_image_not_in_bmc_uploads_dir(image_version):
180
181 r"""
182 Check that an image with the given version is not unpacked inside of the
183 BMCs image uploads directory. If no image is found, retry every 30 seconds
184 for 3 minutes in case the BMC takes time unpacking the image.
185
186 Description of argument(s):
187 image_version The version of the image to look for on the BMC.
188 """
189
190 grk.run_key('Open Connection And Log In')
Charles P. Hofer346c0452017-07-14 15:29:50 -0500191 upload_dir_path = BuiltIn().get_variable_value("${upload_dir_path}")
Charles P. Hofer1d20acd2017-07-05 15:24:40 -0500192 for i in range(6):
193 stat, grep_res = grk.run_key('Execute Command On BMC '
194 + 'ls ' + upload_dir_path + '*/MANIFEST 2>/dev/null '
195 + '| xargs grep -rl "version=' + image_version + '"')
196 image_dir = os.path.dirname(grep_res.split('\n')[0])
197 if '' != image_dir:
198 grk.run_key('Execute Command On BMC rm -rf ' + image_dir)
199 BuiltIn().fail('Found invalid BMC Image: ' + image_dir)
200 time.sleep(30)
201
202###############################################################################