blob: ffc4bc4b22200aaf237c776e1037b3ce15c5071d [file] [log] [blame]
Yoshie Muranaka0b980db2020-10-06 09:24:14 -07001import api from '@/store/api';
2import i18n from '@/i18n';
3
4const FirmwareSingleImageStore = {
5 namespaced: true,
6 state: {
7 activeFirmware: {
8 version: '--',
9 id: null,
Derick Montague602e98a2020-10-21 16:20:00 -050010 location: null,
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070011 },
12 backupFirmware: {
13 version: '--',
14 id: null,
15 location: null,
Derick Montague602e98a2020-10-21 16:20:00 -050016 status: '--',
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070017 },
Derick Montague602e98a2020-10-21 16:20:00 -050018 applyTime: null,
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070019 },
20 getters: {
Derick Montague602e98a2020-10-21 16:20:00 -050021 systemFirmwareVersion: (state) => state.activeFirmware.version,
22 backupFirmwareVersion: (state) => state.backupFirmware.version,
23 backupFirmwareStatus: (state) => state.backupFirmware.status,
24 isRebootFromBackupAvailable: (state) =>
Yoshie Muranaka98bb24e2020-10-06 10:00:19 -070025 state.backupFirmware.id ? true : false,
Derick Montague602e98a2020-10-21 16:20:00 -050026 bmcFirmwareCurrentVersion: (state) => state.activeFirmware.version, //this getter is needed for the Overview page
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070027 },
28 mutations: {
29 setActiveFirmware: (state, { version, id, location }) => {
30 state.activeFirmware.version = version;
31 state.activeFirmware.id = id;
32 state.activeFirmware.location = location;
33 },
34 setBackupFirmware: (state, { version, id, location, status }) => {
35 state.backupFirmware.version = version;
36 state.backupFirmware.id = id;
37 state.backupFirmware.location = location;
38 state.backupFirmware.status = status;
39 },
Derick Montague602e98a2020-10-21 16:20:00 -050040 setApplyTime: (state, applyTime) => (state.applyTime = applyTime),
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070041 },
42 actions: {
Yoshie Muranaka98bb24e2020-10-06 10:00:19 -070043 async getFirmwareInformation({ commit }) {
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070044 return await api
45 .get('/redfish/v1/Managers/bmc')
46 .then(({ data: { Links } }) => {
47 const currentLocation = Links.ActiveSoftwareImage['@odata.id'];
48 // Check SoftwareImages list for not ActiveSoftwareImage id
49 const backupLocation = Links.SoftwareImages.map(
Derick Montague602e98a2020-10-21 16:20:00 -050050 (item) => item['@odata.id']
51 ).find((location) => {
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070052 const id = location.split('/').pop();
53 const currentId = currentLocation.split('/').pop();
54 return id !== currentId;
55 });
56 return { currentLocation, backupLocation };
57 })
58 .then(async ({ currentLocation, backupLocation }) => {
59 const currentData = await api.get(currentLocation);
60 let backupData = {};
61
62 if (backupLocation) {
63 backupData = await api.get(backupLocation);
64 }
65
66 commit('setActiveFirmware', {
67 version: currentData?.data?.Version,
68 id: currentData?.data?.Id,
Derick Montague602e98a2020-10-21 16:20:00 -050069 location: currentData?.data?.['@odata.id'],
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070070 });
71 commit('setBackupFirmware', {
72 version: backupData.data?.Version,
73 id: backupData.data?.Id,
74 location: backupData.data?.['@odata.id'],
Derick Montague602e98a2020-10-21 16:20:00 -050075 status: backupData.data?.Status?.State,
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070076 });
77 })
Derick Montague602e98a2020-10-21 16:20:00 -050078 .catch((error) => console.log(error));
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070079 },
80 getUpdateServiceApplyTime({ commit }) {
81 api
82 .get('/redfish/v1/UpdateService')
83 .then(({ data }) => {
84 const applyTime =
85 data.HttpPushUriOptions.HttpPushUriApplyTime.ApplyTime;
86 commit('setApplyTime', applyTime);
87 })
Derick Montague602e98a2020-10-21 16:20:00 -050088 .catch((error) => console.log(error));
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070089 },
90 setApplyTimeImmediate({ commit }) {
91 const data = {
92 HttpPushUriOptions: {
93 HttpPushUriApplyTime: {
Derick Montague602e98a2020-10-21 16:20:00 -050094 ApplyTime: 'Immediate',
95 },
96 },
Yoshie Muranaka0b980db2020-10-06 09:24:14 -070097 };
98 return api
99 .patch('/redfish/v1/UpdateService', data)
100 .then(() => commit('setApplyTime', 'Immediate'))
Derick Montague602e98a2020-10-21 16:20:00 -0500101 .catch((error) => console.log(error));
Yoshie Muranaka0b980db2020-10-06 09:24:14 -0700102 },
103 async uploadFirmware({ state, dispatch }, image) {
104 if (state.applyTime !== 'Immediate') {
105 // ApplyTime must be set to Immediate before making
106 // request to update firmware
107 await dispatch('setApplyTimeImmediate');
108 }
109 return await api
110 .post('/redfish/v1/UpdateService', image, {
Derick Montague602e98a2020-10-21 16:20:00 -0500111 headers: { 'Content-Type': 'application/octet-stream' },
Yoshie Muranaka0b980db2020-10-06 09:24:14 -0700112 })
113 .then(() => dispatch('getSystemFirwareVersion'))
114 .then(() => i18n.t('pageFirmware.toast.successUploadMessage'))
Derick Montague602e98a2020-10-21 16:20:00 -0500115 .catch((error) => {
Yoshie Muranaka0b980db2020-10-06 09:24:14 -0700116 console.log(error);
117 throw new Error(i18n.t('pageFirmware.toast.errorUploadAndReboot'));
118 });
119 },
120 async uploadFirmwareTFTP({ state, dispatch }, { address, filename }) {
121 const data = {
122 TransferProtocol: 'TFTP',
Derick Montague602e98a2020-10-21 16:20:00 -0500123 ImageURI: `${address}/${filename}`,
Yoshie Muranaka0b980db2020-10-06 09:24:14 -0700124 };
125 if (state.applyTime !== 'Immediate') {
126 // ApplyTime must be set to Immediate before making
127 // request to update firmware
128 await dispatch('setApplyTimeImmediate');
129 }
130 return await api
131 .post(
132 '/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate',
133 data
134 )
135 .then(() => dispatch('getSystemFirwareVersion'))
136 .then(() => i18n.t('pageFirmware.toast.successUploadMessage'))
Derick Montague602e98a2020-10-21 16:20:00 -0500137 .catch((error) => {
Yoshie Muranaka0b980db2020-10-06 09:24:14 -0700138 console.log(error);
139 throw new Error(i18n.t('pageFirmware.toast.errorUploadAndReboot'));
140 });
141 },
142 async switchFirmwareAndReboot({ state }) {
143 const backupLoaction = state.backupFirmware.location;
144 const data = {
145 Links: {
146 ActiveSoftwareImage: {
Derick Montague602e98a2020-10-21 16:20:00 -0500147 '@odata.id': backupLoaction,
148 },
149 },
Yoshie Muranaka0b980db2020-10-06 09:24:14 -0700150 };
151 return await api
152 .patch('/redfish/v1/Managers/bmc', data)
153 .then(() => i18n.t('pageFirmware.toast.successRebootFromBackup'))
Derick Montague602e98a2020-10-21 16:20:00 -0500154 .catch((error) => {
Yoshie Muranaka0b980db2020-10-06 09:24:14 -0700155 console.log(error);
156 throw new Error(i18n.t('pageFirmware.toast.errorRebootFromBackup'));
157 });
Derick Montague602e98a2020-10-21 16:20:00 -0500158 },
159 },
Yoshie Muranaka0b980db2020-10-06 09:24:14 -0700160};
161
162export default FirmwareSingleImageStore;