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()
예제 #3
0
    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)))
예제 #4
0
    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)))
예제 #8
0
 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)
예제 #9
0
    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()
예제 #10
0
    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)))