def firmware_auto_install(handle, version, image_dir, infra_only=False, infra=True, blade=True, rack=False, require_user_confirmation=True): """ This will do end-to-end processing to update firmware on ucsm. Args: handle (UcsHandle) version (string): firmware version image_dir (string): image directory infra_only (bool): by default False. If set to True, will update firmware of FI only require_user_confirmation (bool): by default True. If False needs no user intervention. Returns: None Example: firmware_auto_install(handle, version="2.2.5b", image_dir="/home/imagedir") """ from ucsmsdk.ucseventhandler import UcsEventHandle try: bundle_map = get_firmware_file_names(version) bundles = [] cco_image_list = [] images_to_upload = [] if infra_only: bundles.append(bundle_map['A'][0]) else: if infra: bundles.append(bundle_map['A'][0]) if blade: bundles.append(bundle_map['B'][0]) if rack: bundles.append(bundle_map['C'][0]) for image in bundles: if not is_image_available_on_ucsm(handle, image): images_to_upload.append(image) for image in images_to_upload: log.debug("Checking if image file: '%s' is exist in local " "directory" % image) file_path = os.path.join(image_dir, image) if os.path.exists(file_path): log.debug("Image already exist in image directory ") else: cco_image_list.append(image) # if image not available raising exception to download if cco_image_list: raise ValueError("Download images %s using firmware_download" % cco_image_list) # upload images on ucsm for image in images_to_upload: log.debug("Uploading image '%s' to UCSM." % image) firmware = firmware_add_local(handle, image_dir, image) eh = UcsEventHandle(handle) eh.add(managed_object=firmware, prop="transfer_state", success_value=['downloaded'], poll_sec=30, timeout_sec=600) log.debug("Upload of image file '%s' is completed." % image) if infra_only: # Activate UCSM firmware_activate_infra( handle, version=version, require_user_confirmation=require_user_confirmation) else: if infra: # Activate UCSM log.debug("Activating Firmware Infra......") firmware_activate_infra( handle, version=version, require_user_confirmation=require_user_confirmation) if blade: # Activate Blade log.debug("Activating Firmware Blade......") firmware_activate_blade( handle, version=version, require_user_confirmation=require_user_confirmation) if rack: # Activate Blade log.debug("firmware upgrade code for rack is yet to be done.") # firmware_activate_blade( # handle, version=version, # require_user_confirmation=require_user_confirmation) except: log.debug("Error Occurred in Script.") handle.logout() raise
def firmware_auto_install(handle, version, image_dir, infra_only=False): """ This will do end-to-end processing to update firmware on ucsm. Args: handle (UcsHandle) version (string): firmware version image_dir (string): image directory infra_only (bool): by default False. If set to True, will update firmware of FI only Returns: None Example: firmware_auto_install(handle, version="2.2.5b", image_dir="/home/imagedir") """ from ucsmsdk.ucseventhandler import UcsEventHandle try: bundle_map = get_firmware_file_names(version) bundles = [] cco_image_list = [] bundles.append(bundle_map['A'][0]) if not infra_only: bundles.append(bundle_map['B'][0]) bundles.append(bundle_map['C'][0]) log.debug("Starting Firmware download process to local directory: %s" % image_dir) # adding files to cco image list if not available in local directory for bundle in bundles: file_path = os.path.join(image_dir, bundle) if os.path.exists(file_path): log.debug("Image already exist in image directory ") else: cco_image_list.append(bundle) # if image not available raising exception to download if cco_image_list: raise ValueError("Download images %s using firmware_download" % cco_image_list) # check if image is already uploaded to ucs domain for image in bundles: log.debug("Checking if image file: '%s' is already uploaded to UCS" " Domain" % image) deleted = False filter_str = '(name, %s, type="eq")' % image firmware_package = handle.query_classid( class_id="FirmwareDistributable", filter_str=filter_str) if firmware_package: firmware_dist_image = handle.query_children( in_mo=firmware_package[0], class_id="FirmwareDistImage") if firmware_dist_image: firmware_dist_image = firmware_dist_image[0] if firmware_dist_image.image_deleted != "": deleted = True # image does not exist then upload if deleted or not firmware_package: log.debug("Uploading file to UCSM.") firmware = firmware_add_local(handle, image_dir, image) eh = UcsEventHandle(handle) eh.add(managed_object=firmware, prop="transfer_state", success_value=['downloaded'], poll_sec=30, timeout_sec=600) log.debug("Upload of image file '%s' is completed." % image) else: log.debug("Image file '%s' is already upload available on " "UCSM" % image) # Activate UCSM firmware_activate_infra(handle, version=version) if not infra_only: # Activate Blade firmware_activate_blade(handle, version=version) except: log.debug("Error Occurred in Script.") handle.logout() raise
def firmware_auto_install(handle, version, image_dir, infra_only=False): from ucsmsdk.ucseventhandler import UcsEventHandle try: # create version string ver_split = version.split('(') version_bundle = ver_split[0] + "." + ver_split[1].strip(')') bundles = [] cco_image_list = [] # create firmware file name for the respective version aseries_bundle = "ucs-k9-bundles-infra." + version_bundle + ".A.bin" bundles.append(aseries_bundle) if not infra_only: bseries_bundle = "ucs-k9-bundles-b-series." + version_bundle + \ ".B.bin" bundles.append(bseries_bundle) cseries_bundle = "ucs-k9-bundles-c-series." + version_bundle + \ ".C.bin" bundles.append(cseries_bundle) print("Starting Firmware download process to local directory: %s" % image_dir) # adding files to cco image list if not available in local directory for bundle in bundles: file_path = os.path.join(image_dir, bundle) if os.path.exists(file_path): print("Image already exist in image directory ") else: cco_image_list.append(bundle) # if image not available raising exception to download if cco_image_list: raise ValueError("Download images %s using firmware_download" % cco_image_list) # check if image is already uploaded to ucs domain for image in bundles: print("Checking if image file: '%s' is already uploaded to UCS " "Domain" % image) deleted = False filter_str = '(name, %s, type="eq")' % image firmware_package = handle.query_classid( class_id="FirmwareDistributable", filter_str=filter_str)[0] if firmware_package: firmware_dist_image = handle.query_children( in_mo=firmware_package, class_id="FirmwareDistImage")[0] if firmware_dist_image: if firmware_dist_image.image_deleted != "": deleted = True # image does not exist then upload if deleted or not firmware_package: print("Uploading file to UCSM.") firmware = firmware_add_local(handle, image_dir, image) eh = UcsEventHandle(handle) eh.add(managed_object=firmware, prop="transfer_state", success_value=['downloaded'], poll_sec=30, timeout_sec=600) print("Upload of image file '%s' is completed." % image) else: print("Image file '%s' is already upload available on UCSM" % image) # Activate UCSM firmware_activate_ucsm(handle, version=version) if not infra_only: # Activate Blade firmware_activate_blade(handle, version=version) except: print("Error Occurred in Script.") handle.logout() raise