diff --git a/packages/manager/modules/netapp/src/components/index.js b/packages/manager/modules/netapp/src/components/index.js index 84140a7b9ffe..a2036a60a898 100644 --- a/packages/manager/modules/netapp/src/components/index.js +++ b/packages/manager/modules/netapp/src/components/index.js @@ -2,9 +2,18 @@ import angular from 'angular'; import selectCheckboxes from './select-checkboxes'; import snapshotList from './snapshot-policies'; +import replicationsApprouveModal from './replications-approuve-modal'; +import replicationsPromoteModal from './replications-promote-modal'; +import replicationsDeleteModal from './replications-delete-modal'; const moduleName = 'ovhManagerNetAppComponents'; -angular.module(moduleName, [selectCheckboxes, snapshotList]); +angular.module(moduleName, [ + selectCheckboxes, + snapshotList, + replicationsApprouveModal, + replicationsPromoteModal, + replicationsDeleteModal, +]); export default moduleName; diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/component.js b/packages/manager/modules/netapp/src/components/replications-approuve-modal/component.js new file mode 100644 index 000000000000..ef1656d3f0e1 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/component.js @@ -0,0 +1,11 @@ +import controller from './controller'; +import template from './template.html'; + +export default { + bindings: { + goToReplications: '<', + params: '<', + }, + controller, + template, +}; diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/controller.js b/packages/manager/modules/netapp/src/components/replications-approuve-modal/controller.js new file mode 100644 index 000000000000..868a34ff865c --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/controller.js @@ -0,0 +1,63 @@ +export default class ReplicationsApprouveModalCtrl { + /** @ngInject */ + constructor($http, $translate, Alerter) { + this.Alerter = Alerter; + this.$translate = $translate; + this.$http = $http; + this.onLoad = false; + } + + $onInit() { + this.isPrimaryDisabled = + !this.params.destinationServiceID || + !this.params.sourceShareID || + !this.params.replicationID; + } + + onError() { + this.Alerter.error( + this.$translate.instant('netapp_replications_approuve_error', { + sourceShareID: this.params.sourceShareID, + }), + ); + return this.goToReplications(); + } + + onPrimaryClick() { + return this.$http + .get( + `/storage/netapp/${this.params.destinationServiceID}/share/${this.params.sourceShareID}`, + ) + .catch(() => this.onError()) + .then(({ data: { size } }) => + this.$http + .post( + `/storage/netapp/${this.params.destinationServiceID}/shareReplication/${this.params.replicationID}/accept`, + { + share: { + protocol: 'NFS', + size, + }, + }, + ) + .then(() => { + this.goToReplications(true).then(() => { + this.Alerter.success( + this.$translate.instant( + 'netapp_replications_approuve_success', + { sourceShareID: this.params.sourceShareID }, + ), + ); + }); + }) + .catch(() => this.onError()), + ); + } + + primaryAction() { + this.onLoad = true; + this.onPrimaryClick().finally(() => { + this.onLoad = false; + }); + } +} diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/index.js b/packages/manager/modules/netapp/src/components/replications-approuve-modal/index.js new file mode 100644 index 000000000000..8ca89899fa52 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/index.js @@ -0,0 +1,20 @@ +import angular from 'angular'; +import 'angular-translate'; +import '@ovh-ux/ng-translate-async-loader'; +import '@ovh-ux/ui-kit'; + +import component from './component'; + +const moduleName = 'ovhManagerReplicationsApprouveModalComponent'; + +angular + .module(moduleName, [ + 'pascalprecht.translate', + 'oui', + 'ngSanitize', + 'ngTranslateAsyncLoader', + ]) + .component(moduleName, component) + .run(/* @ngTranslationsInject:json ./translations */); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/template.html b/packages/manager/modules/netapp/src/components/replications-approuve-modal/template.html new file mode 100644 index 000000000000..972119407321 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/template.html @@ -0,0 +1,14 @@ + +

+
diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_de_DE.json b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_de_DE.json new file mode 100644 index 000000000000..16d20653fe36 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_de_DE.json @@ -0,0 +1,9 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Es wurde keine Replikation ausgewählt. Bitte wählen Sie eine aus.", + "netapp_replications_modal_title_approuve": "Replikation akzeptieren", + "netapp_replications_modal_description_approuve": "Achtung! Sie sind im Begriff, eine Replikation zu akzeptieren.", + "netapp_replications_modal_primary_label_approuve": "Synchronisieren", + "netapp_replications_modal_secondary_label": "Schließen", + "netapp_replications_approuve_error": "Das Akzeptieren der Replikation für Volume {{ sourceShareID }} ist fehlgeschlagen.", + "netapp_replications_approuve_success": "Die Replikation des Volumes {{ sourceShareID }} wurde erfolgreich akzeptiert und die Synchronisierung wurde gestartet." +} diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_en_GB.json b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_en_GB.json new file mode 100644 index 000000000000..c1996f8e2677 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_en_GB.json @@ -0,0 +1,9 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "No replication selected. Please select one.", + "netapp_replications_modal_title_approuve": "Accept replication", + "netapp_replications_modal_description_approuve": "Careful! You are about to accept a replication.", + "netapp_replications_modal_primary_label_approuve": "Sync", + "netapp_replications_modal_secondary_label": "Close", + "netapp_replications_approuve_error": "Unable to accept replication for the {{ sourceShareID }} volume.", + "netapp_replications_approuve_success": "Replication accepted for the {{ sourceShareID }} volume, and synchronisation is now in progress." +} diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_es_ES.json b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_es_ES.json new file mode 100644 index 000000000000..40aa5a1247ab --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_es_ES.json @@ -0,0 +1,9 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "No se ha seleccionado ninguna replicación. Por favor, seleccione una.", + "netapp_replications_modal_title_approuve": "Aceptar replicación", + "netapp_replications_modal_description_approuve": "¡Atención! Va a aceptar una replicación.", + "netapp_replications_modal_primary_label_approuve": "Sincronizar", + "netapp_replications_modal_secondary_label": "Cerrar", + "netapp_replications_approuve_error": "No se pudo aceptar la replicación del volumen {{ sourceShareID }}.", + "netapp_replications_approuve_success": "La replicación del volumen {{ sourceShareID }} se ha aceptado correctamente y se ha iniciado la sincronización." +} diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_fr_CA.json b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_fr_CA.json new file mode 100644 index 000000000000..89a416d1c48d --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_fr_CA.json @@ -0,0 +1,9 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Aucune réplication sélectionnée. Merci d'en sélectionner une.", + "netapp_replications_modal_title_approuve": "Accepter la réplication", + "netapp_replications_modal_description_approuve": "Attention! Vous allez accepter une réplication.", + "netapp_replications_modal_primary_label_approuve": "Synchroniser", + "netapp_replications_modal_secondary_label": "Fermer", + "netapp_replications_approuve_error": "L'acceptation de la réplication du volume {{ sourceShareID }} a échoué.", + "netapp_replications_approuve_success": "La réplication du volume {{ sourceShareID }} a été acceptée avec succès et la synchronisation a commencé." +} diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_fr_FR.json b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_fr_FR.json new file mode 100644 index 000000000000..89a416d1c48d --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_fr_FR.json @@ -0,0 +1,9 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Aucune réplication sélectionnée. Merci d'en sélectionner une.", + "netapp_replications_modal_title_approuve": "Accepter la réplication", + "netapp_replications_modal_description_approuve": "Attention! Vous allez accepter une réplication.", + "netapp_replications_modal_primary_label_approuve": "Synchroniser", + "netapp_replications_modal_secondary_label": "Fermer", + "netapp_replications_approuve_error": "L'acceptation de la réplication du volume {{ sourceShareID }} a échoué.", + "netapp_replications_approuve_success": "La réplication du volume {{ sourceShareID }} a été acceptée avec succès et la synchronisation a commencé." +} diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_it_IT.json b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_it_IT.json new file mode 100644 index 000000000000..675e57770045 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_it_IT.json @@ -0,0 +1,9 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Nessuna replica selezionata. Ti chiediamo di selezionarne una.", + "netapp_replications_modal_title_approuve": "Accettare la replica", + "netapp_replications_modal_description_approuve": "Attenzione! Stai per accettare una replica.", + "netapp_replications_modal_primary_label_approuve": "Sincronizza", + "netapp_replications_modal_secondary_label": "Chiudere", + "netapp_replications_approuve_error": "L'accettazione della replica del volume {{ sourceShareID }} non è andata a buon fine.", + "netapp_replications_approuve_success": "La replica del volume {{ sourceShareID }} è stata accettata correttamente e la sincronizzazione è iniziata." +} diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_pl_PL.json b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_pl_PL.json new file mode 100644 index 000000000000..302d49bd1d69 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_pl_PL.json @@ -0,0 +1,9 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Nie wybrano replikacji. Prosimy o wybranie replikacji.", + "netapp_replications_modal_title_approuve": "Akceptuj replikację", + "netapp_replications_modal_description_approuve": "Uwaga: Chcesz zaakceptować replikację.", + "netapp_replications_modal_primary_label_approuve": "Synchronizuj", + "netapp_replications_modal_secondary_label": "Zamknij", + "netapp_replications_approuve_error": "Nie udało się zaakceptować replikacji wolumenu {{sourceShareID}}.", + "netapp_replications_approuve_success": "Replikacja wolumenu {{sourceShareID}} została zaakceptowana i rozpoczęła się synchronizacja." +} diff --git a/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_pt_PT.json b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_pt_PT.json new file mode 100644 index 000000000000..a9d80aa239be --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-approuve-modal/translations/Messages_pt_PT.json @@ -0,0 +1,9 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Nenhuma replicação selecionada. Selecione uma.", + "netapp_replications_modal_title_approuve": "Aceitar a replicação", + "netapp_replications_modal_description_approuve": "Atenção! Vai aceitar uma replicação.", + "netapp_replications_modal_primary_label_approuve": "Sincronizar ", + "netapp_replications_modal_secondary_label": "Fechar", + "netapp_replications_approuve_error": "A aceitação da replicação do volume {{ sourceShareID }} falhou.", + "netapp_replications_approuve_success": "A replicação do volume {{ sourceShareID }} foi aceite com êxito e a sincronização foi iniciada." +} diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/component.js b/packages/manager/modules/netapp/src/components/replications-delete-modal/component.js new file mode 100644 index 000000000000..bd8b94165949 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/component.js @@ -0,0 +1,12 @@ +import controller from './controller'; +import template from './template.html'; + +export default { + bindings: { + serviceName: '<', + goToReplications: '<', + params: '<', + }, + controller, + template, +}; diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/controller.js b/packages/manager/modules/netapp/src/components/replications-delete-modal/controller.js new file mode 100644 index 000000000000..df5b7fc097dd --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/controller.js @@ -0,0 +1,92 @@ +import { REPLICATION_API_STATUS } from '../../dashboard/replications/constants'; + +export default class ReplicationsDeleteModalCtrl { + /** @ngInject */ + constructor($http, $translate, Alerter) { + this.Alerter = Alerter; + this.$translate = $translate; + this.$http = $http; + this.onLoad = false; + } + + $onInit() { + this.isPrimaryDisabled = !this.params.replicationID; + } + + getTitle() { + if ( + [ + REPLICATION_API_STATUS.pending, + REPLICATION_API_STATUS.accepted, + ].includes(this.params.status) + ) { + return this.$translate.instant( + 'netapp_replications_modal_delete_title_cancel', + ); + } + return this.$translate.instant( + 'netapp_replications_modal_delete_title_delete', + ); + } + + getDescription() { + switch (this.params.status) { + case REPLICATION_API_STATUS.pending: + return this.$translate.instant( + 'netapp_replications_modal_delete_description_pending', + ); + case REPLICATION_API_STATUS.completed: + return this.$translate.instant( + 'netapp_replications_modal_delete_description_completed', + ); + case REPLICATION_API_STATUS.accepted: + return this.$translate.instant( + 'netapp_replications_modal_delete_description_accepted', + ); + default: + return this.$translate.instant( + 'netapp_replications_modal_delete_description_delete', + ); + } + } + + onError() { + this.Alerter.error( + [ + REPLICATION_API_STATUS.pending, + REPLICATION_API_STATUS.accepted, + ].includes(this.params.status) + ? this.$translate.instant('netapp_replications_cancel_error', { + sourceShareID: this.params.sourceShareID, + }) + : this.$translate.instant('netapp_replications_delete_error', { + sourceShareID: this.params.sourceShareID, + }), + ); + return this.goToReplications(); + } + + primaryAction() { + this.$http + .delete( + `/storage/netapp/${this.serviceName}/shareReplication/${this.params.replicationID}`, + ) + .then(() => { + return this.goToReplications(true).then(() => { + this.Alerter.success( + [ + REPLICATION_API_STATUS.pending, + REPLICATION_API_STATUS.accepted, + ].includes(this.params.status) + ? this.$translate.instant('netapp_replications_cancel_success', { + sourceShareID: this.params.sourceShareID, + }) + : this.$translate.instant('netapp_replications_delete_success', { + sourceShareID: this.params.sourceShareID, + }), + ); + }); + }) + .catch(() => this.onError()); + } +} diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/index.js b/packages/manager/modules/netapp/src/components/replications-delete-modal/index.js new file mode 100644 index 000000000000..3f4cbfd15b59 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/index.js @@ -0,0 +1,20 @@ +import angular from 'angular'; +import 'angular-translate'; +import '@ovh-ux/ng-translate-async-loader'; +import '@ovh-ux/ui-kit'; + +import component from './component'; + +const moduleName = 'ovhManagerReplicationsDeleteModalComponent'; + +angular + .module(moduleName, [ + 'pascalprecht.translate', + 'oui', + 'ngSanitize', + 'ngTranslateAsyncLoader', + ]) + .component(moduleName, component) + .run(/* @ngTranslationsInject:json ./translations */); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/template.html b/packages/manager/modules/netapp/src/components/replications-delete-modal/template.html new file mode 100644 index 000000000000..f6aece54a927 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/template.html @@ -0,0 +1,19 @@ + +

