Skip to content

Commit 25451b7

Browse files
Kenneth Fullbrightrfrandse
Kenneth Fullbright
authored andcommitted
Added Initiate Resource Dump Function (#103)
* Added Initiate Resource Dump Function - Added ability to initiate resource dump. Signed-off-by: Kenneth Fullbright <[email protected]>
1 parent 3f4b176 commit 25451b7

File tree

5 files changed

+150
-9
lines changed

5 files changed

+150
-9
lines changed

src/store/modules/Authentication/AuthenticanStore.js

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const AuthenticationStore = {
3030
Cookies.remove('XSRF-TOKEN');
3131
Cookies.remove('IsAuthenticated');
3232
localStorage.removeItem('storedUsername');
33+
sessionStorage.removeItem('storedCurrentUser');
3334
state.xsrfCookie = undefined;
3435
state.isAuthenticatedCookie = undefined;
3536
},

src/store/modules/GlobalStore.js

+40
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const serverStateMapper = (hostState) => {
2929
const GlobalStore = {
3030
namespaced: true,
3131
state: {
32+
bootProgress: null,
3233
assetTag: null,
3334
bmcTime: null,
3435
acfInstalled: false,
@@ -42,9 +43,17 @@ const GlobalStore = {
4243
? JSON.parse(localStorage.getItem('storedUtcDisplay'))
4344
: true,
4445
username: localStorage.getItem('storedUsername'),
46+
currentUser: JSON.parse(sessionStorage.getItem('storedCurrentUser')),
4547
isAuthorized: true,
4648
},
4749
getters: {
50+
bootProgress: (state) => state.bootProgress,
51+
isInPhypStandby: (state) =>
52+
// SystemHardwareInitializationComplete and after is "PHYP in standby"
53+
state.bootProgress === 'SystemHardwareInitializationComplete' ||
54+
state.bootProgress === 'SetupEntered' ||
55+
state.bootProgress === 'OSBootStarted' ||
56+
state.bootProgress === 'OSRunning',
4857
assetTag: (state) => state.assetTag,
4958
modelType: (state) => state.modelType,
5059
serialNumber: (state) => state.serialNumber,
@@ -56,9 +65,14 @@ const GlobalStore = {
5665
languagePreference: (state) => state.languagePreference,
5766
isUtcDisplay: (state) => state.isUtcDisplay,
5867
username: (state) => state.username,
68+
currentUser: (state) => state.currentUser,
69+
isServiceUser: (state) =>
70+
state.currentUser?.RoleId === 'OemIBMServiceAgent' || !state.currentUser,
5971
isAuthorized: (state) => state.isAuthorized,
6072
},
6173
mutations: {
74+
setBootProgress: (state, bootProgress) =>
75+
(state.bootProgress = bootProgress),
6276
setAssetTag: (state, assetTag) => (state.assetTag = assetTag),
6377
setModelType: (state, modelType) => (state.modelType = modelType),
6478
setSerialNumber: (state, serialNumber) =>
@@ -75,6 +89,7 @@ const GlobalStore = {
7589
setLanguagePreference: (state, language) =>
7690
(state.languagePreference = language),
7791
setUsername: (state, username) => (state.username = username),
92+
setCurrentUser: (state, currentUser) => (state.currentUser = currentUser),
7893
setUtcTime: (state, isUtcDisplay) => (state.isUtcDisplay = isUtcDisplay),
7994
setUnauthorized: (state) => {
8095
state.isAuthorized = false;
@@ -103,6 +118,22 @@ const GlobalStore = {
103118
})
104119
.catch((error) => console.log(error));
105120
},
121+
getCurrentUser(
122+
{ commit, getters },
123+
username = localStorage.getItem('storedUsername')
124+
) {
125+
if (sessionStorage.getItem('storedCurrentUser')) return;
126+
return api
127+
.get(`/redfish/v1/AccountService/Accounts/${username}`)
128+
.then(({ data }) => {
129+
commit('setCurrentUser', data);
130+
sessionStorage.setItem(
131+
'storedCurrentUser',
132+
JSON.stringify(getters.currentUser)
133+
);
134+
})
135+
.catch((error) => console.log(error));
136+
},
106137
getSystemInfo({ commit }) {
107138
api
108139
.get('/redfish/v1/Systems/system')
@@ -131,6 +162,15 @@ const GlobalStore = {
131162
)
132163
.catch((error) => console.log(error));
133164
},
165+
async getBootProgress({ commit }) {
166+
api
167+
.get('/redfish/v1/Systems/system')
168+
.then(({ data }) => {
169+
const bootProgress = data.BootProgress.LastState;
170+
commit('setBootProgress', bootProgress);
171+
})
172+
.catch((error) => console.log(error));
173+
},
134174
},
135175
};
136176

src/store/modules/Logs/DumpsStore.js

+14
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,20 @@ const DumpsStore = {
6767
throw new Error(i18n.t('pageDumps.toast.errorStartBmcDump'));
6868
});
6969
},
70+
async createResourceDump(_, { resourceSelector, resourcePassword }) {
71+
return await api
72+
.post(
73+
'/redfish/v1/Systems/system/LogServices/Dump/Actions/LogService.CollectDiagnosticData',
74+
{
75+
DiagnosticDataType: 'OEM',
76+
OEMDiagnosticDataType: `Resource_${resourceSelector}_${resourcePassword}`,
77+
}
78+
)
79+
.catch((error) => {
80+
console.log(error);
81+
throw new Error(i18n.t('pageDumps.toast.errorStartResourceDump'));
82+
});
83+
},
7084
async createSystemDump() {
7185
return await api
7286
.post(

src/views/Login/Login.vue

+6-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,12 @@ export default {
131131
if (passwordChangeRequired) {
132132
this.$router.push('/change-password');
133133
} else {
134-
this.$router.push('/');
134+
Promise.all([
135+
this.$store.dispatch('global/getUsers'),
136+
this.$store.dispatch('global/getCurrentUser', username),
137+
]).then(() => {
138+
this.$router.push('/');
139+
});
135140
}
136141
})
137142
.catch((error) => console.log(error))

src/views/Logs/Dumps/DumpsForm.vue

+89-8
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,16 @@
55
:label="$t('pageDumps.form.selectDumpType')"
66
label-for="selectDumpType"
77
>
8+
<template #label>
9+
{{ $t('pageDumps.form.selectDumpType') }}
10+
<info-tooltip :title="$t('pageDumps.form.selectDumpTypeTooltip')" />
11+
</template>
812
<b-form-select
913
id="selectDumpType"
1014
v-model="selectedDumpType"
1115
:options="dumpTypeOptions"
1216
:state="getValidationState($v.selectedDumpType)"
17+
@change="updateDumpInfo"
1318
>
1419
<template #first>
1520
<b-form-select-option :value="null" disabled>
@@ -21,9 +26,40 @@
2126
{{ $t('global.form.required') }}
2227
</b-form-invalid-feedback>
2328
</b-form-group>
24-
<alert variant="info" class="mb-3" :show="selectedDumpType === 'system'">
25-
{{ $t('pageDumps.form.systemDumpInfo') }}
26-
</alert>
29+
<template v-if="selectedDumpType === 'resource'">
30+
<b-form-group label-for="resourceSelector">
31+
<template #label>
32+
{{ $t('pageDumps.form.resourceSelector') }}
33+
<info-tooltip
34+
:title="$t('pageDumps.form.resourceSelectorTooltip')"
35+
/>
36+
</template>
37+
38+
<b-form-input id="resourceSelector" v-model="resourceSelectorValue">
39+
</b-form-input>
40+
</b-form-group>
41+
<template v-if="isServiceUser">
42+
<b-form-group label-for="password">
43+
<template #label>
44+
{{ $t('pageDumps.form.password') }}
45+
<info-tooltip :title="$t('pageDumps.form.passwordTooltip')" />
46+
</template>
47+
<input-password-toggle>
48+
<b-form-input
49+
id="password"
50+
v-model="resourcePassword"
51+
type="password"
52+
:state="getValidationState($v.resourcePassword)"
53+
>
54+
</b-form-input>
55+
<b-form-invalid-feedback role="alert">
56+
{{ $t('global.form.required') }}
57+
</b-form-invalid-feedback>
58+
</input-password-toggle>
59+
</b-form-group>
60+
</template>
61+
</template>
62+
2763
<b-button variant="primary" type="submit" form="form-new-dump">
2864
{{ $t('pageDumps.form.initiateDump') }}
2965
</b-button>
@@ -33,30 +69,59 @@
3369
</template>
3470

3571
<script>
36-
import { required } from 'vuelidate/lib/validators';
72+
import { required, requiredIf } from 'vuelidate/lib/validators';
3773
import ModalConfirmation from './DumpsModalConfirmation';
38-
import Alert from '@/components/Global/Alert';
74+
import InfoTooltip from '@/components/Global/InfoTooltip';
75+
import InputPasswordToggle from '@/components/Global/InputPasswordToggle';
3976
import BVToastMixin from '@/components/Mixins/BVToastMixin';
4077
import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
4178
4279
export default {
43-
components: { Alert, ModalConfirmation },
80+
components: { InfoTooltip, InputPasswordToggle, ModalConfirmation },
4481
mixins: [BVToastMixin, VuelidateMixin],
4582
data() {
4683
return {
4784
selectedDumpType: null,
85+
resourceSelectorValue: null,
86+
resourcePassword: null,
4887
dumpTypeOptions: [
4988
{ value: 'bmc', text: this.$t('pageDumps.form.bmcDump') },
89+
{ value: 'resource', text: this.$t('pageDumps.form.resourceDump') },
5090
{ value: 'system', text: this.$t('pageDumps.form.systemDump') },
5191
],
5292
};
5393
},
94+
computed: {
95+
currentUser() {
96+
return this.$store.getters['global/currentUser'];
97+
},
98+
isServiceUser() {
99+
return this.$store.getters['global/isServiceUser'];
100+
},
101+
},
102+
created() {
103+
this.checkForUserData();
104+
},
54105
validations() {
55106
return {
56107
selectedDumpType: { required },
108+
resourcePassword: {
109+
required: requiredIf(
110+
() => this.isServiceUser && this.selectedDumpType === 'resource'
111+
),
112+
},
57113
};
58114
},
59115
methods: {
116+
checkForUserData() {
117+
if (!this.currentUser) {
118+
this.$store.dispatch('userManagement/getUsers');
119+
this.$store.dispatch('global/getCurrentUser');
120+
}
121+
},
122+
updateDumpInfo() {
123+
this.$emit('updateDumpInfo', this.selectedDumpType);
124+
},
60125
handleSubmit() {
61126
this.$v.$touch();
62127
if (this.$v.$invalid) return;
@@ -65,12 +130,28 @@ export default {
65130
if (this.selectedDumpType === 'system') {
66131
this.showConfirmationModal();
67132
}
133+
// Resource dump initiation
134+
else if (this.selectedDumpType === 'resource') {
135+
this.$store
136+
.dispatch('dumps/createResourceDump', {
137+
resourceSelector: this.resourceSelectorValue,
138+
// If not logged as service, 'pwd' must be used
139+
resourcePassword: this.resourcePassword || 'pwd',
140+
})
141+
.then(() =>
142+
this.infoToast(this.$t('pageDumps.toast.successStartDump'), {
143+
title: this.$t('pageDumps.toast.successStartResourceDumpTitle'),
144+
timestamp: true,
145+
})
146+
)
147+
.catch(({ message }) => this.errorToast(message));
148+
}
68149
// BMC dump initiation
69150
else if (this.selectedDumpType === 'bmc') {
70151
this.$store
71152
.dispatch('dumps/createBmcDump')
72153
.then(() =>
73-
this.infoToast(this.$t('pageDumps.toast.successStartBmcDump'), {
154+
this.infoToast(this.$t('pageDumps.toast.successStartDump'), {
74155
title: this.$t('pageDumps.toast.successStartBmcDumpTitle'),
75156
timestamp: true,
76157
})
@@ -85,7 +166,7 @@ export default {
85166
this.$store
86167
.dispatch('dumps/createSystemDump')
87168
.then(() =>
88-
this.infoToast(this.$t('pageDumps.toast.successStartSystemDump'), {
169+
this.infoToast(this.$t('pageDumps.toast.successStartDump'), {
89170
title: this.$t('pageDumps.toast.successStartSystemDumpTitle'),
90171
timestamp: true,
91172
})

0 commit comments

Comments
 (0)