From 5dfe5c5deebbc955e19830b1717da0fb2b5f3447 Mon Sep 17 00:00:00 2001 From: Kristijan Mitrovic Date: Wed, 1 Jul 2020 11:17:40 +0200 Subject: [PATCH] Show latest backup and allow queuing new one --- src/_services/network.service.js | 16 +++++++-- src/_store/networks.module.js | 57 ++++++++++++++++++++++++++++---- src/account/NetworkPage.vue | 38 +++++++++++++++++++-- 3 files changed, 100 insertions(+), 11 deletions(-) diff --git a/src/_services/network.service.js b/src/_services/network.service.js index 2af16a6..579c6df 100644 --- a/src/_services/network.service.js +++ b/src/_services/network.service.js @@ -10,6 +10,7 @@ export const networkService = { getNetworkById, getNearestRegions, startNetwork, + queueBackup, forkNetwork, getStatusesByNetworkId, getNodesByNetworkId, @@ -17,7 +18,8 @@ export const networkService = { restoreNetwork, deleteNetwork, requestNetworkKeys, - retrieveNetworkKeys + retrieveNetworkKeys, + getNetworkBackups }; function getAllNetworks(userId, messages, errors) { @@ -59,6 +61,11 @@ function stopNetwork(userId, networkId, messages, errors) { return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/actions/stop`, util.postWithAuth()).then(util.handleCrudResponse(messages, errors)); } +function queueBackup(userId, networkId, messages, errors) { + return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/backups/user_requested`, util.putWithAuth()) + .then(util.handleCrudResponse(messages, errors)); +} + function restoreNetwork(userId, networkId, messages, errors) { return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/actions/restore`, util.postWithAuth()).then(util.handleCrudResponse(messages, errors)); @@ -75,4 +82,9 @@ function requestNetworkKeys(userId, networkId, messages, errors) { function retrieveNetworkKeys(userId, networkId, code, password, messages, errors) { return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/actions/keys/${code}`, util.postWithAuth({name: 'password', value: password})).then(util.handleCrudResponse(messages, errors)); -} \ No newline at end of file +} + +function getNetworkBackups(userId, networkId, messages, errors) { + return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/backups`, util.getWithAuth()) + .then(util.handleCrudResponse(messages, errors)); +} diff --git a/src/_store/networks.module.js b/src/_store/networks.module.js index ed2beaa..8bbe5f1 100644 --- a/src/_store/networks.module.js +++ b/src/_store/networks.module.js @@ -10,7 +10,7 @@ const state = { loading: { networks: false, network: false, stopping: false, restoring: false, deleting: false, nearestRegions: false, startingNetwork: false, networkStatuses: false, networkNodes: false, - requestNetworkKeys: false, retrieveNetworkKeys: false + requestNetworkKeys: false, retrieveNetworkKeys: false, queueBackup: false }, creating: null, error: null, @@ -23,7 +23,8 @@ const state = { deletedNetwork: null, networkKeysRequested: null, networkKeys: null, - restoreKey: null + restoreKey: null, + backups: null, }; const actions = { @@ -36,13 +37,21 @@ const actions = { ); }, - getNetworkById({ commit }, {userId, networkId, messages, errors}) { + getBackups({ commit }, { userId, networkId, messages, errors }) { + commit('getNetworkBackupsRequest'); + networkService.getNetworkBackups(userId, networkId, messages, errors) + .then(backups => commit('getNetworkBackupsSuccess', backups), + error => commit('getNetworkBackupsFailure', error)); + }, + + getNetworkById({ commit, dispatch }, {userId, networkId, messages, errors}) { commit('getNetworkByIdRequest'); networkService.getNetworkById(userId, networkId, messages, errors) - .then( - network => commit('getNetworkByIdSuccess', network), - error => commit('getNetworkByIdFailure', error) - ); + .then(network => commit('getNetworkByIdSuccess', network), + error => commit('getNetworkByIdFailure', error)) + .then(r => dispatch('getBackups', + { userId: userId, networkId: networkId, + messages: messages, errors: errors })); }, addPlanAndStartNetwork({ commit }, {userId, accountPlan, cloud, region, messages, errors}) { @@ -96,6 +105,16 @@ const actions = { ); }, + queueBackup({ commit, dispatch }, { userId, networkId, messages, errors }) { + commit('queueBackupRequest', networkId); + networkService.queueBackup(userId, networkId, messages, errors) + .then(backup => commit('queueBackupSuccess', backup), + error => commit('queueBackupFailure', { networkId, error: error.toString() })) + .then(r => dispatch('getBackups', + { userId: userId, networkId: networkId, + messages: messages, errors: errors })); +}, + restoreNetwork({ commit }, { userId, networkId, messages, errors }) { commit('restoreNetworkRequest', networkId); networkService.restoreNetwork(userId, networkId, messages, errors) @@ -222,6 +241,18 @@ const mutations = { state.error = error; }, + queueBackupRequest(state, id) { + state.loading.queueBackup = true; + }, + queueBackupSuccess(state, id) { + // noop - state.loading.queueBackup will be set to false only after backup info is loaded to prevent allowing + // another backup in queue before this one i really processed. + }, + queueBackupFailure(state, { id, error }) { + state.loading.queueBackup = false; + state.error = error; + }, + restoreNetworkRequest(state, networkId) { state.loading.restoring = true; state.restoreKey = null; @@ -290,6 +321,18 @@ const mutations = { retrieveNetworkKeysFailure(state, error) { state.loading.retrieveNetworkKeys = false; state.error = { error }; + }, + getNetworkBackupsRequest(state, backups) { + state.backups = null; + }, + getNetworkBackupsSuccess(state, backups) { + state.backups = backups; + state.loading.queueBackup = false; + }, + getNetworkBackupsFailure(state, error) { + state.backups = null; + state.loading.queueBackup = false; + state.error = { error }; } }; diff --git a/src/account/NetworkPage.vue b/src/account/NetworkPage.vue index 0e9ef5c..2bd42e7 100644 --- a/src/account/NetworkPage.vue +++ b/src/account/NetworkPage.vue @@ -165,6 +165,23 @@ {{messages.link_network_action_stop_description}} + +
+ {{ messages.label_latest_backup }} + + {{ messages.label_no_latest_backup }} + + {{ messages.label_latest_backup }} {{ backups[0].label }} {{ backups[0].status }} + {{ messages.date_format_app_data_epoch_time.parseDateMessage(backups[0]['creationTime'], messages) }} + + + + +
+ +
@@ -199,7 +216,7 @@ computed: { ...mapState('networks', [ 'network', 'newNodeNotification', 'networkStatuses', 'networkNodes', 'networkKeysRequested', - 'deletedNetwork', 'networkKeys', 'loading', 'restoreKey' + 'deletedNetwork', 'networkKeys', 'loading', 'restoreKey', 'backups' ]), ...mapState('system', ['messages', 'configs', 'appLinks']), showSetupHelp () { @@ -217,12 +234,20 @@ }, networkAppLoginUrl: function () { return 'https://'+this.network.name+'.'+this.network.domainName+'/appLogin?session='+util.currentUser().token+'&uri=/'; + }, + allowQueueBackup: function () { + if (this.backups === null) return false; + if (this.backups.length === 0) return true; + + let lastBackupStatus = this.backups[0].status; + return lastBackupStatus !== 'queued' && lastBackupStatus !== 'backup_in_progress'; } }, methods: { ...mapActions('networks', [ 'getNetworkById', 'deleteNetwork', 'getStatusesByNetworkId', 'getNodesByNetworkId', - 'stopNetwork', 'restoreNetwork', 'deleteNetwork', 'requestNetworkKeys', 'retrieveNetworkKeys' + 'stopNetwork', 'queueBackup', 'restoreNetwork', 'deleteNetwork', 'requestNetworkKeys', + 'retrieveNetworkKeys' ]), ...mapActions('system', ['getAppLinks']), refreshStatus (userId) { @@ -254,6 +279,15 @@ errors: this.errors }); }, + queueBckup () { + this.errors.clear(); + this.queueBackup({ + userId: this.user.uuid, + networkId: this.networkId, + messages: this.messages, + errors: this.errors + }); + }, restoreNet () { this.errors.clear(); this.restoreNetwork({