+
+

+
+
diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_de_DE.json b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_de_DE.json new file mode 100644 index 000000000000..d50d7d79d6b2 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_de_DE.json @@ -0,0 +1,15 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Es wurde keine Replikation ausgewählt. Bitte wählen Sie eine aus.", + "netapp_replications_modal_delete_title_delete": "Replikation löschen", + "netapp_replications_modal_delete_title_cancel": "Replikation abbrechen", + "netapp_replications_modal_delete_description_pending": "Sie werden diese Replikationsanforderung abbrechen, ohne sie zu akzeptieren. Möchten Sie wirklich fortfahren?", + "netapp_replications_modal_delete_description_completed": "Durch diese Aktion wird die Zeile aus der Tabelle gelöscht und die während des Replikationsprozesses erstellten Volumes (Quelle und Ziel) bleiben erhalten. Möchten Sie wirklich fortfahren?", + "netapp_replications_modal_delete_description_accepted": "Achtung: Wenn Sie diese Replikation abbrechen, beenden Sie die Synchronisierung und löschen das Zielvolume. Möchten Sie wirklich fortfahren?", + "netapp_replications_modal_delete_description_delete": "Sind Sie sicher, dass Sie diese Replikation löschen möchten?", + "netapp_replications_modal_delete_primary_label_confirm": "Bestätigen", + "netapp_replications_modal_delete_secondary_label": "Schließen", + "netapp_replications_delete_success": "Die Replikation des Volumes {{ sourceShareID }} wurde erfolgreich gelöscht.", + "netapp_replications_cancel_success": "Die Replikation des Volumes {{ sourceShareID }} wurde erfolgreich abgebrochen.", + "netapp_replications_delete_error": "Beim Löschen der Replikation für Volume {{ sourceShareID }} ist ein Fehler aufgetreten.", + "netapp_replications_cancel_error": "Das Abbrechen der Replikation für Volume {{ sourceShareID }} ist fehlgeschlagen." +} diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_en_GB.json b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_en_GB.json new file mode 100644 index 000000000000..72e656876e6e --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_en_GB.json @@ -0,0 +1,15 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "No replication selected. Please select one.", + "netapp_replications_modal_delete_title_delete": "Delete replication", + "netapp_replications_modal_delete_title_cancel": "Cancel replication", + "netapp_replications_modal_delete_description_pending": "You are about to cancel this replication request without accepting it. Are you sure you want to continue?", + "netapp_replications_modal_delete_description_completed": "This action will delete the table row and keep the volumes created during the replication process (source and target). Are you sure you want to continue?", + "netapp_replications_modal_delete_description_accepted": "Careful, cancelling this replication will halt synchronisation and delete the target volume. Are you sure you want to continue?", + "netapp_replications_modal_delete_description_delete": "Are you sure that you want to delete this replication?", + "netapp_replications_modal_delete_primary_label_confirm": "Confirm", + "netapp_replications_modal_delete_secondary_label": "Close", + "netapp_replications_delete_success": "The {{ sourceShareID }} volume replication has been deleted.", + "netapp_replications_cancel_success": "The {{ sourceShareID }} volume is no longer replicated.", + "netapp_replications_delete_error": "Unable to delete the {{ sourceShareID }} volume replication.", + "netapp_replications_cancel_error": "Failed to undo replication for the {{ sourceShareID }} volume." +} diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_es_ES.json b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_es_ES.json new file mode 100644 index 000000000000..adbd67954b90 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_es_ES.json @@ -0,0 +1,15 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "No se ha seleccionado ninguna replicación. Por favor, seleccione una.", + "netapp_replications_modal_delete_title_delete": "Eliminar replicación", + "netapp_replications_modal_delete_title_cancel": "Cancelar replicación", + "netapp_replications_modal_delete_description_pending": "Va a cancelar esta solicitud de replicación sin aceptarla. ¿Seguro/a que quiere continuar?", + "netapp_replications_modal_delete_description_completed": "Esta acción eliminará la fila de la tabla y conservará los volúmenes creados durante el proceso de replicación (origen y destino). ¿Seguro/a que quiere continuar?", + "netapp_replications_modal_delete_description_accepted": "Atención: si elimina esta replicación, se detendrá la sincronización y se eliminará el volumen de destino. ¿Seguro/a que quiere continuar?", + "netapp_replications_modal_delete_description_delete": "¿Seguro que quiere eliminar esta replicación?", + "netapp_replications_modal_delete_primary_label_confirm": "Confirmar", + "netapp_replications_modal_delete_secondary_label": "Cerrar", + "netapp_replications_delete_success": "La replicación del volumen {{ sourceShareID }} se ha eliminado correctamente.", + "netapp_replications_cancel_success": "La replicación del volumen {{ sourceShareID }} se ha cancelado correctamente.", + "netapp_replications_delete_error": "No se ha podido eliminar la replicación del volumen {{ sourceShareID }}.", + "netapp_replications_cancel_error": "No se pudo cancelar la replicación del volumen {{ sourceShareID }}." +} diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_fr_CA.json b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_fr_CA.json new file mode 100644 index 000000000000..64d36d8d994f --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_fr_CA.json @@ -0,0 +1,15 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Aucune réplication sélectionnée. Merci d'en sélectionner une.", + "netapp_replications_modal_delete_title_delete": "Supprimer la réplication", + "netapp_replications_modal_delete_title_cancel": "Annuler la réplication", + "netapp_replications_modal_delete_description_pending": "Vous allez annuler cette demande de réplication sans l'accepter. Êtes-vous sûr de vouloir continuer ?", + "netapp_replications_modal_delete_description_completed": "Cette action supprimera la ligne du tableau et gardera les volumes créés pendant le processus de réplication (source et destination). Êtes-vous sûr de vouloir continuer ?", + "netapp_replications_modal_delete_description_accepted": "Attention : en annulant cette réplication, vous allez stopper la synchronisation et supprimer le volume de destination. Êtes-vous sûr de vouloir continuer ?", + "netapp_replications_modal_delete_description_delete": "Êtes-vous sûr de vouloir supprimer cette réplication ?", + "netapp_replications_modal_delete_primary_label_confirm": "Confirmer", + "netapp_replications_modal_delete_secondary_label": "Fermer", + "netapp_replications_delete_success": "La réplication du volume {{ sourceShareID }} a été supprimée avec succès.", + "netapp_replications_cancel_success": "La réplication du volume {{ sourceShareID }} a été annulée avec succès.", + "netapp_replications_delete_error": "La suppression de la réplication du volume {{ sourceShareID }} a échoué.", + "netapp_replications_cancel_error": "L'annulation' de la réplication du volume {{ sourceShareID }} a échoué." +} diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_fr_FR.json b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_fr_FR.json new file mode 100644 index 000000000000..64d36d8d994f --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_fr_FR.json @@ -0,0 +1,15 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Aucune réplication sélectionnée. Merci d'en sélectionner une.", + "netapp_replications_modal_delete_title_delete": "Supprimer la réplication", + "netapp_replications_modal_delete_title_cancel": "Annuler la réplication", + "netapp_replications_modal_delete_description_pending": "Vous allez annuler cette demande de réplication sans l'accepter. Êtes-vous sûr de vouloir continuer ?", + "netapp_replications_modal_delete_description_completed": "Cette action supprimera la ligne du tableau et gardera les volumes créés pendant le processus de réplication (source et destination). Êtes-vous sûr de vouloir continuer ?", + "netapp_replications_modal_delete_description_accepted": "Attention : en annulant cette réplication, vous allez stopper la synchronisation et supprimer le volume de destination. Êtes-vous sûr de vouloir continuer ?", + "netapp_replications_modal_delete_description_delete": "Êtes-vous sûr de vouloir supprimer cette réplication ?", + "netapp_replications_modal_delete_primary_label_confirm": "Confirmer", + "netapp_replications_modal_delete_secondary_label": "Fermer", + "netapp_replications_delete_success": "La réplication du volume {{ sourceShareID }} a été supprimée avec succès.", + "netapp_replications_cancel_success": "La réplication du volume {{ sourceShareID }} a été annulée avec succès.", + "netapp_replications_delete_error": "La suppression de la réplication du volume {{ sourceShareID }} a échoué.", + "netapp_replications_cancel_error": "L'annulation' de la réplication du volume {{ sourceShareID }} a échoué." +} diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_it_IT.json b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_it_IT.json new file mode 100644 index 000000000000..a1ba6a78b0f3 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_it_IT.json @@ -0,0 +1,15 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Nessuna replica selezionata. Ti chiediamo di selezionarne una.", + "netapp_replications_modal_delete_title_delete": "Eliminare la replica", + "netapp_replications_modal_delete_title_cancel": "Annullare la replica", + "netapp_replications_modal_delete_description_pending": "Annullerai questa richiesta di replica senza accettarla. Vuoi davvero continuare?", + "netapp_replications_modal_delete_description_completed": "Questa azione cancellerà la riga dalla tabella e manterrà i volumi creati durante il processo di replica (sorgente e destinazione). Vuoi davvero continuare?", + "netapp_replications_modal_delete_description_accepted": "Attenzione: annullando questa replica, interromperai la sincronizzazione ed eliminerai il volume di destinazione. Vuoi davvero continuare?", + "netapp_replications_modal_delete_description_delete": "Vuoi davvero eliminare questa replica?", + "netapp_replications_modal_delete_primary_label_confirm": "Confermare", + "netapp_replications_modal_delete_secondary_label": "Chiudere", + "netapp_replications_delete_success": "La replica del volume {{ sourceShareID }} è stata eliminata correttamente.", + "netapp_replications_cancel_success": "La replica del volume {{ sourceShareID }} è stata annullata correttamente.", + "netapp_replications_delete_error": "L'eliminazione della replica del volume {{ sourceShareID }} non è andata a buon fine.", + "netapp_replications_cancel_error": "L'annullamento della replica del volume {{ sourceShareID }} non è andato a buon fine." +} diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_pl_PL.json b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_pl_PL.json new file mode 100644 index 000000000000..a35efc165ac0 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_pl_PL.json @@ -0,0 +1,15 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Nie wybrano replikacji. Prosimy o wybranie replikacji.", + "netapp_replications_modal_delete_title_delete": "Usuń replikację", + "netapp_replications_modal_delete_title_cancel": "Anuluj replikację", + "netapp_replications_modal_delete_description_pending": "Chcesz anulować żądanie replikacji bez jego zaakceptowania. Czy na pewno chcesz kontynuować?", + "netapp_replications_modal_delete_description_completed": "Ta operacja usunie wiersz z tabeli i pozostawi wolumeny utworzone podczas procesu replikacji (źródłowy i docelowy). Czy na pewno chcesz kontynuować?", + "netapp_replications_modal_delete_description_accepted": "Uwaga: anulowanie tej replikacji spowoduje zatrzymanie synchronizacji i usunięcie wolumenu docelowego. Czy na pewno chcesz kontynuować?", + "netapp_replications_modal_delete_description_delete": "Czy na pewno chcesz usunąć tę replikację?", + "netapp_replications_modal_delete_primary_label_confirm": "Zatwierdź", + "netapp_replications_modal_delete_secondary_label": "Zamknij", + "netapp_replications_delete_success": "Replikacja wolumenu {{sourceShareID}} została usunięta.", + "netapp_replications_cancel_success": "Replikacja wolumenu {{sourceShareID}} została anulowana.", + "netapp_replications_delete_error": "Usunięcie replikacji wolumenu {{sourceShareID}} nie powiodło się.", + "netapp_replications_cancel_error": "Replikacja wolumenu {{sourceShareID}} nie powiodła się." +} diff --git a/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_pt_PT.json b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_pt_PT.json new file mode 100644 index 000000000000..4480b93a821a --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-delete-modal/translations/Messages_pt_PT.json @@ -0,0 +1,15 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Nenhuma replicação selecionada. Selecione uma replicação.", + "netapp_replications_modal_delete_title_delete": "Eliminar a replicação", + "netapp_replications_modal_delete_title_cancel": "Anular a replicação", + "netapp_replications_modal_delete_description_pending": "Está a anular este pedido de replicação sem o aceitar. Tem a certeza de que quer continuar?", + "netapp_replications_modal_delete_description_completed": "Esta ação irá eliminar a linha da tabela e conservar os volumes criados durante o processo de replicação (origem e destino). Tem a certeza de que quer continuar?", + "netapp_replications_modal_delete_description_accepted": "Atenção: ao anular esta replicação, irá interromper a sincronização e eliminar o volume de destino. Tem a certeza de que quer continuar?", + "netapp_replications_modal_delete_description_delete": "Tem a certeza de que deseja eliminar esta replicação?", + "netapp_replications_modal_delete_primary_label_confirm": "Confirmar", + "netapp_replications_modal_delete_secondary_label": "Fechar", + "netapp_replications_delete_success": "A replicação do volume {{ sourceShareID }} foi eliminada com sucesso.", + "netapp_replications_cancel_success": "A replicação do volume {{ sourceShareID }} foi anulada com sucesso.", + "netapp_replications_delete_error": "A eliminação da replicação do volume {{ sourceShareID }} falhou.", + "netapp_replications_cancel_error": "A anulação da replicação do volume {{ sourceShareID }} falhou." +} diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/component.js b/packages/manager/modules/netapp/src/components/replications-promote-modal/component.js new file mode 100644 index 000000000000..bd8b94165949 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/component.js @@ -0,0 +1,12 @@ +import controller from './controller'; +import template from './template.html'; + +export default { + bindings: { + serviceName: '<', + goToReplications: '<', + params: '<', + }, + controller, + template, +}; diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/controller.js b/packages/manager/modules/netapp/src/components/replications-promote-modal/controller.js new file mode 100644 index 000000000000..b52164b156c8 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/controller.js @@ -0,0 +1,39 @@ +export default class ReplicationsPromoteModalCtrl { + /** @ngInject */ + constructor($http, $translate, Alerter) { + this.Alerter = Alerter; + this.$translate = $translate; + this.$http = $http; + this.onLoad = false; + } + + $onInit() { + this.isPrimaryDisabled = !this.params.replicationID; + } + + onError() { + this.Alerter.error( + this.$translate.instant('netapp_replications_promote_error', { + sourceShareID: this.params.sourceShareID, + }), + ); + return this.goToReplications(); + } + + primaryAction() { + this.$http + .post( + `/storage/netapp/${this.serviceName}/shareReplication/${this.params.replicationID}/cutover`, + ) + .then(() => { + return this.goToReplications(true).then(() => { + this.Alerter.success( + this.$translate.instant('netapp_replications_promote_success', { + sourceShareID: this.params.sourceShareID, + }), + ); + }); + }) + .catch(() => this.onError()); + } +} diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/index.js b/packages/manager/modules/netapp/src/components/replications-promote-modal/index.js new file mode 100644 index 000000000000..a3c615e444a7 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/index.js @@ -0,0 +1,20 @@ +import angular from 'angular'; +import 'angular-translate'; +import '@ovh-ux/ng-translate-async-loader'; +import '@ovh-ux/ui-kit'; + +import component from './component'; + +const moduleName = 'ovhManagerReplicationsPromoteModalComponent'; + +angular + .module(moduleName, [ + 'pascalprecht.translate', + 'oui', + 'ngSanitize', + 'ngTranslateAsyncLoader', + ]) + .component(moduleName, component) + .run(/* @ngTranslationsInject:json ./translations */); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/template.html b/packages/manager/modules/netapp/src/components/replications-promote-modal/template.html new file mode 100644 index 000000000000..159bd686b6f9 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/template.html @@ -0,0 +1,22 @@ + +

