@@ -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)); | |||
} | |||
} | |||
function getNetworkBackups(userId, networkId, messages, errors) { | |||
return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/backups`, util.getWithAuth()) | |||
.then(util.handleCrudResponse(messages, errors)); | |||
} |
@@ -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 }; | |||
} | |||
}; | |||
@@ -165,6 +165,23 @@ | |||
</button> | |||
<img v-show="loading && loading.stopping" :src="loadingImgSrc" /> | |||
{{messages.link_network_action_stop_description}} | |||
<hr/> | |||
<span v-if="backups === null">{{ messages.label_latest_backup }} <img :src="loadingImgSrc" /></span> | |||
<span v-else> | |||
<span v-if="backups.length === 0">{{ messages.label_no_latest_backup }}</span> | |||
<span v-else> | |||
{{ messages.label_latest_backup }} {{ backups[0].label }} {{ backups[0].status }} | |||
{{ messages.date_format_app_data_epoch_time.parseDateMessage(backups[0]['creationTime'], messages) }} | |||
</span> | |||
</span> | |||
<span v-if="allowQueueBackup"> | |||
<br/> | |||
<button @click="queueBckup()" class="btn btn-secondary" :disabled="loading && loading.queueBackup"> | |||
{{ messages.link_backup_network }} | |||
</button> | |||
</span> | |||
</div> | |||
<div v-else-if="network.state === 'stopped' || network.state === 'error_stopping'" | |||
style="border: 2px solid #000;"> | |||
@@ -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({ | |||