From 7bc85e4936f1fe0178bae3bedcdc11c5e00564d6 Mon Sep 17 00:00:00 2001 From: Yoshie Muranaka Date: Thu, 11 Feb 2021 09:59:13 -0800 Subject: Update single file firmware card layout Updates will enable a more dynamic firmware page layout by inspecting all firmware images for host images. GETs all firmware inventory at Redfish endpoint '/redfish/v1/UpdateService/FirmwareInventory' then checks if any image includes RelatedItem '/redfish/v1/Systems/system/Bios' to determine whether the UI should show combined or separate firmware cards for BMC and Host. This is part of an effort to make the firmware page more dynamic. These changes are only visisble with ibm dotenv variables. Signed-off-by: Yoshie Muranaka Change-Id: I8542a27c6ff421bcb24c8b2570dbe150d5c1ce6c --- .../FirmwareAlertServerPower.vue | 60 ++++ .../FirmwareSingleImage/FirmwareCardsBmc.vue | 145 ++++++++ .../FirmwareSingleImage/FirmwareCardsHost.vue | 75 ++++ .../FirmwareSingleImage/FirmwareFormUpdate.vue | 235 +++++++++++++ .../FirmwareModalSwitchToRunning.vue | 31 ++ .../FirmwareModalUpdateFirmware.vue | 48 +++ .../FirmwareSingleImage/FirmwareSingleImage.vue | 389 +++------------------ .../FirmwareSingleImageModalSwitchToRunning.vue | 31 -- .../FirmwareSingleImageModalUpdateFirmware.vue | 44 --- .../FirmwareSingleImageStore.js | 146 ++++---- src/locales/en-US.json | 32 +- 11 files changed, 743 insertions(+), 493 deletions(-) create mode 100644 src/env/components/FirmwareSingleImage/FirmwareAlertServerPower.vue create mode 100644 src/env/components/FirmwareSingleImage/FirmwareCardsBmc.vue create mode 100644 src/env/components/FirmwareSingleImage/FirmwareCardsHost.vue create mode 100644 src/env/components/FirmwareSingleImage/FirmwareFormUpdate.vue create mode 100644 src/env/components/FirmwareSingleImage/FirmwareModalSwitchToRunning.vue create mode 100644 src/env/components/FirmwareSingleImage/FirmwareModalUpdateFirmware.vue delete mode 100644 src/env/components/FirmwareSingleImage/FirmwareSingleImageModalSwitchToRunning.vue delete mode 100644 src/env/components/FirmwareSingleImage/FirmwareSingleImageModalUpdateFirmware.vue (limited to 'src') diff --git a/src/env/components/FirmwareSingleImage/FirmwareAlertServerPower.vue b/src/env/components/FirmwareSingleImage/FirmwareAlertServerPower.vue new file mode 100644 index 00000000..f7ac0fc9 --- /dev/null +++ b/src/env/components/FirmwareSingleImage/FirmwareAlertServerPower.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/env/components/FirmwareSingleImage/FirmwareCardsBmc.vue b/src/env/components/FirmwareSingleImage/FirmwareCardsBmc.vue new file mode 100644 index 00000000..857adf0f --- /dev/null +++ b/src/env/components/FirmwareSingleImage/FirmwareCardsBmc.vue @@ -0,0 +1,145 @@ + + + diff --git a/src/env/components/FirmwareSingleImage/FirmwareCardsHost.vue b/src/env/components/FirmwareSingleImage/FirmwareCardsHost.vue new file mode 100644 index 00000000..c47f60f5 --- /dev/null +++ b/src/env/components/FirmwareSingleImage/FirmwareCardsHost.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/env/components/FirmwareSingleImage/FirmwareFormUpdate.vue b/src/env/components/FirmwareSingleImage/FirmwareFormUpdate.vue new file mode 100644 index 00000000..f13b8e00 --- /dev/null +++ b/src/env/components/FirmwareSingleImage/FirmwareFormUpdate.vue @@ -0,0 +1,235 @@ + + + diff --git a/src/env/components/FirmwareSingleImage/FirmwareModalSwitchToRunning.vue b/src/env/components/FirmwareSingleImage/FirmwareModalSwitchToRunning.vue new file mode 100644 index 00000000..56f505d0 --- /dev/null +++ b/src/env/components/FirmwareSingleImage/FirmwareModalSwitchToRunning.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/env/components/FirmwareSingleImage/FirmwareModalUpdateFirmware.vue b/src/env/components/FirmwareSingleImage/FirmwareModalUpdateFirmware.vue new file mode 100644 index 00000000..d6c52f9c --- /dev/null +++ b/src/env/components/FirmwareSingleImage/FirmwareModalUpdateFirmware.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/env/components/FirmwareSingleImage/FirmwareSingleImage.vue b/src/env/components/FirmwareSingleImage/FirmwareSingleImage.vue index b7ad4c53..2e601bd4 100644 --- a/src/env/components/FirmwareSingleImage/FirmwareSingleImage.vue +++ b/src/env/components/FirmwareSingleImage/FirmwareSingleImage.vue @@ -1,244 +1,68 @@ diff --git a/src/env/components/FirmwareSingleImage/FirmwareSingleImageModalSwitchToRunning.vue b/src/env/components/FirmwareSingleImage/FirmwareSingleImageModalSwitchToRunning.vue deleted file mode 100644 index 56f505d0..00000000 --- a/src/env/components/FirmwareSingleImage/FirmwareSingleImageModalSwitchToRunning.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/src/env/components/FirmwareSingleImage/FirmwareSingleImageModalUpdateFirmware.vue b/src/env/components/FirmwareSingleImage/FirmwareSingleImageModalUpdateFirmware.vue deleted file mode 100644 index 51575253..00000000 --- a/src/env/components/FirmwareSingleImage/FirmwareSingleImageModalUpdateFirmware.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - diff --git a/src/env/store/FirmwareSingleImage/FirmwareSingleImageStore.js b/src/env/store/FirmwareSingleImage/FirmwareSingleImageStore.js index b16cac8a..ae4d6333 100644 --- a/src/env/store/FirmwareSingleImage/FirmwareSingleImageStore.js +++ b/src/env/store/FirmwareSingleImage/FirmwareSingleImageStore.js @@ -4,83 +4,107 @@ import i18n from '@/i18n'; const FirmwareSingleImageStore = { namespaced: true, state: { - activeFirmware: { - version: '--', - id: null, - location: null, - }, - backupFirmware: { - version: '--', - id: null, - location: null, - status: null, - }, + bmcFirmware: [], + hostFirmware: [], + bmcActiveFirmwareId: null, + hostActiveFirmwareId: null, applyTime: null, tftpAvailable: false, }, getters: { - systemFirmwareVersion: (state) => state.activeFirmware.version, - backupFirmwareVersion: (state) => state.backupFirmware.version, - backupFirmwareStatus: (state) => state.backupFirmware.status, - isRebootFromBackupAvailable: (state) => - state.backupFirmware.id ? true : false, - bmcFirmwareCurrentVersion: (state) => state.activeFirmware.version, //this getter is needed for the Overview page, isTftpUploadAvailable: (state) => state.tftpAvailable, - }, - mutations: { - setActiveFirmware: (state, { version, id, location }) => { - state.activeFirmware.version = version; - state.activeFirmware.id = id; - state.activeFirmware.location = location; + isSingleFileUploadEnabled: (state) => state.hostFirmware.length === 0, + activeBmcFirmware: (state) => { + return state.bmcFirmware.find( + (firmware) => firmware.id === state.bmcActiveFirmwareId + ); }, - setBackupFirmware: (state, { version, id, location, status }) => { - state.backupFirmware.version = version; - state.backupFirmware.id = id; - state.backupFirmware.location = location; - state.backupFirmware.status = status; + activeHostFirmware: (state) => { + return state.hostFirmware.find( + (firmware) => firmware.id === state.hostActiveFirmwareId + ); }, + backupBmcFirmware: (state) => { + return state.bmcFirmware.find( + (firmware) => firmware.id !== state.bmcActiveFirmwareId + ); + }, + backupHostFirmware: (state) => { + return state.hostFirmware.find( + (firmware) => firmware.id !== state.hostActiveFirmwareId + ); + }, + bmcFirmwareCurrentVersion: (_, getters) => + getters.activeBmcFirmware?.version, //this getter is needed for the Overview page, + }, + mutations: { + setActiveBmcFirmwareId: (state, id) => (state.bmcActiveFirmwareId = id), + setActiveHostFirmwareId: (state, id) => (state.hostActiveFirmwareId = id), + setBmcFirmware: (state, firmware) => (state.bmcFirmware = firmware), + setHostFirmware: (state, firmware) => (state.hostFirmware = firmware), setApplyTime: (state, applyTime) => (state.applyTime = applyTime), setTftpUploadAvailable: (state, tftpAvailable) => (state.tftpAvailable = tftpAvailable), }, actions: { - async getFirmwareInformation({ commit }) { - return await api + async getFirmwareInformation({ dispatch }) { + dispatch('getActiveHostFirmware'); + dispatch('getActiveBmcFirmware'); + return await dispatch('getFirmwareInventory'); + }, + getActiveBmcFirmware({ commit }) { + return api .get('/redfish/v1/Managers/bmc') .then(({ data: { Links } }) => { - const currentLocation = Links.ActiveSoftwareImage['@odata.id']; - // Check SoftwareImages list for not ActiveSoftwareImage id - const backupLocation = Links.SoftwareImages.map( - (item) => item['@odata.id'] - ).find((location) => { - const id = location.split('/').pop(); - const currentId = currentLocation.split('/').pop(); - return id !== currentId; - }); - return { currentLocation, backupLocation }; + const id = Links?.ActiveSoftwareImage['@odata.id'].split('/').pop(); + commit('setActiveBmcFirmwareId', id); }) - .then(async ({ currentLocation, backupLocation }) => { - const currentData = await api.get(currentLocation); - let backupData = {}; - - if (backupLocation) { - backupData = await api.get(backupLocation); - } - - commit('setActiveFirmware', { - version: currentData?.data?.Version, - id: currentData?.data?.Id, - location: currentData?.data?.['@odata.id'], - }); - commit('setBackupFirmware', { - version: backupData.data?.Version, - id: backupData.data?.Id, - location: backupData.data?.['@odata.id'], - status: backupData.data?.Status?.Health, - }); + .catch((error) => console.log(error)); + }, + getActiveHostFirmware({ commit }) { + return api + .get('/redfish/v1/Systems/system/Bios') + .then(({ data: { Links } }) => { + const id = Links?.ActiveSoftwareImage['@odata.id'].split('/').pop(); + commit('setActiveHostFirmwareId', id); }) .catch((error) => console.log(error)); }, + async getFirmwareInventory({ commit }) { + const inventoryList = await api + .get('/redfish/v1/UpdateService/FirmwareInventory') + .then(({ data: { Members = [] } = {} }) => + Members.map((item) => api.get(item['@odata.id'])) + ) + .catch((error) => console.log(error)); + await api + .all(inventoryList) + .then((response) => { + const bmcFirmware = []; + const hostFirmware = []; + response.forEach(({ data }) => { + const firmwareType = data?.RelatedItem?.[0]?.['@odata.id'] + .split('/') + .pop(); + const item = { + version: data?.Version, + id: data?.Id, + location: data?.['@odata.id'], + status: data?.Status?.Health, + }; + if (firmwareType === 'bmc') { + bmcFirmware.push(item); + } else if (firmwareType === 'Bios') { + hostFirmware.push(item); + } + }); + commit('setBmcFirmware', bmcFirmware); + commit('setHostFirmware', hostFirmware); + }) + .catch((error) => { + console.log(error); + }); + }, getUpdateServiceSettings({ commit }) { api .get('/redfish/v1/UpdateService') @@ -147,8 +171,8 @@ const FirmwareSingleImageStore = { throw new Error(i18n.t('pageFirmware.toast.errorUploadAndReboot')); }); }, - async switchFirmwareAndReboot({ state }) { - const backupLoaction = state.backupFirmware.location; + async switchFirmwareAndReboot({ getters }) { + const backupLoaction = getters.backupBmcFirmware.location; const data = { Links: { ActiveSoftwareImage: { diff --git a/src/locales/en-US.json b/src/locales/en-US.json index 8ca98bf0..714027bb 100644 --- a/src/locales/en-US.json +++ b/src/locales/en-US.json @@ -317,14 +317,14 @@ "successUploadTitle": "Code update started" }, "singleFileUpload": { - "backupImage": "Backup image", - "bmcAndServer": "BMC and server:", - "fileAddress": "File address", - "fileSource": "File source", - "runningImage": "Running image", - "startUpdate": "Start update", - "switchToRunning": "Switch to running", - "updateFirmware": "Update firmware", + "cardActionSwitchToRunning": "Switch to running", + "cardBodyVersion": "Version", + "cardTitleBackup": "Backup image", + "cardTitleRunning": "Running image", + "sectionTitleBmcCards": "BMC", + "sectionTitleBmcCardsCombined": "BMC and server", + "sectionTitleHostCards": "Host", + "sectionTitleUpdateFirmware": "Update firmware", "alert": { "operationInProgress": "Server power operation in progress.", "serverMustBePoweredOffTo": "Server must be powered off to:", @@ -333,14 +333,26 @@ "updateFirmware": "Update firmware", "viewServerPowerOperations": "View server power operations" }, + "form": { + "updateFirmware": { + "fileAddress": "File address", + "fileSource": "File source", + "imageFile": "Image file", + "imageFileHelperText": "Only .tar files accepted", + "startUpdate": "Start update", + "tftpServer": "TFTP server", + "workstation": "Workstation" + } + }, "modal": { "switchImages": "Switch images", "switchRunningImage": "Switch running image", "switchRunningImageInfo": "A BMC reboot is required to run the backup image. The application might be unresponsive during this time.", "switchRunningImageInfo2": "Are you sure you want to switch to the backup image (%{backup})?", "updateFirmwareInfo": "The BMC will reboot during the update process. The server cannot be powered on until the update is finished.", - "updateFirmwareInfo2": "The running image (%{running}) will be copied to backup and the backup image (%{backup}) will be permanently deleted.", - "updateFirmwareInfo3": "Are you sure you want to proceed with the update?" + "updateFirmwareInfo2": "The running image (%{running}) will be copied to backup. The backup image will be deleted.", + "updateFirmwareInfo3": "Are you sure you want to proceed with the update?", + "updateFirmwareInfoDefault": "The new image will be uploaded and activated. After that, the BMC or host will reboot automatically to run from the new image." }, "toast": { "errorSwitchImages": "Error switching running and backup images.", -- cgit v1.2.3