+
+

+ +

+
+
+
diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_de_DE.json b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_de_DE.json new file mode 100644 index 000000000000..af2ba75a993d --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_de_DE.json @@ -0,0 +1,10 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Es wurde keine Replikation ausgewählt. Bitte wählen Sie eine aus.", + "netapp_replications_modal_title_promote": "Volume hochstufen", + "netapp_replications_modal_description_promote": "Möchten Sie dieses Volume wirklich hochstufen?", + "netapp_replications_modal_primary_label_promote": "Bestätigen", + "netapp_replications_modal_secondary_label": "Schließen", + "netapp_replications_modal_warning_promote": "Durch das Hochstufen eines Replikationsvolumes wird die Replikationsverbindung mit dem Quellvolume getrennt. Das hochgestufte Volume wird unabhängig. Diese Aktion kann nicht rückgängig gemacht werden.", + "netapp_replications_promote_success": "Die Replikation des Volumes {{ sourceShareID }} wurde erfolgreich hochgestuft.", + "netapp_replications_promote_error": "Das Hochstufen der Replikation des Volumes {{ sourceShareID }} ist fehlgeschlagen." +} diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_en_GB.json b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_en_GB.json new file mode 100644 index 000000000000..71a2c70112d0 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_en_GB.json @@ -0,0 +1,10 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "No replication selected. Please select one.", + "netapp_replications_modal_title_promote": "Promote volume", + "netapp_replications_modal_description_promote": "Are you sure you want to promote this volume?", + "netapp_replications_modal_primary_label_promote": "Confirm", + "netapp_replications_modal_secondary_label": "Close", + "netapp_replications_modal_warning_promote": "Promoting a replication volume severs the connection to the source volume. The promoted volume will then stand on its own. This action cannot be undone.", + "netapp_replications_promote_success": "The {{ sourceShareID }} replication volume has been promoted.", + "netapp_replications_promote_error": "Failed to promote the {{ sourceShareID }} volume replication." +} diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_es_ES.json b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_es_ES.json new file mode 100644 index 000000000000..ccef09bf7a26 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_es_ES.json @@ -0,0 +1,10 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "No se ha seleccionado ninguna replicación. Por favor, seleccione una.", + "netapp_replications_modal_title_promote": "Promover el volumen", + "netapp_replications_modal_description_promote": "¿Seguro/a que quiere promover este volumen?", + "netapp_replications_modal_primary_label_promote": "Confirmar", + "netapp_replications_modal_secondary_label": "Cerrar", + "netapp_replications_modal_warning_promote": "Al promover un volumen de replicación, se interrumpe la conexión de replicación con el volumen de origen. El volumen promovido pasará a ser independiente. Esta acción no se puede deshacer.", + "netapp_replications_promote_success": "La promoción de replicación del volumen {{ sourceShareID }} se ha realizado correctamente.", + "netapp_replications_promote_error": "No se pudo promover la replicación del volumen {{ sourceShareID }}." +} diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_fr_CA.json b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_fr_CA.json new file mode 100644 index 000000000000..f737a1bc604b --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_fr_CA.json @@ -0,0 +1,10 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Aucune réplication sélectionnée. Merci d'en sélectionner une.", + "netapp_replications_modal_title_promote": "Promouvoir le volume", + "netapp_replications_modal_description_promote": "ête-vous sûr de vouloir promouvoir ce volume ?", + "netapp_replications_modal_primary_label_promote": "Confirmer", + "netapp_replications_modal_secondary_label": "Fermer", + "netapp_replications_modal_warning_promote": "La promotion d'un volume de réplication entraîne la coupure de la connexion de réplication avec le volume source. Le volume promu deviendra indépendant. Cette action n'est pas réversible.", + "netapp_replications_promote_success": "La promotion de la réplication du volume {{ sourceShareID }} a été effectuée avec succès.", + "netapp_replications_promote_error": "La promotion de la réplication du volume {{ sourceShareID }} a échoué." +} diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_fr_FR.json b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_fr_FR.json new file mode 100644 index 000000000000..f737a1bc604b --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_fr_FR.json @@ -0,0 +1,10 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Aucune réplication sélectionnée. Merci d'en sélectionner une.", + "netapp_replications_modal_title_promote": "Promouvoir le volume", + "netapp_replications_modal_description_promote": "ête-vous sûr de vouloir promouvoir ce volume ?", + "netapp_replications_modal_primary_label_promote": "Confirmer", + "netapp_replications_modal_secondary_label": "Fermer", + "netapp_replications_modal_warning_promote": "La promotion d'un volume de réplication entraîne la coupure de la connexion de réplication avec le volume source. Le volume promu deviendra indépendant. Cette action n'est pas réversible.", + "netapp_replications_promote_success": "La promotion de la réplication du volume {{ sourceShareID }} a été effectuée avec succès.", + "netapp_replications_promote_error": "La promotion de la réplication du volume {{ sourceShareID }} a échoué." +} diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_it_IT.json b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_it_IT.json new file mode 100644 index 000000000000..96703e2472c7 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_it_IT.json @@ -0,0 +1,10 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Nessuna replica selezionata. Ti chiediamo di selezionarne una.", + "netapp_replications_modal_title_promote": "Promuovere il volume", + "netapp_replications_modal_description_promote": "Vuoi davvero promuovere questo volume?", + "netapp_replications_modal_primary_label_promote": "Confermare", + "netapp_replications_modal_secondary_label": "Chiudere", + "netapp_replications_modal_warning_promote": "La promozione di un volume di replica comporta l'interruzione della connessione di replica con il volume sorgente. Il volume promosso diventerà indipendente. Questa azione è irreversibile.", + "netapp_replications_promote_success": "La promozione della replica del volume {{ sourceShareID }} è stata effettuata correttamente.", + "netapp_replications_promote_error": "La promozione della replica del volume {{ sourceShareID }} non è andata a buon fine." +} diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_pl_PL.json b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_pl_PL.json new file mode 100644 index 000000000000..39110491d50e --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_pl_PL.json @@ -0,0 +1,10 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Nie wybrano żadnej repliki. Wybierz replikę.", + "netapp_replications_modal_title_promote": "Ustaw wolumen jako główny", + "netapp_replications_modal_description_promote": "Czy na pewno chcesz ustawić ten wolumen jako główny?", + "netapp_replications_modal_primary_label_promote": "Zatwierdź", + "netapp_replications_modal_secondary_label": "Zamknij", + "netapp_replications_modal_warning_promote": "Ustawienie wolumenu repliki jako głównego przerywa replikację między nim a wolumenem źródłowym. Po tej operacji wolumen będzie działał niezależnie. Operacja jest nieodwracalna.", + "netapp_replications_promote_success": "Wolumen {{sourceShareID}} został ustawiony jako główny.", + "netapp_replications_promote_error": "Nie udało się ustawić wolumenu {{sourceShareID}} jako głównego." +} diff --git a/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_pt_PT.json b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_pt_PT.json new file mode 100644 index 000000000000..0e57b95435f6 --- /dev/null +++ b/packages/manager/modules/netapp/src/components/replications-promote-modal/translations/Messages_pt_PT.json @@ -0,0 +1,10 @@ +{ + "netapp_replications_modal_description_no_replication_selected": "Nenhuma replicação selecionada. Selecione uma replicação.", + "netapp_replications_modal_title_promote": "Promover o volume", + "netapp_replications_modal_description_promote": "Tem a certeza de que pretende promover este volume?", + "netapp_replications_modal_primary_label_promote": "Confirmar", + "netapp_replications_modal_secondary_label": "Fechar", + "netapp_replications_modal_warning_promote": "A promoção de um volume de replicação provoca a interrupção da ligação de replicação ao volume de origem. O volume promovido passará a ser independente. Esta ação não é reversível.", + "netapp_replications_promote_success": "A promoção da replicação do volume {{ sourceShareID }} foi realizada com sucesso.", + "netapp_replications_promote_error": "A promoção da replicação do volume {{ sourceShareID }} falhou." +} diff --git a/packages/manager/modules/netapp/src/dashboard/component.js b/packages/manager/modules/netapp/src/dashboard/component.js index e47a700d29bb..fc4b4b6b75d6 100644 --- a/packages/manager/modules/netapp/src/dashboard/component.js +++ b/packages/manager/modules/netapp/src/dashboard/component.js @@ -7,6 +7,7 @@ export default { dashboardLink: '<', storage: '<', snapshotPoliciesLink: '<', + replicationsLink: '<', volumesLink: '<', isSnapshotPoliciesAvailable: '<', trackClick: '<', diff --git a/packages/manager/modules/netapp/src/dashboard/index/controller.js b/packages/manager/modules/netapp/src/dashboard/index/controller.js index 74cac9f1c46b..238d7bb89b21 100644 --- a/packages/manager/modules/netapp/src/dashboard/index/controller.js +++ b/packages/manager/modules/netapp/src/dashboard/index/controller.js @@ -28,6 +28,7 @@ export default class OvhManagerNetAppDashboardIndexCtrl { } $onInit() { + this.isNetworkTypePublic = !this.networkInformations; this.commitImpressionData = this.shouldReengage() ? RECOMMIT_IMPRESSION_TRACKING_DATA : COMMIT_IMPRESSION_TRACKING_DATA; diff --git a/packages/manager/modules/netapp/src/dashboard/index/template.html b/packages/manager/modules/netapp/src/dashboard/index/template.html index 11537f1eaa31..9d497921fa67 100644 --- a/packages/manager/modules/netapp/src/dashboard/index/template.html +++ b/packages/manager/modules/netapp/src/dashboard/index/template.html @@ -181,6 +181,17 @@ > + + + + + {{ $ctrl.networkInfo }} + + { + $stateProvider.state('netapp.dashboard.replications.approuve.**', { + url: '/approuve', + lazyLoad: ($transition$) => { + const $ocLazyLoad = $transition$.injector().get('$ocLazyLoad'); + + return import('./module').then((mod) => + $ocLazyLoad.inject(mod.default || mod), + ); + }, + }); + }, +); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/approuve/module.js b/packages/manager/modules/netapp/src/dashboard/replications/approuve/module.js new file mode 100644 index 000000000000..d9930d8f7a03 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/approuve/module.js @@ -0,0 +1,15 @@ +import angular from 'angular'; +import '@ovh-ux/manager-core'; +import '@ovh-ux/ng-translate-async-loader'; +import '@uirouter/angularjs'; +import 'angular-translate'; + +import routing from './routing'; + +const moduleName = 'ovhManagerNetAppReplicationsApprouveComponent'; + +angular + .module(moduleName, ['ovhManagerCore', 'pascalprecht.translate', 'ui.router']) + .config(routing); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/approuve/routing.js b/packages/manager/modules/netapp/src/dashboard/replications/approuve/routing.js new file mode 100644 index 000000000000..f504dade8e44 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/approuve/routing.js @@ -0,0 +1,28 @@ +import approuveModal from '../../../components/replications-approuve-modal'; + +export default /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.replications.approuve', { + url: '/approuve', + views: { + modal: { + component: approuveModal, + }, + }, + layout: 'modal', + params: { + destinationServiceID: null, + replicationID: null, + sourceShareID: null, + }, + resolve: { + params: /* @ngInject */ ($transition$) => $transition$.params(), + // destinationServiceID: /* @ngInject */ ($transition$) => + // $transition$.params().destinationServiceID, + // replicationID: /* @ngInject */ ($transition$) => + // $transition$.params().replicationID, + // sourceShareID: /* @ngInject */ ($transition$) => + // $transition$.params().sourceShareID, + breadcrumb: /* @ngInject */ () => null, + }, + }); +}; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/component.js b/packages/manager/modules/netapp/src/dashboard/replications/component.js new file mode 100644 index 000000000000..af9eb37a9281 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/component.js @@ -0,0 +1,15 @@ +import controller from './controller'; +import template from './template.html'; + +export default { + bindings: { + replications: '<', + sourceEFSNames: '<', + serviceName: '<', + goToApprouveReplication: '<', + goToPromoteReplication: '<', + goToDeleteReplication: '<', + }, + controller, + template, +}; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/constants.js b/packages/manager/modules/netapp/src/dashboard/replications/constants.js new file mode 100644 index 000000000000..e743fc636264 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/constants.js @@ -0,0 +1,66 @@ +export const ACCEPTED_REPLICATION_STATE = { + ERROR: 'acceptedReplicationStateError', + IN_SYNC: 'acceptedReplicationStateInSync', + OUT_OF_SYNC: 'acceptedReplicationStateOutOfSync', + ACTIVE: 'acceptedReplicationStateActive', +}; + +export const REPLICATION_API_STATUS = { + accepted: 'accepted', + pending: 'pending', + cutover: 'cutover', + completed: 'completed', + error: 'error', + deleting: 'deleting', + cutting_over: 'cutting_over', +}; + +export const REPLICATION_API_REPLICASTATE = { + error: 'error', + in_sync: 'in_sync', + out_of_sync: 'out_of_sync', + // active: 'active', +}; + +export const REPLICATION_STATUS_DISPLAY = { + pending: { + color: 'warning', + wording: 'pending', + }, + cutting_over: { + color: 'info', + wording: 'cuttingover', + }, + cutover: { + color: 'info', + wording: 'cutover', + }, + completed: { + color: 'success', + wording: 'completed', + }, + error: { + color: 'error', + wording: 'error', + }, + [ACCEPTED_REPLICATION_STATE.ERROR]: { + color: 'error', + wording: 'accepted_synch_error', + }, + [ACCEPTED_REPLICATION_STATE.IN_SYNC]: { + color: 'success', + wording: 'accepted_synchronize', + }, + [ACCEPTED_REPLICATION_STATE.OUT_OF_SYNC]: { + color: 'info', + wording: 'accepted_synchronizating', + }, + // [ACCEPTED_REPLICATION_STATE.ACTIVE]: { + // color: 'info', + // wording: 'accepted_active', + // }, + deleting: { + color: 'warning', + wording: 'deleting', + }, +}; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/controller.js b/packages/manager/modules/netapp/src/dashboard/replications/controller.js new file mode 100644 index 000000000000..ba00ae879a43 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/controller.js @@ -0,0 +1,69 @@ +import { + ACCEPTED_REPLICATION_STATE, + REPLICATION_API_REPLICASTATE, + REPLICATION_API_STATUS, + REPLICATION_STATUS_DISPLAY, +} from './constants'; + +export default class OvhManagerNetAppReplicationsCtrl { + /* @ngInject */ + constructor($translate) { + this.$translate = $translate; + this.hasReplications = false; + } + + $onInit() { + this.hasReplications = !!this.replications.length; + } + + canApprouve(replication) { + return ( + replication.status === REPLICATION_API_STATUS.pending && + this.serviceName === replication.destination.serviceID + ); + } + + canPromote(replication) { + return ( + replication.status === REPLICATION_API_STATUS.accepted && + replication.replicaState === REPLICATION_API_REPLICASTATE.in_sync && + this.serviceName === replication.destination.serviceID + ); + } + + static canDelete(replication) { + return [ + REPLICATION_API_STATUS.accepted, + REPLICATION_API_STATUS.pending, + REPLICATION_API_STATUS.completed, + ].includes(replication.status); + } + + deleteOrCancelLabel(replication) { + if ( + [ + REPLICATION_API_STATUS.accepted, + REPLICATION_API_STATUS.pending, + ].includes(replication.status) + ) { + return this.$translate.instant('netapp_replications_button_cancel'); + } + return this.$translate.instant('netapp_replications_button_delete'); + } + + static getStatus(replication) { + if (replication.status === REPLICATION_API_STATUS.accepted) { + if (replication.replicaState === REPLICATION_API_REPLICASTATE.error) + return REPLICATION_STATUS_DISPLAY[ACCEPTED_REPLICATION_STATE.ERROR]; + if (replication.replicaState === REPLICATION_API_REPLICASTATE.in_sync) + return REPLICATION_STATUS_DISPLAY[ACCEPTED_REPLICATION_STATE.IN_SYNC]; + if (replication.replicaState === REPLICATION_API_REPLICASTATE.out_of_sync) + return REPLICATION_STATUS_DISPLAY[ + ACCEPTED_REPLICATION_STATE.OUT_OF_SYNC + ]; + // if (replication.replicaState === REPLICATION_API_REPLICASTATE.active) return ACCEPTED_REPLICATION_STATE.ACTIVE; + } + + return REPLICATION_STATUS_DISPLAY[replication.status]; + } +} diff --git a/packages/manager/modules/netapp/src/dashboard/replications/delete/index.js b/packages/manager/modules/netapp/src/dashboard/replications/delete/index.js new file mode 100644 index 000000000000..b565f9cb24d9 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/delete/index.js @@ -0,0 +1,22 @@ +import angular from 'angular'; +import '@uirouter/angularjs'; +import 'oclazyload'; + +const moduleName = 'ovhManagerNetAppReplicationsDeleteLoading'; + +angular.module(moduleName, ['ui.router', 'oc.lazyLoad']).config( + /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.replications.delete.**', { + url: '/delete', + lazyLoad: ($transition$) => { + const $ocLazyLoad = $transition$.injector().get('$ocLazyLoad'); + + return import('./module').then((mod) => + $ocLazyLoad.inject(mod.default || mod), + ); + }, + }); + }, +); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/delete/module.js b/packages/manager/modules/netapp/src/dashboard/replications/delete/module.js new file mode 100644 index 000000000000..33d61d54613f --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/delete/module.js @@ -0,0 +1,15 @@ +import angular from 'angular'; +import '@ovh-ux/manager-core'; +import '@ovh-ux/ng-translate-async-loader'; +import '@uirouter/angularjs'; +import 'angular-translate'; + +import routing from './routing'; + +const moduleName = 'ovhManagerNetAppReplicationsDeleteComponent'; + +angular + .module(moduleName, ['ovhManagerCore', 'pascalprecht.translate', 'ui.router']) + .config(routing); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/delete/routing.js b/packages/manager/modules/netapp/src/dashboard/replications/delete/routing.js new file mode 100644 index 000000000000..235d0a4cf3e8 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/delete/routing.js @@ -0,0 +1,22 @@ +import promoteModal from '../../../components/replications-delete-modal'; + +export default /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.replications.delete', { + url: '/delete', + views: { + modal: { + component: promoteModal, + }, + }, + layout: 'modal', + params: { + replicationID: null, + status: null, + sourceShareID: null, + }, + resolve: { + params: /* @ngInject */ ($transition$) => $transition$.params(), + breadcrumb: /* @ngInject */ () => null, + }, + }); +}; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/index.js b/packages/manager/modules/netapp/src/dashboard/replications/index.js new file mode 100644 index 000000000000..9ab78f4a29f3 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/index.js @@ -0,0 +1,22 @@ +import angular from 'angular'; +import '@uirouter/angularjs'; +import 'oclazyload'; + +const moduleName = 'ovhManagerNetAppReplicationsLoading'; + +angular.module(moduleName, ['ui.router', 'oc.lazyLoad']).config( + /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.replications.**', { + url: '/replications', + lazyLoad: ($transition$) => { + const $ocLazyLoad = $transition$.injector().get('$ocLazyLoad'); + + return import('./module').then((mod) => + $ocLazyLoad.inject(mod.default || mod), + ); + }, + }); + }, +); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/module.js b/packages/manager/modules/netapp/src/dashboard/replications/module.js new file mode 100644 index 000000000000..9249c9348225 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/module.js @@ -0,0 +1,33 @@ +import angular from 'angular'; +import '@ovh-ux/manager-core'; +import '@ovh-ux/ng-ovh-utils'; +import '@ovh-ux/ng-translate-async-loader'; +import '@uirouter/angularjs'; +import 'angular-translate'; + +import component from './component'; +import routing from './routing'; + +import approuveReplication from './approuve'; +import promoteReplication from './promote'; +import deleteReplication from './delete'; + +import './style.scss'; + +const moduleName = 'ovhManagerNetAppReplications'; + +angular + .module(moduleName, [ + 'ovhManagerCore', + 'ngOvhUtils', + 'pascalprecht.translate', + 'ui.router', + approuveReplication, + promoteReplication, + deleteReplication, + ]) + .component(moduleName, component) + .config(routing) + .run(/* @ngTranslationsInject:json ./translations */); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/promote/index.js b/packages/manager/modules/netapp/src/dashboard/replications/promote/index.js new file mode 100644 index 000000000000..8d4d6722c4e0 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/promote/index.js @@ -0,0 +1,22 @@ +import angular from 'angular'; +import '@uirouter/angularjs'; +import 'oclazyload'; + +const moduleName = 'ovhManagerNetAppReplicationsPromoteLoading'; + +angular.module(moduleName, ['ui.router', 'oc.lazyLoad']).config( + /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.replications.promote.**', { + url: '/promote', + lazyLoad: ($transition$) => { + const $ocLazyLoad = $transition$.injector().get('$ocLazyLoad'); + + return import('./module').then((mod) => + $ocLazyLoad.inject(mod.default || mod), + ); + }, + }); + }, +); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/promote/module.js b/packages/manager/modules/netapp/src/dashboard/replications/promote/module.js new file mode 100644 index 000000000000..d9930d8f7a03 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/promote/module.js @@ -0,0 +1,15 @@ +import angular from 'angular'; +import '@ovh-ux/manager-core'; +import '@ovh-ux/ng-translate-async-loader'; +import '@uirouter/angularjs'; +import 'angular-translate'; + +import routing from './routing'; + +const moduleName = 'ovhManagerNetAppReplicationsApprouveComponent'; + +angular + .module(moduleName, ['ovhManagerCore', 'pascalprecht.translate', 'ui.router']) + .config(routing); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/promote/routing.js b/packages/manager/modules/netapp/src/dashboard/replications/promote/routing.js new file mode 100644 index 000000000000..85693fc2d4ee --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/promote/routing.js @@ -0,0 +1,21 @@ +import promoteModal from '../../../components/replications-promote-modal'; + +export default /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.replications.promote', { + url: '/promote', + views: { + modal: { + component: promoteModal, + }, + }, + layout: 'modal', + params: { + replicationID: null, + sourceShareID: null, + }, + resolve: { + params: /* @ngInject */ ($transition$) => $transition$.params(), + breadcrumb: /* @ngInject */ () => null, + }, + }); +}; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/routing.js b/packages/manager/modules/netapp/src/dashboard/replications/routing.js new file mode 100644 index 000000000000..1af4768bbc9f --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/routing.js @@ -0,0 +1,72 @@ +import { REPLICATION_API_STATUS } from './constants'; + +export default /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.replications', { + url: '/replications', + views: { + '@netapp.dashboard': { + component: 'ovhManagerNetAppReplications', + }, + }, + resolve: { + sourceEFSNames: /* @ngInject */ ($http) => + $http + .get('/storage/netapp') + .then(({ data = [] }) => + data.reduce((prev, { id, name }) => ({ ...prev, [id]: name }), {}), + ), + replications: /* @ngInject */ ($http, $q, serviceName) => + $http + .get(`/storage/netapp/${serviceName}/shareReplication`) + .catch(() => []) + .then(({ data = [] }) => + $q + .all( + data.reduce((prev, { id, status }) => { + const promise = + status === REPLICATION_API_STATUS.accepted && + $http.get( + `/storage/netapp/${serviceName}/shareReplication/${id}`, + ); + + return promise ? [...prev, promise] : prev; + }, []), + ) + .then((acceptedShareReplications) => { + return data.map( + (replication) => + acceptedShareReplications.find( + ({ data: { id } }) => id === replication.id, + )?.data || replication, + ); + }), + ), + goToApprouveReplication: /* @ngInject */ ($state) => ({ + destinationServiceID, + replicationID, + sourceShareID, + }) => { + $state.go('netapp.dashboard.replications.approuve', { + destinationServiceID, + replicationID, + sourceShareID, + }); + }, + goToPromoteReplication: /* @ngInject */ ($state) => ({ replication }) => { + $state.go('netapp.dashboard.replications.promote', { + replicationID: replication.id, + sourceShareID: replication.source.shareID, + }); + }, + goToDeleteReplication: /* @ngInject */ ($state) => ({ replication }) => { + $state.go('netapp.dashboard.replications.delete', { + replicationID: replication.id, + status: replication.status, + sourceShareID: replication.source.shareID, + }); + }, + breadcrumb: /* @ngInject */ ($translate) => + $translate.instant('netapp_replications_breadcrumb'), + }, + }); +}; diff --git a/packages/manager/modules/netapp/src/dashboard/replications/style.scss b/packages/manager/modules/netapp/src/dashboard/replications/style.scss new file mode 100644 index 000000000000..c6c309888bee --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/style.scss @@ -0,0 +1,3 @@ +.oui-datagrid__cell { + padding: 1rem 0.5rem; +} diff --git a/packages/manager/modules/netapp/src/dashboard/replications/template.html b/packages/manager/modules/netapp/src/dashboard/replications/template.html new file mode 100644 index 000000000000..d99606eb1c7d --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/template.html @@ -0,0 +1,125 @@ +
+

