blob: e4ac71b0403eace2ee1d2bfacb95165c2413bca0 [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 "
86 + file_path + " | grep \"version=\"")
87 return ret_values.split("=")[-1]
88
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 "
105 + file_path + " | grep \"purpose=\"")
106 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
125 upload_dir = BuiltIn().get_variable_value("${UPLOAD_DIR_PATH}")
126 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
152 image_version = BuiltIn().get_variable_value("${IMAGE_VERSION}")
153 image_path = get_image_path(image_version)
154 image_version_id = image_path.split("/")[-2]
155
156 grk.run_key_u("Open Connection And Log In")
157 image_purpose = get_image_purpose(image_path + "MANIFEST")
158 if (image_purpose == "bmc" or image_purpose == "host"):
159 uri = var.SOFTWARE_VERSION_URI + "/" + image_version_id
160 status, ret_values =\
161 grk.run_key("Read Attribute " + uri + " Activation")
162
163 if ((ret_values == var.READY) or (ret_values == var.INVALID)
164 or (ret_values == var.ACTIVE)):
165 return True
166 else:
167 gp.print_var(ret_values)
168 return False
169 else:
170 gp.print_var(versionPurpose)
171 return False
172
173###############################################################################
Charles P. Hofer1d20acd2017-07-05 15:24:40 -0500174
175
176###############################################################################
177def verify_image_not_in_bmc_uploads_dir(image_version):
178
179 r"""
180 Check that an image with the given version is not unpacked inside of the
181 BMCs image uploads directory. If no image is found, retry every 30 seconds
182 for 3 minutes in case the BMC takes time unpacking the image.
183
184 Description of argument(s):
185 image_version The version of the image to look for on the BMC.
186 """
187
188 grk.run_key('Open Connection And Log In')
189 upload_dir_path = BuiltIn().get_variable_value("${UPLOAD_DIR_PATH}")
190 for i in range(6):
191 stat, grep_res = grk.run_key('Execute Command On BMC '
192 + 'ls ' + upload_dir_path + '*/MANIFEST 2>/dev/null '
193 + '| xargs grep -rl "version=' + image_version + '"')
194 image_dir = os.path.dirname(grep_res.split('\n')[0])
195 if '' != image_dir:
196 grk.run_key('Execute Command On BMC rm -rf ' + image_dir)
197 BuiltIn().fail('Found invalid BMC Image: ' + image_dir)
198 time.sleep(30)
199
200###############################################################################