@@ -10,6 +10,7 @@ export const networkService = { | |||||
getNetworkById, | getNetworkById, | ||||
getNearestRegions, | getNearestRegions, | ||||
startNetwork, | startNetwork, | ||||
queueBackup, | |||||
forkNetwork, | forkNetwork, | ||||
getStatusesByNetworkId, | getStatusesByNetworkId, | ||||
getNodesByNetworkId, | getNodesByNetworkId, | ||||
@@ -17,7 +18,8 @@ export const networkService = { | |||||
restoreNetwork, | restoreNetwork, | ||||
deleteNetwork, | deleteNetwork, | ||||
requestNetworkKeys, | requestNetworkKeys, | ||||
retrieveNetworkKeys | |||||
retrieveNetworkKeys, | |||||
getNetworkBackups | |||||
}; | }; | ||||
function getAllNetworks(userId, messages, errors) { | 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)); | 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) { | function restoreNetwork(userId, networkId, messages, errors) { | ||||
return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/actions/restore`, | return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/actions/restore`, | ||||
util.postWithAuth()).then(util.handleCrudResponse(messages, errors)); | 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) { | 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)); | 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: { | loading: { | ||||
networks: false, network: false, stopping: false, restoring: false, deleting: false, | networks: false, network: false, stopping: false, restoring: false, deleting: false, | ||||
nearestRegions: false, startingNetwork: false, networkStatuses: false, networkNodes: false, | nearestRegions: false, startingNetwork: false, networkStatuses: false, networkNodes: false, | ||||
requestNetworkKeys: false, retrieveNetworkKeys: false | |||||
requestNetworkKeys: false, retrieveNetworkKeys: false, queueBackup: false | |||||
}, | }, | ||||
creating: null, | creating: null, | ||||
error: null, | error: null, | ||||
@@ -23,7 +23,8 @@ const state = { | |||||
deletedNetwork: null, | deletedNetwork: null, | ||||
networkKeysRequested: null, | networkKeysRequested: null, | ||||
networkKeys: null, | networkKeys: null, | ||||
restoreKey: null | |||||
restoreKey: null, | |||||
backups: null, | |||||
}; | }; | ||||
const actions = { | 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'); | commit('getNetworkByIdRequest'); | ||||
networkService.getNetworkById(userId, networkId, messages, errors) | 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}) { | 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 }) { | restoreNetwork({ commit }, { userId, networkId, messages, errors }) { | ||||
commit('restoreNetworkRequest', networkId); | commit('restoreNetworkRequest', networkId); | ||||
networkService.restoreNetwork(userId, networkId, messages, errors) | networkService.restoreNetwork(userId, networkId, messages, errors) | ||||
@@ -222,6 +241,18 @@ const mutations = { | |||||
state.error = error; | 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) { | restoreNetworkRequest(state, networkId) { | ||||
state.loading.restoring = true; | state.loading.restoring = true; | ||||
state.restoreKey = null; | state.restoreKey = null; | ||||
@@ -290,6 +321,18 @@ const mutations = { | |||||
retrieveNetworkKeysFailure(state, error) { | retrieveNetworkKeysFailure(state, error) { | ||||
state.loading.retrieveNetworkKeys = false; | state.loading.retrieveNetworkKeys = false; | ||||
state.error = { error }; | 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> | </button> | ||||
<img v-show="loading && loading.stopping" :src="loadingImgSrc" /> | <img v-show="loading && loading.stopping" :src="loadingImgSrc" /> | ||||
{{messages.link_network_action_stop_description}} | {{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> | ||||
<div v-else-if="network.state === 'stopped' || network.state === 'error_stopping'" | <div v-else-if="network.state === 'stopped' || network.state === 'error_stopping'" | ||||
style="border: 2px solid #000;"> | style="border: 2px solid #000;"> | ||||
@@ -199,7 +216,7 @@ | |||||
computed: { | computed: { | ||||
...mapState('networks', [ | ...mapState('networks', [ | ||||
'network', 'newNodeNotification', 'networkStatuses', 'networkNodes', 'networkKeysRequested', | 'network', 'newNodeNotification', 'networkStatuses', 'networkNodes', 'networkKeysRequested', | ||||
'deletedNetwork', 'networkKeys', 'loading', 'restoreKey' | |||||
'deletedNetwork', 'networkKeys', 'loading', 'restoreKey', 'backups' | |||||
]), | ]), | ||||
...mapState('system', ['messages', 'configs', 'appLinks']), | ...mapState('system', ['messages', 'configs', 'appLinks']), | ||||
showSetupHelp () { | showSetupHelp () { | ||||
@@ -217,12 +234,20 @@ | |||||
}, | }, | ||||
networkAppLoginUrl: function () { | networkAppLoginUrl: function () { | ||||
return 'https://'+this.network.name+'.'+this.network.domainName+'/appLogin?session='+util.currentUser().token+'&uri=/'; | 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: { | methods: { | ||||
...mapActions('networks', [ | ...mapActions('networks', [ | ||||
'getNetworkById', 'deleteNetwork', 'getStatusesByNetworkId', 'getNodesByNetworkId', | 'getNetworkById', 'deleteNetwork', 'getStatusesByNetworkId', 'getNodesByNetworkId', | ||||
'stopNetwork', 'restoreNetwork', 'deleteNetwork', 'requestNetworkKeys', 'retrieveNetworkKeys' | |||||
'stopNetwork', 'queueBackup', 'restoreNetwork', 'deleteNetwork', 'requestNetworkKeys', | |||||
'retrieveNetworkKeys' | |||||
]), | ]), | ||||
...mapActions('system', ['getAppLinks']), | ...mapActions('system', ['getAppLinks']), | ||||
refreshStatus (userId) { | refreshStatus (userId) { | ||||
@@ -254,6 +279,15 @@ | |||||
errors: this.errors | errors: this.errors | ||||
}); | }); | ||||
}, | }, | ||||
queueBckup () { | |||||
this.errors.clear(); | |||||
this.queueBackup({ | |||||
userId: this.user.uuid, | |||||
networkId: this.networkId, | |||||
messages: this.messages, | |||||
errors: this.errors | |||||
}); | |||||
}, | |||||
restoreNet () { | restoreNet () { | ||||
this.errors.clear(); | this.errors.clear(); | ||||
this.restoreNetwork({ | this.restoreNetwork({ | ||||