+

+ + +

+ + +

+ +
+ +
+ +

+ + +

+ - +
+ +
+ +
+ +
+ + + + +
+
+ + + + + + + + + + + +
+
+
+

+

+
diff --git a/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_de_DE.json b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_de_DE.json new file mode 100644 index 000000000000..12649c0e3e71 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_de_DE.json @@ -0,0 +1,26 @@ +{ + "netapp_replications_breadcrumb": "Replikationen", + "netapp_replications_title": "Liste der Replikationen", + "netapp_replications_title_no_replication": "Keine Replikation", + "netapp_replications_information": "Verwalten Sie hier eingehende und ausgehende Volume-Replikationen, einschließlich Synchronisierungsanforderungen und die Verfolgung ihres Fortschritts.", + "netapp_replications_source_efs_id": "Quelle", + "netapp_replications_destination_efs_id": "Ziel", + "netapp_replications_efs_link_service": "Dienst: {{ shareid }}", + "netapp_replications_efs_link_volume": "Volume: {{ shareid }}", + "netapp_replications_status": "Replikationsstatus", + "netapp_replications_status_pending": "Genehmigung steht noch aus", + "netapp_replications_status_cuttingover": "Wird hochgestuft", + "netapp_replications_status_cutover": "Wird hochgestuft", + "netapp_replications_status_completed": "Migriert", + "netapp_replications_status_error": "Fehler", + "netapp_replications_status_accepted_synch_error": "Synchronisierungsfehler", + "netapp_replications_status_accepted_synchronize": "Synchronisiert", + "netapp_replications_status_accepted_synchronizating": "Wird synchronisiert", + "netapp_replications_status_deleting": "Wird gelöscht", + "netapp_replications_pending_help": "Für dieses Volume muss die Replikation bestätigt werden. Zum Genehmigen müssen Sie die Replikation vom Zieldienst aus akzeptieren. Sobald die Replikation bestätigt ist, wird sie gestartet.", + "netapp_replications_button_approuve": "Replikation akzeptieren", + "netapp_replications_button_promote": "Hochstufen", + "netapp_replications_button_delete": "Löschen", + "netapp_replications_button_cancel": "Abbrechen", + "netapp_replications_efs_current_service": "Dieser Dienst" +} diff --git a/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_en_GB.json b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_en_GB.json new file mode 100644 index 000000000000..a33f61f24e99 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_en_GB.json @@ -0,0 +1,26 @@ +{ + "netapp_replications_breadcrumb": "Replications", + "netapp_replications_title": "List of replications", + "netapp_replications_title_no_replication": "No replication", + "netapp_replications_information": "Here, you can manage replications of incoming and outgoing volumes, including sync requests and progress tracking.", + "netapp_replications_source_efs_id": "Source", + "netapp_replications_destination_efs_id": "Target", + "netapp_replications_efs_link_service": "Service: {{ shareid }}", + "netapp_replications_efs_link_volume": "Volume: {{ shareid }}", + "netapp_replications_status": "Replication status", + "netapp_replications_status_pending": "Pending approval", + "netapp_replications_status_cuttingover": "Promoting...", + "netapp_replications_status_cutover": "Promoting...", + "netapp_replications_status_completed": "Migrated", + "netapp_replications_status_error": "Error", + "netapp_replications_status_accepted_synch_error": "Synchronisation error", + "netapp_replications_status_accepted_synchronize": "Synced", + "netapp_replications_status_accepted_synchronizating": "Synchronising...", + "netapp_replications_status_deleting": "Deleting...", + "netapp_replications_pending_help": "This volume is awaiting confirmation before it can be replicated. To confirm, you need to accept the replication request from the target service. Once confirmed, the replication process will start.", + "netapp_replications_button_approuve": "Accept replication", + "netapp_replications_button_promote": "Promote", + "netapp_replications_button_delete": "Delete", + "netapp_replications_button_cancel": "Cancel", + "netapp_replications_efs_current_service": "This service" +} diff --git a/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_es_ES.json b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_es_ES.json new file mode 100644 index 000000000000..2aad49ebd89e --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_es_ES.json @@ -0,0 +1,26 @@ +{ + "netapp_replications_breadcrumb": "Replicaciones", + "netapp_replications_title": "Lista de replicaciones", + "netapp_replications_title_no_replication": "Ninguna replicación", + "netapp_replications_information": "Gestione aquí las replicaciones de volúmenes entrantes y salientes, incluidas las solicitudes de sincronización y el seguimiento de su progreso.", + "netapp_replications_source_efs_id": "Origen", + "netapp_replications_destination_efs_id": "Destino", + "netapp_replications_efs_link_service": "Servicio: {{ shareid }}", + "netapp_replications_efs_link_volume": "Volumen: {{ shareid }}", + "netapp_replications_status": "Estado de la replicación", + "netapp_replications_status_pending": "Pendiente de aprobación", + "netapp_replications_status_cuttingover": "En proceso de promoción", + "netapp_replications_status_cutover": "En proceso de promoción", + "netapp_replications_status_completed": "Migrado", + "netapp_replications_status_error": "Error", + "netapp_replications_status_accepted_synch_error": "Error de sincronización", + "netapp_replications_status_accepted_synchronize": "Sincronizado", + "netapp_replications_status_accepted_synchronizating": "Sincronizando...", + "netapp_replications_status_deleting": "Eliminando...", + "netapp_replications_pending_help": "Este volumen está pendiente de confirmación de la replicación. Para aprobar esta acción, debe aceptar la replicación desde el servicio de destino. Una vez aprobada, comenzará la replicación.", + "netapp_replications_button_approuve": "Aceptar replicación", + "netapp_replications_button_promote": "Promover", + "netapp_replications_button_delete": "Eliminar", + "netapp_replications_button_cancel": "Cancelar", + "netapp_replications_efs_current_service": "Este servicio" +} diff --git a/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_fr_CA.json b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_fr_CA.json new file mode 100644 index 000000000000..23af3b38549d --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_fr_CA.json @@ -0,0 +1,26 @@ +{ + "netapp_replications_breadcrumb": "Réplications", + "netapp_replications_title": "Liste des réplications", + "netapp_replications_title_no_replication": "Pas de réplication", + "netapp_replications_information": "Gérez ici les réplications de volumes entrants et sortants, y compris les demandes de synchronisation et le suivi de leur progression.", + "netapp_replications_source_efs_id": "Source", + "netapp_replications_destination_efs_id": "Destination", + "netapp_replications_efs_link_service": "Service : {{ shareid }}", + "netapp_replications_efs_link_volume": "Volume : {{ shareid }}", + "netapp_replications_status": "Réplication status", + "netapp_replications_status_pending": "En attente d'approbation", + "netapp_replications_status_cuttingover": "En cours de promotion", + "netapp_replications_status_cutover": "En cours de promotion", + "netapp_replications_status_completed": "Migré", + "netapp_replications_status_error": "Erreur", + "netapp_replications_status_accepted_synch_error": "Erreur de synchronisation", + "netapp_replications_status_accepted_synchronize": "Synchronisé", + "netapp_replications_status_accepted_synchronizating": "En cours de synchronisation", + "netapp_replications_status_deleting": "Suppression en cours", + "netapp_replications_pending_help": "Ce volume est en attente d'une confirmation de la réplication. Pour approuver, vous devez accepter la réplication à partir du service de destination. Une fois confirmée la réplication commencera.", + "netapp_replications_button_approuve": "Accepter réplication", + "netapp_replications_button_promote": "Promouvoir", + "netapp_replications_button_delete": "Supprimer", + "netapp_replications_button_cancel": "Annuler", + "netapp_replications_efs_current_service": "Ce service" +} diff --git a/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_fr_FR.json b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_fr_FR.json new file mode 100644 index 000000000000..23af3b38549d --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_fr_FR.json @@ -0,0 +1,26 @@ +{ + "netapp_replications_breadcrumb": "Réplications", + "netapp_replications_title": "Liste des réplications", + "netapp_replications_title_no_replication": "Pas de réplication", + "netapp_replications_information": "Gérez ici les réplications de volumes entrants et sortants, y compris les demandes de synchronisation et le suivi de leur progression.", + "netapp_replications_source_efs_id": "Source", + "netapp_replications_destination_efs_id": "Destination", + "netapp_replications_efs_link_service": "Service : {{ shareid }}", + "netapp_replications_efs_link_volume": "Volume : {{ shareid }}", + "netapp_replications_status": "Réplication status", + "netapp_replications_status_pending": "En attente d'approbation", + "netapp_replications_status_cuttingover": "En cours de promotion", + "netapp_replications_status_cutover": "En cours de promotion", + "netapp_replications_status_completed": "Migré", + "netapp_replications_status_error": "Erreur", + "netapp_replications_status_accepted_synch_error": "Erreur de synchronisation", + "netapp_replications_status_accepted_synchronize": "Synchronisé", + "netapp_replications_status_accepted_synchronizating": "En cours de synchronisation", + "netapp_replications_status_deleting": "Suppression en cours", + "netapp_replications_pending_help": "Ce volume est en attente d'une confirmation de la réplication. Pour approuver, vous devez accepter la réplication à partir du service de destination. Une fois confirmée la réplication commencera.", + "netapp_replications_button_approuve": "Accepter réplication", + "netapp_replications_button_promote": "Promouvoir", + "netapp_replications_button_delete": "Supprimer", + "netapp_replications_button_cancel": "Annuler", + "netapp_replications_efs_current_service": "Ce service" +} diff --git a/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_it_IT.json b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_it_IT.json new file mode 100644 index 000000000000..780101b19ec8 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_it_IT.json @@ -0,0 +1,26 @@ +{ + "netapp_replications_breadcrumb": "Repliche", + "netapp_replications_title": "Elenco delle repliche", + "netapp_replications_title_no_replication": "Nessuna replica", + "netapp_replications_information": "Gestisci le repliche dei volumi in entrata e uscita, incluse le richieste di sincronizzazione e il monitoraggio dello stato di avanzamento.", + "netapp_replications_source_efs_id": "Source", + "netapp_replications_destination_efs_id": "Destinazione", + "netapp_replications_efs_link_service": "Servizio: {{ shareid }}", + "netapp_replications_efs_link_volume": "Volume: {{ shareid }}", + "netapp_replications_status": "Stato della replica", + "netapp_replications_status_pending": "In attesa di approvazione", + "netapp_replications_status_cuttingover": "In corso di promozione", + "netapp_replications_status_cutover": "In corso di promozione", + "netapp_replications_status_completed": "Migrato", + "netapp_replications_status_error": "Errore", + "netapp_replications_status_accepted_synch_error": "Errore di sincronizzazione", + "netapp_replications_status_accepted_synchronize": "Sincronizzato", + "netapp_replications_status_accepted_synchronizating": "In corso di sincronizzazione", + "netapp_replications_status_deleting": "Eliminazione in corso...", + "netapp_replications_pending_help": "Questo volume è in attesa di una conferma della replica. Per approvare, devi accettare la replica a partire dal servizio di destinazione. Una volta confermata, la replica avrà inizio.", + "netapp_replications_button_approuve": "Accettare la replica", + "netapp_replications_button_promote": "Promuovere", + "netapp_replications_button_delete": "Eliminare", + "netapp_replications_button_cancel": "Annullare", + "netapp_replications_efs_current_service": "Questo servizio" +} diff --git a/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_pl_PL.json b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_pl_PL.json new file mode 100644 index 000000000000..0f9152212929 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_pl_PL.json @@ -0,0 +1,26 @@ +{ + "netapp_replications_breadcrumb": "Replikacje", + "netapp_replications_title": "Lista replikacji", + "netapp_replications_title_no_replication": "Brak replikacji", + "netapp_replications_information": "Tutaj zarządzasz replikacjami wolumenów przychodzących i wychodzących, w tym żądaniami synchronizacji oraz monitorowaniem ich postępu.", + "netapp_replications_source_efs_id": "Źródło", + "netapp_replications_destination_efs_id": "Docelowy EFS", + "netapp_replications_efs_link_service": "Usługa: {{shareid}}", + "netapp_replications_efs_link_volume": "Wolumen: {{shareid}}", + "netapp_replications_status": "Status replikacji", + "netapp_replications_status_pending": "Oczekiwanie na zatwierdzenie", + "netapp_replications_status_cuttingover": "Trwa ustawianie wolumenu jako głównego", + "netapp_replications_status_cutover": "Trwa ustawianie wolumenu jako głównego", + "netapp_replications_status_completed": "Migracja zakończona", + "netapp_replications_status_error": "Błąd", + "netapp_replications_status_accepted_synch_error": "Błąd synchronizacji", + "netapp_replications_status_accepted_synchronize": "Synchronizacja zakończona", + "netapp_replications_status_accepted_synchronizating": "W trakcie synchronizacji", + "netapp_replications_status_deleting": "Trwa usuwanie", + "netapp_replications_pending_help": "Ten wolumen oczekuje na potwierdzenie replikacji. Aby zatwierdzić, zaakceptuj replikację w usłudze docelowej. Po zatwierdzeniu rozpocznie się replikacja.", + "netapp_replications_button_approuve": "Zaakceptuj replikację", + "netapp_replications_button_promote": "Ustaw wolumen jako główny", + "netapp_replications_button_delete": "Usuń", + "netapp_replications_button_cancel": "Anuluj", + "netapp_replications_efs_current_service": "Ta usługa" +} diff --git a/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_pt_PT.json b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_pt_PT.json new file mode 100644 index 000000000000..135db0696bb4 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/replications/translations/Messages_pt_PT.json @@ -0,0 +1,26 @@ +{ + "netapp_replications_breadcrumb": "Replicações", + "netapp_replications_title": "Lista das replicações", + "netapp_replications_title_no_replication": "Sem replicação", + "netapp_replications_information": "Faça aqui a gestão das replicações de volumes de entrada e de saída, incluindo os pedidos de sincronização e o acompanhamento do seu progresso.", + "netapp_replications_source_efs_id": "Origem", + "netapp_replications_destination_efs_id": "Destino", + "netapp_replications_efs_link_service": "Serviço: {{ shareid }}", + "netapp_replications_efs_link_volume": "Volume: {{ shareid }}", + "netapp_replications_status": "Estado da replicação", + "netapp_replications_status_pending": "A aguardar aprovação", + "netapp_replications_status_cuttingover": "Em curso de promoção", + "netapp_replications_status_cutover": "Em curso de promoção", + "netapp_replications_status_completed": "Migrado", + "netapp_replications_status_error": "Erro", + "netapp_replications_status_accepted_synch_error": "Erro de sincronização", + "netapp_replications_status_accepted_synchronize": "Sincronizado", + "netapp_replications_status_accepted_synchronizating": "Sincronização em curso", + "netapp_replications_status_deleting": "Eliminação em curso", + "netapp_replications_pending_help": "Este volume aguarda uma confirmação da replicação. Para aprovar, deve aceitar a replicação a partir do serviço de destino. Uma vez confirmada a replicação, esta será iniciada.", + "netapp_replications_button_approuve": "Aceitar replicação", + "netapp_replications_button_promote": "Promover", + "netapp_replications_button_delete": "Eliminar", + "netapp_replications_button_cancel": "Anular", + "netapp_replications_efs_current_service": "Este serviço" +} diff --git a/packages/manager/modules/netapp/src/dashboard/routing.js b/packages/manager/modules/netapp/src/dashboard/routing.js index 547c52f65948..ec6cce1f7d5f 100644 --- a/packages/manager/modules/netapp/src/dashboard/routing.js +++ b/packages/manager/modules/netapp/src/dashboard/routing.js @@ -42,12 +42,9 @@ export default /* @ngInject */ ($stateProvider) => { volumes: /* @ngInject */ ($http, serviceName, NetAppDashboardService) => $http .get(`/storage/netapp/${serviceName}/share?detail=true`) - .then(({ data }) => { - return NetAppDashboardService.getListOfAccessPath( - serviceName, - data, - ); - }) + .then(({ data }) => + NetAppDashboardService.getListOfAccessPath(serviceName, data), + ) .then((volumes) => volumes.map((volume) => new Share(volume))), availableVolumeSize: /* @ngInject */ (storage, volumes) => { const storageVolumesSize = volumes.reduce( @@ -68,6 +65,16 @@ export default /* @ngInject */ ($stateProvider) => { $state.href('netapp.dashboard.snapshotPolicies', $transition$.params()), volumesLink: /* @ngInject */ ($state, $transition$) => $state.href('netapp.dashboard.volumes', $transition$.params()), + replicationsLink: /* @ngInject */ ($state, $transition$) => + $state.href('netapp.dashboard.replications', $transition$.params()), + goToReplications: /* @ngInject */ ($state) => (reload = false) => + $state.go( + 'netapp.dashboard.replications', + {}, + { + reload, + }, + ), serviceName: /* @ngInject */ ($transition$) => $transition$.params().serviceName, storage: /* @ngInject */ ($http, serviceName) => diff --git a/packages/manager/modules/netapp/src/dashboard/service.js b/packages/manager/modules/netapp/src/dashboard/service.js index 94f44378bb8b..06ac4d5306e3 100644 --- a/packages/manager/modules/netapp/src/dashboard/service.js +++ b/packages/manager/modules/netapp/src/dashboard/service.js @@ -32,6 +32,7 @@ export default class NetAppDashboardService { ]; this.coreConfig = coreConfig; this.activesNFS = []; + this.replicationsSelectedVolumes = []; } /** @@ -379,4 +380,5 @@ export default class NetAppDashboardService { })); }); } + } diff --git a/packages/manager/modules/netapp/src/dashboard/template.html b/packages/manager/modules/netapp/src/dashboard/template.html index d9db0db428b6..63a797ddb2b9 100644 --- a/packages/manager/modules/netapp/src/dashboard/template.html +++ b/packages/manager/modules/netapp/src/dashboard/template.html @@ -49,6 +49,12 @@ data-translate="netapp_dashboard_snapshot_policies" > + + +
diff --git a/packages/manager/modules/netapp/src/dashboard/translations/Messages_de_DE.json b/packages/manager/modules/netapp/src/dashboard/translations/Messages_de_DE.json index ccdbd4a5f61f..ac68a6609de6 100644 --- a/packages/manager/modules/netapp/src/dashboard/translations/Messages_de_DE.json +++ b/packages/manager/modules/netapp/src/dashboard/translations/Messages_de_DE.json @@ -4,5 +4,6 @@ "netapp_dashboard_snapshot_policies": "Regeln für Snapshots", "netapp_dashboard_global_error": "Der folgende Fehler ist aufgetreten:
{{message}}
request_id: {{requestId}}", "netapp_dashboard_guide_title": "Guides", - "netapp_dashboard_guide_network_configuration": "Enterprise File Storage – Konfiguration des privaten Netzwerks" + "netapp_dashboard_guide_network_configuration": "Enterprise File Storage – Konfiguration des privaten Netzwerks", + "netapp_dashboard_replications": "Replikationen" } diff --git a/packages/manager/modules/netapp/src/dashboard/translations/Messages_en_GB.json b/packages/manager/modules/netapp/src/dashboard/translations/Messages_en_GB.json index 286ee2caaaef..4c20daf1033f 100644 --- a/packages/manager/modules/netapp/src/dashboard/translations/Messages_en_GB.json +++ b/packages/manager/modules/netapp/src/dashboard/translations/Messages_en_GB.json @@ -4,5 +4,6 @@ "netapp_dashboard_snapshot_policies": "Snapshot policies", "netapp_dashboard_global_error": "The following error has occurred:
{{message}}
request_id: {{requestId}}", "netapp_dashboard_guide_title": "Guides", - "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Private Network Configuration" + "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Private Network Configuration", + "netapp_dashboard_replications": "Replications" } diff --git a/packages/manager/modules/netapp/src/dashboard/translations/Messages_es_ES.json b/packages/manager/modules/netapp/src/dashboard/translations/Messages_es_ES.json index e7b7d0ef20d7..4a453d254dcd 100644 --- a/packages/manager/modules/netapp/src/dashboard/translations/Messages_es_ES.json +++ b/packages/manager/modules/netapp/src/dashboard/translations/Messages_es_ES.json @@ -4,5 +4,6 @@ "netapp_dashboard_snapshot_policies": "Políticas de snapshots", "netapp_dashboard_global_error": "Ha ocurrido el siguiente error:
{{message}}
request_id: {{requestId}}", "netapp_dashboard_guide_title": "Guías", - "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Configuración de la red privada" + "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Configuración de la red privada", + "netapp_dashboard_replications": "Replicaciones" } diff --git a/packages/manager/modules/netapp/src/dashboard/translations/Messages_fr_CA.json b/packages/manager/modules/netapp/src/dashboard/translations/Messages_fr_CA.json index 0571c45675dc..ef074fe7b016 100644 --- a/packages/manager/modules/netapp/src/dashboard/translations/Messages_fr_CA.json +++ b/packages/manager/modules/netapp/src/dashboard/translations/Messages_fr_CA.json @@ -4,5 +4,6 @@ "netapp_dashboard_snapshot_policies": "Snapshot policies", "netapp_dashboard_global_error": "L'erreur suivante est survenue :
{{message}}
request_id: {{requestId}}", "netapp_dashboard_guide_title": "Guides", - "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Configuration du réseau privé" + "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Configuration du réseau privé", + "netapp_dashboard_replications": "Réplications" } diff --git a/packages/manager/modules/netapp/src/dashboard/translations/Messages_fr_FR.json b/packages/manager/modules/netapp/src/dashboard/translations/Messages_fr_FR.json index 0571c45675dc..ef074fe7b016 100644 --- a/packages/manager/modules/netapp/src/dashboard/translations/Messages_fr_FR.json +++ b/packages/manager/modules/netapp/src/dashboard/translations/Messages_fr_FR.json @@ -4,5 +4,6 @@ "netapp_dashboard_snapshot_policies": "Snapshot policies", "netapp_dashboard_global_error": "L'erreur suivante est survenue :
{{message}}
request_id: {{requestId}}", "netapp_dashboard_guide_title": "Guides", - "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Configuration du réseau privé" + "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Configuration du réseau privé", + "netapp_dashboard_replications": "Réplications" } diff --git a/packages/manager/modules/netapp/src/dashboard/translations/Messages_it_IT.json b/packages/manager/modules/netapp/src/dashboard/translations/Messages_it_IT.json index 03cbf2e5a627..7be729f482f1 100644 --- a/packages/manager/modules/netapp/src/dashboard/translations/Messages_it_IT.json +++ b/packages/manager/modules/netapp/src/dashboard/translations/Messages_it_IT.json @@ -4,5 +4,6 @@ "netapp_dashboard_snapshot_policies": "Politiche di Snapshot", "netapp_dashboard_global_error": "Si è verificato il seguente errore:
{{message}}
request_id: {{requestId}}", "netapp_dashboard_guide_title": "Guide", - "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Configurazione della rete privata" + "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Configurazione della rete privata", + "netapp_dashboard_replications": "Repliche" } diff --git a/packages/manager/modules/netapp/src/dashboard/translations/Messages_pl_PL.json b/packages/manager/modules/netapp/src/dashboard/translations/Messages_pl_PL.json index d3bef6c9b143..2fee9d6883ad 100644 --- a/packages/manager/modules/netapp/src/dashboard/translations/Messages_pl_PL.json +++ b/packages/manager/modules/netapp/src/dashboard/translations/Messages_pl_PL.json @@ -4,5 +4,6 @@ "netapp_dashboard_snapshot_policies": "Reguły dotyczące snapshotów", "netapp_dashboard_global_error": "Wystąpił następujący błąd:
{{message}}
request_id: {{requestId}}", "netapp_dashboard_guide_title": "Przewodniki", - "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - konfiguracja sieci prywatnej" + "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - konfiguracja sieci prywatnej", + "netapp_dashboard_replications": "Replikacje" } diff --git a/packages/manager/modules/netapp/src/dashboard/translations/Messages_pt_PT.json b/packages/manager/modules/netapp/src/dashboard/translations/Messages_pt_PT.json index 3befc56d3745..9adba03dff70 100644 --- a/packages/manager/modules/netapp/src/dashboard/translations/Messages_pt_PT.json +++ b/packages/manager/modules/netapp/src/dashboard/translations/Messages_pt_PT.json @@ -4,5 +4,6 @@ "netapp_dashboard_snapshot_policies": "Políticas de snapshots", "netapp_dashboard_global_error": "Ocorreu o seguinte erro:
{{message}}
request_id: {{requestId}}", "netapp_dashboard_guide_title": "Manuais", - "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Configuração da rede privada" + "netapp_dashboard_guide_network_configuration": "Enterprise File Storage - Configuração da rede privada", + "netapp_dashboard_replications": "Replicações" } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/component.js b/packages/manager/modules/netapp/src/dashboard/volumes/component.js index 21c1644b7321..e44fb142850e 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/component.js +++ b/packages/manager/modules/netapp/src/dashboard/volumes/component.js @@ -1,4 +1,5 @@ import template from './template.html'; +import controller from './controller'; export default { bindings: { @@ -21,6 +22,11 @@ export default { trackClick: '<', goToEditVolumeReserveSpace: '<', totalVolumesStorage: '<', + goToCreateReplications: '<', + replicationsAvaibleServices: '<', + hasAvailableReplicationsServices: '<', + isNetworkAvailable: '<', }, template, + controller, }; diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/controller.js b/packages/manager/modules/netapp/src/dashboard/volumes/controller.js new file mode 100644 index 000000000000..7b32bf7f36de --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/controller.js @@ -0,0 +1,26 @@ +export default class { + /* @ngInject */ + constructor(NetAppDashboardService) { + this.NetAppDashboardService = NetAppDashboardService; + this.selectedReplicationsCheckboxes = {}; + this.AWAITING_REPLICATION_STATUS = 'awaiting_replication'; + } + + $onDestroy() { + this.NetAppDashboardService.replicationsSelectedVolumes = []; + } + + handleCheckboxChange({ volumeId, checked }) { + if (!checked) + this.NetAppDashboardService.replicationsSelectedVolumes = this.NetAppDashboardService.replicationsSelectedVolumes.filter( + (id) => id !== volumeId, + ); + else this.NetAppDashboardService.replicationsSelectedVolumes.push(volumeId); + } + + goToSingleReplication(volumeId) { + this.NetAppDashboardService.replicationsSelectedVolumes = [volumeId]; + this.selectedReplicationsCheckboxes = { [volumeId]: true }; + return this.goToCreateReplications(); + } +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/component.js b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/component.js new file mode 100644 index 000000000000..1d3d617068d2 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/component.js @@ -0,0 +1,15 @@ +import template from './template.html'; +import controller from './controller'; + +export default { + bindings: { + replicationsAvaibleServices: '<', + hasAvailableReplicationsServices: '<', + goToOrder: '<', + goToVolumes: '<', + postReplications: '<', + isNetworkAvailable: '<', + }, + template, + controller, +}; diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/controller.js b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/controller.js new file mode 100644 index 000000000000..fc3c1499feb3 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/controller.js @@ -0,0 +1,66 @@ +export default class NetappVolumesCreateReplicationsCtrl { + /* @ngInject */ + constructor(NetAppDashboardService, $translate) { + this.optionsReplicationsAvaibleServices = []; + this.onPostLoad = false; + this.replicationsSelectedVolumes = + NetAppDashboardService.replicationsSelectedVolumes; + this.NetAppDashboardService = NetAppDashboardService; + this.$translate = $translate; + } + + $onInit() { + this.optionsReplicationsAvaibleServices = this.replicationsAvaibleServices.map( + ({ service: { id, name } }) => ({ + id, + displayName: `${id}
${name}`, + }), + ); + } + + onPrimaryClick() { + if (!this.replicationsAvaibleServices.length) { + this.goToOrder(); + } else if ( + this.replicationsSelectedVolumes.length && + this.destinationServiceId + ) { + this.onPostLoad = true; + this.postReplications({ + volumesIds: this.replicationsSelectedVolumes, + destinationServiceId: this.destinationServiceId, + }).then((resp = []) => { + const errors = resp.reduce( + ( + prev, + { + status, + config: { + data: { destinationServiceId, sourceShareId } = {}, + } = {}, + }, + ) => + status === 201 + ? prev + : `${prev}
  • ${this.$translate.instant( + 'netapp_volumes_replications_errors', + { destinationServiceId, sourceShareId }, + )}
  • `, + '', + ); + + const message = errors.length ? `` : undefined; + const type = message ? 'warning' : 'success'; + + return this.goToVolumes(message, type, true); + }); + } + } + + isPrimaryButtonDisabled() { + return ( + this.onPostLoad || + (this.hasAvailableReplicationsServices && !this.destinationServiceId) + ); + } +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/index.js b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/index.js new file mode 100644 index 000000000000..c8af27acb435 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/index.js @@ -0,0 +1,22 @@ +import angular from 'angular'; +import '@uirouter/angularjs'; +import 'oclazyload'; + +const moduleName = 'ovhManagerNetAppVolumesCreateReplicationsLazyLoading'; + +angular.module(moduleName, ['ui.router', 'oc.lazyLoad']).config( + /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.volumes.create-replications.**', { + url: '/create-replications', + lazyLoad: ($transition$) => { + const $ocLazyLoad = $transition$.injector().get('$ocLazyLoad'); + + return import('./module').then((mod) => + $ocLazyLoad.inject(mod.default || mod), + ); + }, + }); + }, +); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/module.js b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/module.js new file mode 100644 index 000000000000..802e408d4d8c --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/module.js @@ -0,0 +1,25 @@ +import angular from 'angular'; +import '@ovh-ux/manager-core'; +import '@ovh-ux/ng-ovh-utils'; +import '@ovh-ux/ui-kit'; +import '@uirouter/angularjs'; +import 'angular-translate'; + +import component from './component'; +import routing from './routing'; + +const moduleName = 'ovhManagerNetAppVolumesCreateReplications'; + +angular + .module(moduleName, [ + 'ngOvhUtils', + 'oui', + 'ovhManagerCore', + 'pascalprecht.translate', + 'ui.router', + ]) + .config(routing) + .component(moduleName, component) + .run(/* @ngTranslationsInject:json ./translations */); + +export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/routing.js b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/routing.js new file mode 100644 index 000000000000..1416fef8fca2 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/routing.js @@ -0,0 +1,24 @@ +export default /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.volumes.create-replications', { + url: '/create-replications', + component: 'ovhManagerNetAppVolumesCreateReplications', + layout: 'modal', + resolve: { + postReplications: /* @ngInject */ ($q, $http, serviceName) => ({ + volumesIds, + destinationServiceId, + }) => + $q.all( + volumesIds.map((sourceShareId) => + $http + .post(`/storage/netapp/${serviceName}/shareReplication`, { + destinationServiceId, + sourceShareId, + }) + .catch((resp) => resp), + ), + ), + breadcrumb: () => null, + }, + }); +}; diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/template.html b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/template.html new file mode 100644 index 000000000000..b912fc4ca5fe --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/template.html @@ -0,0 +1,56 @@ + +
    + +

    +
    +
    + +

    +
    +
    +

    +

    +
      +
    • + {{volumeId}} +
    • +
    + + + + +
    +
    diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_de_DE.json b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_de_DE.json new file mode 100644 index 000000000000..682188190a55 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_de_DE.json @@ -0,0 +1,14 @@ +{ + "netapp_network_volumes_replications_title": "Volume(s) auf einem anderen Enterprise File Storage Dienst synchronisieren", + "netapp_network_volumes_replications_button_cancel": "Abbrechen", + "netapp_network_volumes_replications_button_buy": "Bestellen", + "netapp_network_volumes_replications_button_sync": "Synchronisieren", + "netapp_network_volumes_no_selected_volume_replications_subtitle": "Kein Volume ausgewählt", + "netapp_network_volumes_no_selected_volume_replications_description": "Um eine Replikation durchzuführen, wählen Sie bitte ein oder mehrere Volumes aus.", + "netapp_network_volumes_replications_selected_volumes": "Ausgewählte(s) Volume(s):", + "netapp_network_volumes_no_replications_subtitle": "Kein qualifizierter Zieldienst gefunden", + "netapp_network_volumes_not_replications_description": "Um Volumes zu synchronisieren, muss mindestens ein Enterprise File Storage Dienst mit einer vRack Verbindung im gleichen Rechenzentrum vorhanden sein. Dienste mit öffentlicher Verbindung können nicht als Ziel verwendet werden und sind bald veraltet.", + "netapp_network_volumes_replications_description": "Jedes Volume wird einzeln im Enterprise File Storage Zieldienst repliziert. Sie müssen die Synchronisierung auf den Zieldiensten für jedes Volume bestätigen. Die synchronisierten Volumes sind dann schreibgeschützt. Anschließend können Sie die Lese-/Schreibvorgänge über die Liste der Volumes im Zieldienst hochstufen.", + "netapp_network_volumes_replications_form_label": "Enterprise File Storage Zieldienst", + "netapp_network_volumes_replications_form_placeholder": "EFS auswählen" +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_en_GB.json b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_en_GB.json new file mode 100644 index 000000000000..73c6fe5200e6 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_en_GB.json @@ -0,0 +1,14 @@ +{ + "netapp_network_volumes_replications_title": "Sync volume(s) on another Enterprise File Storage service", + "netapp_network_volumes_replications_button_cancel": "Cancel", + "netapp_network_volumes_replications_button_buy": "Order", + "netapp_network_volumes_replications_button_sync": "Sync", + "netapp_network_volumes_no_selected_volume_replications_subtitle": "No volume selected", + "netapp_network_volumes_no_selected_volume_replications_description": "To replicate, please select one or more volumes.", + "netapp_network_volumes_replications_selected_volumes": "Selected volume(s):", + "netapp_network_volumes_no_replications_subtitle": "No eligible target services found", + "netapp_network_volumes_not_replications_description": "To sync volumes, you need to have at least one Enterprise File Storage service with a vRack connection in the same datacentre. Services exposed to the public cannot be used as targets and will soon be retired.", + "netapp_network_volumes_replications_description": "Each volume will be replicated individually in the target Enterprise File Storage service. You need to confirm synchronisation on the target services for each volume. The synced volumes will then be read-only. You can then promote to read/write from the list of volumes in the target service.", + "netapp_network_volumes_replications_form_label": "Target Enterprise File Storage", + "netapp_network_volumes_replications_form_placeholder": "Select EFS" +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_es_ES.json b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_es_ES.json new file mode 100644 index 000000000000..471ccaa449ae --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_es_ES.json @@ -0,0 +1,14 @@ +{ + "netapp_network_volumes_replications_title": "Sync volume(s) en otro servicio Enterprise File Storage", + "netapp_network_volumes_replications_button_cancel": "Cancelar", + "netapp_network_volumes_replications_button_buy": "Contratar", + "netapp_network_volumes_replications_button_sync": "Sincronizar", + "netapp_network_volumes_no_selected_volume_replications_subtitle": "No hay ningún volumen seleccionado", + "netapp_network_volumes_no_selected_volume_replications_description": "Para realizar una replicación, seleccione uno o varios volúmenes.", + "netapp_network_volumes_replications_selected_volumes": "Volumen(es) seleccionado(s):", + "netapp_network_volumes_no_replications_subtitle": "No se han encontrado servicios de destino elegibles", + "netapp_network_volumes_not_replications_description": "Para sincronizar volúmenes, debe tener al menos un servicio Enterprise File Storage con una conexión vRack en el mismo datacenter. Los servicios con conexión pública no pueden usarse como destino y pronto no estarán disponibles.", + "netapp_network_volumes_replications_description": "Cada volumen se replicará individualmente en el servicio Enterprise File Storage de destino. Deberá validar la sincronización en los servicios de destino para cada volumen. Los volúmenes sincronizados serán de solo lectura. A continuación, podrá promover en lectura/escritura desde la lista de volúmenes en el servicio de destino.", + "netapp_network_volumes_replications_form_label": "Enterprise File Storage de destino", + "netapp_network_volumes_replications_form_placeholder": "Seleccione EFS" +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_fr_CA.json b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_fr_CA.json new file mode 100644 index 000000000000..d308681262a8 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_fr_CA.json @@ -0,0 +1,14 @@ +{ + "netapp_network_volumes_replications_title": "Sync volume(s) sur un autre service Enterprise File Storage", + "netapp_network_volumes_replications_button_cancel": "Annuler", + "netapp_network_volumes_replications_button_buy": "Commander", + "netapp_network_volumes_replications_button_sync": "Synchroniser", + "netapp_network_volumes_no_selected_volume_replications_subtitle": "Pas de volume sélectionné", + "netapp_network_volumes_no_selected_volume_replications_description": "Pour faire une réplication, merci de sélectionner un ou plusieurs volume(s).", + "netapp_network_volumes_replications_selected_volumes": "Volume(s) sélectionné(s) :", + "netapp_network_volumes_no_replications_subtitle": "Aucun service cible eligible trouvé", + "netapp_network_volumes_not_replications_description": "Pour synchroniser des volumes, vous devez avoir au moins un service Enterprise File Storage avec un connection vRack dans le même datacenter. Les services avec connection public ne peuvent pas servir de destination et seront bientôt dépréciés.", + "netapp_network_volumes_replications_description": "Chaque volume sera répliqué individuellement dans le service Enterprise File Storage cible. Vous devrez valider la synchronisation sur les services cibles pour chaque volume. Les volumes syncronisés seront alors en lecture seule. Vous pourrez ensuite promouvoir en lecture / écriture à partir de la liste des volumes dans le service de destination.", + "netapp_network_volumes_replications_form_label": "Enterprise File Storage cible", + "netapp_network_volumes_replications_form_placeholder": "Sélectionnez EFS" +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_fr_FR.json b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_fr_FR.json new file mode 100644 index 000000000000..d308681262a8 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_fr_FR.json @@ -0,0 +1,14 @@ +{ + "netapp_network_volumes_replications_title": "Sync volume(s) sur un autre service Enterprise File Storage", + "netapp_network_volumes_replications_button_cancel": "Annuler", + "netapp_network_volumes_replications_button_buy": "Commander", + "netapp_network_volumes_replications_button_sync": "Synchroniser", + "netapp_network_volumes_no_selected_volume_replications_subtitle": "Pas de volume sélectionné", + "netapp_network_volumes_no_selected_volume_replications_description": "Pour faire une réplication, merci de sélectionner un ou plusieurs volume(s).", + "netapp_network_volumes_replications_selected_volumes": "Volume(s) sélectionné(s) :", + "netapp_network_volumes_no_replications_subtitle": "Aucun service cible eligible trouvé", + "netapp_network_volumes_not_replications_description": "Pour synchroniser des volumes, vous devez avoir au moins un service Enterprise File Storage avec un connection vRack dans le même datacenter. Les services avec connection public ne peuvent pas servir de destination et seront bientôt dépréciés.", + "netapp_network_volumes_replications_description": "Chaque volume sera répliqué individuellement dans le service Enterprise File Storage cible. Vous devrez valider la synchronisation sur les services cibles pour chaque volume. Les volumes syncronisés seront alors en lecture seule. Vous pourrez ensuite promouvoir en lecture / écriture à partir de la liste des volumes dans le service de destination.", + "netapp_network_volumes_replications_form_label": "Enterprise File Storage cible", + "netapp_network_volumes_replications_form_placeholder": "Sélectionnez EFS" +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_it_IT.json b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_it_IT.json new file mode 100644 index 000000000000..42b2200bf6ea --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_it_IT.json @@ -0,0 +1,14 @@ +{ + "netapp_network_volumes_replications_title": "Sincronizzazione dei volumi su un altro servizio Enterprise File Storage", + "netapp_network_volumes_replications_button_cancel": "Annullare", + "netapp_network_volumes_replications_button_buy": "Ordinare", + "netapp_network_volumes_replications_button_sync": "Sincronizza", + "netapp_network_volumes_no_selected_volume_replications_subtitle": "Nessun volume selezionato", + "netapp_network_volumes_no_selected_volume_replications_description": "Per effettuare una replica, seleziona uno o più volumi.", + "netapp_network_volumes_replications_selected_volumes": "Volumi selezionati:", + "netapp_network_volumes_no_replications_subtitle": "Nessun servizio di destinazione idoneo trovato", + "netapp_network_volumes_not_replications_description": "Per sincronizzare volumi, devi disporre di almeno un servizio Enterprise File Storage con una connessione vRack nello stesso datacenter. I servizi con connessione pubblica non possono essere utilizzati come destinazione e presto non saranno più disponibili.", + "netapp_network_volumes_replications_description": "Ogni volume sarà replicato singolarmente nel servizio Enterprise File Storage di destinazione. Devi convalidare la sincronizzazione sui servizi di destinazione per ogni volume. Da quel momento i volumi sincronizzati saranno in sola lettura. In seguito potrai promuoverli in lettura/scrittura dall'elenco dei volumi nel servizio di destinazione.", + "netapp_network_volumes_replications_form_label": "Enterprise File Storage di destinazione", + "netapp_network_volumes_replications_form_placeholder": "Seleziona EFS" +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_pl_PL.json b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_pl_PL.json new file mode 100644 index 000000000000..07d56de6fcfe --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_pl_PL.json @@ -0,0 +1,14 @@ +{ + "netapp_network_volumes_replications_title": "Synchronizuj wolumen(y) z inną usługą Enterprise File Storage", + "netapp_network_volumes_replications_button_cancel": "Anuluj", + "netapp_network_volumes_replications_button_buy": "Zamów", + "netapp_network_volumes_replications_button_sync": "Synchronizuj", + "netapp_network_volumes_no_selected_volume_replications_subtitle": "Nie wybrano wolumenu", + "netapp_network_volumes_no_selected_volume_replications_description": "Aby utworzyć replikację, wybierz jeden lub kilka wolumenów.", + "netapp_network_volumes_replications_selected_volumes": "Wybrane wolumeny:", + "netapp_network_volumes_no_replications_subtitle": "Nie znaleziono usługi docelowej spełniającej wymagania", + "netapp_network_volumes_not_replications_description": "Aby synchronizować wolumeny, musisz mieć co najmniej jedną usługę Enterprise File Storage podłączoną do vRack w tym samym centrum danych. Usługi dostępne przez publiczną sieć nie mogą być używane jako usługi docelowe i wkrótce zostaną wycofane.", + "netapp_network_volumes_replications_description": "Replikacja każdego wolumenu zostanie wykonana oddzielnie w docelowej usłudze Enterprise File Storage. Zatwierdź synchronizację w usługach docelowych dla każdego wolumenu. Zsynchronizowane wolumeny będą wtedy dostępne tylko do odczytu. Następnie możesz przełączyć wolumen w tryb odczytu i zapisu na liście wolumenów w usłudze docelowej.", + "netapp_network_volumes_replications_form_label": "Docelowy Enterprise File Storage", + "netapp_network_volumes_replications_form_placeholder": "Wybierz EFS" +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_pt_PT.json b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_pt_PT.json new file mode 100644 index 000000000000..ae10716fd43a --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/create-replications/translations/Messages_pt_PT.json @@ -0,0 +1,14 @@ +{ + "netapp_network_volumes_replications_title": "Sincronizar volume(s) noutro serviço Enterprise File Storage", + "netapp_network_volumes_replications_button_cancel": "Anular", + "netapp_network_volumes_replications_button_buy": "Encomendar", + "netapp_network_volumes_replications_button_sync": "Sincronizar ", + "netapp_network_volumes_no_selected_volume_replications_subtitle": "Nenhum volume selecionado", + "netapp_network_volumes_no_selected_volume_replications_description": "Para efetuar uma replicação, selecione um ou vários volumes.", + "netapp_network_volumes_replications_selected_volumes": "Volume(s) selecionado(s):", + "netapp_network_volumes_no_replications_subtitle": "Não foram encontrados serviços alvo elegíveis", + "netapp_network_volumes_not_replications_description": "Para sincronizar volumes, deve ter, pelo menos, um serviço Enterprise File Storage com uma ligação vRack no mesmo datacenter. Os serviços com ligação pública não podem servir de destino e serão descontinuados em breve.", + "netapp_network_volumes_replications_description": "Cada volume será replicado individualmente no serviço Enterprise File Storage de destino. Deverá validar a sincronização nos serviços alvo para cada volume. Os volumes sincronizados serão então apenas de leitura. De seguida, poderá promover em leitura/escrita a partir da lista dos volumes no serviço de destino.", + "netapp_network_volumes_replications_form_label": "Enterprise File Storage alvo", + "netapp_network_volumes_replications_form_placeholder": "Selecione EFS" +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/module.js b/packages/manager/modules/netapp/src/dashboard/volumes/module.js index 1652ddefc8cc..a072bea323f1 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/module.js +++ b/packages/manager/modules/netapp/src/dashboard/volumes/module.js @@ -12,6 +12,7 @@ import deleteModule from './delete'; import dashboard from './dashboard'; import editSize from './edit-size'; import editReserveSpace from './edit-reserve-space'; +import createReplications from './create-replications'; const moduleName = 'ovhManagerNetAppVolumes'; @@ -26,6 +27,7 @@ angular dashboard, editSize, editReserveSpace, + createReplications, ]) .config(routing) .component('ovhManagerNetAppVolumes', component) diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/routing.js b/packages/manager/modules/netapp/src/dashboard/volumes/routing.js index f13cb238a23a..4e4576e47466 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/routing.js +++ b/packages/manager/modules/netapp/src/dashboard/volumes/routing.js @@ -39,8 +39,9 @@ export default /* @ngInject */ ($stateProvider) => { goToVolumes: /* @ngInject */ ($state, Alerter, storage) => ( message = false, type = 'success', + forceReload = false, ) => { - const reload = message && type === 'success'; + const reload = forceReload || (message && type === 'success'); const promise = $state.go( 'netapp.dashboard.volumes', { @@ -169,6 +170,17 @@ export default /* @ngInject */ ($stateProvider) => { $translate.instant('netapp_volumes_breadcrumb'), totalVolumesStorage: /* @ngInject */ (volumes) => volumes.reduce((sum, { size }) => sum + size, 0), + goToCreateReplications: /* @ngInject */ ($state) => () => + $state.go('netapp.dashboard.volumes.create-replications'), + replicationsAvaibleServices: /* @ngInject */ ($http, serviceName) => + $http + .get( + `/storage/netapp/${serviceName}/shareReplicationServicesCompatibility?compatibleOnly=true`, + ) + .then(({ data = [] }) => data) + .catch(() => []), + hasAvailableReplicationsServices: /* @ngInject */ (replicationsAvaibleServices) => + !!replicationsAvaibleServices.length }, atInternet: { ignore: true, diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/template.html b/packages/manager/modules/netapp/src/dashboard/volumes/template.html index 8079fc8b2549..7102ff6d8c47 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/template.html +++ b/packages/manager/modules/netapp/src/dashboard/volumes/template.html @@ -16,6 +16,16 @@ > + + + + + + - +

    - + + + diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_de_DE.json b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_de_DE.json index 07554f4230f9..ccffb5737493 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_de_DE.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_de_DE.json @@ -43,5 +43,9 @@ "netapp_volumes_mount_path_not_configurated": "Nicht konfiguriert", "netapp_volumes_edit_volume_size": "Größe ändern", "netapp_volumes_restore_snapshot": "Letzten Snapshot wiederherstellen", - "netapp_volumes_edit_reserve_space": "Den für Snapshots reservierten Platz ändern" + "netapp_volumes_edit_reserve_space": "Den für Snapshots reservierten Platz ändern", + "netapp_volumes_button_replications": "Volume(s) replizieren", + "netapp_volumes_status_awaiting_replication": "Replikation wird ausgeführt", + "netapp_volumes_edit_create_single_replication": "Dieses Volume replizieren", + "netapp_volumes_replications_errors": "Das Volume {{sourceShareId}} konnte nicht auf den Dienst {{destinationServiceId}} repliziert werden." } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_en_GB.json b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_en_GB.json index 95a5c47ffa2c..ae535c0e7038 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_en_GB.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_en_GB.json @@ -43,5 +43,9 @@ "netapp_volumes_mount_path_not_configurated": "Not configured", "netapp_volumes_edit_volume_size": "Edit size", "netapp_volumes_restore_snapshot": "Revert to the last saved snapshot", - "netapp_volumes_edit_reserve_space": "Edit snapshot reserve space" + "netapp_volumes_edit_reserve_space": "Edit snapshot reserve space", + "netapp_volumes_button_replications": "Replicate volume(s)", + "netapp_volumes_status_awaiting_replication": "Replicating...", + "netapp_volumes_edit_create_single_replication": "Replicate this volume", + "netapp_volumes_replications_errors": "The {{sourceShareId}} volume could not be replicated to the {{destinationServiceId}} service." } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_es_ES.json b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_es_ES.json index 4a0ff22cd633..89cf8b879836 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_es_ES.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_es_ES.json @@ -43,5 +43,9 @@ "netapp_volumes_mount_path_not_configurated": "No configurado", "netapp_volumes_edit_volume_size": "Cambiar el tamaño", "netapp_volumes_restore_snapshot": "Restaurar el último snapshot", - "netapp_volumes_edit_reserve_space": "Modificar el espacio reservados para los snapshots" + "netapp_volumes_edit_reserve_space": "Modificar el espacio reservados para los snapshots", + "netapp_volumes_button_replications": "Replicar volumen(es)", + "netapp_volumes_status_awaiting_replication": "Replicación en curso", + "netapp_volumes_edit_create_single_replication": "Replicar este volumen", + "netapp_volumes_replications_errors": "No se pudo replicar el volumen {{sourceShareId}} en el servicio {{destinationServiceId}}." } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_fr_CA.json b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_fr_CA.json index f4493eb9a649..2af45cf2078e 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_fr_CA.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_fr_CA.json @@ -43,5 +43,9 @@ "netapp_volumes_delete_volume": "Supprimer le volume", "netapp_volumes_edit_volume_size": "Modifier la taille", "netapp_volumes_edit_reserve_space": "Modifier l'espace réservé des snapshots", - "netapp_volumes_mount_path_not_configurated": "Non configuré" + "netapp_volumes_mount_path_not_configurated": "Non configuré", + "netapp_volumes_button_replications": "Répliquer volume(s)", + "netapp_volumes_status_awaiting_replication": "Réplication en cours", + "netapp_volumes_edit_create_single_replication": "Répliquer ce volume", + "netapp_volumes_replications_errors": "Le volume {{sourceShareId}} n'a pas pu être répliqué sur le service {{destinationServiceId}}." } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_fr_FR.json b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_fr_FR.json index f4493eb9a649..2af45cf2078e 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_fr_FR.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_fr_FR.json @@ -43,5 +43,9 @@ "netapp_volumes_delete_volume": "Supprimer le volume", "netapp_volumes_edit_volume_size": "Modifier la taille", "netapp_volumes_edit_reserve_space": "Modifier l'espace réservé des snapshots", - "netapp_volumes_mount_path_not_configurated": "Non configuré" + "netapp_volumes_mount_path_not_configurated": "Non configuré", + "netapp_volumes_button_replications": "Répliquer volume(s)", + "netapp_volumes_status_awaiting_replication": "Réplication en cours", + "netapp_volumes_edit_create_single_replication": "Répliquer ce volume", + "netapp_volumes_replications_errors": "Le volume {{sourceShareId}} n'a pas pu être répliqué sur le service {{destinationServiceId}}." } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_it_IT.json b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_it_IT.json index b6ccc66ba7e3..f20bb99500af 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_it_IT.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_it_IT.json @@ -43,5 +43,9 @@ "netapp_volumes_mount_path_not_configurated": "Non configurato", "netapp_volumes_edit_volume_size": "Modificare la dimensione", "netapp_volumes_restore_snapshot": "Ripristinare l'ultimo Snapshot", - "netapp_volumes_edit_reserve_space": "Modificare lo spazio riservato agli Snapshot" + "netapp_volumes_edit_reserve_space": "Modificare lo spazio riservato agli Snapshot", + "netapp_volumes_button_replications": "Replicare volumi", + "netapp_volumes_status_awaiting_replication": "Replica in corso", + "netapp_volumes_edit_create_single_replication": "Replicare questo volume", + "netapp_volumes_replications_errors": "Impossibile replicare il volume {{sourceShareId}} sul servizio {{destinationServiceId}}." } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_pl_PL.json b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_pl_PL.json index 8019782251a2..51b8b9253e1d 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_pl_PL.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_pl_PL.json @@ -43,5 +43,9 @@ "netapp_volumes_mount_path_not_configurated": "Brak konfiguracji", "netapp_volumes_edit_volume_size": "Zmień rozmiar", "netapp_volumes_restore_snapshot": "Przywróć ostatni snapshot", - "netapp_volumes_edit_reserve_space": "Zmień przestrzeń dyskową przeznaczoną na snapshoty" + "netapp_volumes_edit_reserve_space": "Zmień przestrzeń dyskową przeznaczoną na snapshoty", + "netapp_volumes_button_replications": "Replikuj wolumen(y)", + "netapp_volumes_status_awaiting_replication": "Replikacja w trakcie", + "netapp_volumes_edit_create_single_replication": "Replikuj ten wolumen", + "netapp_volumes_replications_errors": "Nie udało się wykonać replikacji wolumenu {{sourceShareId}} w usłudze {{destinationServiceId}}." } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_pt_PT.json b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_pt_PT.json index 05ea811803ab..c7646e692253 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_pt_PT.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/translations/Messages_pt_PT.json @@ -43,5 +43,9 @@ "netapp_volumes_mount_path_not_configurated": "Não configurado", "netapp_volumes_edit_volume_size": "Alterar dimensão", "netapp_volumes_restore_snapshot": "Restaurar a última snapshot", - "netapp_volumes_edit_reserve_space": "Alterar o espaço reservado às snapshots" + "netapp_volumes_edit_reserve_space": "Alterar o espaço reservado às snapshots", + "netapp_volumes_button_replications": "Replicar volume(s)", + "netapp_volumes_status_awaiting_replication": "Replicação em curso", + "netapp_volumes_edit_create_single_replication": "Replicar este volume", + "netapp_volumes_replications_errors": "Não foi possível replicar o volume {{sourceShareId}} no serviço {{destinationServiceId}}." } diff --git a/packages/manager/modules/netapp/src/routing.js b/packages/manager/modules/netapp/src/routing.js index d299ae03610f..755617356e21 100644 --- a/packages/manager/modules/netapp/src/routing.js +++ b/packages/manager/modules/netapp/src/routing.js @@ -16,6 +16,15 @@ export default /* @ngInject */ ($stateProvider) => { }, breadcrumb: /* @ngInject */ ($translate) => $translate.instant('netapp_title'), + + goToOrder: /* @ngInject */ ($state, atInternet) => () => { + atInternet.trackClick({ + type: 'action', + name: `netapp::create`, + }); + + return $state.go('netapp.order'); + }, }, }); @@ -125,15 +134,6 @@ export default /* @ngInject */ ($stateProvider) => { }, }), - goToOrder: /* @ngInject */ ($state, atInternet) => () => { - atInternet.trackClick({ - type: 'action', - name: `netapp::create`, - }); - - return $state.go('netapp.order'); - }, - hideBreadcrumb: () => true, }, });