blob: 98f86fd50e0bbbcf1ef1b14a9fa0f5ce1136d332 [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,
10 location: null
11 },
12 backupFirmware: {
13 version: '--',
14 id: null,
15 location: null,
16 status: '--'
17 },
18 applyTime: null
19 },
20 getters: {
21 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,
26 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 },
40 setApplyTime: (state, applyTime) => (state.applyTime = applyTime)
41 },
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(
50 item => item['@odata.id']
51 ).find(location => {
52 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,
69 location: currentData?.data?.['@odata.id']
70 });
71 commit('setBackupFirmware', {
72 version: backupData.data?.Version,
73 id: backupData.data?.Id,
74 location: backupData.data?.['@odata.id'],
75 status: backupData.data?.Status?.State
76 });
77 })
78 .catch(error => console.log(error));
79 },
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 })
88 .catch(error => console.log(error));
89 },
90 setApplyTimeImmediate({ commit }) {
91 const data = {
92 HttpPushUriOptions: {
93 HttpPushUriApplyTime: {
94 ApplyTime: 'Immediate'
95 }
96 }
97 };
98 return api
99 .patch('/redfish/v1/UpdateService', data)
100 .then(() => commit('setApplyTime', 'Immediate'))
101 .catch(error => console.log(error));
102 },
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, {
111 headers: { 'Content-Type': 'application/octet-stream' }
112 })
113 .then(() => dispatch('getSystemFirwareVersion'))
114 .then(() => i18n.t('pageFirmware.toast.successUploadMessage'))
115 .catch(error => {
116 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',
123 ImageURI: `${address}/${filename}`
124 };
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'))
137 .catch(error => {
138 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: {
147 '@odata.id': backupLoaction
148 }
149 }
150 };
151 return await api
152 .patch('/redfish/v1/Managers/bmc', data)
153 .then(() => i18n.t('pageFirmware.toast.successRebootFromBackup'))
154 .catch(error => {
155 console.log(error);
156 throw new Error(i18n.t('pageFirmware.toast.errorRebootFromBackup'));
157 });
158 }
159 }
160};
161
162export default FirmwareSingleImageStore;