summaryrefslogtreecommitdiffstats
path: root/src/build/tools/sbeCmvcUtility.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/build/tools/sbeCmvcUtility.py')
-rwxr-xr-xsrc/build/tools/sbeCmvcUtility.py570
1 files changed, 570 insertions, 0 deletions
diff --git a/src/build/tools/sbeCmvcUtility.py b/src/build/tools/sbeCmvcUtility.py
new file mode 100755
index 00000000..793029af
--- /dev/null
+++ b/src/build/tools/sbeCmvcUtility.py
@@ -0,0 +1,570 @@
+#!/usr/bin/python
+# IBM_PROLOG_BEGIN_TAG
+# This is an automatically generated prolog.
+#
+# $Source: src/build/tools/sbeCmvcUtility.py $
+#
+# OpenPOWER sbe Project
+#
+# Contributors Listed Below - COPYRIGHT 2016
+#
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+# IBM_PROLOG_END_TAG
+'''
+###########################################################
+# @file sbeCmvcUtility.py
+# @author: George Keishing <gkeishin@in.ibm.com>
+# Sangeetha TS <sangeet2@in.ibm.com>
+# @brief Utilility Module to support CMVC operation
+#
+# Created on March 03, 2016
+# ----------------------------------------------------
+# @version Developer Date Description
+# ----------------------------------------------------
+# 1.0 gkeishin 03/03/16 Initial create
+###########################################################
+'''
+
+#-------------------------
+# Imports
+#-------------------------
+import os, sys
+import time
+import os.path
+import subprocess
+import shutil
+import hashlib
+from subprocess import Popen, PIPE
+from os.path import expanduser # for getting $HOME PATH
+import stat # for File permission op
+
+# Libraries/utility funcs and user define const
+import sbeCmvcConstants as errorcode
+
+
+##########################################################################
+# Function : utilCmvcChangeDir
+#
+# @param i_cmvcnum : CMVC defect or Feature number
+#
+# @brief Create a directory
+#
+##########################################################################
+def utilCmvcChangeDir(i_cmvcnum):
+ l_home_path= expanduser("~") + "/" + errorcode.CMVC_DIR_CREATE + i_cmvcnum
+
+ print " Sandbox path\t: ",l_home_path
+ cmd='mkdir -p ' + l_home_path
+ os.system(cmd)
+ os.chdir(l_home_path)
+
+##########################################################################
+# Function :utilCmvcRepoPath
+#
+# @param i_cmvcnum : CMVC defect or Feature number
+#
+# @param i_pathname : SBE repo Path location
+#
+# @param i_filename : Files to be copied
+#
+# @brief find the files in repo
+#
+##########################################################################
+def utilCmvcRepoPath(i_pathname, i_cmvcnum, i_filename):
+ l_home_path= expanduser("~") + "/" + errorcode.CMVC_DIR_CREATE + i_cmvcnum
+ # Strip the last string from the file path input
+
+ print " Sandbox path\t: ",l_home_path
+ print " SBE Repo path\t: ",i_pathname
+
+ if i_filename == "None":
+ i_filename = errorcode.CMVC_FILE_LIST
+
+ for l_filename in i_filename.split(","):
+
+ # Find the files and copy
+ l_sb_path = utilFindFile(l_filename,l_home_path)
+ l_repo_path = utilFindFile(l_filename,i_pathname)
+
+ if l_sb_path is None :
+ print " ERROR: Checked out sandbox does not contain " + l_filename
+ return errorcode.ERROR_CMVC_FILE_COPY
+ if l_repo_path is None :
+ print " ERROR: File Not Found in SBE repo " + l_filename
+ return errorcode.ERROR_CMVC_FILE_COPY
+
+ cp_cmd = 'cp ' + l_repo_path + ' ' + l_sb_path
+ rc=os.system(cp_cmd )
+ if rc:
+ return errorcode.ERROR_CMVC_FILE_COPY
+ else:
+ # validate the copied files via hashing
+ l_src = l_repo_path
+ l_dest = l_sb_path
+ hash_err = utilCheckFileHash(l_src,l_dest)
+ if hash_err == errorcode.ERROR_HASH_CHECK:
+ return hash_err
+
+ # Returned success
+ return errorcode.SUCCESS_EXIT
+
+##########################################################################
+# Function :utilFindFile
+#
+# @param i_filename : File Name
+#
+# @param i_path : Directory to search in
+#
+# @brief Finds a given file and returns the absoulte path
+#
+##########################################################################
+def utilFindFile(i_filename, i_path):
+ for root, dirs, files in os.walk(i_path):
+ if i_filename in files:
+ return os.path.join(root, i_filename)
+
+##########################################################################
+# Function :utilFindFilePPE
+#
+# @param i_filename : File Name
+#
+# @param i_path : Directory to search in
+#
+# @brief Finds a given file ins PPE repo and returns the absoulte path
+#
+##########################################################################
+def utilFindFilePPE(i_filename, i_path, i_sandbox_name):
+ for root, dirs, files in os.walk(i_path):
+ if i_filename in files:
+ # Ignore the test sandbox files in the PPE
+ if not i_sandbox_name in root:
+ return os.path.join(root, i_filename)
+ # Consider the path, if the repository is contanied in the sandbox
+ else:
+ if i_sandbox_name in i_path:
+ return os.path.join(root, i_filename)
+
+##########################################################################
+# Function :utilCmvcCheckout
+#
+# @param i_filename : File Name
+#
+# @param i_release : Fips FW Release to checkout (ex: fips910 )
+#
+# @param i_cmvcnum : CMVC defect or Feature number
+#
+# @brief Check out a given file
+#
+##########################################################################
+def utilCmvcCheckout(i_filename, i_release, i_cmvcnum):
+ print " File Name\t: ",i_filename
+ print " Release\t: ",i_release
+
+ # The file simics.tar is not unique so provide the relative path
+ if i_filename == "simics.tar":
+ i_filename = 'src/sbei/sbfw/simics.tar'
+
+ print " CMVC #\t: ",i_cmvcnum[1:]
+ l_home_path= expanduser("~") + "/" + errorcode.CMVC_DIR_CREATE + i_cmvcnum
+
+ cmd='File -checkout ' + i_filename + ' -release '+ i_release + ' -relative ' + l_home_path
+ if i_cmvcnum[:1] == "D":
+ cmd += ' -defect ' + i_cmvcnum[1:]
+ else:
+ cmd += ' -feature ' + i_cmvcnum[1:]
+
+ print " Executing\t: ", cmd
+ rc = os.system(cmd)
+ if rc:
+ # rc 256 File not found in CMVC
+ if rc == 256:
+ print " * File was not found or Error operation in CMVC"
+ return errorcode.ERROR_CMVC_CHECKOUT
+ else:
+ return errorcode.SUCCESS_CMVC_CHECKOUT
+
+
+##########################################################################
+# Function :utilCmvcCheckin
+#
+# @param i_filename : Relative Path of the File
+#
+# @param i_release : Fips FW Release to checkout (ex: fips910 )
+#
+# @param i_cmvcnum : CMVC defect or Feature number
+#
+# @brief Check in a given file
+#
+##########################################################################
+def utilCmvcCheckin(i_filename, i_release, i_cmvcnum):
+ print " File Name\t: ",i_filename
+ print " Release\t: ",i_release
+ print " CMVC #\t: ",i_cmvcnum[1:]
+
+ l_home_path= expanduser("~") + "/" + errorcode.CMVC_DIR_CREATE + i_cmvcnum
+ l_base_path = utilFindFile(i_filename,l_home_path)
+ # This will give the ablsolute path, strip it from src
+ for l_var in l_base_path.split("/src"):
+ if i_filename in l_var:
+ l_str = 'src' + l_var
+
+ cmd='File -checkin ' + l_str + ' -release '+ i_release + ' -relative ' + l_home_path
+ if i_cmvcnum[:1] == "D":
+ cmd += ' -defect ' + i_cmvcnum[1:]
+ else:
+ cmd += ' -feature ' + i_cmvcnum[1:]
+
+ print " Executing\t: ", cmd
+ rc = os.system(cmd)
+ if rc:
+ return errorcode.ERROR_CMVC_CHECKIN
+ else:
+ return errorcode.SUCCESS_CMVC_CHECKIN
+
+
+##########################################################################
+# Function :utilCmvcFixComplete
+#
+# @param i_cmvcnum : CMVC defect or Feature number
+#
+# @param i_release : Fips Release string
+#
+# @brief Fix the record to complete
+#
+##########################################################################
+def utilCmvcFixComplete(i_cmvcnum, i_release):
+ print " CMVC #\t: ",i_cmvcnum
+ l_cmvcnum =i_cmvcnum[1:]
+
+ if i_cmvcnum[:1] == "D":
+ cmd='Fix -complete ' + ' -defect ' + l_cmvcnum + ' -r ' + i_release + ' -component esw_sbei'
+ else:
+ cmd='Fix -complete ' + ' -feature ' + l_cmvcnum + ' -r ' + i_release + ' -component esw_sbei'
+
+ print " Executing\t: ", cmd
+ rc = os.system(cmd)
+ if rc:
+ return errorcode.ERROR_CMVC_FIX_RECORD
+ else:
+ return errorcode.SUCCESS_CMVC_FIX_RECORD
+
+##########################################################################
+# Function :utilCheckTrackState
+#
+# @param i_cmvcnum : CMVC defect or Feature number
+#
+# @param i_release : Fips Release string
+#
+# @brief Check if the track is in fix state or not
+#
+##########################################################################
+def utilCheckTrackState(i_cmvcnum, i_release):
+ print " CMVC #\t: ",i_cmvcnum
+ print " Release\t: ",i_release
+
+ l_cmvcnum =i_cmvcnum[1:]
+ cmd = 'Track -view -release ' + i_release
+ if i_cmvcnum[:1] == "D":
+ cmd += ' -defect ' + l_cmvcnum
+ else:
+ cmd += ' -feature ' + l_cmvcnum
+ cmd += ' | grep state '
+
+ print " Executing\t: ", cmd
+ ex_cmd = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+ for line in ex_cmd.stdout :
+ if not line: continue
+ line = line.strip()
+ if "fix" in line :
+ return errorcode.SUCCESS_TRACK_STATE
+ return errorcode.ERROR_TRACK_STATE
+
+##########################################################################
+# Function :utilCheckFileHash
+#
+# @param i_src : Source location of the file to be copy from
+#
+# @param i_dest : Destination location of the file to be copied to
+#
+# @brief Make sure after copying files, the hash matches
+#
+##########################################################################
+def utilCheckFileHash(i_src, i_dest):
+ print " Source\t: ",i_src
+ print " Destination\t: ",i_dest
+
+ sha_orig = hashlib.sha256()
+ sha_orig.update(file(i_src).read())
+ orig_hash=sha_orig.hexdigest()
+ print " * Orig Hash\t [ %s : %s ] "% (os.path.basename(i_src),orig_hash)
+
+ sha_copy = hashlib.sha256()
+ sha_copy.update(file(i_dest).read())
+ copied_hash=sha_copy.hexdigest()
+ print " * Copied Hash\t [ %s : %s ] "% (os.path.basename(i_dest),copied_hash)
+
+ if orig_hash == copied_hash:
+ print " -> Hash Match .. Continue\n"
+ return errorcode.SUCCESS_HASH_CHECK
+ else:
+ print " Mismatch Hash.. Abort"
+ return errorcode.ERROR_HASH_CHECK
+
+##########################################################################
+# Function :utilRollBack
+#
+# @param i_action : Undo Checkout or checkin
+#
+# @param i_cmvcnum : CMVC defect or Feature number
+#
+# @param i_release : Fips FW Release to checkout (ex: fips910 )
+#
+# @brief Brute force undo of all files
+#
+##########################################################################
+def utilRollBack(i_action, i_cmvcnum, i_release):
+ print "\n * Action request\t: ",i_action
+ if i_action == "checkin":
+ print " * Undoing All default File list"
+ if i_cmvcnum[:1] == "D":
+ cmd = 'File -undo ' + errorcode.CMVC_FILE_UNDO_LIST + ' -release ' + i_release + ' -defect ' + i_cmvcnum[1:] + ' >/dev/null 2>&1'
+ else:
+ cmd = 'File -undo ' + errorcode.CMVC_FILE_UNDO_LIST + ' -release ' + i_release + ' -feature ' + i_cmvcnum[1:] + ' >/dev/null 2>&1'
+ else:
+ print " * Unlocking All default Files list"
+ if i_cmvcnum[:1] == "D":
+ cmd = 'File -unlock ' + errorcode.CMVC_FILE_UNDO_LIST + ' -release ' + i_release + ' >/dev/null 2>&1'
+ else:
+ cmd = 'File -unlock ' + errorcode.CMVC_FILE_UNDO_LIST + ' -release ' + i_release + ' >/dev/null 2>&1'
+
+ #print " Executing : ", cmd
+ rc = os.system(cmd)
+ # CMVC throws this rc even if its successfull
+ if rc != 1024 and rc !=0:
+ print "\n Error [ %s ] in Undoing/Unlocking Files.. Please check manually"%rc
+ else:
+ print "\n Roll Back Successfull.. Please Revisit your inputs [ OK ] "
+
+
+##########################################################################
+# Function :utilTriggerJenkins
+#
+# @param i_cmvcnum : CMVC defect or Feature number
+#
+# @param i_release : Fips FW Release to checkout (ex: fips910 )
+#
+# @param i_bvt : Fips BVT xml file
+#
+# @brief Trigger Jenkins CI job
+#
+##########################################################################
+def utilTriggerJenkins(i_cmvcnum,i_release,i_bvt):
+ print " Jenkins job for %s" % i_cmvcnum
+ #PATH : /afs/austin.ibm.com/projects/esw/bin/fsp-CI-jenkins
+ cmd = "fsp-CI-jenkins -r " + i_release + " -t " + i_cmvcnum[1:] + " --test_on_hardware=y"
+ if not i_bvt == "None" :
+ cmd += " -b " + i_bvt
+ rc = os.system(cmd)
+ if rc :
+ return errorcode.ERROR_CI_TRIGGER
+ else :
+ return errorcode.SUCCESS_CI_TRIGGER
+
+
+##########################################################################
+# Function :utilCopyFileToSandbox
+#
+# @param i_pathname : SBE repo Path location
+#
+# @param i_sandboxname : Sandbox repo Path location
+#
+# @param i_filename : Files to be copied
+#
+# @brief find the files in repo and copy to the sandbox
+#
+##########################################################################
+def utilCopyFileToSandbox(i_pathname,i_sandboxname,i_filename):
+
+ print "\n *** For Development *** \n"
+ print " Sandbox path\t: ",i_sandboxname
+ print " SBE Repo path\t: ",i_pathname
+ print "\n"
+
+ if i_filename == "None":
+ i_filename = errorcode.CMVC_FILE_LIST
+ #print " No User supplied Files to copy"
+ #return errorcode.ERROR_FILE_INPUT
+
+ for l_filename in i_filename.split(","):
+ # Find the files and copy
+ l_sandbox_name = os.path.basename(i_sandboxname)
+ l_repo_path = utilFindFilePPE(l_filename,i_pathname,l_sandbox_name)
+ if l_repo_path is None :
+ print " File [ %s ] not found in Repo..\t Check your repo and retry "%l_filename
+ return errorcode.ERROR_CMVC_FILE_COPY
+ else:
+ for files in errorcode.FILE_LOOKUP_LIST.split(","):
+ if l_filename in files:
+ break
+
+ # Append this src path and to the sanbox base and copy the file
+ sb_cp_path = i_sandboxname + '/' + files
+
+ # Check if this path exist in the sandbox , if not create and copy
+ if os.path.exists(sb_cp_path) == False:
+ cmd='mkdir -p ' + os.path.dirname(sb_cp_path)
+ #print " Creating dir %s "%cmd
+ os.system(cmd)
+
+ # Copy the file
+ copy_cmd = 'cp -rf ' + l_repo_path + ' ' + sb_cp_path
+ rc = os.system(copy_cmd)
+ if rc:
+ print " RC code :",rc
+ print " ERROR : Copying file : ",copy_cmd
+ return errorcode.ERROR_CMVC_FILE_COPY
+ else:
+ print " Copied file : ",copy_cmd
+
+ return errorcode.SUCCESS_DEV_EXIT
+
+
+##########################################################################
+# Function :utilppeSbENV
+#
+# @param i_env_key : ENV paramter
+#
+# @brief find the PPE Repo path from ENV and returns the path string
+#
+##########################################################################
+def utilppeSbENV(i_env_key):
+ #-----------------------------------------------------------
+ # SBEROOT=/gsa/ausgsa/projects/i/indiateam04/gkeishin/PPE_CHANGES
+ #-----------------------------------------------------------
+ l_found_ppe_conf = False
+ env_ppe_path="None"
+ for key in os.environ.keys():
+ if i_env_key in key:
+ #print "\t %s : %s" % (key,os.environ[key])
+ env_ppe_path = os.environ[key]
+ l_found_ppe_conf = True
+
+ if l_found_ppe_conf == False:
+ print " ---------------------------------------------------------"
+ print " | [ ERROR SETTING ] : The PPE Repository ENV is not set |"
+ print " | Please do ./sb workon to set/load the PPE repo ENV |"
+ print " ---------------------------------------------------------"
+
+ return env_ppe_path
+
+##########################################################################
+# Function : utilFind_sb_base
+#
+# @param i_sb_name : Sandbox name
+#
+# @brief find the sandbox base path
+#
+##########################################################################
+def utilFind_sb_base(i_sb_name):
+ out_str= "None"
+
+ # workon -m ppc sbeisb -c 'env | grep SANDBOXBASE'
+ find_sb_base = 'workon -m ppc ' + i_sb_name + " -c 'env | grep SANDBOXBASE ' | grep SANDBOXBASE"
+
+ # SANDBOXBASE=/gsa/ausgsa/projects/i/indiateam04/gkeishin/sbeisb
+ out_str = os.popen(find_sb_base).read()
+
+ if not out_str:
+ return "None"
+ else:
+ return out_str.strip('SANDBOXBASE=')
+
+##########################################################################
+# Function : utilFind_sb_rc
+#
+# @param i_sb_name : Sandbox RC path
+#
+# @brief find the sandbox RC path
+#
+##########################################################################
+def utilFind_sb_rc(i_sb_name):
+ out_str= "None"
+
+ # workon -m ppc sbeisb -c 'env | grep SANDBOXRC'
+ find_sb_rc = 'workon -m ppc ' + i_sb_name + " -c 'env | grep SANDBOXRC ' | grep SANDBOXRC"
+ # SANDBOXRC=/gsa/ausgsa/projects/i/indiateam04/gkeishin/.sandboxrc
+ out_str = os.popen(find_sb_rc).read()
+
+ if not out_str:
+ return "None"
+ else:
+ return os.path.dirname(out_str.strip('SANDBOXRC='))
+
+##########################################################################
+# Function : utilFind_ENV_string
+#
+# @param i_env_name : ENV string
+#
+# @brief find the ENV string set in the env
+#
+##########################################################################
+def utilFind_ENV_string(i_env_name):
+ out_str= "None"
+
+ find_env_name = "env | grep " + i_env_name
+
+ out_str = os.popen(find_env_name).read()
+
+ if not out_str:
+ return "None"
+ else:
+ # Strip string
+ l_strip=i_env_name +"="
+ return out_str.strip(l_strip)
+
+##########################################################################
+# Function : utilWriteShell_hooks
+#
+# @param i_sandbox_path : Sandbox full path
+#
+# @brief find the ENV string set in the env
+#
+##########################################################################
+def utilWriteShell_hooks(i_sandbox_path):
+ # Write the compile shell hook on the fips sandbox location
+ hook_file=i_sandbox_path + '/src/compilesb'
+ f = open(hook_file,'w')
+
+ # compilesb: This hook schell script will look like this
+ #
+ # #!/bin/sh
+ # cd /gsa/ausgsa/projects/i/indiateam04/gkeishin/sbeisb/src/sbei/sbfw/
+ # mk -a
+ # mk install_all
+
+ f.write('#!/bin/sh \n')
+ cd_cmd= 'cd ' + i_sandbox_path + '/src/sbei/sbfw/'
+ f.write(cd_cmd)
+ f.write('\n')
+ f.write('mk -a || exit -1 \n')
+ f.write('mk install_all || exit -1\n')
+ f.close()
+
+ # Change the file permission for execute
+ perm_st = os.stat(hook_file)
+ os.chmod(hook_file, perm_st.st_mode | stat.S_IEXEC)
+
+ return hook_file # path of the shell file
+
OpenPOWER on IntegriCloud