blob: afc12e923bea98afba52f2e59e51b81814de6f6f [file] [log] [blame]
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -07001import api from '@/store/api';
2import i18n from '@/i18n';
Dixsie Wolmersf65ee342020-01-22 19:47:56 -06003
4const FirmwareStore = {
5 namespaced: true,
6 state: {
Yoshie Muranaka33d755f2021-02-18 15:24:14 -08007 bmcFirmware: [],
8 hostFirmware: [],
9 bmcActiveFirmwareId: null,
10 hostActiveFirmwareId: null,
Derick Montague602e98a2020-10-21 16:20:00 -050011 applyTime: null,
greenfil6b424f92023-03-10 10:47:41 +030012 httpPushUri: null,
Yoshie Muranaka33d755f2021-02-18 15:24:14 -080013 tftpAvailable: false,
Dixsie Wolmersf65ee342020-01-22 19:47:56 -060014 },
15 getters: {
Yoshie Muranaka33d755f2021-02-18 15:24:14 -080016 isTftpUploadAvailable: (state) => state.tftpAvailable,
17 isSingleFileUploadEnabled: (state) => state.hostFirmware.length === 0,
18 activeBmcFirmware: (state) => {
19 return state.bmcFirmware.find(
20 (firmware) => firmware.id === state.bmcActiveFirmwareId
21 );
22 },
23 activeHostFirmware: (state) => {
24 return state.hostFirmware.find(
25 (firmware) => firmware.id === state.hostActiveFirmwareId
26 );
27 },
28 backupBmcFirmware: (state) => {
29 return state.bmcFirmware.find(
30 (firmware) => firmware.id !== state.bmcActiveFirmwareId
31 );
32 },
33 backupHostFirmware: (state) => {
34 return state.hostFirmware.find(
35 (firmware) => firmware.id !== state.hostActiveFirmwareId
36 );
37 },
Dixsie Wolmersf65ee342020-01-22 19:47:56 -060038 },
39 mutations: {
Yoshie Muranaka33d755f2021-02-18 15:24:14 -080040 setActiveBmcFirmwareId: (state, id) => (state.bmcActiveFirmwareId = id),
41 setActiveHostFirmwareId: (state, id) => (state.hostActiveFirmwareId = id),
42 setBmcFirmware: (state, firmware) => (state.bmcFirmware = firmware),
43 setHostFirmware: (state, firmware) => (state.hostFirmware = firmware),
Derick Montague602e98a2020-10-21 16:20:00 -050044 setApplyTime: (state, applyTime) => (state.applyTime = applyTime),
greenfil6b424f92023-03-10 10:47:41 +030045 setHttpPushUri: (state, httpPushUri) => (state.httpPushUri = httpPushUri),
Yoshie Muranaka33d755f2021-02-18 15:24:14 -080046 setTftpUploadAvailable: (state, tftpAvailable) =>
47 (state.tftpAvailable = tftpAvailable),
Dixsie Wolmersf65ee342020-01-22 19:47:56 -060048 },
49 actions: {
Yoshie Muranaka98bb24e2020-10-06 10:00:19 -070050 async getFirmwareInformation({ dispatch }) {
Yoshie Muranaka33d755f2021-02-18 15:24:14 -080051 dispatch('getActiveHostFirmware');
52 dispatch('getActiveBmcFirmware');
53 return await dispatch('getFirmwareInventory');
Yoshie Muranaka98bb24e2020-10-06 10:00:19 -070054 },
Yoshie Muranaka33d755f2021-02-18 15:24:14 -080055 getActiveBmcFirmware({ commit }) {
56 return api
Dixsie Wolmers46a87442020-02-26 15:26:30 -060057 .get('/redfish/v1/Managers/bmc')
Yoshie Muranakad227f1c2020-10-06 13:46:58 -070058 .then(({ data: { Links } }) => {
Yoshie Muranaka33d755f2021-02-18 15:24:14 -080059 const id = Links?.ActiveSoftwareImage['@odata.id'].split('/').pop();
60 commit('setActiveBmcFirmwareId', id);
Yoshie Muranaka98bb24e2020-10-06 10:00:19 -070061 })
Derick Montague602e98a2020-10-21 16:20:00 -050062 .catch((error) => console.log(error));
Yoshie Muranaka98bb24e2020-10-06 10:00:19 -070063 },
Yoshie Muranaka33d755f2021-02-18 15:24:14 -080064 getActiveHostFirmware({ commit }) {
65 return api
Yoshie Muranaka98bb24e2020-10-06 10:00:19 -070066 .get('/redfish/v1/Systems/system/Bios')
67 .then(({ data: { Links } }) => {
Yoshie Muranaka33d755f2021-02-18 15:24:14 -080068 const id = Links?.ActiveSoftwareImage['@odata.id'].split('/').pop();
69 commit('setActiveHostFirmwareId', id);
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -070070 })
Derick Montague602e98a2020-10-21 16:20:00 -050071 .catch((error) => console.log(error));
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -070072 },
Yoshie Muranaka33d755f2021-02-18 15:24:14 -080073 async getFirmwareInventory({ commit }) {
74 const inventoryList = await api
75 .get('/redfish/v1/UpdateService/FirmwareInventory')
76 .then(({ data: { Members = [] } = {} }) =>
77 Members.map((item) => api.get(item['@odata.id']))
78 )
79 .catch((error) => console.log(error));
80 await api
81 .all(inventoryList)
82 .then((response) => {
83 const bmcFirmware = [];
84 const hostFirmware = [];
85 response.forEach(({ data }) => {
86 const firmwareType = data?.RelatedItem?.[0]?.['@odata.id']
87 .split('/')
88 .pop();
89 const item = {
90 version: data?.Version,
91 id: data?.Id,
92 location: data?.['@odata.id'],
93 status: data?.Status?.Health,
94 };
95 if (firmwareType === 'bmc') {
96 bmcFirmware.push(item);
97 } else if (firmwareType === 'Bios') {
98 hostFirmware.push(item);
99 }
100 });
101 commit('setBmcFirmware', bmcFirmware);
102 commit('setHostFirmware', hostFirmware);
103 })
104 .catch((error) => {
105 console.log(error);
106 });
107 },
108 getUpdateServiceSettings({ commit }) {
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700109 api
110 .get('/redfish/v1/UpdateService')
111 .then(({ data }) => {
112 const applyTime =
113 data.HttpPushUriOptions.HttpPushUriApplyTime.ApplyTime;
Yoshie Muranaka33d755f2021-02-18 15:24:14 -0800114 const allowableActions =
115 data?.Actions?.['#UpdateService.SimpleUpdate']?.[
116 'TransferProtocol@Redfish.AllowableValues'
117 ];
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700118 commit('setApplyTime', applyTime);
greenfil6b424f92023-03-10 10:47:41 +0300119 const httpPushUri = data.HttpPushUri;
120 commit('setHttpPushUri', httpPushUri);
Derick Montaguef7cd5e02021-05-11 17:02:00 -0500121 if (allowableActions?.includes('TFTP')) {
Yoshie Muranaka33d755f2021-02-18 15:24:14 -0800122 commit('setTftpUploadAvailable', true);
123 }
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700124 })
Derick Montague602e98a2020-10-21 16:20:00 -0500125 .catch((error) => console.log(error));
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700126 },
127 setApplyTimeImmediate({ commit }) {
128 const data = {
129 HttpPushUriOptions: {
130 HttpPushUriApplyTime: {
Derick Montague602e98a2020-10-21 16:20:00 -0500131 ApplyTime: 'Immediate',
132 },
133 },
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700134 };
135 return api
136 .patch('/redfish/v1/UpdateService', data)
137 .then(() => commit('setApplyTime', 'Immediate'))
Derick Montague602e98a2020-10-21 16:20:00 -0500138 .catch((error) => console.log(error));
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700139 },
140 async uploadFirmware({ state, dispatch }, image) {
141 if (state.applyTime !== 'Immediate') {
142 // ApplyTime must be set to Immediate before making
143 // request to update firmware
144 await dispatch('setApplyTimeImmediate');
145 }
146 return await api
greenfil6b424f92023-03-10 10:47:41 +0300147 .post(state.httpPushUri, image, {
Derick Montague602e98a2020-10-21 16:20:00 -0500148 headers: { 'Content-Type': 'application/octet-stream' },
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700149 })
Derick Montague602e98a2020-10-21 16:20:00 -0500150 .catch((error) => {
Dixsie Wolmers46a87442020-02-26 15:26:30 -0600151 console.log(error);
Yoshie Muranaka33d755f2021-02-18 15:24:14 -0800152 throw new Error(i18n.t('pageFirmware.toast.errorUpdateFirmware'));
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700153 });
154 },
Yoshie Muranaka33d755f2021-02-18 15:24:14 -0800155 async uploadFirmwareTFTP({ state, dispatch }, fileAddress) {
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700156 const data = {
157 TransferProtocol: 'TFTP',
Yoshie Muranaka33d755f2021-02-18 15:24:14 -0800158 ImageURI: fileAddress,
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700159 };
160 if (state.applyTime !== 'Immediate') {
161 // ApplyTime must be set to Immediate before making
162 // request to update firmware
163 await dispatch('setApplyTimeImmediate');
164 }
165 return await api
Gunnar Mills60713b02020-08-18 10:21:05 -0500166 .post(
167 '/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate',
168 data
169 )
Derick Montague602e98a2020-10-21 16:20:00 -0500170 .catch((error) => {
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700171 console.log(error);
Yoshie Muranaka33d755f2021-02-18 15:24:14 -0800172 throw new Error(i18n.t('pageFirmware.toast.errorUpdateFirmware'));
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700173 });
174 },
Yoshie Muranaka33d755f2021-02-18 15:24:14 -0800175 async switchBmcFirmwareAndReboot({ getters }) {
176 const backupLocation = getters.backupBmcFirmware.location;
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700177 const data = {
178 Links: {
179 ActiveSoftwareImage: {
Yoshie Muranaka1dedbdf2020-11-30 07:04:01 -0800180 '@odata.id': backupLocation,
Derick Montague602e98a2020-10-21 16:20:00 -0500181 },
182 },
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700183 };
184 return await api
185 .patch('/redfish/v1/Managers/bmc', data)
Derick Montague602e98a2020-10-21 16:20:00 -0500186 .catch((error) => {
Yoshie Muranaka92a0a4a2020-07-15 10:30:31 -0700187 console.log(error);
Yoshie Muranaka33d755f2021-02-18 15:24:14 -0800188 throw new Error(i18n.t('pageFirmware.toast.errorSwitchImages'));
Dixsie Wolmers46a87442020-02-26 15:26:30 -0600189 });
Derick Montague602e98a2020-10-21 16:20:00 -0500190 },
191 },
Dixsie Wolmersf65ee342020-01-22 19:47:56 -0600192};
193
194export default FirmwareStore;