diff --git a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_de_DE.json b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_de_DE.json index baeb61865c6e..da1f35846a2e 100644 --- a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_de_DE.json +++ b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_de_DE.json @@ -32,5 +32,8 @@ "server_display_without-engagement": "ohne Vertragsbindung", "server_display_renew-automatic": "automatisch", "server_display_renew-manual": "manuell", - "server_display_vrack": "vRack" + "server_display_vrack": "vRack", + "guide_first_step_label": "Erste Schritte mit einem Dedicated Server", + "guide_secure_label": "Einen Dedicated Server absichern", + "guide_ssh_connections_label": "Erste Schritte mit SSH-Verbindungen" } diff --git a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_en_GB.json b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_en_GB.json index ca76550bdd87..07e3ac44bb20 100644 --- a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_en_GB.json +++ b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_en_GB.json @@ -32,5 +32,8 @@ "server_display_without-engagement": "without commitment", "server_display_renew-automatic": "Automatic", "server_display_renew-manual": "manual", - "server_display_vrack": "vRack" + "server_display_vrack": "vRack", + "guide_first_step_label": "Getting started with a dedicated server", + "guide_secure_label": "Secure my dedicated server", + "guide_ssh_connections_label": "How to get started with SSH connections" } diff --git a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_es_ES.json b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_es_ES.json index b827e4a2ae65..7db42ccadf6e 100644 --- a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_es_ES.json +++ b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_es_ES.json @@ -32,5 +32,8 @@ "server_display_without-engagement": "sin compromiso", "server_display_renew-automatic": "automático", "server_display_renew-manual": "manual", - "server_display_vrack": "vRack" + "server_display_vrack": "vRack", + "guide_first_step_label": "Primeros pasos con un servidor dedicado", + "guide_secure_label": "Proteger un servidor dedicado", + "guide_ssh_connections_label": "Primeros pasos para utilizar las conexiones SSH" } diff --git a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_fr_CA.json b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_fr_CA.json index b89e70aba3ff..af97dfb1758b 100644 --- a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_fr_CA.json +++ b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_fr_CA.json @@ -32,5 +32,8 @@ "server_display_with-engagement": "avec engagement", "server_display_without-engagement": "sans engagement", "server_display_renew-automatic": "automatique", - "server_display_renew-manual": "manuel" + "server_display_renew-manual": "manuel", + "guide_first_step_label": "Premiers pas avec un serveur dédié", + "guide_secure_label": "Sécuriser un serveur dédié", + "guide_ssh_connections_label": "Comment bien débuter avec les connexions SSH" } diff --git a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_fr_FR.json b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_fr_FR.json index b89e70aba3ff..af97dfb1758b 100644 --- a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_fr_FR.json +++ b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_fr_FR.json @@ -32,5 +32,8 @@ "server_display_with-engagement": "avec engagement", "server_display_without-engagement": "sans engagement", "server_display_renew-automatic": "automatique", - "server_display_renew-manual": "manuel" + "server_display_renew-manual": "manuel", + "guide_first_step_label": "Premiers pas avec un serveur dédié", + "guide_secure_label": "Sécuriser un serveur dédié", + "guide_ssh_connections_label": "Comment bien débuter avec les connexions SSH" } diff --git a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_it_IT.json b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_it_IT.json index 66a416b77d91..1c5ff133d984 100644 --- a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_it_IT.json +++ b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_it_IT.json @@ -32,5 +32,8 @@ "server_display_without-engagement": "senza impegno", "server_display_renew-automatic": "automatico", "server_display_renew-manual": "manuale", - "server_display_vrack": "vRack" + "server_display_vrack": "vRack", + "guide_first_step_label": "Iniziare a utilizzare un server dedicato", + "guide_secure_label": "Mettere in sicurezza un server dedicato", + "guide_ssh_connections_label": "Come iniziare a utilizzare le connessioni SSH" } diff --git a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_pl_PL.json b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_pl_PL.json index 394182adbfd7..f2cd890ff736 100644 --- a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_pl_PL.json +++ b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_pl_PL.json @@ -32,5 +32,8 @@ "server_display_without-engagement": "bez umowy terminowej", "server_display_renew-automatic": "automatycznie", "server_display_renew-manual": "ręcznie", - "server_display_vrack": "vRack" + "server_display_vrack": "vRack", + "guide_first_step_label": "Pierwsze kroki z serwerem dedykowanym", + "guide_secure_label": "Bezpieczeństwo serwera dedykowanego", + "guide_ssh_connections_label": "Jak rozpocząć korzystanie z połączeń SSH" } diff --git a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_pt_PT.json b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_pt_PT.json index 662069cb11ef..5d8bc6a67004 100644 --- a/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_pt_PT.json +++ b/packages/manager/apps/dedicated-servers/public/translations/dedicated-servers/Messages_pt_PT.json @@ -32,5 +32,8 @@ "server_display_without-engagement": "sem compromisso", "server_display_renew-automatic": "automático", "server_display_renew-manual": "manual", - "server_display_vrack": "vRack" + "server_display_vrack": "vRack", + "guide_first_step_label": "Primeiros passos com um servidor dedicado", + "guide_secure_label": "Proteger um servidor dedicado", + "guide_ssh_connections_label": "Como começar com as ligações SSH" } diff --git a/packages/manager/apps/dedicated-servers/src/hooks/useGuides.tsx b/packages/manager/apps/dedicated-servers/src/hooks/useGuides.tsx new file mode 100644 index 000000000000..8e561dda2338 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/hooks/useGuides.tsx @@ -0,0 +1,138 @@ +import { useContext, useEffect, useState } from 'react'; +import { GuideItem } from '@ovh-ux/manager-react-components'; +import { CountryCode } from '@ovh-ux/manager-config'; +import { ShellContext } from '@ovh-ux/manager-react-shell-client'; + +type GuideLinks = Partial<{ [key in CountryCode | 'DEFAULT']: string }>; + +const ENDPOINT = 'https://help.ovhcloud.com/csm/'; + +const getFirstStepUrl = (language: string, article: string) => + `${ENDPOINT}${language}-dedicated-servers-getting-started-dedicated-server?id=kb_article_view&sysparm_article=${article}`; + +const firstStepEnIe = ['en-ie', 'KB0043476'] as const; +const firstStepFr = ['fr', 'KB0043481'] as const; + +const FIRST_STEP_LINKS: GuideLinks = { + FR: getFirstStepUrl(...firstStepFr), + DE: getFirstStepUrl('de', 'KB0030498'), + ES: getFirstStepUrl('es-es', 'KB0043480'), + IE: getFirstStepUrl(...firstStepEnIe), + IT: getFirstStepUrl('it', 'KB0043487'), + NL: getFirstStepUrl(...firstStepEnIe), + PL: getFirstStepUrl('pl', 'KB0043483'), + PT: getFirstStepUrl('pt', 'KB0043484'), + GB: getFirstStepUrl('en-gb', 'KB0043475'), + CA: getFirstStepUrl('en-ca', 'KB0043473'), + QC: getFirstStepUrl('fr-ca', 'KB0043482'), + MA: getFirstStepUrl(...firstStepFr), + SN: getFirstStepUrl(...firstStepFr), + TN: getFirstStepUrl(...firstStepFr), + AU: getFirstStepUrl('en-au', 'KB0043474'), + IN: getFirstStepUrl('en-in', 'KB0067915'), + SG: getFirstStepUrl('en-sg', 'KB0043478'), + ASIA: getFirstStepUrl('asia', 'KB0043472'), + WE: getFirstStepUrl(...firstStepEnIe), + WS: getFirstStepUrl('es', 'KB0043479'), + DEFAULT: getFirstStepUrl(...firstStepEnIe), +}; + +const getSecureUrl = (language: string, article: string) => + `${ENDPOINT}${language}-dedicated-servers-securing-server?id=kb_article_view&sysparm_article=${article}`; + +const secureEnIe = ['en-ie', 'KB0043971'] as const; +const secureFr = ['fr', 'KB0043978'] as const; + +const SECURE_LINKS: GuideLinks = { + FR: getSecureUrl(...secureFr), + DE: getSecureUrl('de', 'KB0043981'), + ES: getSecureUrl('es-es', 'KB0043976'), + IE: getSecureUrl(...secureEnIe), + IT: getSecureUrl('it', 'KB0043982'), + NL: getSecureUrl(...secureEnIe), + PL: getSecureUrl('pl', 'KB0043983'), + PT: getSecureUrl('pt', 'KB0043986'), + GB: getSecureUrl('en-gb', 'KB0043969'), + CA: getSecureUrl('en-ca', 'KB0043970'), + QC: getSecureUrl('fr-ca', 'KB0043979'), + MA: getSecureUrl(...secureFr), + SN: getSecureUrl(...secureFr), + TN: getSecureUrl(...secureFr), + AU: getSecureUrl('en-au', 'KB0043972'), + IN: getSecureUrl('en-in', 'KB0067991'), + SG: getSecureUrl('en-sg', 'KB0043974'), + ASIA: getSecureUrl('asia', 'KB0031024'), + WE: getSecureUrl(...secureEnIe), + WS: getSecureUrl(...secureEnIe), + DEFAULT: getSecureUrl(...secureEnIe), +}; + +const getSSHConnectionsUrl = (language: string, article: string) => + `${ENDPOINT}${language}-dedicated-servers-ssh-introduction?id=kb_article_view&sysparm_article=${article}`; + +const sshConnectionEnIe = ['en-ie', 'KB0044020'] as const; +const sshConnectionFr = ['fr', 'KB0044339'] as const; + +const SSH_CONNECTIONS_LINKS: GuideLinks = { + FR: getSSHConnectionsUrl(...sshConnectionFr), + DE: getSSHConnectionsUrl('de', 'KB0044338'), + ES: getSSHConnectionsUrl('es-es', 'KB0044025'), + IE: getSSHConnectionsUrl(...sshConnectionEnIe), + IT: getSSHConnectionsUrl('it', 'KB0044027'), + NL: getSSHConnectionsUrl(...sshConnectionEnIe), + PL: getSSHConnectionsUrl('pl', 'KB0044030'), + PT: getSSHConnectionsUrl('pt', 'KB0044029'), + GB: getSSHConnectionsUrl('en-gb', 'KB0044024'), + CA: getSSHConnectionsUrl('en-ca', 'KB0044022'), + QC: getSSHConnectionsUrl('fr-ca', 'KB0044023'), + MA: getSSHConnectionsUrl(...sshConnectionFr), + SN: getSSHConnectionsUrl(...sshConnectionFr), + TN: getSSHConnectionsUrl(...sshConnectionFr), + AU: getSSHConnectionsUrl('en-au', 'KB0044019'), + IN: getSSHConnectionsUrl('en-in', 'KB0068003'), + SG: getSSHConnectionsUrl('en-sg', 'KB0044327'), + ASIA: getSSHConnectionsUrl('asia', 'KB0031077'), + WE: getSSHConnectionsUrl(...sshConnectionEnIe), + WS: getSSHConnectionsUrl('es', 'KB0044028'), + DEFAULT: getSSHConnectionsUrl(...sshConnectionEnIe), +}; + +const guidesList = [ + { + label: 'guide_first_step_label', + links: FIRST_STEP_LINKS, + }, + { + label: 'guide_secure_label', + links: SECURE_LINKS, + }, + { + label: 'guide_ssh_connections_label', + links: SSH_CONNECTIONS_LINKS, + }, +]; + +export default function useGuides(translate: (key: string) => string) { + const [guides, setGuides] = useState([]); + const { + shell: { environment }, + } = useContext(ShellContext); + + useEffect(() => { + (async () => { + const env = await environment.getEnvironment(); + const { ovhSubsidiary } = env.getUser(); + + setGuides( + guidesList.map(({ label, links }, id) => ({ + id, + label: translate(label), + href: links[ovhSubsidiary as CountryCode] || links.DEFAULT, + target: '_blank', + })), + ); + })(); + }, []); + + return guides; +} diff --git a/packages/manager/apps/dedicated-servers/src/pages/listing/index.tsx b/packages/manager/apps/dedicated-servers/src/pages/listing/index.tsx index c4ab8471db13..a2280777e26d 100644 --- a/packages/manager/apps/dedicated-servers/src/pages/listing/index.tsx +++ b/packages/manager/apps/dedicated-servers/src/pages/listing/index.tsx @@ -12,12 +12,17 @@ import { useRouteSynchro, ShellContext, } from '@ovh-ux/manager-react-shell-client'; -import { ChangelogButton, BaseLayout } from '@ovh-ux/manager-react-components'; +import { + ChangelogButton, + BaseLayout, + GuideButton, +} from '@ovh-ux/manager-react-components'; import { OdsTabs, OdsTab } from '@ovhcloud/ods-components/react'; import { useTranslation } from 'react-i18next'; import { CHANGELOG_LINKS } from '@/data/constants/changelogLinks'; import { urls } from '@/routes/routes.constant'; import { useCluster } from '@/hooks/useCluster'; +import useGuides from '@/hooks/useGuides'; export default function Layout() { const { t } = useTranslation('dedicated-servers'); @@ -28,6 +33,7 @@ export default function Layout() { const { data, isSuccess: isSuccessCluster } = useCluster(); const [activePanel, setActivePanel] = useState(''); const navigate = useNavigate(); + const guides = useGuides(t); useRouteSynchro(); @@ -66,6 +72,7 @@ export default function Layout() { header={{ title: t('title'), changelogButton: , + headerButton: , }} tabs={
diff --git a/packages/manager/apps/dedicated/client/app/images/flags/it.svg b/packages/manager/apps/dedicated/client/app/images/flags/it.svg new file mode 100644 index 000000000000..20a8bfdcc802 --- /dev/null +++ b/packages/manager/apps/dedicated/client/app/images/flags/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/interfaces.service.js b/packages/manager/modules/bm-server-components/src/network-interfaces/interfaces.service.js index e80ddc949bb1..c1ec4d5a5a60 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/interfaces.service.js +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/interfaces.service.js @@ -115,6 +115,7 @@ export default class DedicatedServerInterfacesService { id: uuid, name, mac: networkInterfaceController.join(', '), + nbMac: networkInterfaceController.length, type, vrack, enabled, diff --git a/packages/manager/modules/bm-server-components/src/network-tile/template.html b/packages/manager/modules/bm-server-components/src/network-tile/template.html index 4350d4e5bd4d..9d84229e8ce3 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/template.html +++ b/packages/manager/modules/bm-server-components/src/network-tile/template.html @@ -8,8 +8,7 @@ - - + diff --git a/packages/manager/modules/bm-server-components/src/ola/component.js b/packages/manager/modules/bm-server-components/src/ola/component.js index 4417029f1a6e..061d485bfc78 100644 --- a/packages/manager/modules/bm-server-components/src/ola/component.js +++ b/packages/manager/modules/bm-server-components/src/ola/component.js @@ -1,7 +1,9 @@ import template from './template.html'; +import controller from './controller.js'; export default { template, + controller, bindings: { server: '<', guideUrl: '@', diff --git a/packages/manager/modules/bm-server-components/src/ola/controller.js b/packages/manager/modules/bm-server-components/src/ola/controller.js new file mode 100644 index 000000000000..1e5ff22cde96 --- /dev/null +++ b/packages/manager/modules/bm-server-components/src/ola/controller.js @@ -0,0 +1,29 @@ +import { + NEW_LACP_MODE_BANNER_FEATURE_ID, + SCALE_HGR_MAC_COUNTER, +} from './ola.constants'; + +export default class OlaCtrl { + /* @ngInject */ + constructor($state, olaService, ovhFeatureFlipping) { + this.$state = $state; + this.olaService = olaService; + this.ovhFeatureFlipping = ovhFeatureFlipping; + } + + $onInit() { + this.isLacpBannerAvailable = false; + this.resilienceGuideUrl = this.olaService.getResilienceGuideUrl(); + this.olaService.getNetworkInterfaces(this.server?.name).then((data) => { + if (data.length >= SCALE_HGR_MAC_COUNTER) { + this.ovhFeatureFlipping + .checkFeatureAvailability(NEW_LACP_MODE_BANNER_FEATURE_ID) + .then((featureAvailability) => { + this.isLacpBannerAvailable = featureAvailability.isFeatureAvailable( + NEW_LACP_MODE_BANNER_FEATURE_ID, + ); + }); + } + }); + } +} diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js index e9c600adead2..00c306780d3d 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js @@ -3,7 +3,11 @@ import flatten from 'lodash/flatten'; import get from 'lodash/get'; import map from 'lodash/map'; -import { OLA_MODES } from '../ola.constants'; +import { + OLA_MODES, + NEW_LACP_MODE_BANNER_FEATURE_ID, + SCALE_HGR_MAC_COUNTER, +} from '../ola.constants'; export default class { /* @ngInject */ @@ -13,6 +17,7 @@ export default class { $translate, Alerter, ouiDatagridService, + ovhFeatureFlipping, olaService, OvhApiDedicatedServerPhysicalInterface, OvhApiDedicatedServerVirtualInterface, @@ -25,11 +30,24 @@ export default class { this.PhysicalInterface = OvhApiDedicatedServerPhysicalInterface; this.VirtualInterface = OvhApiDedicatedServerVirtualInterface; this.ouiDatagridService = ouiDatagridService; + this.ovhFeatureFlipping = ovhFeatureFlipping; } $onInit() { this.olaModes = Object.values(OLA_MODES); this.isLoading = false; + const nbMacs = this.interfaces.reduce((acc, item) => acc + item.nbMac, 0); + this.resilienceGuideUrl = this.olaService.getResilienceGuideUrl(); + this.isLacpBannerAvailable = false; + if (nbMacs >= SCALE_HGR_MAC_COUNTER) { + this.ovhFeatureFlipping + .checkFeatureAvailability(NEW_LACP_MODE_BANNER_FEATURE_ID) + .then((featureAvailability) => { + this.isLacpBannerAvailable = featureAvailability.isFeatureAvailable( + NEW_LACP_MODE_BANNER_FEATURE_ID, + ); + }); + } this.configuration = { mode: diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html index 591be3005ea3..c4ed4ebbfbd2 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html @@ -39,6 +39,26 @@ >

+ + + + + + + + +
data); } + getNetworkInterfaces(serverName) { + return this.$http + .get(`/dedicated/server/${serverName}/networkInterfaceController`) + .then(({ data }) => data); + } + waitTasks(serverName) { return this.getTasks(serverName).then((tasks) => this.waitAllTasks(serverName, tasks), @@ -113,4 +120,12 @@ export default class OlaService { }, ); } + + getResilienceGuideUrl() { + const { ovhSubsidiary } = this.coreConfig.getUser(); + return ( + NETWORK_RESILIENCE_GUIDES[ovhSubsidiary] || + NETWORK_RESILIENCE_GUIDES.DEFAULT + ); + } } diff --git a/packages/manager/modules/bm-server-components/src/ola/template.html b/packages/manager/modules/bm-server-components/src/ola/template.html index 5dc42cd1159d..bb7aaaba6781 100644 --- a/packages/manager/modules/bm-server-components/src/ola/template.html +++ b/packages/manager/modules/bm-server-components/src/ola/template.html @@ -28,6 +28,31 @@

+ + + + + + + + + + + diff --git a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_de_DE.json b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_de_DE.json index 324937ff142b..efbac7e9cb34 100644 --- a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_de_DE.json +++ b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_de_DE.json @@ -12,5 +12,6 @@ "server_ola_reset": "Die private Aggregation dekonfigurieren", "server_ola_terminate": "OLA kündigen", "server_ola_mode_vrack_aggregation": "Private Aggregation", - "server_ola_mode_default": "Standard" + "server_ola_mode_default": "Standard", + "server_ola_alert_new_lacp_rule": "OVHcloud führt am 25. November 2025 ein Update des LACP-Aggregationsmodells ein. Der Wechsel in den OLA-Modus oder umgekehrt oder die Neukonfiguration der Aggregation wird das neue Verhalten anwenden. Überprüfen Sie bei Bedarf die LACP- und MAC-Einstellungen Ihres Betriebssystems, um sich an dieses Update anzupassen. Zusätzliche Informationen sind in dieser Dokumentation verfügbar." } diff --git a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_en_GB.json b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_en_GB.json index 6da5b06ef7ee..a7eddbe42c67 100644 --- a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_en_GB.json +++ b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_en_GB.json @@ -12,5 +12,6 @@ "server_ola_reset": "Unconfigure private aggregation", "server_ola_terminate": "Cancel OLA", "server_ola_mode_vrack_aggregation": "Private aggregation", - "server_ola_mode_default": "Default" + "server_ola_mode_default": "Default", + "server_ola_alert_new_lacp_rule": "OVHcloud is introducing an update to the LACP aggregation model starting from 25 November 2025. Switching to OLA mode or vice versa, or reconfiguring the aggregation, will apply the new behaviour. If necessary, review the LACP and MAC settings of your operating system to align with this update. Additional information is available in this documentation." } diff --git a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_es_ES.json b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_es_ES.json index 89110e410a6c..bfcd645ff0d8 100644 --- a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_es_ES.json +++ b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_es_ES.json @@ -12,5 +12,6 @@ "server_ola_reset": "Desconfigurar la agregación privada", "server_ola_terminate": "Dar de baja OLA", "server_ola_mode_vrack_aggregation": "Agregación privada", - "server_ola_mode_default": "Por defecto" + "server_ola_mode_default": "Por defecto", + "server_ola_alert_new_lacp_rule": "OVHcloud introduce una actualización del modelo de agregación LACP a partir del 25 de noviembre de 2025. El cambio al modo OLA o viceversa, o la reconfiguración de la agregación, aplicará el nuevo comportamiento. Si es necesario, revise los parámetros LACP y MAC de su sistema operativo para alinearse con esta actualización. Información adicional está disponible en esta documentación." } diff --git a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_fr_CA.json b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_fr_CA.json index 0f41ca088d64..f52e377a2ed3 100644 --- a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_fr_CA.json +++ b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_fr_CA.json @@ -1,6 +1,7 @@ { "server_ola_step_checker_title": "OLA: OVHcloud Link Aggregation", "server_ola_alert_configuration_needed_small": "Une configuration manuelle via le KVM IPMI sera nécessaire.", + "server_ola_alert_new_lacp_rule": "OVHcloud introduit une mise à jour du modèle d’agrégation LACP à partir du 25 novembre 2025. Le passage en mode OLA ou inversement, ou la reconfiguration de l'agrégation, appliquera le nouveau comportement. Si nécessaire, passez en revue les paramètres LACP et MAC de votre système d'exploitation pour vous aligner sur cette mise à jour. Des informations supplémentaires sont disponibles dans cette documentation.", "server_ola_alert_configuration_needed_link": "En savoir plus", "server_ola_new_tab": "(S'ouvre dans un nouvel onglet)", "server_ola": "OVHcloud Link Aggregation", diff --git a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_fr_FR.json b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_fr_FR.json index 0f41ca088d64..f52e377a2ed3 100644 --- a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_fr_FR.json +++ b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_fr_FR.json @@ -1,6 +1,7 @@ { "server_ola_step_checker_title": "OLA: OVHcloud Link Aggregation", "server_ola_alert_configuration_needed_small": "Une configuration manuelle via le KVM IPMI sera nécessaire.", + "server_ola_alert_new_lacp_rule": "OVHcloud introduit une mise à jour du modèle d’agrégation LACP à partir du 25 novembre 2025. Le passage en mode OLA ou inversement, ou la reconfiguration de l'agrégation, appliquera le nouveau comportement. Si nécessaire, passez en revue les paramètres LACP et MAC de votre système d'exploitation pour vous aligner sur cette mise à jour. Des informations supplémentaires sont disponibles dans cette documentation.", "server_ola_alert_configuration_needed_link": "En savoir plus", "server_ola_new_tab": "(S'ouvre dans un nouvel onglet)", "server_ola": "OVHcloud Link Aggregation", diff --git a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_it_IT.json b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_it_IT.json index 98f54bd28965..e01641125f2b 100644 --- a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_it_IT.json +++ b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_it_IT.json @@ -12,5 +12,6 @@ "server_ola_reset": "Rimuovi la configurazione dell’aggregazione privata", "server_ola_terminate": "Disattiva OLA", "server_ola_mode_vrack_aggregation": "Aggregazione privata", - "server_ola_mode_default": "Predefinito" + "server_ola_mode_default": "Predefinito", + "server_ola_alert_new_lacp_rule": "OVHcloud introduce un aggiornamento del modello di aggregazione LACP a partire dal 25 novembre 2025. Il passaggio alla modalità OLA o viceversa, o la riconfigurazione dell'aggregazione, applicherà il nuovo comportamento. Se necessario, rivedere i parametri LACP e MAC del proprio sistema operativo per allinearsi a questo aggiornamento. Ulteriori informazioni sono disponibili in questa documentazione." } diff --git a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_pl_PL.json b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_pl_PL.json index 3a6a48e45d99..3274738c21ee 100644 --- a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_pl_PL.json +++ b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_pl_PL.json @@ -12,5 +12,6 @@ "server_ola_reset": "Wyłącz agregację prywatną", "server_ola_terminate": "Rezygnuj z OLA", "server_ola_mode_vrack_aggregation": "Agregacja prywatna", - "server_ola_mode_default": "Domyślnie" + "server_ola_mode_default": "Domyślnie", + "server_ola_alert_new_lacp_rule": "OVHcloud wprowadza aktualizację modelu agregacji LACP od 25 listopada 2025 roku. Przejście w tryb OLA lub odwrotnie, lub rekonfiguracja agregacji, zastosuje nowe zachowanie. W razie potrzeby sprawdź ustawienia LACP i MAC w swoim systemie operacyjnym, aby dostosować się do tej aktualizacji. Dodatkowe informacje są dostępne w tej dokumentacji." } diff --git a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_pt_PT.json b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_pt_PT.json index 133f0732e51d..349f4495feb2 100644 --- a/packages/manager/modules/bm-server-components/src/ola/translations/Messages_pt_PT.json +++ b/packages/manager/modules/bm-server-components/src/ola/translations/Messages_pt_PT.json @@ -12,5 +12,6 @@ "server_ola_reset": "Remover a configuração da agregação privada", "server_ola_terminate": "Rescindir a opção OLA", "server_ola_mode_vrack_aggregation": "Agregação privada", - "server_ola_mode_default": "Defeito" + "server_ola_mode_default": "Defeito", + "server_ola_alert_new_lacp_rule": "A OVHcloud introduz uma atualização do modelo de agregação LACP a partir de 25 de novembro de 2025. A mudança para o modo OLA ou vice-versa, ou a reconfiguração da agregação, aplicará o novo comportamento. Se necessário, revise os parâmetros LACP e MAC do seu sistema operativo para se alinhar a esta atualização. Informações adicionais estão disponíveis nesta documentação." } diff --git a/packages/manager/modules/netapp/src/dashboard/constants.js b/packages/manager/modules/netapp/src/dashboard/constants.js index 19f465a6d1b9..9389408564b0 100644 --- a/packages/manager/modules/netapp/src/dashboard/constants.js +++ b/packages/manager/modules/netapp/src/dashboard/constants.js @@ -51,57 +51,62 @@ export const POLLING_TYPE = { export const FETCH_INTERVAL = 5000; +const getVrackOrderUrl = (host) => + `https://${host}/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))`; + export const VRACK_ORDER_URLS = { - CZ: - "https://www.ovh.cz/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - DE: - "https://www.ovh.de/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - ES: - "https://www.ovh.es/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - FI: - "https://www.ovh-hosting.fi/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - FR: - "https://www.ovh.com/fr/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - GB: - "https://www.ovh.co.uk/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - IE: - "https://www.ovh.ie/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - IT: - "https://www.ovh.it/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - LT: - "https://www.ovh.lt/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - MA: - "https://www.ovh.ma/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - NL: - "https://www.ovh.nl/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - PL: - "https://www.ovh.pl/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - PT: - "https://www.ovh.pt/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - SN: - "https://www.ovh.sn/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - TN: - "https://www.ovh.com/tn/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - US: - "https://us.ovhcloud.com/order/express/#/express/review?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - ASIA: - "https://ca.ovh.com/asia/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - IN: - "https://ca.ovh.com/in/order/express/#/express/review?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - AU: - "https://ca.ovh.com/au/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - CA: - "https://ca.ovh.com/en/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - QC: - "https://ca.ovh.com/fr/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - SG: - "https://ca.ovh.com/sg/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - WE: - "https://us.ovh.com/us/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - WS: - "https://us.ovh.com/es/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", - DEFAULT: - "https://www.ovh.ie/order/express/#/new/express/resume?products=~(~(planCode~'vrack~quantity~1~productId~'vrack))", + CZ: getVrackOrderUrl('www.ovh.cz'), + DE: getVrackOrderUrl('www.ovh.de'), + ES: getVrackOrderUrl('www.ovh.es'), + FI: getVrackOrderUrl('www.ovh-hosting.fi'), + FR: getVrackOrderUrl('www.ovh.com/fr'), + GB: getVrackOrderUrl('www.ovh.co.uk'), + IE: getVrackOrderUrl('www.ovh.ie'), + IT: getVrackOrderUrl('www.ovh.it'), + LT: getVrackOrderUrl('www.ovh.lt'), + MA: getVrackOrderUrl('www.ovh.ma'), + NL: getVrackOrderUrl('www.ovh.nl'), + PL: getVrackOrderUrl('www.ovh.pl'), + PT: getVrackOrderUrl('www.ovh.pt'), + SN: getVrackOrderUrl('www.ovh.sn'), + TN: getVrackOrderUrl('www.ovh.com/tn'), + US: getVrackOrderUrl('us.ovhcloud.com'), + ASIA: getVrackOrderUrl('ca.ovh.com/asia'), + IN: getVrackOrderUrl('ca.ovh.com/in'), + AU: getVrackOrderUrl('ca.ovh.com/au'), + CA: getVrackOrderUrl('ca.ovh.com/en'), + QC: getVrackOrderUrl('ca.ovh.com/fr'), + SG: getVrackOrderUrl('ca.ovh.com/sg'), + WE: getVrackOrderUrl('us.ovh.com/us'), + WS: getVrackOrderUrl('us.ovh.com/es'), + DEFAULT: getVrackOrderUrl('www.ovh.ie'), +}; + +const getGuideLink = (language, article) => + `https://help.ovhcloud.com/csm/${language}-public-cloud-storage-netapp-network-configuration?id=kb_article_view&sysparm_article=${article}`; + +export const CONFIGURATION_GUIDE_LINKS = { + DE: getGuideLink('de', 'KB0062694'), + ES: getGuideLink('es-es', 'KB0062712'), + FR: getGuideLink('fr', 'KB0062718'), + IE: getGuideLink('en-ie', 'KB0062719'), + IT: getGuideLink('it', 'KB0062713'), + NL: getGuideLink('en-ie', 'KB0062719'), + PL: getGuideLink('pl', 'KB0062723'), + PT: getGuideLink('pt', 'KB0062717'), + GB: getGuideLink('en-gb', 'KB0062711'), + CA: getGuideLink('en-ca', 'KB0062716'), + QC: getGuideLink('fr-ca', 'KB0062721'), + MA: getGuideLink('fr', 'KB0062718'), + SN: getGuideLink('fr', 'KB0062718'), + TN: getGuideLink('fr', 'KB0062718'), + AU: getGuideLink('en-au', 'KB0062710'), + IN: getGuideLink('en-in', 'KB0069629'), + SG: getGuideLink('en-sg', 'KB0062714'), + ASIA: getGuideLink('en-in', 'KB0069629'), + WE: getGuideLink('en-ie', 'KB0062719'), + WS: getGuideLink('en-ie', 'KB0062719'), + DEFAULT: getGuideLink('en-ie', 'KB0062719'), }; export const LABELS = { @@ -123,6 +128,8 @@ export const SNAPSHOT_TYPE = { export const CUSTOM_SELECTION = 'Custom'; +export const ACTIVES_NFS_LIMITE = 5; + export default { MINIMUM_VOLUME_SIZE, COMMIT_IMPRESSION_TRACKING_DATA, diff --git a/packages/manager/modules/netapp/src/dashboard/controller.js b/packages/manager/modules/netapp/src/dashboard/controller.js index 1711fb99ffa3..117633fd3852 100644 --- a/packages/manager/modules/netapp/src/dashboard/controller.js +++ b/packages/manager/modules/netapp/src/dashboard/controller.js @@ -1,5 +1,6 @@ export default class NetappDashboardCtrl { - /* @ngInject */ constructor(constants) { + /* @ngInject */ constructor(constants, NetAppDashboardService) { + this.GUIDE_LINKS = NetAppDashboardService.GUIDES_LINKS; this.constants = constants; } } diff --git a/packages/manager/modules/netapp/src/dashboard/index/controller.js b/packages/manager/modules/netapp/src/dashboard/index/controller.js index 6826052d4d0c..74cac9f1c46b 100644 --- a/packages/manager/modules/netapp/src/dashboard/index/controller.js +++ b/packages/manager/modules/netapp/src/dashboard/index/controller.js @@ -23,6 +23,8 @@ export default class OvhManagerNetAppDashboardIndexCtrl { this.SERVICE_TYPE = SERVICE_TYPE; this.NETAPP_NAME_PATTERN = NETAPP_NAME_PATTERN; this.LABELS = LABELS; + // eslint-disable-next-line prefer-destructuring + this.CONFIGURATION_GUIDE_LINK = NetAppDashboardService.GUIDES_LINKS[0]; } $onInit() { diff --git a/packages/manager/modules/netapp/src/dashboard/index/template.html b/packages/manager/modules/netapp/src/dashboard/index/template.html index bd06681a0171..11537f1eaa31 100644 --- a/packages/manager/modules/netapp/src/dashboard/index/template.html +++ b/packages/manager/modules/netapp/src/dashboard/index/template.html @@ -65,6 +65,17 @@ }" data-translate="{{ 'netapp_dashboard_network_configuration_status_' + $ctrl.networkInformations.status }}" > + + + { + const getMetrics = (query) => + this.$http.get(`${endpoint}/prometheus/api/v1/query?query=${query}`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + return this.$q + .all([ + getMetrics(getMaxFilesQuery(serviceName, volumeId)), + getMetrics(getUsedFilesQuery(serviceName, volumeId)), + getMetrics(getActivesNFSQuery(serviceName, volumeId)), + ]) + .then((results) => + results.map( + ({ + data: { + data: { result }, + }, + }) => result, + ), + ) + .then(([maxFiles, usedFiles, activesNFS = []]) => { + const parseValue = ([metric]) => { + const val = metric?.value?.[1]; + return val ? parseInt(val, 10).toLocaleString() : '0'; + }; + + this.activesNFS = activesNFS.map( + ({ + metric: { client_ip: clientIp, protocol }, + value: minutes, + }) => { + const language = this.coreConfig + .getUserLocale() + .replace('_', '-'); + const lastConnection = new Intl.DateTimeFormat(language, { + dateStyle: 'short', + timeStyle: 'short', + }) + .format(new Date() - minutes[1] * 1000) + .replace(' ', ' - '); + + return { + clientIp, + protocol, + lastConnection, + }; + }, + ); + + return { + maxFiles: parseValue(maxFiles), + usedFiles: parseValue(usedFiles), + activesNFSLimite: ACTIVES_NFS_LIMITE, + activesNFS: this.activesNFS, + }; + }) + .catch(() => ({ + maxFiles: '0', + usedFiles: '0', + activesNFSLimite: ACTIVES_NFS_LIMITE, + activesNFS: [], + })); + }); + } } diff --git a/packages/manager/modules/netapp/src/dashboard/template.html b/packages/manager/modules/netapp/src/dashboard/template.html index d3163aeb0779..d9db0db428b6 100644 --- a/packages/manager/modules/netapp/src/dashboard/template.html +++ b/packages/manager/modules/netapp/src/dashboard/template.html @@ -6,10 +6,23 @@ class="oui-header__title" data-translate="{{:: $ctrl.storage.name }}" > - +
+ + + + + + +
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 72a8ca4e2216..ccdbd4a5f61f 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 @@ -2,5 +2,7 @@ "netapp_dashboard_general_information": "Allgemeine Informationen", "netapp_dashboard_volumes": "Volumes", "netapp_dashboard_snapshot_policies": "Regeln für Snapshots", - "netapp_dashboard_global_error": "Der folgende Fehler ist aufgetreten:
{{message}}
request_id: {{requestId}}" + "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" } 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 a7313672a283..286ee2caaaef 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 @@ -2,5 +2,7 @@ "netapp_dashboard_general_information": "General information", "netapp_dashboard_volumes": "Volumes", "netapp_dashboard_snapshot_policies": "Snapshot policies", - "netapp_dashboard_global_error": "The following error has occurred:
{{message}}
request_id: {{requestId}}" + "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" } 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 8f900661c5a5..e7b7d0ef20d7 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 @@ -2,5 +2,7 @@ "netapp_dashboard_general_information": "Información general", "netapp_dashboard_volumes": "Volúmenes", "netapp_dashboard_snapshot_policies": "Políticas de snapshots", - "netapp_dashboard_global_error": "Ha ocurrido el siguiente error:
{{message}}
request_id: {{requestId}}" + "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" } 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 473f56add25c..0571c45675dc 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 @@ -2,5 +2,7 @@ "netapp_dashboard_general_information": "Informations générales", "netapp_dashboard_volumes": "Volumes", "netapp_dashboard_snapshot_policies": "Snapshot policies", - "netapp_dashboard_global_error": "L'erreur suivante est survenue :
{{message}}
request_id: {{requestId}}" + "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é" } 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 473f56add25c..0571c45675dc 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 @@ -2,5 +2,7 @@ "netapp_dashboard_general_information": "Informations générales", "netapp_dashboard_volumes": "Volumes", "netapp_dashboard_snapshot_policies": "Snapshot policies", - "netapp_dashboard_global_error": "L'erreur suivante est survenue :
{{message}}
request_id: {{requestId}}" + "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é" } 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 c28e0bb0d242..03cbf2e5a627 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 @@ -2,5 +2,7 @@ "netapp_dashboard_general_information": "Informazioni generali", "netapp_dashboard_volumes": "Volumi", "netapp_dashboard_snapshot_policies": "Politiche di Snapshot", - "netapp_dashboard_global_error": "Si è verificato il seguente errore:
{{message}}
request_id: {{requestId}}" + "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" } 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 0bc23a803716..d3bef6c9b143 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 @@ -2,5 +2,7 @@ "netapp_dashboard_general_information": "Informacje ogólne", "netapp_dashboard_volumes": "Wolumeny", "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_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" } 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 c2e1cacded49..3befc56d3745 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 @@ -2,5 +2,7 @@ "netapp_dashboard_general_information": "Informações gerais", "netapp_dashboard_volumes": "Volumes", "netapp_dashboard_snapshot_policies": "Políticas de snapshots", - "netapp_dashboard_global_error": "Ocorreu o seguinte erro:
{{message}}
request_id: {{requestId}}" + "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" } diff --git a/packages/manager/modules/netapp/src/dashboard/utils.js b/packages/manager/modules/netapp/src/dashboard/utils.js new file mode 100644 index 000000000000..fbee830598ac --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/utils.js @@ -0,0 +1,9 @@ +export const getMaxFilesQuery = (serviceName, volumeId) => + // eslint-disable-next-line no-useless-escape + `\{__name__=~"volume_inode_files_total",service_id="${serviceName}",share_id="${volumeId}"\}`; +export const getUsedFilesQuery = (serviceName, volumeId) => + // eslint-disable-next-line no-useless-escape + `\{__name__=~"volume_inode_files_used",service_id="${serviceName}",share_id="${volumeId}"\}`; +export const getActivesNFSQuery = (serviceName, volumeId) => + // eslint-disable-next-line no-useless-escape + `\{__name__=~"nfs_clients_idle_duration",service_id="${serviceName}",share_id="${volumeId}"\}`; diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/acl/module.js b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/acl/module.js index a0c31b3ecf55..99b2f83e6eac 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/acl/module.js +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/acl/module.js @@ -23,7 +23,7 @@ angular 'ui.router', ]) .config(routing) - .component('ovhManagerNetAppVolumesDashboardAcl', component) + .component(moduleName, component) .run(/* @ngTranslationsInject:json ./translations */); export default moduleName; diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/component.js b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/component.js new file mode 100644 index 000000000000..9cf0090db421 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/component.js @@ -0,0 +1,10 @@ +import controller from './controller'; +import template from './template.html'; + +export default { + bindings: { + activesNFS: '<', + }, + controller, + template, +}; diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/controller.js b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/controller.js new file mode 100644 index 000000000000..61f073e0275d --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/controller.js @@ -0,0 +1,11 @@ +export default class NetAppVolumesDashboardAclController { + /* @ngInject */ + constructor($translate) { + this.$translate = $translate; + this.tableHeaders = [ + 'netapp_volumes_dashboard_actives_nfs_ip', + 'netapp_volumes_dashboard_actives_nfs_version', + 'netapp_volumes_dashboard_actives_nfs_last_connection', + ]; + } +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/index.js b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/index.js new file mode 100644 index 000000000000..a7697c0dd379 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/index.js @@ -0,0 +1,22 @@ +import angular from 'angular'; +import '@uirouter/angularjs'; +import 'oclazyload'; + +const moduleName = 'ovhManagerNetAppVolumesDashboardActivesNFSLazyLoading'; + +angular.module(moduleName, ['ui.router', 'oc.lazyLoad']).config( + /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.volumes.dashboard.actives-nfs.**', { + url: '/actives-nfs', + 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/dashboard/actives-nfs/module.js b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/module.js new file mode 100644 index 000000000000..f19bdf302f1f --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/module.js @@ -0,0 +1,27 @@ +import angular from 'angular'; +import '@ovh-ux/manager-core'; +import '@ovh-ux/ng-ovh-utils'; +import '@ovh-ux/ng-ui-router-breadcrumb'; +import '@ovh-ux/ui-kit'; +import '@uirouter/angularjs'; +import 'angular-translate'; + +import component from './component'; +import routing from './routing'; + +const moduleName = 'ovhManagerNetAppVolumesDashboardActivesNFS'; + +angular + .module(moduleName, [ + 'ngUiRouterBreadcrumb', + '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/dashboard/actives-nfs/routing.js b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/routing.js new file mode 100644 index 000000000000..5b367664dc98 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/routing.js @@ -0,0 +1,12 @@ +export default /* @ngInject */ ($stateProvider) => { + $stateProvider.state('netapp.dashboard.volumes.dashboard.actives-nfs', { + url: '/actives-nfs', + component: 'ovhManagerNetAppVolumesDashboardActivesNFS', + resolve: { + breadcrumb: /* @ngInject */ ($translate) => + $translate.instant('netapp_volumes_dashboard_actives_nfs_breadcrumb'), + activesNFS: /* @ngInject */ (NetAppDashboardService) => + NetAppDashboardService.activesNFS, + }, + }); +}; diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/template.html b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/template.html new file mode 100644 index 000000000000..5ccbe2a47e8a --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/template.html @@ -0,0 +1,40 @@ +
+

+ + + + + + + + + + + + + +
+ +
+ {{nfs.clientIp}} + + {{nfs.protocol}} + + {{nfs.lastConnection}} +
+ +
diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_de_DE.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_de_DE.json new file mode 100644 index 000000000000..a3d43b325951 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_de_DE.json @@ -0,0 +1,7 @@ +{ + "netapp_volumes_dashboard_actives_nfs_breadcrumb": "NFS", + "netapp_volumes_dashboard_actives_nfs_ip": "IP-Adresse des Clients", + "netapp_volumes_dashboard_actives_nfs_version": "NFS-Version", + "netapp_volumes_dashboard_actives_nfs_last_connection": "Letzte Anmeldung", + "netapp_volumes_dashboard_actives_nfs_description": "Die Liste der kürzlich verbundenen NFS-Clients." +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_en_GB.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_en_GB.json new file mode 100644 index 000000000000..8b7f0c484419 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_en_GB.json @@ -0,0 +1,7 @@ +{ + "netapp_volumes_dashboard_actives_nfs_breadcrumb": "NFS", + "netapp_volumes_dashboard_actives_nfs_ip": "Client IP address", + "netapp_volumes_dashboard_actives_nfs_version": "NFS version", + "netapp_volumes_dashboard_actives_nfs_last_connection": "Last login", + "netapp_volumes_dashboard_actives_nfs_description": "List of recently connected NFS clients." +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_es_ES.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_es_ES.json new file mode 100644 index 000000000000..3d087cad2d43 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_es_ES.json @@ -0,0 +1,7 @@ +{ + "netapp_volumes_dashboard_actives_nfs_breadcrumb": "NFS", + "netapp_volumes_dashboard_actives_nfs_ip": "Dirección IP del cliente", + "netapp_volumes_dashboard_actives_nfs_version": "Versión NFS", + "netapp_volumes_dashboard_actives_nfs_last_connection": "Última conexión", + "netapp_volumes_dashboard_actives_nfs_description": "Lista de clientes NFS conectados recientemente." +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_fr_CA.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_fr_CA.json new file mode 100644 index 000000000000..dbbd2ae0298e --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_fr_CA.json @@ -0,0 +1,7 @@ +{ + "netapp_volumes_dashboard_actives_nfs_breadcrumb": "NFS", + "netapp_volumes_dashboard_actives_nfs_ip": "Addresse IP du client", + "netapp_volumes_dashboard_actives_nfs_version": "Version NFS", + "netapp_volumes_dashboard_actives_nfs_last_connection": "Dernière connexion", + "netapp_volumes_dashboard_actives_nfs_description": "La liste des clients NFS connectés récemment." +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_fr_FR.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_fr_FR.json new file mode 100644 index 000000000000..dbbd2ae0298e --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_fr_FR.json @@ -0,0 +1,7 @@ +{ + "netapp_volumes_dashboard_actives_nfs_breadcrumb": "NFS", + "netapp_volumes_dashboard_actives_nfs_ip": "Addresse IP du client", + "netapp_volumes_dashboard_actives_nfs_version": "Version NFS", + "netapp_volumes_dashboard_actives_nfs_last_connection": "Dernière connexion", + "netapp_volumes_dashboard_actives_nfs_description": "La liste des clients NFS connectés récemment." +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_it_IT.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_it_IT.json new file mode 100644 index 000000000000..ed5e5e2ed491 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_it_IT.json @@ -0,0 +1,7 @@ +{ + "netapp_volumes_dashboard_actives_nfs_breadcrumb": "NFS", + "netapp_volumes_dashboard_actives_nfs_ip": "Indirizzo IP del client", + "netapp_volumes_dashboard_actives_nfs_version": "Versione NFS", + "netapp_volumes_dashboard_actives_nfs_last_connection": "Ultima connessione", + "netapp_volumes_dashboard_actives_nfs_description": "Elenco dei client NFS connessi di recente." +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_pl_PL.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_pl_PL.json new file mode 100644 index 000000000000..ce0f85fb242a --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_pl_PL.json @@ -0,0 +1,7 @@ +{ + "netapp_volumes_dashboard_actives_nfs_breadcrumb": "NFS", + "netapp_volumes_dashboard_actives_nfs_ip": "Adres IP klienta", + "netapp_volumes_dashboard_actives_nfs_version": "Wersja NFS", + "netapp_volumes_dashboard_actives_nfs_last_connection": "Ostatnie połączenie", + "netapp_volumes_dashboard_actives_nfs_description": "Lista klientów NFS połączonych w ostatnim czasie." +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_pt_PT.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_pt_PT.json new file mode 100644 index 000000000000..a52742feef24 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/actives-nfs/translations/Messages_pt_PT.json @@ -0,0 +1,7 @@ +{ + "netapp_volumes_dashboard_actives_nfs_breadcrumb": "NFS", + "netapp_volumes_dashboard_actives_nfs_ip": "Endereço IP do cliente", + "netapp_volumes_dashboard_actives_nfs_version": "Versão NFS", + "netapp_volumes_dashboard_actives_nfs_last_connection": "Última conexão", + "netapp_volumes_dashboard_actives_nfs_description": "A lista dos clientes NFS conectados recentemente." +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/component.js b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/component.js index c4146c9795e5..b7bdef89fd04 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/component.js +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/component.js @@ -8,12 +8,14 @@ export default { volumeDashboardLink: '<', volumeDashboardAclLink: '<', volumeDashboardSnapshotsLink: '<', + volumeDashboardActivesNFSLink: '<', volume: '<', updateVolume: '<', goToVolumeDashboard: '<', goToEditVolumeSize: '<', goToEditVolumeReserveSpace: '<', volumeReserveSpacePercentage: '<', + volumeUsages: '<', }, controller, template, diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/module.js b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/module.js index d755d09ab6d6..0dcd4451ac95 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/module.js +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/module.js @@ -12,6 +12,9 @@ import aclModule from './acl'; import snapshotsModule from './snapshots'; import editSize from './edit-size'; import editReserveSpace from './edit-reserve-space'; +import activesNFSModule from './actives-nfs'; + +import './style.less'; const moduleName = 'ovhManagerNetAppVolumesDashboard'; @@ -25,6 +28,7 @@ angular snapshotsModule, editSize, editReserveSpace, + activesNFSModule, ]) .config(routing) .component('ovhManagerNetAppVolumesDashboard', component) diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/routing.js b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/routing.js index b64b267293c8..97fe4ac0e3b1 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/routing.js +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/routing.js @@ -60,6 +60,11 @@ export default /* @ngInject */ ($stateProvider) => { 'netapp.dashboard.volumes.dashboard.snapshots', $transition$.params(), ), + volumeDashboardActivesNFSLink: /* @ngInject */ ($state, $transition$) => + $state.href( + 'netapp.dashboard.volumes.dashboard.actives-nfs', + $transition$.params(), + ), accessPath: /* @ngInject */ ($http, serviceName, volumeId) => $http .get(`/storage/netapp/${serviceName}/share/${volumeId}/accessPath`) @@ -68,7 +73,7 @@ export default /* @ngInject */ ($stateProvider) => { accessPaths?.find(({ preferred }) => !!preferred), ) .catch(() => null), - updateVolume: /* @ngInject */ ($http, $translate, serviceName) => ({ + updateVolume: /* @ngInject */ ($http, serviceName) => ({ name, id, description, @@ -110,6 +115,13 @@ export default /* @ngInject */ ($stateProvider) => { volumeId, }), breadcrumb: /* @ngInject */ (volumeId) => volumeId, + volumeUsages: /* @ngInject */ ( + NetAppDashboardService, + serviceName, + volumeId, + ) => { + return NetAppDashboardService.getVolumeUsages(serviceName, volumeId); + }, }, }); }; diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/style.less b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/style.less new file mode 100644 index 000000000000..c4a2015a88a7 --- /dev/null +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/style.less @@ -0,0 +1,3 @@ +.list-none { + list-style-type: none; +} diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/template.html b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/template.html index 6f2ed7b773db..4b1f15922ea8 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/template.html +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/template.html @@ -26,6 +26,14 @@ > + + +
@@ -94,7 +102,7 @@ + + + + {{$ctrl.volumeUsages.maxFiles}} + + + + + {{$ctrl.volumeUsages.usedFiles}} + + + + +
    +
  • + {{nfs.clientIp}} +
  • +
+ + + + + +
+
+
diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_de_DE.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_de_DE.json index c4e85fd681aa..7d040e748e36 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_de_DE.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_de_DE.json @@ -33,5 +33,12 @@ "netapp_volumes_dashboard_snapshots": "Snapshots", "netapp_volumes_dashboard_volume_pattern": "Höchstens 256 Zeichen: ausschließlich Zahlen, Buchstaben, Unterstriche, Bindestriche und Punkte.", "netapp_volumes_dashboard_mount_path_not_configurated": "Netzwerkeinstellungen nicht konfiguriert", - "netapp_volumes_dashboard_information_reserve_space": "Snapshot-Reserve" + "netapp_volumes_dashboard_information_reserve_space": "Snapshot-Reserve", + "netapp_volumes_dashboard_usage_title": "Übersicht über die Nutzung", + "netapp_volumes_dashboard_usage_max_files": "Maximale Dateien", + "netapp_volumes_dashboard_usage_files": "Verwendete Dateien", + "netapp_volumes_dashboard_usage_nfs_client": "NFS-Clients (in den letzten 48 Stunden aktiv)", + "netapp_volumes_dashboard_usage_no_nfs_client": "Keine aktiven Verbindungen", + "netapp_volumes_dashboard_usage_view_all": "Alle anzeigen", + "netapp_volumes_dashboard_actives_nfs_title": "NFS-Verbindungen" } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_en_GB.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_en_GB.json index 61803bf90b2b..565376286a46 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_en_GB.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_en_GB.json @@ -33,5 +33,12 @@ "netapp_volumes_dashboard_snapshots": "Snapshots", "netapp_volumes_dashboard_volume_pattern": "May only contain numbers, letters, underscores, dashes or full stops, and a maximum of 256 characters.", "netapp_volumes_dashboard_mount_path_not_configurated": "Network settings not configured", - "netapp_volumes_dashboard_information_reserve_space": "Snapshot reserve" + "netapp_volumes_dashboard_information_reserve_space": "Snapshot reserve", + "netapp_volumes_dashboard_usage_title": "Usage overview", + "netapp_volumes_dashboard_usage_max_files": "Maximum files", + "netapp_volumes_dashboard_usage_files": "Files used", + "netapp_volumes_dashboard_usage_nfs_client": "NFS clients (active in the last 48 hours)", + "netapp_volumes_dashboard_usage_no_nfs_client": "No active connections", + "netapp_volumes_dashboard_usage_view_all": "See all", + "netapp_volumes_dashboard_actives_nfs_title": "NFS Connections" } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_es_ES.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_es_ES.json index 10e7bb6634b6..6f3bd9480db3 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_es_ES.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_es_ES.json @@ -33,5 +33,12 @@ "netapp_volumes_dashboard_snapshots": "Snapshots", "netapp_volumes_dashboard_volume_pattern": "Solo debe contener números, letras, guiones, guiones bajos o puntos, y un máximo de 256 caracteres.", "netapp_volumes_dashboard_mount_path_not_configurated": "No se han configurado las opciones de red", - "netapp_volumes_dashboard_information_reserve_space": "Reserva de snapshots" + "netapp_volumes_dashboard_information_reserve_space": "Reserva de snapshots", + "netapp_volumes_dashboard_usage_title": "Visión general de uso", + "netapp_volumes_dashboard_usage_max_files": "Número máximo de archivos", + "netapp_volumes_dashboard_usage_files": "Archivos utilizados", + "netapp_volumes_dashboard_usage_nfs_client": "Clientes NFS (activos en las últimas 48 horas)", + "netapp_volumes_dashboard_usage_no_nfs_client": "No hay conexiones activas", + "netapp_volumes_dashboard_usage_view_all": "Ver todos", + "netapp_volumes_dashboard_actives_nfs_title": "Conexiones NFS" } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_fr_CA.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_fr_CA.json index cb00d9b23d00..3816456b10a2 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_fr_CA.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_fr_CA.json @@ -33,5 +33,12 @@ "netapp_volumes_dashboard_acl": "Contrôle d'accès (ACL)", "netapp_volumes_dashboard_snapshots": "Snapshots", "netapp_volumes_dashboard_volume_pattern": "Doit uniquement contenir des nombres, lettres, underscores, tirets ou points et un maximum de 256 caractères.", - "netapp_volumes_dashboard_mount_path_not_configurated": "Paramètres réseaux non configurés" + "netapp_volumes_dashboard_mount_path_not_configurated": "Paramètres réseaux non configurés", + "netapp_volumes_dashboard_usage_title": "Vue d'ensemble de l'utilisation", + "netapp_volumes_dashboard_usage_max_files": "Fichiers maximum", + "netapp_volumes_dashboard_usage_files": "Fichiers utilisés", + "netapp_volumes_dashboard_usage_nfs_client": "Clients NFS (actifs dans les 48 dernières heures)", + "netapp_volumes_dashboard_usage_no_nfs_client": "Pas de connections actives", + "netapp_volumes_dashboard_usage_view_all": "Voir tous", + "netapp_volumes_dashboard_actives_nfs_title": "Connexions NFS" } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_fr_FR.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_fr_FR.json index cb00d9b23d00..3816456b10a2 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_fr_FR.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_fr_FR.json @@ -33,5 +33,12 @@ "netapp_volumes_dashboard_acl": "Contrôle d'accès (ACL)", "netapp_volumes_dashboard_snapshots": "Snapshots", "netapp_volumes_dashboard_volume_pattern": "Doit uniquement contenir des nombres, lettres, underscores, tirets ou points et un maximum de 256 caractères.", - "netapp_volumes_dashboard_mount_path_not_configurated": "Paramètres réseaux non configurés" + "netapp_volumes_dashboard_mount_path_not_configurated": "Paramètres réseaux non configurés", + "netapp_volumes_dashboard_usage_title": "Vue d'ensemble de l'utilisation", + "netapp_volumes_dashboard_usage_max_files": "Fichiers maximum", + "netapp_volumes_dashboard_usage_files": "Fichiers utilisés", + "netapp_volumes_dashboard_usage_nfs_client": "Clients NFS (actifs dans les 48 dernières heures)", + "netapp_volumes_dashboard_usage_no_nfs_client": "Pas de connections actives", + "netapp_volumes_dashboard_usage_view_all": "Voir tous", + "netapp_volumes_dashboard_actives_nfs_title": "Connexions NFS" } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_it_IT.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_it_IT.json index 2efbeff489ba..232756aee13f 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_it_IT.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_it_IT.json @@ -33,5 +33,12 @@ "netapp_volumes_dashboard_snapshots": "Snapshot", "netapp_volumes_dashboard_volume_pattern": "Deve contenere esclusivamente numeri, lettere, underscore, trattini o punti ed essere composta da un massimo di 256 caratteri.", "netapp_volumes_dashboard_mount_path_not_configurated": "Impostazioni di rete non configurate", - "netapp_volumes_dashboard_information_reserve_space": "Riserva degli Snapshot" + "netapp_volumes_dashboard_information_reserve_space": "Riserva degli Snapshot", + "netapp_volumes_dashboard_usage_title": "Visualizzazione generale dell'utilizzo", + "netapp_volumes_dashboard_usage_max_files": "Numero massimo di file", + "netapp_volumes_dashboard_usage_files": "File utilizzati", + "netapp_volumes_dashboard_usage_nfs_client": "Client NFS (attivi nelle ultime 48 ore)", + "netapp_volumes_dashboard_usage_no_nfs_client": "Nessuna connessione attiva", + "netapp_volumes_dashboard_usage_view_all": "Visualizza tutto", + "netapp_volumes_dashboard_actives_nfs_title": "Connessioni NFS" } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_pl_PL.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_pl_PL.json index 20f041322b9e..6de937fc5d41 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_pl_PL.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_pl_PL.json @@ -33,5 +33,12 @@ "netapp_volumes_dashboard_snapshots": "Snapshoty", "netapp_volumes_dashboard_volume_pattern": "Może zawierać jedynie cyfry, litery, podkreślenia, myślniki lub kropki i maksymalnie 256 znaków.", "netapp_volumes_dashboard_mount_path_not_configurated": "Nie skonfigurowano ustawień sieci", - "netapp_volumes_dashboard_information_reserve_space": "Przestrzeń dyskowa przeznaczona na snapshoty" + "netapp_volumes_dashboard_information_reserve_space": "Przestrzeń dyskowa przeznaczona na snapshoty", + "netapp_volumes_dashboard_usage_title": "Podsumowanie wykorzystania", + "netapp_volumes_dashboard_usage_max_files": "Maksymalna liczba plików", + "netapp_volumes_dashboard_usage_files": "Używane pliki", + "netapp_volumes_dashboard_usage_nfs_client": "Klienty NFS (aktywne w ciągu ostatnich 48 godzin)", + "netapp_volumes_dashboard_usage_no_nfs_client": "Brak aktywnych połączeń", + "netapp_volumes_dashboard_usage_view_all": "Pokaż wszystkie", + "netapp_volumes_dashboard_actives_nfs_title": "Połączenia NFS" } diff --git a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_pt_PT.json b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_pt_PT.json index b0a1d4f04395..5f51df77defa 100644 --- a/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_pt_PT.json +++ b/packages/manager/modules/netapp/src/dashboard/volumes/dashboard/translations/Messages_pt_PT.json @@ -33,5 +33,12 @@ "netapp_volumes_dashboard_snapshots": "Snapshots", "netapp_volumes_dashboard_volume_pattern": "Deve conter apenas números, letras, underscores, traços ou pontos e um máximo de 256 caracteres.", "netapp_volumes_dashboard_mount_path_not_configurated": "Definições de rede não configuradas", - "netapp_volumes_dashboard_information_reserve_space": "Reserva das snapshots" + "netapp_volumes_dashboard_information_reserve_space": "Reserva das snapshots", + "netapp_volumes_dashboard_usage_title": "Visão geral da utilização", + "netapp_volumes_dashboard_usage_max_files": "Ficheiros máximos", + "netapp_volumes_dashboard_usage_files": "Ficheiros utilizados", + "netapp_volumes_dashboard_usage_nfs_client": "Clientes NFS (ativos nas últimas 48 horas)", + "netapp_volumes_dashboard_usage_no_nfs_client": "Sem ligações ativas", + "netapp_volumes_dashboard_usage_view_all": "Consultar todos", + "netapp_volumes_dashboard_actives_nfs_title": "Conexões NFS" } diff --git a/packages/manager/modules/netapp/src/routing.js b/packages/manager/modules/netapp/src/routing.js index 316863da2a7c..d299ae03610f 100644 --- a/packages/manager/modules/netapp/src/routing.js +++ b/packages/manager/modules/netapp/src/routing.js @@ -49,6 +49,7 @@ export default /* @ngInject */ ($stateProvider) => { hidden: false, property: 'id', serviceLink: true, + typeOptions: { operators: ['is', 'isNot'] }, }, { label: $translate.instant(`netapp_list_columns_header_name`), @@ -57,7 +58,7 @@ export default /* @ngInject */ ($stateProvider) => { { label: $translate.instant(`netapp_list_columns_header_status`), property: 'status', - format: (value) => value.status, + format: (value) => value.status || value, map: (row) => { switch (row.status) { case 'creating': @@ -97,7 +98,7 @@ export default /* @ngInject */ ($stateProvider) => { ], }), dataModel: () => 'storage.NetAppService', - defaultFilterColumn: () => 'id', + defaultFilterColumn: () => 'name', header: () => 'Enterprise File Storage', changelog: () => 'file_storage', customizableColumns: () => true,