Tests for Downloading Image onto the BMC

- Upload images via REST
- Upload images via TFTP

Resolves openbmc/openbmc-test-automation#510

Change-Id: Id55f12d0d0354024c57ca929953b408e70876b40
Signed-off-by: Saqib Khan <khansa@us.ibm.com>
diff --git a/extended/test_uploadimage.py b/extended/test_uploadimage.py
new file mode 100644
index 0000000..44a0963
--- /dev/null
+++ b/extended/test_uploadimage.py
@@ -0,0 +1,173 @@
+#!/usr/bin/env python
+
+r"""
+This module is the python counterpart to test_uploadimage.robot.
+"""
+
+import os
+import sys
+import re
+import string
+import tarfile
+import time
+
+robot_pgm_dir_path = os.path.dirname(__file__) + os.sep
+repo_lib_path = re.sub('/extended/', '/lib', robot_pgm_dir_path)
+repo_data_path = re.sub('/extended/', '/data', robot_pgm_dir_path)
+sys.path.append(repo_lib_path)
+sys.path.append(repo_data_path)
+
+import gen_robot_keyword as grk
+import gen_print as gp
+import variables as var
+from robot.libraries.BuiltIn import BuiltIn
+
+
+###############################################################################
+def get_latest_file(dir_path):
+
+    r"""
+    Get the path to the latest uploaded file.
+
+    Description of argument(s):
+    dir_path    Path to the dir from which the name of the last
+                updated file or folder will be returned to the
+                calling function.
+    """
+
+    grk.run_key_u("Open Connection And Log In")
+    status, ret_values =\
+            grk.run_key("Execute Command On BMC  cd " + dir_path
+            + "; stat -c '%Y %n' * | sort -k1,1nr | head -n 1", ignore=1)
+    return ret_values.split(" ")[-1]
+
+###############################################################################
+
+
+###############################################################################
+def get_version_tar(tar_file_path):
+
+    r"""
+    Read the image version from the MANIFEST inside the tarball.
+
+    Description of argument(s):
+    tar_file_path    The path to a tar file that holds the image
+                     version inside the MANIFEST.
+    """
+
+    tar = tarfile.open(tar_file_path)
+    for member in tar.getmembers():
+        f=tar.extractfile(member)
+        content=f.read()
+        if "version=" in content:
+            content = content.split("\n")
+            content = [x for x in content if "version=" in x]
+            version = content[0].split("=")[-1]
+            break
+    tar.close()
+    return version
+
+###############################################################################
+
+
+###############################################################################
+def get_image_version(file_path):
+
+    r"""
+    Read the file for a version object.
+
+    Description of argument(s):
+    file_path    The path to a file that holds the image version.
+    """
+
+    grk.run_key_u("Open Connection And Log In")
+    status, ret_values =\
+            grk.run_key("Execute Command On BMC  cat "
+            + file_path + " | grep \"version=\"")
+    return ret_values.split("=")[-1]
+
+###############################################################################
+
+
+###############################################################################
+def get_image_purpose(file_path):
+
+    r"""
+    Read the file for a purpose object.
+
+    Description of argument(s):
+    file_path    The path to a file that holds the image purpose.
+    """
+
+    grk.run_key_u("Open Connection And Log In")
+    status, ret_values =\
+            grk.run_key("Execute Command On BMC  cat "
+            + file_path + " | grep \"purpose=\"")
+    return ret_values.split("=")[-1]
+
+###############################################################################
+
+
+###############################################################################
+def get_image_path(image_version):
+
+    r"""
+    Query the upload image dir for the presence of image matching
+    the version that was read from the MANIFEST before uploading
+    the image. Based on the purpose verify the activation object
+    exists and is either READY or INVALID.
+
+    Description of argument(s):
+    image_version    The version of the image that should match one
+                     of the images in the upload dir.
+    """
+
+    upload_dir = BuiltIn().get_variable_value("${UPLOAD_DIR_PATH}")
+    grk.run_key_u("Open Connection And Log In")
+    status, image_list =\
+            grk.run_key("Execute Command On BMC  ls -d " + upload_dir
+            + "*/")
+
+    image_list = image_list.split("\n")
+    retry = 0
+    while (retry < 10):
+        for i in range(0, len(image_list)):
+            version = get_image_version(image_list[i] + "MANIFEST")
+            if (version == image_version):
+                return image_list[i]
+        time.sleep(10)
+        retry += 1
+
+###############################################################################
+
+
+###############################################################################
+def verify_image_upload():
+
+    r"""
+    Verify the image was uploaded correctly and that it created
+    a valid d-bus object
+    """
+
+    image_version = BuiltIn().get_variable_value("${IMAGE_VERSION}")
+    image_path = get_image_path(image_version)
+    image_version_id = image_path.split("/")[-2]
+
+    grk.run_key_u("Open Connection And Log In")
+    image_purpose = get_image_purpose(image_path + "MANIFEST")
+    if (image_purpose == "bmc" or image_purpose == "host"):
+        uri = var.SOFTWARE_VERSION_URI + "/" + image_version_id
+        status, ret_values =\
+        grk.run_key("Read Attribute  " + uri + "  Activation")
+
+        if ((ret_values == var.READY) or (ret_values == var.INVALID)
+            or (ret_values == var.ACTIVE)):
+            return True
+        else:
+            gp.print_var(ret_values)
+            return False
+    else:
+        gp.print_var(versionPurpose)
+        return False
+
+###############################################################################