1import api from '@/store/api';
2
3const HOST_STATE = {
4  on: 'xyz.openbmc_project.State.Host.HostState.Running',
5  off: 'xyz.openbmc_project.State.Host.HostState.Off',
6  error: 'xyz.openbmc_project.State.Host.HostState.Quiesced',
7  diagnosticMode: 'xyz.openbmc_project.State.Host.HostState.DiagnosticMode',
8};
9
10const serverStateMapper = (hostState) => {
11  switch (hostState) {
12    case HOST_STATE.on:
13    case 'On': // Redfish PowerState
14      return 'on';
15    case HOST_STATE.off:
16    case 'Off': // Redfish PowerState
17      return 'off';
18    case HOST_STATE.error:
19    case 'Quiesced': // Redfish Status
20      return 'error';
21    case HOST_STATE.diagnosticMode:
22    case 'InTest': // Redfish Status
23      return 'diagnosticMode';
24    default:
25      return 'unreachable';
26  }
27};
28
29const GlobalStore = {
30  namespaced: true,
31  state: {
32    assetTag: null,
33    bmcTime: null,
34    modelType: null,
35    serialNumber: null,
36    serverStatus: 'unreachable',
37    languagePreference: localStorage.getItem('storedLanguage') || 'en-US',
38    isUtcDisplay: localStorage.getItem('storedUtcDisplay')
39      ? JSON.parse(localStorage.getItem('storedUtcDisplay'))
40      : true,
41    username: localStorage.getItem('storedUsername'),
42    isAuthorized: true,
43    userPrivilege: null,
44  },
45  getters: {
46    assetTag: (state) => state.assetTag,
47    modelType: (state) => state.modelType,
48    serialNumber: (state) => state.serialNumber,
49    serverStatus: (state) => state.serverStatus,
50    bmcTime: (state) => state.bmcTime,
51    languagePreference: (state) => state.languagePreference,
52    isUtcDisplay: (state) => state.isUtcDisplay,
53    username: (state) => state.username,
54    isAuthorized: (state) => state.isAuthorized,
55    userPrivilege: (state) => state.userPrivilege,
56  },
57  mutations: {
58    setAssetTag: (state, assetTag) => (state.assetTag = assetTag),
59    setModelType: (state, modelType) => (state.modelType = modelType),
60    setSerialNumber: (state, serialNumber) =>
61      (state.serialNumber = serialNumber),
62    setBmcTime: (state, bmcTime) => (state.bmcTime = bmcTime),
63    setServerStatus: (state, serverState) =>
64      (state.serverStatus = serverStateMapper(serverState)),
65    setLanguagePreference: (state, language) =>
66      (state.languagePreference = language),
67    setUsername: (state, username) => (state.username = username),
68    setUtcTime: (state, isUtcDisplay) => (state.isUtcDisplay = isUtcDisplay),
69    setUnauthorized: (state) => {
70      state.isAuthorized = false;
71      window.setTimeout(() => {
72        state.isAuthorized = true;
73      }, 100);
74    },
75    setPrivilege: (state, privilege) => {
76      state.userPrivilege = privilege;
77    },
78  },
79  actions: {
80    async getBmcPath() {
81      const serviceRoot = await api
82        .get('/redfish/v1')
83        .catch((error) => console.log(error));
84      let bmcPath = serviceRoot.data?.ManagerProvidingService?.['@odata.id'];
85      if (!bmcPath) {
86        const managers = await api
87          .get('/redfish/v1/Managers')
88          .catch((error) => console.log(error));
89        bmcPath = managers.data?.Members?.[0]?.['@odata.id'];
90      }
91      return bmcPath;
92    },
93    async getSystemPath() {
94      const systems = await api
95        .get('/redfish/v1/Systems')
96        .catch((error) => console.log(error));
97      let systemPath = systems.data?.Members?.[0]?.['@odata.id'];
98      return systemPath;
99    },
100    async getBmcTime({ commit }) {
101      return await api
102        .get(`${await this.dispatch('global/getBmcPath')}`)
103        .then((response) => {
104          const bmcDateTime = response.data.DateTime;
105          const date = new Date(bmcDateTime);
106          commit('setBmcTime', date);
107        })
108        .catch((error) => console.log(error));
109    },
110    async getSystemInfo({ commit }) {
111      api
112        .get(`${await this.dispatch('global/getSystemPath')}`)
113        .then(
114          ({
115            data: {
116              AssetTag,
117              Model,
118              PowerState,
119              SerialNumber,
120              Status: { State } = {},
121            },
122          } = {}) => {
123            commit('setAssetTag', AssetTag);
124            commit('setSerialNumber', SerialNumber);
125            commit('setModelType', Model);
126            if (State === 'Quiesced' || State === 'InTest') {
127              // OpenBMC's host state interface is mapped to 2 Redfish
128              // properties "Status""State" and "PowerState". Look first
129              // at State for certain cases.
130              commit('setServerStatus', State);
131            } else {
132              commit('setServerStatus', PowerState);
133            }
134          },
135        )
136        .catch((error) => console.log(error));
137    },
138  },
139};
140
141export default GlobalStore;
142