def embedded_firmware_download(self): """Execute the firmware download.""" if self.nvsram: firmware_url = "firmware/embedded-firmware?nvsram=true&staged=true" headers, data = create_multipart_formdata(files=[( "nvsramfile", self.nvsram_name, self.nvsram), ("dlpfile", self.firmware_name, self.firmware)]) else: firmware_url = "firmware/embedded-firmware?nvsram=false&staged=true" headers, data = create_multipart_formdata( files=[("dlpfile", self.firmware_name, self.firmware)]) # Stage firmware and nvsram try: rc, response = self.request(firmware_url, method="POST", data=data, headers=headers, timeout=(30 * 60)) except Exception as error: self.module.fail_json( msg="Failed to stage firmware. Array Id [%s]. Error[%s]." % (self.ssid, to_native(error))) # Activate firmware activate_thread = threading.Thread( target=self.embedded_firmware_activate) activate_thread.start() self.wait_for_reboot()
def proxy_upload_and_check_compatibility(self): """Ensure firmware is uploaded and verify compatibility.""" cfw_files = [] try: rc, cfw_files = self.request("firmware/cfw-files") except Exception as error: self.module.fail_json( msg="Failed to retrieve existing firmware files. Error [%s]" % to_native(error)) if self.firmware: for cfw_file in cfw_files: if cfw_file["filename"] == self.firmware_name: break else: fields = [("validate", "true")] files = [("firmwareFile", self.firmware_name, self.firmware)] headers, data = create_multipart_formdata(files=files, fields=fields) try: rc, response = self.request("firmware/upload", method="POST", data=data, headers=headers) except Exception as error: self.module.fail_json( msg= "Failed to upload firmware bundle file. File [%s]. Array [%s]. Error [%s]." % (self.firmware_name, self.ssid, to_native(error))) self.proxy_check_firmware_compatibility() if self.nvsram: for cfw_file in cfw_files: if cfw_file["filename"] == self.nvsram_name: break else: fields = [("validate", "true")] files = [("firmwareFile", self.nvsram_name, self.nvsram)] headers, data = create_multipart_formdata(files=files, fields=fields) try: rc, response = self.request("firmware/upload", method="POST", data=data, headers=headers) except Exception as error: self.module.fail_json( msg= "Failed to upload NVSRAM file. File [%s]. Array [%s]. Error [%s]." % (self.nvsram_name, self.ssid, to_native(error))) self.proxy_check_nvsram_compatibility()
def embedded_check_bundle_compatibility(self): """Verify the provided firmware bundle is compatible with E-Series storage system.""" try: files = [("files[]", "blob", self.firmware)] headers, data = create_multipart_formdata(files=files, send_8kb=True) rc, bundle_compatible = self.request( "firmware/embedded-firmware/%s/bundle-compatibility-check" % self.ssid, method="POST", data=data, headers=headers) # Determine whether valid and compatible firmware if not bundle_compatible["signatureTestingPassed"]: self.module.fail_json( msg="Invalid firmware bundle file. File [%s]." % self.firmware) if not bundle_compatible["fileCompatible"]: self.module.fail_json( msg="Incompatible firmware bundle file. File [%s]." % self.firmware) # Determine whether upgrade is required for module in bundle_compatible["versionContents"]: bundle_module_version = module["bundledVersion"].split(".") onboard_module_version = module["onboardVersion"].split(".") version_minimum_length = min(len(bundle_module_version), len(onboard_module_version)) if bundle_module_version[: version_minimum_length] != onboard_module_version[: version_minimum_length]: self.upgrade_required = True # Check whether downgrade is being attempted bundle_version = module["bundledVersion"].split(".")[:2] onboard_version = module["onboardVersion"].split(".")[:2] if bundle_version[0] < onboard_version[0] or ( bundle_version[0] == onboard_version[0] and bundle_version[1] < onboard_version[1]): self.module.fail_json( msg= "Downgrades are not permitted. onboard [%s] > bundled[%s]." % (module["onboardVersion"], module["bundledVersion"])) # Update bundle info self.module_info.update({ module["module"]: { "onboard_version": module["onboardVersion"], "bundled_version": module["bundledVersion"] } }) except Exception as error: self.module.fail_json( msg= "Failed to retrieve bundle compatibility results. Array Id [%s]. Error[%s]." % (self.ssid, to_native(error)))
def upload_certificate(self, path): """Add or update remote server certificate to the storage array.""" file_name = os.path.basename(path) headers, data = create_multipart_formdata(files=[("file", file_name, path)]) rc, resp = self.request(self.url_path_prefix + "certificates/remote-server", method="POST", headers=headers, data=data, ignore_errors=True) if rc == 404: rc, resp = self.request(self.url_path_prefix + "sslconfig/ca?useTruststore=true", method="POST", headers=headers, data=data, ignore_errors=True) if rc > 299: self.module.fail_json(msg="Failed to upload certificate. Array [%s]. Error [%s, %s]." % (self.ssid, rc, resp))
def upload_files(self): """Add drive firmware file to the proxy.""" for filename in self.add_files: firmware_name = os.path.basename(filename) files = [("file", firmware_name, self.files[filename])] headers, data = create_multipart_formdata(files) try: rc, response = self.request("/files/drive", method="POST", headers=headers, data=data) except Exception as error: self.upload_failures.append(filename) self.module.warn("Failed to upload drive firmware file. File [%s]." % firmware_name)
def enable_feature_pack(self): """Enable the feature pack key.""" filename = re.split(r"/", self.feature_key)[-1] files = [("keyFile", filename, self.feature_key)] headers, data = create_multipart_formdata(files) try: self.request("storage-systems/%s/feature-pack" % self.ssid, method="POST", headers=headers, data=data) except Exception as error: self.module.fail_json( msg= "No changes made. Array [%s]. Error [%s].\nheaders [%s]\ndata [%s] [%s] [%s]" % (self.ssid, to_native(error), headers, data, self.expected_submodel_id, self.current_submodel_id))
def upload_firmware(self): """Ensure firmware has been upload prior to uploaded.""" for firmware in self.firmware_list: firmware_name = os.path.basename(firmware) files = [("file", firmware_name, firmware)] headers, data = create_multipart_formdata(files) try: rc, response = self.request("/files/drive", method="POST", headers=headers, data=data) except Exception as error: self.module.fail_json( msg= "Failed to upload drive firmware [%s]. Array [%s]. Error [%s]." % (firmware_name, self.ssid, to_native(error)))
def upload_files(self): """Upload firmware and nvsram file.""" for filename in self.add_files: fields = [("validate", "true")] files = [("firmwareFile", filename, self.files[filename])] headers, data = create_multipart_formdata(files=files, fields=fields) try: rc, response = self.request("firmware/upload/", method="POST", data=data, headers=headers) except Exception as error: self.upload_failures.append(filename) self.module.warn( msg="Failed to upload firmware file. File [%s]" % filename)
def embedded_upgrade(self): """Upload and activate both firmware and NVSRAM.""" files = [("nvsramfile", self.nvsram_name, self.nvsram), ("dlpfile", self.firmware_name, self.firmware)] headers, data = create_multipart_formdata(files=files) try: rc, response = self.request( "firmware/embedded-firmware?staged=false&nvsram=true", method="POST", data=data, headers=headers) self.upgrade_in_progress = True except Exception as error: self.module.fail_json( msg= "Failed to upload and activate firmware. Array Id [%s]. Error[%s]." % (self.ssid, to_native(error))) if self.wait_for_completion: self.embedded_wait_for_controller_reboot()
def embedded_check_nvsram_compatibility(self): """Verify the provided NVSRAM is compatible with E-Series storage system.""" # Check nvsram compatibility try: files = [("nvsramimage", self.nvsram_name, self.nvsram)] headers, data = create_multipart_formdata(files=files) rc, nvsram_compatible = self.request( "firmware/embedded-firmware/%s/nvsram-compatibility-check" % self.ssid, method="POST", data=data, headers=headers) if not nvsram_compatible["signatureTestingPassed"]: self.module.fail_json(msg="Invalid NVSRAM file. File [%s]." % self.nvsram) if not nvsram_compatible["fileCompatible"]: self.module.fail_json( msg="Incompatible NVSRAM file. File [%s]." % self.nvsram) # Determine whether nvsram is required for module in nvsram_compatible["versionContents"]: if module["bundledVersion"] != module["onboardVersion"]: self.upgrade_required = True # Update bundle info self.module_info.update({ module["module"]: { "onboard_version": module["onboardVersion"], "bundled_version": module["bundledVersion"] } }) except Exception as error: self.module.fail_json( msg= "Failed to retrieve NVSRAM compatibility results. Array Id [%s]. Error[%s]." % (self.ssid, to_native(error)))