From addeac649c86a6feee98448d19a2a7479fb68d2a Mon Sep 17 00:00:00 2001 From: jimliming Date: Wed, 31 May 2017 14:03:14 -0700 Subject: [PATCH 1/3] update ucsfirmware.py/def firmware_add_remote fixed example, and removed local filepath check. This is adding a remote source, so it fails when checking os.path.exists(filepath) --- ucsmsdk_samples/firmware/ucsfirmware.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ucsmsdk_samples/firmware/ucsfirmware.py b/ucsmsdk_samples/firmware/ucsfirmware.py index e7fa0d0..d1a6250 100755 --- a/ucsmsdk_samples/firmware/ucsfirmware.py +++ b/ucsmsdk_samples/firmware/ucsfirmware.py @@ -357,15 +357,10 @@ def firmware_add_remote(handle, file_name, remote_path, protocol, server, file_name="ucs-k9-bundle-c-series.2.2.5b.C.bin", remote_path="/home/imagedir", protocol="nfs", - server="10.65.1.2, + server="10.65.1.2", user="user", pwd="pwd") """ - file_path = os.path.join(remote_path, file_name) - - if not os.path.exists(file_path): - raise IOError("Image does not exist") - if protocol is not FirmwareDownloaderConsts.PROTOCOL_TFTP: if not user: raise ValueError("Provide user") From 81f9c43a11719884c17466c005aa24c1b4c6761f Mon Sep 17 00:00:00 2001 From: jimliming Date: Thu, 1 Jun 2017 11:04:54 -0700 Subject: [PATCH 2/3] Update ucsfirmware.py --- ucsmsdk_samples/firmware/ucsfirmware.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/ucsmsdk_samples/firmware/ucsfirmware.py b/ucsmsdk_samples/firmware/ucsfirmware.py index d1a6250..6b43920 100755 --- a/ucsmsdk_samples/firmware/ucsfirmware.py +++ b/ucsmsdk_samples/firmware/ucsfirmware.py @@ -52,6 +52,20 @@ def firmware_available(username, password, mdf_id_list=None, proxy=None): image_names = [image.image_name for image in images] return sorted(image_names) +def return_download_state(handle, file_name): + ''' + Returns Transfer Status of FirmwareDownloader object for a single download. + + Args: + handle (UcsHandle) + file_name (string): firmware image name + + Example: + return_download_status(handle, 'ucs-k9-bundle-infra.2.2.5b.A.bin') + ''' + download_state = (h.query_dn(dn='sys/fw-catalogue/dnld-%s' % file_name)).transfer_state + + return download_state def get_firmware_bundles(handle, bundle_type=None): """ @@ -350,7 +364,8 @@ def firmware_add_remote(handle, file_name, remote_path, protocol, server, FirmwareDownloader: Managed Object Raises: - ValueError if image not available or incorrect credential + ValueError if incorrect credential + IOError if file fails to download Example: firmware_add_remote(handle, @@ -383,6 +398,11 @@ def firmware_add_remote(handle, file_name, remote_path, protocol, server, handle.add_mo(firmware_downloader) # handle.set_dump_xml() handle.commit() + + time.sleep(5) + if return_download_state(handle, file_name) == 'failed': + raise IOError("File failed to download") + return firmware_downloader From d5a0da4a4b95e015fb1daa4fe359889ebfeab22b Mon Sep 17 00:00:00 2001 From: Jimla Date: Fri, 2 Jun 2017 15:36:16 -0700 Subject: [PATCH 3/3] collapsed functions, added better poll check. increased sleep so UCS has time to respond with a proper fail. Maybe watch until there is progress and timeout within a window? --- ucsmsdk_samples/firmware/ucsfirmware.py | 40 +++++++++++++++---------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/ucsmsdk_samples/firmware/ucsfirmware.py b/ucsmsdk_samples/firmware/ucsfirmware.py index 6b43920..02e9bb2 100755 --- a/ucsmsdk_samples/firmware/ucsfirmware.py +++ b/ucsmsdk_samples/firmware/ucsfirmware.py @@ -24,8 +24,11 @@ from ucsmsdk.mometa.firmware.FirmwareCatalogue import FirmwareCatalogue from ucsmsdk.mometa.firmware.FirmwareDownloader import FirmwareDownloader from ucsmsdk.mometa.firmware.FirmwareDownloader import FirmwareDownloaderConsts +from ucsmsdk.mometa.firmware.FirmwareDistributable import FirmwareDistributableConsts from ucsmsdk.mometa.firmware.FirmwareAck import FirmwareAckConsts +from ucsmsdk.ucsexception import UcsOperationError + log = logging.getLogger('ucs') @@ -52,20 +55,6 @@ def firmware_available(username, password, mdf_id_list=None, proxy=None): image_names = [image.image_name for image in images] return sorted(image_names) -def return_download_state(handle, file_name): - ''' - Returns Transfer Status of FirmwareDownloader object for a single download. - - Args: - handle (UcsHandle) - file_name (string): firmware image name - - Example: - return_download_status(handle, 'ucs-k9-bundle-infra.2.2.5b.A.bin') - ''' - download_state = (h.query_dn(dn='sys/fw-catalogue/dnld-%s' % file_name)).transfer_state - - return download_state def get_firmware_bundles(handle, bundle_type=None): """ @@ -376,6 +365,24 @@ def firmware_add_remote(handle, file_name, remote_path, protocol, server, user="user", pwd="pwd") """ + def return_download_state(handle, file_name): + ''' + Returns Transfer State of FirmwareDownloader object for a single download. + + Args: + handle (UcsHandle) + file_name (string): firmware image name + + Example: + return_download_state(handle, 'ucs-k9-bundle-infra.2.2.5b.A.bin') + ''' + download = handle.query_dn(dn='sys/fw-catalogue/dnld-%s' % file_name) + if download is None: + raise UcsOperationError("Query FirmwareDownloader", "None returned") + + download_state = download.transfer_state + return download_state + if protocol is not FirmwareDownloaderConsts.PROTOCOL_TFTP: if not user: raise ValueError("Provide user") @@ -399,8 +406,9 @@ def firmware_add_remote(handle, file_name, remote_path, protocol, server, # handle.set_dump_xml() handle.commit() - time.sleep(5) - if return_download_state(handle, file_name) == 'failed': + time.sleep(10) + if return_download_state(handle, file_name) == \ + FirmwareDistributableConsts.TRANSFER_STATE_FAILED: raise IOError("File failed to download") return firmware_downloader