From b1ce4f969fba27419837c8f0ed44c12187fb7be7 Mon Sep 17 00:00:00 2001 From: Phillip Bailey Date: Thu, 24 Sep 2026 16:15:36 -0400 Subject: [PATCH] Add network topology view --- .../en/plugin__networking-console-plugin.json | 1 + .../es/plugin__networking-console-plugin.json | 945 +++++++++--------- .../fr/plugin__networking-console-plugin.json | 939 ++++++++--------- .../ja/plugin__networking-console-plugin.json | 928 +++++++++-------- .../ko/plugin__networking-console-plugin.json | 938 +++++++++-------- .../zh/plugin__networking-console-plugin.json | 940 +++++++++-------- package-lock.json | 702 ++++++++++++- package.json | 1 + plugin-manifest.ts | 3 + src/utils/resources/pods/constants.ts | 2 + src/utils/resources/udns/constants.ts | 3 + src/utils/resources/udns/helper.ts | 63 +- src/utils/resources/vm/constants.ts | 31 + src/utils/resources/vm/utils.ts | 54 +- .../routes/list/components/RouteStatus.tsx | 4 +- .../routes/list/hooks/useRouteFilters.ts | 6 +- src/views/routes/list/utils/utils.ts | 6 +- .../details/tabs/pods/components/PodRow.tsx | 11 +- .../tabs/pods/components/PodStatus.tsx | 4 +- .../services/details/tabs/pods/constants.ts | 12 + .../details/tabs/pods/hooks/usePodColumns.tsx | 4 +- src/views/services/details/tabs/pods/utils.ts | 4 +- src/views/topology/TopologyPage.scss | 21 + src/views/topology/TopologyPage.tsx | 49 + .../components/CustomGroup/CustomGroup.scss | 10 + .../components/CustomGroup/CustomGroup.tsx | 25 + .../components/CustomNode/CustomNode.scss | 19 + .../components/CustomNode/CustomNode.tsx | 59 ++ src/views/topology/components/Topology.tsx | 69 ++ .../components/TopologyControlBar.tsx | 43 + .../topology/context/TopologyContext.tsx | 32 + .../hooks/useNetworkTopologyResources.ts | 122 +++ src/views/topology/manifest.ts | 36 + src/views/topology/utils/LevelsLayout.ts | 209 ++++ src/views/topology/utils/constants.ts | 48 + .../dataTransformation/dataTransformation.ts | 191 ++++ .../utils/dataTransformation/resourceUtils.ts | 226 +++++ src/views/topology/utils/factories.ts | 39 + src/views/topology/utils/filteringUtils.ts | 99 ++ src/views/topology/utils/nodePositionUtils.ts | 44 + .../useUDNVirtualMachines.ts | 4 +- .../useUDNVirtualMachines/utils/utils.ts | 8 - 42 files changed, 4565 insertions(+), 2389 deletions(-) create mode 100644 src/utils/resources/pods/constants.ts create mode 100644 src/views/topology/TopologyPage.scss create mode 100644 src/views/topology/TopologyPage.tsx create mode 100644 src/views/topology/components/CustomGroup/CustomGroup.scss create mode 100644 src/views/topology/components/CustomGroup/CustomGroup.tsx create mode 100644 src/views/topology/components/CustomNode/CustomNode.scss create mode 100644 src/views/topology/components/CustomNode/CustomNode.tsx create mode 100644 src/views/topology/components/Topology.tsx create mode 100644 src/views/topology/components/TopologyControlBar.tsx create mode 100644 src/views/topology/context/TopologyContext.tsx create mode 100644 src/views/topology/hooks/useNetworkTopologyResources.ts create mode 100644 src/views/topology/manifest.ts create mode 100644 src/views/topology/utils/LevelsLayout.ts create mode 100644 src/views/topology/utils/constants.ts create mode 100644 src/views/topology/utils/dataTransformation/dataTransformation.ts create mode 100644 src/views/topology/utils/dataTransformation/resourceUtils.ts create mode 100644 src/views/topology/utils/factories.ts create mode 100644 src/views/topology/utils/filteringUtils.ts create mode 100644 src/views/topology/utils/nodePositionUtils.ts diff --git a/locales/en/plugin__networking-console-plugin.json b/locales/en/plugin__networking-console-plugin.json index 18e2c041..09e35b7c 100644 --- a/locales/en/plugin__networking-console-plugin.json +++ b/locales/en/plugin__networking-console-plugin.json @@ -491,6 +491,7 @@ "View logs": "View logs", "View naming information": "View naming information", "Virtual Machines": "Virtual Machines", + "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.": "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.", "VLAN": "VLAN", "VLAN tag number": "VLAN tag number", "Weight": "Weight", diff --git a/locales/es/plugin__networking-console-plugin.json b/locales/es/plugin__networking-console-plugin.json index 57aec8b3..38a87efc 100644 --- a/locales/es/plugin__networking-console-plugin.json +++ b/locales/es/plugin__networking-console-plugin.json @@ -1,509 +1,510 @@ { - " See more details in: <3>": " Ver más detalles en: <3>", - " See more details in: <3>.": " Ver más detalles en: <3>.", - "(all nodes): ": "(todos los nodos): ", - "{{count}} annotation_one": "{{count}} anotación", + " See more details in: <3>": " See more details in: <3>", + " See more details in: <3>.": " See more details in: <3>.", + "(all nodes): ": "(all nodes): ", + "{{count}} annotation_one": "{{count}} annotation", "{{count}} annotation_many": "{{count}} annotation", - "{{count}} annotation_other": "{{count}} anotaciones", - "{{kind}} details": "Detalles de {{kind}}", - "{{kind}} disabled": "{{kind}} desactivado", - "{{numCores}} cores": "{{numCores}} núcleos", - "{{path}} found in resource, but is not supported in form.": "{{path}} se encuentra en el recurso, pero no se admite en el formulario.", - "{{path}} is missing.": "Falta {{path}}.", - "{{path}} should be an Array.": "{{path}} debería ser una matriz.", - "{{path}} should not be empty.": "{{path}} no debe estar vacío.", - "{{value}} at {{date}}": "{{value}} en {{date}}", - "+{{count}} more_one": "+{{count}} más_uno", + "{{count}} annotation_other": "{{count}} annotation", + "{{kind}} details": "{{kind}} details", + "{{kind}} disabled": "{{kind}} disabled", + "{{numCores}} cores": "{{numCores}} cores", + "{{path}} found in resource, but is not supported in form.": "{{path}} found in resource, but is not supported in form.", + "{{path}} is missing.": "{{path}} is missing.", + "{{path}} should be an Array.": "{{path}} should be an Array.", + "{{path}} should not be empty.": "{{path}} should not be empty.", + "{{value}} at {{date}}": "{{value}} at {{date}}", + "+{{count}} more_one": "+{{count}} more", "+{{count}} more_many": "+{{count}} more", - "+{{count}} more_other": "+{{count}} más_otro", - "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.": "El <0>Operador de virtualización OpenShift u <3>Operador de red SR-IOV deben instalarse en el clúster para poder elegir el tipo de red.", - "404: Page Not Found": "404: Pagina no encontrada", - "A number between 0 and 255 that depicts relative weight compared with other targets.": "Un número entre 0 y 255 que representa el peso relativo en comparación con otros objetivos.", - "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').": "El nombre del Proyecto debe constar de caracteres alfanuméricos en minúscula o '-', y debe comenzar y terminar con un carácter alfanumérico (por ejemplo, 'mi-nombre' o '123-abc').", - "A unique name for the Route within the project": "Un nombre único para la Ruta dentro del proyecto.", - "Accessible outside the cluster": "Accesible fuera del clúster", - "Accessible within the cluster only": "Accesible solo dentro del clúster", - "Actions": "Acciones", - "Adapter model": "Modelo de adaptador", - "Add": "Agregar", - "Add allowed destination": "Agregar destino permitido", - "Add allowed source": "Agregar fuente permitida", - "Add alternate Service": "Agregar servicio alternativo", - "Add egress rule": "Agregar regla de salida", - "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.": "Agregue reglas de salida para aplicarlas a los pods seleccionados. Se permite el tráfico a los pods si coincide con al menos una regla.", - "Add exception": "Agregar excepción", - "Add expression": "Agregar expresión", - "Add ingress rule": "Agregar regla de ingreso", - "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.": "Agregue reglas de ingreso que se aplicarán a los pods seleccionados. Se permite el tráfico desde pods si coincide con al menos una regla.", - "Add label": "Agregar etiqueta", - "Add namespace selector": "Agregar selector de espacio de nombres", - "Add pod selector": "Agregar selector de pods", - "Add port": "Agregar puerto", - "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.": "Agregue puertos para restringir el tráfico a través de ellos. Si no se proporcionan puertos, su política hará que todos los puertos sean accesibles al tráfico.", - "Add subnet": "Agregar subred", - "Add virtual machines": "Agregar máquinas virtuales", - "All incoming traffic is denied to Pods in {{namespace}}": "Se rechaza todo el tráfico entrante a los Pods en {{namespace}}", - "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.": "Todo el tráfico saliente está permitido de forma predeterminada. Se pueden utilizar reglas de salida para restringir el tráfico saliente si el proveedor de red del clúster lo permite. Cuando se utiliza el proveedor de red del clúster OpenShift SDN, no se admite la política de red de salida.", - "All outgoing traffic is denied from Pods in {{namespace}}": "Se deniega todo el tráfico saliente desde los Pods en {{namespace}}", - "All pods within {{namespace}}": "Todos los pods en {{namespace}}", - "Allow": "Permitir", - "Allow peers by IP block": "Permitir pares por bloque de IP", - "Allow pods from inside the cluster": "Permitir pods desde dentro del clúster", - "Allow pods from the same namespace": "Permitir pods del mismo espacio de nombres", - "Allow traffic from peers by IP block": "Permitir el tráfico desde pares por bloque de IP", - "Allow traffic from pods in the same namespace": "Permitir el tráfico desde pods en el mismo espacio de nombres", - "Allow traffic from pods inside the cluster": "Permitir el tráfico desde pods dentro del clúster", - "Allow traffic to peers by IP block": "Permitir tráfico hacia pares por bloque de IP", - "Allow traffic to pods in the same namespace": "Permitir el tráfico a pods en el mismo espacio de nombres", - "Allow traffic to pods inside the cluster": "Permitir el tráfico a los pods dentro del clúster", - "Alternate Service target": "Objetivo de servicio alternativo", - "Alternate Service to route to.": "Servicio alternativo al que dirigirse.", - "Alternate Service weight": "Peso de servicio alternativo", - "An error occurred.": "Ocurrió un error.", - "An error occurred. Please try again.": "Ocurrió un error. Inténtelo de nuevo.", - "An OpenShift project is an alternative representation of a Kubernetes namespace.": "Un proyecto OpenShift es una representación alternativa de un espacio de nombres de Kubernetes.", - "annotation_one": "anotación", + "+{{count}} more_other": "+{{count}} more", + "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.": "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.", + "404: Page Not Found": "404: Page Not Found", + "A number between 0 and 255 that depicts relative weight compared with other targets.": "A number between 0 and 255 that depicts relative weight compared with other targets.", + "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').": "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').", + "A unique name for the Route within the project": "A unique name for the Route within the project", + "Accessible outside the cluster": "Accessible outside the cluster", + "Accessible within the cluster only": "Accessible within the cluster only", + "Actions": "Actions", + "Adapter model": "Adapter model", + "Add": "Add", + "Add allowed destination": "Add allowed destination", + "Add allowed source": "Add allowed source", + "Add alternate Service": "Add alternate Service", + "Add egress rule": "Add egress rule", + "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.": "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.", + "Add exception": "Add exception", + "Add expression": "Add expression", + "Add ingress rule": "Add ingress rule", + "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.": "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.", + "Add label": "Add label", + "Add namespace selector": "Add namespace selector", + "Add pod selector": "Add pod selector", + "Add port": "Add port", + "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.": "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.", + "Add subnet": "Add subnet", + "Add virtual machines": "Add virtual machines", + "All incoming traffic is denied to Pods in {{namespace}}": "All incoming traffic is denied to Pods in {{namespace}}", + "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.": "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.", + "All outgoing traffic is denied from Pods in {{namespace}}": "All outgoing traffic is denied from Pods in {{namespace}}", + "All pods within {{namespace}}": "All pods within {{namespace}}", + "Allow": "Allow", + "Allow peers by IP block": "Allow peers by IP block", + "Allow pods from inside the cluster": "Allow pods from inside the cluster", + "Allow pods from the same namespace": "Allow pods from the same namespace", + "Allow traffic from peers by IP block": "Allow traffic from peers by IP block", + "Allow traffic from pods in the same namespace": "Allow traffic from pods in the same namespace", + "Allow traffic from pods inside the cluster": "Allow traffic from pods inside the cluster", + "Allow traffic to peers by IP block": "Allow traffic to peers by IP block", + "Allow traffic to pods in the same namespace": "Allow traffic to pods in the same namespace", + "Allow traffic to pods inside the cluster": "Allow traffic to pods inside the cluster", + "Alternate Service target": "Alternate Service target", + "Alternate Service to route to.": "Alternate Service to route to.", + "Alternate Service weight": "Alternate Service weight", + "An error occurred.": "An error occurred.", + "An error occurred. Please try again.": "An error occurred. Please try again.", + "An OpenShift project is an alternative representation of a Kubernetes namespace.": "An OpenShift project is an alternative representation of a Kubernetes namespace.", + "annotation_one": "annotation", "annotation_many": "annotation", - "annotation_other": "anotaciones", - "Annotations": "Anotaciones", - "Any namespace": "Cualquier espacio de nombres", - "Any peer": "Cualquier par", - "Any pod": "Cualquier pod", - "Any port": "Cualquier puerto", - "Are you sure you want to remove <2> from <5>{nadName}?": "¿Está seguro de que desea quitar <2> de <5>{nadName}?", - "Are you sure you want to remove <2> from <5>{udnName}?": "¿Está seguro de que desea quitar <2> de <5>{udnName}?", - "Are you sure?": "¿Está seguro?", - "Assigns IP addresses from this subnet to Pods and VirtualMachines.": "Asigna direcciones IP de esta subred a pods y máquinas virtuales.", - "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.": "En el momento de la creación, el espacio de nombre debe configurarse con la etiqueta <2>{{label}}. Vaya a<5> Espacios de nombre para crear un nuevo espacio de nombre.", - "At least one port is required": "Se requiere al menos un puerto", - "Backend health": "Estado del backend", - "Bridge name": "Nombre del puente", - "Browse...": "Navegar...", - "CA certificate": "Certificado de CA", - "Can't preview matching {{resourceName}}": "No se puede previsualizar {{resourceName}} coincidente", - "Can't preview pods": "No se pueden previsualizar los pods", - "Cancel": "Cancelar", - "Certificate": "Certificado", - "Certificates": "Certificados", + "annotation_other": "annotation", + "Annotations": "Annotations", + "Any namespace": "Any namespace", + "Any peer": "Any peer", + "Any pod": "Any pod", + "Any port": "Any port", + "Are you sure you want to remove <2> from <5>{nadName}?": "Are you sure you want to remove <2> from <5>{nadName}?", + "Are you sure you want to remove <2> from <5>{udnName}?": "Are you sure you want to remove <2> from <5>{udnName}?", + "Are you sure?": "Are you sure?", + "Assigns IP addresses from this subnet to Pods and VirtualMachines.": "Assigns IP addresses from this subnet to Pods and VirtualMachines.", + "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.": "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.", + "At least one port is required": "At least one port is required", + "Backend health": "Backend health", + "Bridge name": "Bridge name", + "Browse...": "Browse...", + "CA certificate": "CA certificate", + "Can't preview matching {{resourceName}}": "Can't preview matching {{resourceName}}", + "Can't preview pods": "Can't preview pods", + "Cancel": "Cancel", + "Certificate": "Certificate", + "Certificates": "Certificates", "CIDR": "CIDR", - "Clear": "Borrar", - "Clear input value": "Borrar valor de entrada", - "Click <1>Create {{kind}} to create your first {{kind}}": "Haga clic en <1> Create {{kind}} para crear su primer {{kind}}", - "Cluster administrator permissions are required to enable this feature.": "Se requieren permisos de administrador de clúster para habilitar esta función.", - "Cluster IP": "IP del clúster", - "Cluster-wide UserDefinedNetworks": "UserDefinedNetworks en todo el clúster", + "Clear": "Clear", + "Clear input value": "Clear input value", + "Click <1>Create {{kind}} to create your first {{kind}}": "Click <1>Create {{kind}} to create your first {{kind}}", + "Cluster administrator permissions are required to enable this feature.": "Cluster administrator permissions are required to enable this feature.", + "Cluster IP": "Cluster IP", + "Cluster-wide UserDefinedNetworks": "Cluster-wide UserDefinedNetworks", "ClusterUserDefinedNetwork": "ClusterUserDefinedNetwork", - "ClusterUserDefinedNetwork name": "Nombre de ClusterUserDefinedNetwork", + "ClusterUserDefinedNetwork name": "ClusterUserDefinedNetwork name", "ClusterUserDefinedNetworks": "ClusterUserDefinedNetworks", - "Completed": "Terminado", - "Conditions": "Condiciones", - "Configure in Virtual machine networks page": "Configurar en la página de redes de máquinas virtuales", - "Configure via:": "Configurar a través de:", - "Confirm": "Confirmar", - "Connection rate": "Tasa de conexión", + "Completed": "Completed", + "Conditions": "Conditions", + "Configure in Virtual machine networks page": "Configure in Virtual machine networks page", + "Configure via:": "Configure via:", + "Confirm": "Confirm", + "Connection rate": "Connection rate", "ConsoleQuickStart": "ConsoleQuickStart", "ConsoleQuickStarts": "ConsoleQuickStarts", - "Copied": "Copiado", - "Copied to clipboard": "Copiado al portapapeles", - "Copy": "Copiar", - "Copy to clipboard": "Copiar al portapapeles", + "Copied": "Copied", + "Copied to clipboard": "Copied to clipboard", + "Copy": "Copy", + "Copy to clipboard": "Copy to clipboard", "CPU": "CPU", "CrashLoopBackOff": "CrashLoopBackOff", - "CrashLoopBackOff indicates that the application within the container is failing to start properly.": "CrashLoopBackOff indica que la aplicación dentro del contenedor no se inicia correctamente.", - "Create": "Crear", - "Create {{ kind }}": "Crear {{ kind }}", - "Create {{kind}}": "Crear {{kind}}", - "Create {{label}}": "Crear {{label}}", - "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.": "Cree un servicio con el formulario. Cambie a la vista YAML para tener control total, incluidos los campos que no se muestran en el formulario.", - "Create by completing the form.": "Crear completando el formulario.", - "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.": "Crear ingresando manualmente definiciones YAML o JSON, o arrastrando y soltando un archivo en el editor.", - "Create ClusterUserDefinedNetwork": "Crear ClusterUserDefinedNetwork", - "Create Ingress": "Crear ingreso", - "Create NetworkAttachmentDefinition": "Crear NetworkAttachmentDefinition", - "Create Project": "Crear proyecto", - "Create Route": "Crear ruta", - "Create Service": "Crear servicio", - "Create UserDefinedNetwork": "Crear UserDefinedNetwork", - "Created": "Creado", - "Created at": "Creado en", - "Current selections": "Selecciones actuales", - "Custom route": "Ruta personalizada", - "Debug container {{name}}": "Contenedor de depuración {{name}}", - "Define a new UserDefinedNetwork for this project": "Definir una nueva UserDefinedNetwork para este proyecto", - "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.": "Defina la red que utilizan las máquinas virtuales y los pods para comunicarse en el proyecto. Aprenda más sobre la <2>red primaria definida por el usuario.", - "Define the network used by VirtualMachines and Pods to communicate in this project": "Defina la red que utilizan las máquinas virtuales y los pods para comunicarse en este proyecto.", - "Degraded: {{ready}} of {{total}} endpoints ready": "Degradado: {{ready}} de {{total}} puntos de acceso listos", - "Delete": "Eliminar", - "Delete {{kind}}": "Eliminar {{kind}}", - "Delete Ingress": "Eliminar ingreso", - "Delete NetworkAttachmentDefinition": "Eliminar NetworkAttachmentDefinition", - "Delete Route": "Eliminar ruta", - "Delete Service": "Eliminar servicio", - "Deletion protection": "Protección contra eliminación", - "Deny all egress traffic": "Denegar todo el tráfico de salida", - "Deny all ingress traffic": "Denegar todo el tráfico de entrada", - "Description": "Descripción", - "Destination CA certificate": "Certificado CA de destino", - "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.": "Los destinos agregados a esta regla permitirán el tráfico desde los pods definidos anteriormente. Los destinos de esta lista se combinan mediante una operación lógica OR.", - "Details": "Detalles", - "Disabled": "Desactivado", - "Display name": "Nombre para mostrar", - "Do you need to set up custom DNS?": "¿Necesita configurar DNS personalizado?", - "Down: {{ready}} of {{total}} endpoints ready": "Inactivo: {{ready}} de {{total}} puntos de acceso listos", - "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.": "Los clústeres de doble pila pueden configurar dos subredes (una para cada familia de IP). De lo contrario, solo se permite una subred.", - "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "Los clústeres de doble pila pueden configurar dos subredes (una para cada familia IP). De lo contrario, solo se permite una subred. El formato debe coincidir con la notación CIDR estándar (por ejemplo, “192.168.123.0/24”).", - "Duplicate keys found in main pod selector": "Se encontraron claves duplicadas en el selector de pod principal", - "Duplicate keys found in peer namespace selector": "Claves duplicadas encontradas en el selector de espacios de nombres de pares", - "Duplicate keys found in peer pod selector": "Claves duplicadas encontradas en el selector de pods de pares", + "CrashLoopBackOff indicates that the application within the container is failing to start properly.": "CrashLoopBackOff indicates that the application within the container is failing to start properly.", + "Create": "Create", + "Create {{ kind }}": "Create {{ kind }}", + "Create {{kind}}": "Create {{kind}}", + "Create {{label}}": "Create {{label}}", + "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.": "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.", + "Create by completing the form.": "Create by completing the form.", + "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.": "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.", + "Create ClusterUserDefinedNetwork": "Create ClusterUserDefinedNetwork", + "Create Ingress": "Create Ingress", + "Create NetworkAttachmentDefinition": "Create NetworkAttachmentDefinition", + "Create Project": "Create Project", + "Create Route": "Create Route", + "Create Service": "Create Service", + "Create UserDefinedNetwork": "Create UserDefinedNetwork", + "Created": "Created", + "Created at": "Created at", + "Current selections": "Current selections", + "Custom route": "Custom route", + "Debug container {{name}}": "Debug container {{name}}", + "Define a new UserDefinedNetwork for this project": "Define a new UserDefinedNetwork for this project", + "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.": "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.", + "Define the network used by VirtualMachines and Pods to communicate in this project": "Define the network used by VirtualMachines and Pods to communicate in this project", + "Degraded: {{ready}} of {{total}} endpoints ready": "Degraded: {{ready}} of {{total}} endpoints ready", + "Delete": "Delete", + "Delete {{kind}}": "Delete {{kind}}", + "Delete Ingress": "Delete Ingress", + "Delete NetworkAttachmentDefinition": "Delete NetworkAttachmentDefinition", + "Delete Route": "Delete Route", + "Delete Service": "Delete Service", + "Deletion protection": "Deletion protection", + "Deny all egress traffic": "Deny all egress traffic", + "Deny all ingress traffic": "Deny all ingress traffic", + "Description": "Description", + "Destination CA certificate": "Destination CA certificate", + "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.": "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.", + "Details": "Details", + "Disabled": "Disabled", + "Display name": "Display name", + "Do you need to set up custom DNS?": "Do you need to set up custom DNS?", + "Down: {{ready}} of {{total}} endpoints ready": "Down: {{ready}} of {{total}} endpoints ready", + "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.": "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.", + "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").", + "Duplicate keys found in main pod selector": "Duplicate keys found in main pod selector", + "Duplicate keys found in peer namespace selector": "Duplicate keys found in peer namespace selector", + "Duplicate keys found in peer pod selector": "Duplicate keys found in peer pod selector", "Edge": "Edge", - "Edit": "Editar", - "Edit {{kind}}": "Editar {{kind}}", - "Edit {{label}}": "Editar {{label}}", - "Edit annotations": "Editar anotaciones", - "Edit Ingress": "Editar ingreso", - "Edit labels": "Editar etiquetas", - "Edit NetworkAttachmentDefinition": "Editar NetworkAttachmentDefinition", - "Edit Pod selector": "Editar selector de pods", - "Edit Route": "Editar ruta", - "Edit Service": "Editar servicio", - "Egress": "Salida", - "Egress network policy is not supported.": "No se admite la política de red de salida.", - "Egress rule": "Regla de salida", - "Egress rules": "Reglas de salida", - "Enable {{kind}}": "Permitir {{kind}}", - "Enabled": "Activado", + "Edit": "Edit", + "Edit {{kind}}": "Edit {{kind}}", + "Edit {{label}}": "Edit {{label}}", + "Edit annotations": "Edit annotations", + "Edit Ingress": "Edit Ingress", + "Edit labels": "Edit labels", + "Edit NetworkAttachmentDefinition": "Edit NetworkAttachmentDefinition", + "Edit Pod selector": "Edit Pod selector", + "Edit Route": "Edit Route", + "Edit Service": "Edit Service", + "Egress": "Egress", + "Egress network policy is not supported.": "Egress network policy is not supported.", + "Egress rule": "Egress rule", + "Egress rules": "Egress rules", + "Enable {{kind}}": "Enable {{kind}}", + "Enabled": "Enabled", "EndpointSlice": "EndpointSlice", "EndpointSlices": "EndpointSlices", "Error": "Error", - "Error details": "Error de detalles", - "Error loading virtual machines": "Error al cargar las máquinas virtuales", - "Example: 100": "Ejemplo: 100", - "Exceptions": "Excepciones", - "External DNS name this service resolves to (e.g. example.com).": "Nombre DNS externo al que apunta este servicio (p.\u00a0ej., example.com).", - "External IP": "IP externa", - "External load balancer": "Balanceador de carga externo", - "External name": "Nombre externo", - "External name is required": "Se requiere un nombre externo", - "External name must be a valid hostname": "El nombre externo debe ser un nombre de host válido", - "External service name": "Nombre del servicio externo", - "Failed": "Fallido", - "Failed to add the following virtual machines: {{names}}": "No se pudieron agregar las siguientes máquinas virtuales: {{names}}", - "Failed to remove virtual machine from network": "No se pudo eliminar la máquina virtual de la red", - "Failed to retrieve the list of projects": "No se pudo recuperar la lista de proyectos", - "False": "Falso", - "Form view": "Vista de formulario", - "From": "De", - "From pods": "Pods de origen", - "Given subnet is split into smaller subnets for every node.": "La subred dada se divide en subredes más pequeñas para cada nodo.", - "Health": "Estado", - "Healthy: {{ready}} of {{total}} endpoints ready": "En buen estado: {{ready}} de {{total}} puntos de acceso listos", - "Hide": "Ocultar", - "Hide selected Namespace(s)": "Ocultar los espacios de nombre seleccionados", + "Error details": "Error details", + "Error loading virtual machines": "Error loading virtual machines", + "Example: 100": "Example: 100", + "Exceptions": "Exceptions", + "External DNS name this service resolves to (e.g. example.com).": "External DNS name this service resolves to (e.g. example.com).", + "External IP": "External IP", + "External load balancer": "External load balancer", + "External name": "External name", + "External name is required": "External name is required", + "External name must be a valid hostname": "External name must be a valid hostname", + "External service name": "External service name", + "Failed": "Failed", + "Failed to add the following virtual machines: {{names}}": "Failed to add the following virtual machines: {{names}}", + "Failed to remove virtual machine from network": "Failed to remove virtual machine from network", + "Failed to retrieve the list of projects": "Failed to retrieve the list of projects", + "False": "False", + "Form view": "Form view", + "From": "From", + "From pods": "From pods", + "Given subnet is split into smaller subnets for every node.": "Given subnet is split into smaller subnets for every node.", + "Health": "Health", + "Healthy: {{ready}} of {{total}} endpoints ready": "Healthy: {{ready}} of {{total}} endpoints ready", + "Hide": "Hide", + "Hide selected Namespace(s)": "Hide selected Namespace(s)", "Host": "Host", - "Hostname": "Nombre de host", + "Hostname": "Hostname", "Hosts": "Hosts", - "HostSubnet": "Subred del host", - "If no namespace selector is provided, pods from all namespaces will be eligible.": "Si no se proporciona ningún selector de espacio de nombres, los pods de todos los espacios de nombres serán elegibles.", - "If no pod selector is provided, the policy will apply to all pods in the namespace.": "Si no se proporciona ningún selector de pods, la política se aplicará a todos los pods en el espacio de nombres.", - "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "Si no se proporciona ningún selector de pods, se permitirá el tráfico de todos los pods en espacios de nombres elegibles.", - "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "Si no se proporciona ningún selector de pods, se permitirá el tráfico de todos los pods en este espacio de nombres.", - "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "Si no se proporciona ningún selector de pods, se permitirá el tráfico a todos los pods en espacios de nombres elegibles.", - "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "Si no se proporciona ningún selector de pods, se permitirá el tráfico a todos los pods en este espacio de nombres.", - "If this field is empty, traffic will be allowed from all external sources.": "Si este campo está vacío, se permitirá el tráfico de todas las fuentes externas.", - "If this field is empty, traffic will be allowed to all external sources.": "Si este campo está vacío, se permitirá el tráfico a todas las fuentes externas.", - "Ingress": "Ingreso", - "Ingress details": "Detalles de ingreso", - "Ingress points of load balancer": "Puntos de entrada del balanceador de carga", - "Ingress rule": "Regla de ingreso", - "Ingress rules": "Reglas de ingreso", - "Ingresses": "Ingresos", - "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}": "Error de entrada: los selectores deben comenzar y terminar con una letra o número, y solo pueden contener -, _, / o . Valor ofensivo: {{offendingSelector}}", - "Insecure traffic": "Tráfico inseguro", - "Interface": "Interfaz", - "Invalid IP address or subnet format": "Dirección IP o formato de subred no válidos", - "Invalid subnet format": "Formato de subred no válido", - "Invalid YAML cannot be persisted": "YAML no válido no se puede conservar", - "IP address": "Dirección IP", - "IP address management": "Gestión de direcciones IP", - "IP Addresses accepting traffic for service": "Direcciones IP que aceptan tráfico para el servicio", - "IP block exceptions are not supported and would cause the entire IP block section to be ignored.": "Las excepciones de bloqueo de IP no son compatibles y provocarían que se ignore toda la sección del bloqueo de IP.", - "IP blocks": "Bloques de IP", - "IPAM Lifecycle": "Ciclo de vida de IPAM", + "HostSubnet": "HostSubnet", + "If no namespace selector is provided, pods from all namespaces will be eligible.": "If no namespace selector is provided, pods from all namespaces will be eligible.", + "If no pod selector is provided, the policy will apply to all pods in the namespace.": "If no pod selector is provided, the policy will apply to all pods in the namespace.", + "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.", + "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "If no pod selector is provided, traffic from all pods in this namespace will be allowed.", + "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.", + "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "If no pod selector is provided, traffic to all pods in this namespace will be allowed.", + "If this field is empty, traffic will be allowed from all external sources.": "If this field is empty, traffic will be allowed from all external sources.", + "If this field is empty, traffic will be allowed to all external sources.": "If this field is empty, traffic will be allowed to all external sources.", + "Ingress": "Ingress", + "Ingress details": "Ingress details", + "Ingress points of load balancer": "Ingress points of load balancer", + "Ingress rule": "Ingress rule", + "Ingress rules": "Ingress rules", + "Ingresses": "Ingresses", + "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}": "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}", + "Insecure traffic": "Insecure traffic", + "Interface": "Interface", + "Invalid IP address or subnet format": "Invalid IP address or subnet format", + "Invalid subnet format": "Invalid subnet format", + "Invalid YAML cannot be persisted": "Invalid YAML cannot be persisted", + "IP address": "IP address", + "IP address management": "IP address management", + "IP Addresses accepting traffic for service": "IP Addresses accepting traffic for service", + "IP block exceptions are not supported and would cause the entire IP block section to be ignored.": "IP block exceptions are not supported and would cause the entire IP block section to be ignored.", + "IP blocks": "IP blocks", + "IPAM Lifecycle": "IPAM Lifecycle", "IPAMLifecycle": "IPAMLifecycle", - "IPAMLifecycle controls IP addresses management lifecycle.": "IPAMLifecycle controla el ciclo de vida de la gestión de direcciones IP.", - "It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "No se recomienda configurar este campo sin una necesidad explícita y sin comprender la topología de la red OVN.", + "IPAMLifecycle controls IP addresses management lifecycle.": "IPAMLifecycle controls IP addresses management lifecycle.", + "It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "It is not recommended to set this field without explicit need and understanding of the OVN network topology.", "JoinSubnets": "JoinSubnets", - "JoinSubnets are used inside the OVN network topology.": "JoinSubnets se utiliza dentro de la topología de red OVN.", - "Key": "Clave", - "key is the label key that the selector applies": "La clave es la clave de etiqueta que aplica el selector", - "Kind": "Tipo", - "Labels": "Etiquetas", - "Layer2 topology creates one logical switch shared by all nodes.": "La topología de capa 2 crea un switch lógico que comparten todos los nodos.", - "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.": "La topología de capa 3 crea un segmento de capa 2 por nodo, cada uno con una subred diferente. El enrutamiento de capa 3 se utiliza para interconectar las subredes de los nodos.", - "Learn how to use NetworkAttachmentDefinitions": "Aprenda a utilizar NetworkAttachmentDefinitions", - "Learn more about {{ kind }}": "Más información acerca de {{ kind }}", - "Learn more about working with projects": "Obtenga más información sobre cómo trabajar con proyectos", - "List of {{resourceName}} matching": "Lista de {{resourceName}} coincidentes", - "List of matching {{resourceName}}": "Lista de {{resourceName}} coincidentes", - "List of pods": "Lista de pods", - "List of pods matching": "Lista de pods coincidentes", - "Location": "Ubicación", - "Location of the resource that backs the service": "Ubicación del recurso que respalda el servicio.", - "MAC spoof check": "Comprobación de falsificación de MAC", - "Manage columns": "Administrar columnas", - "Managed by UserDefinedNetwork": "Administrado por UserDefinedNetwork", - "Match Expressions": "Expresiones de coincidencia", - "Match Labels": "Etiquetas de coincidencia", - "matchExpressions is a list of label selector requirements. The requirements are ANDed.": "matchExpressions es una lista de requisitos del selector de etiquetas. Los requisitos se combinan mediante AND.", - "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.": "matchLabels es un mapa de pares {key,value}. Un solo{key,value} en el mapa matchLabels es equivalente a un elemento de matchExpressions, cuyo campo de llave es “key”, el operador es “In” y la matriz de valores contiene solo “value”. Los requisitos son ANDed.", - "Memory": "Memoria", - "Message": "Mensaje", - "Metrics": "Métricas", - "Missing installed operators": "Operadores instalados faltantes", - "More information:": "Más información:", + "JoinSubnets are used inside the OVN network topology.": "JoinSubnets are used inside the OVN network topology.", + "Key": "Key", + "key is the label key that the selector applies": "key is the label key that the selector applies", + "Kind": "Kind", + "Labels": "Labels", + "Layer2 topology creates one logical switch shared by all nodes.": "Layer2 topology creates one logical switch shared by all nodes.", + "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.": "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.", + "Learn how to use NetworkAttachmentDefinitions": "Learn how to use NetworkAttachmentDefinitions", + "Learn more about {{ kind }}": "Learn more about {{ kind }}", + "Learn more about working with projects": "Learn more about working with projects", + "List of {{resourceName}} matching": "List of {{resourceName}} matching", + "List of matching {{resourceName}}": "List of matching {{resourceName}}", + "List of pods": "List of pods", + "List of pods matching": "List of pods matching", + "Location": "Location", + "Location of the resource that backs the service": "Location of the resource that backs the service", + "MAC spoof check": "MAC spoof check", + "Manage columns": "Manage columns", + "Managed by UserDefinedNetwork": "Managed by UserDefinedNetwork", + "Match Expressions": "Match Expressions", + "Match Labels": "Match Labels", + "matchExpressions is a list of label selector requirements. The requirements are ANDed.": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", + "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", + "Memory": "Memory", + "Message": "Message", + "Metrics": "Metrics", + "Missing installed operators": "Missing installed operators", + "More information:": "More information:", "MTU": "MTU", - "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.": "MTU es opcional. Si no se proporciona, se utiliza el valor configurado globalmente en OVN-Kubernetes (el valor predeterminado es 1400) para la red.", - "MTU is the maximum transmission unit for a network.": "MTU es la unidad máxima de transmisión de una red.", + "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.": "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.", + "MTU is the maximum transmission unit for a network.": "MTU is the maximum transmission unit for a network.", "multi-networkpolicies": "multi-networkpolicies", "multi-networkpolicy": "multi-networkpolicy", "MultiNetworkPolicies": "MultiNetworkPolicies", - "Name": "Nombre", - "Name is required": "Se requiere un nombre", - "Namespace": "Espacio de nombre", - "Namespace is required": "Se requiere un espacio de nombres", - "Namespace selector": "Selector de espacio de nombres", - "Namespace Selector": "Selector de espacio de nombre", - "Namespace(s)": "Espacios de nombre", - "Namespaced UserDefinedNetworks": "UserDefinedNetworks con espacio de nombre", - "Namespaces having all the supplied key/value pairs as labels will be selected.": "Se seleccionarán los espacios de nombres que tengan todos los pares clave/valor proporcionados como etiquetas.", - "Naming information": "Información de nombres", - "network": "red", - "Network": "Red", - "Network type": "Tipo de red", - "Network Type": "Tipo de red", + "Name": "Name", + "Name is required": "Name is required", + "Namespace": "Namespace", + "Namespace is required": "Namespace is required", + "Namespace selector": "Namespace selector", + "Namespace Selector": "Namespace Selector", + "Namespace(s)": "Namespace(s)", + "Namespaced UserDefinedNetworks": "Namespaced UserDefinedNetworks", + "Namespaces having all the supplied key/value pairs as labels will be selected.": "Namespaces having all the supplied key/value pairs as labels will be selected.", + "Naming information": "Naming information", + "network": "network", + "Network": "Network", + "Network type": "Network type", + "Network Type": "Network Type", "NetworkAttachmentDefinitions": "NetworkAttachmentDefinitions", "NetworkPolicies": "NetworkPolicies", - "NetworkPolicies documentation": "Documentación de NetworkPolicies", - "networks": "redes", - "Networks are not project-bound. Using the same name creates a shared NAD.": "Las redes no están vinculadas a proyectos. Usar el mismo nombre crea un NAD compartido.", - "Networks are not project-bound. Using the same name creates a shared UDN.": "Las redes no están limitadas por proyecto. Usar el mismo nombre crea una UDN compartida.", - "No {{kind}} found": "No se encontró {{kind}}", - "No {{label}} found": "No se encontró {{label}}", - "No {{resourceName}} matching the provided labels": "No hay {{resourceName}} que coincidan con las etiquetas proporcionadas", - "No conditions found": "No se encontraron condiciones", - "No datapoints found.": "No se encontraron puntos de datos.", - "No description": "Sin descripción", - "No hosts": "No se encontraron hosts", - "No labels": "Sin etiquetas", + "NetworkPolicies documentation": "NetworkPolicies documentation", + "networks": "networks", + "Networks are not project-bound. Using the same name creates a shared NAD.": "Networks are not project-bound. Using the same name creates a shared NAD.", + "Networks are not project-bound. Using the same name creates a shared UDN.": "Networks are not project-bound. Using the same name creates a shared UDN.", + "No {{kind}} found": "No {{kind}} found", + "No {{label}} found": "No {{label}} found", + "No {{resourceName}} matching the provided labels": "No {{resourceName}} matching the provided labels", + "No conditions found": "No conditions found", + "No datapoints found.": "No datapoints found.", + "No description": "No description", + "No hosts": "No hosts", + "No labels": "No labels", "No matching OVN bridge mapping found for \"{{name}}\".": "No matching OVN bridge mapping found for \"{{name}}\".", - "No matching projects": "No hay proyectos que coincidan", - "No namespace is configured for a primary user-defined network": "No hay ningún espacio de nombre configurado para una red principal definida por el usuario", - "No NetworkAttachmentDefinition found": "No se encontró NetworkAttachmentDefinition", - "No owner": "Sin propietario", - "No pods matching the provided labels in the current namespace": "No hay pods que coincidan con las etiquetas proporcionadas en el espacio de nombres actual", - "No projects matched": "No hay proyectos coincidentes", - "No results found for \"{{inputValue}}\"": "No se encontraron resultados para \"{{inputValue}}\"", - "No route status": "Sin estado de ruta", - "No selector": "Sin selector", - "No virtual machines found": "No se encontraron máquinas virtuales", - "Node": "Nodo", - "Node port": "Puerto de nodo", + "No matching projects": "No matching projects", + "No namespace is configured for a primary user-defined network": "No namespace is configured for a primary user-defined network", + "No NetworkAttachmentDefinition found": "No NetworkAttachmentDefinition found", + "No owner": "No owner", + "No pods matching the provided labels in the current namespace": "No pods matching the provided labels in the current namespace", + "No projects matched": "No projects matched", + "No results found for \"{{inputValue}}\"": "No results found for \"{{inputValue}}\"", + "No route status": "No route status", + "No selector": "No selector", + "No virtual machines found": "No virtual machines found", + "Node": "Node", + "Node port": "Node port", "NodeNetworkConfigurationPolicy": "NodeNetworkConfigurationPolicy", - "None": "Ninguno", - "Not available": "No disponible", - "Not configured": "No configurado", - "Not found": "No encontrado", - "Not Receiving Traffic": "Sin recepción de tráfico", - "NS selector": "Selector NS", + "None": "None", + "Not available": "Not available", + "Not configured": "Not configured", + "Not found": "Not found", + "Not Receiving Traffic": "Not Receiving Traffic", + "NS selector": "NS selector", "of": "of", - "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).": "Un puerto por línea como [nombre:]puerto:puertodestino/PROTOCOLO (p.\u00a0ej., http:80:9376/TCP).", - "Only supported when \"subnets\" are set.": "Solo se admite cuando se configuran “subredes”.", - "Operator": "Operador", - "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.": "El operador representa la relación de una clave con un conjunto de valores. Los operadores válidos son In, NotIn, Exists y DoesNotExist.", - "Owner": "Propietario", - "Passthrough": "Pasar por", - "Path": "Ruta", - "Path that the router watches to route traffic to the service.": "Ruta que observa el enrutador para enrutar el tráfico al servicio.", - "Path type": "Tipo de ruta", - "Pending": "Pendiente", + "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).": "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).", + "Only supported when \"subnets\" are set.": "Only supported when \"subnets\" are set.", + "Operator": "Operator", + "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", + "Owner": "Owner", + "Passthrough": "Passthrough", + "Path": "Path", + "Path that the router watches to route traffic to the service.": "Path that the router watches to route traffic to the service.", + "Path type": "Path type", + "Pending": "Pending", "per page": "per page", - "Percent": "Por ciento", - "Persistent": "Persistente", - "Phase": "Fase", - "Physical network name": "Nombre de la red física", - "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.": "Nombre de la red física. Se debe configurar una asignación de puentes en los nodos del clúster para asignar entre los nombres de redes físicas y los puentes Open vSwitch.", - "Please <2>try again.": "<2>Inténtelo de nuevo.", - "Pod crash loop back-off": "Retroceso del bucle de caída del pod", - "Pod port or name": "Puerto o nombre del pod", - "Pod selector": "Selector de pods", - "Pod selector for": "Selector de pods para", - "Pod unschedulable": "Pod no programable", + "Percent": "Percent", + "Persistent": "Persistent", + "Phase": "Phase", + "Physical network name": "Physical network name", + "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.": "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.", + "Please <2>try again.": "Please <2>try again.", + "Pod crash loop back-off": "Pod crash loop back-off", + "Pod port or name": "Pod port or name", + "Pod selector": "Pod selector", + "Pod selector for": "Pod selector for", + "Pod unschedulable": "Pod unschedulable", "pods": "pods", "Pods": "Pods", - "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.": "Los pods aceptan todo el tráfico de manera predeterminada. Se pueden aislar mediante NetworkPolicies, que especifican una lista de reglas de entrada permitidas. Cuando un pod se selecciona mediante una NetworkPolicy, rechaza todo el tráfico no permitido explícitamente mediante dicha NetworkPolicy.", - "Pods having all the supplied key/value pairs as labels will be selected.": "Se seleccionarán los pods que tengan todos los pares clave/valor proporcionados como etiquetas.", - "Policy for": "Política para", - "Policy name": "Nombre de la política", - "Policy type": "Tipo de póliza", - "Port": "Puerto", - "Port is required": "Se requiere un puerto", - "Port must be between 1 and 65535": "El puerto debe estar entre 1 y 65535", - "Port names must be unique": "Los nombres de los puertos deben ser únicos", - "Port names must be valid DNS labels": "Los nombres de los puertos deben ser etiquetas DNS válidas", - "Ports": "Puertos", - "Ports must use the format [name:]port:targetPort/PROTOCOL": "Los puertos deben usar el formato [nombre:]puerto:puertodestino/PROTOCOLO", - "Primary network is automatically assigned to every pod created in the same namespace.": "La red principal se asigna automáticamente a cada pod creado en el mismo espacio de nombre.", - "Private key": "Clave privada", - "Project name": "Nombre del proyecto", - "Protocol": "Protocolo", - "Protocol must be TCP, UDP, or SCTP": "El protocolo debe ser TCP, UDP o SCTP", - "Public hostname for the Route. If not specified, a hostname is generated.": "Nombre de host público para la ruta. Si no se especifica, se genera un nombre de host.", - "Re-encrypt": "Volver a cifrar", - "Ready": "Listo", - "Reason": "Razón", - "Receiving Traffic": "Recepción de tráfico", - "Redirect": "Redirigir", - "Refer an existing ClusterUserDefinedNetwork": "Hacer referencia a un ClusterUserDefinedNetwork existente", - "Refer to your cluster administrator to know which network provider is used.": "Consulte a su administrador de clúster para saber qué proveedor de red se utiliza.", - "Remove": "Eliminar", - "Remove all": "Quitar todo", - "Remove alternate Service": "Quitar servicio alternativo", - "Remove exception": "Quitar excepción", - "Remove from network": "Eliminar de la red", - "Remove peer": "Quitar par", - "Remove port": "Quitar puerto", - "Remove subnets?": "¿Desea eliminar subredes?", - "Remove virtual machine from network?": "¿Desea eliminar la máquina virtual de la red?", - "Reset to default": "Restablecer a valores predeterminados", - "Resource name": "Nombre del recurso", - "Restarts": "Reinicios", - "Restricted Access": "Acceso restringido", - "Reveal": "Mostrar", - "Review selected Namespace(s)": "Revisar los espacios de nombre seleccionados", - "Role": "Rol", - "Role describes the network role in the pod.": "El rol describe el rol de la red en el pod.", - "Route details": "Detalles de la ruta", - "Router canonical hostname": "Nombre de host canónico del enrutador", - "Router: {{routerName}}": "Enrutador: {{routerName}}", - "Routes": "Rutas", - "Routes can be secured using several TLS termination types for serving certificates.": "Las rutas se pueden proteger utilizando varios tipos de terminación TLS para entregar certificados.", - "Routing is a way to make your application publicly visible": "El enrutamiento es una forma de hacer que su aplicación sea públicamente visible.", - "Rules": "Normas", - "Running": "En ejecución", - "Save": "Guardar", - "Search by name...": "Buscar por nombre...", - "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.": "La red secundaria solo se asigna a los pods que usan la anotación k8s.v1.cni.cncf.io/networks para seleccionar la red determinada.", - "Secure Route": "Ruta segura", - "Security": "Seguridad", - "Select a Project": "Seleccionar un proyecto", - "Select a Service": "Seleccionar un servicio", - "Select all": "Seleccionar todo", - "Select an operator": "Seleccionar un operador", - "Select ClusterUserDefinedNetwork": "Seleccionar ClusterUserDefinedNetwork", - "Select default ingress and egress deny rules": "Seleccione reglas predeterminadas de denegación de entrada y salida", - "Select insecure traffic type": "Seleccionar tipo de tráfico inseguro", - "Select one or more NetworkAttachmentDefinitions": "Seleccione una o más NetworkAttachmentDefinitions", - "Select resource name": "Seleccionar nombre de recurso", - "Select role": "Seleccionar rol", - "Select target port": "Seleccionar puerto de destino", - "Select termination type": "Seleccionar tipo de terminación", - "Select virtual machines to connect to this network.": "Seleccione las máquinas virtuales que desea conectar a esta red.", - "Selected categories will be displayed in the table.": "Las categorías seleccionadas se mostrarán en la tabla.", + "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.": "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.", + "Pods having all the supplied key/value pairs as labels will be selected.": "Pods having all the supplied key/value pairs as labels will be selected.", + "Policy for": "Policy for", + "Policy name": "Policy name", + "Policy type": "Policy type", + "Port": "Port", + "Port is required": "Port is required", + "Port must be between 1 and 65535": "Port must be between 1 and 65535", + "Port names must be unique": "Port names must be unique", + "Port names must be valid DNS labels": "Port names must be valid DNS labels", + "Ports": "Ports", + "Ports must use the format [name:]port:targetPort/PROTOCOL": "Ports must use the format [name:]port:targetPort/PROTOCOL", + "Primary network is automatically assigned to every pod created in the same namespace.": "Primary network is automatically assigned to every pod created in the same namespace.", + "Private key": "Private key", + "Project name": "Project name", + "Protocol": "Protocol", + "Protocol must be TCP, UDP, or SCTP": "Protocol must be TCP, UDP, or SCTP", + "Public hostname for the Route. If not specified, a hostname is generated.": "Public hostname for the Route. If not specified, a hostname is generated.", + "Re-encrypt": "Re-encrypt", + "Ready": "Ready", + "Reason": "Reason", + "Receiving Traffic": "Receiving Traffic", + "Redirect": "Redirect", + "Refer an existing ClusterUserDefinedNetwork": "Refer an existing ClusterUserDefinedNetwork", + "Refer to your cluster administrator to know which network provider is used.": "Refer to your cluster administrator to know which network provider is used.", + "Remove": "Remove", + "Remove all": "Remove all", + "Remove alternate Service": "Remove alternate Service", + "Remove exception": "Remove exception", + "Remove from network": "Remove from network", + "Remove peer": "Remove peer", + "Remove port": "Remove port", + "Remove subnets?": "Remove subnets?", + "Remove virtual machine from network?": "Remove virtual machine from network?", + "Reset to default": "Reset to default", + "Resource name": "Resource name", + "Restarts": "Restarts", + "Restricted Access": "Restricted Access", + "Reveal": "Reveal", + "Review selected Namespace(s)": "Review selected Namespace(s)", + "Role": "Role", + "Role describes the network role in the pod.": "Role describes the network role in the pod.", + "Route details": "Route details", + "Router canonical hostname": "Router canonical hostname", + "Router: {{routerName}}": "Router: {{routerName}}", + "Routes": "Routes", + "Routes can be secured using several TLS termination types for serving certificates.": "Routes can be secured using several TLS termination types for serving certificates.", + "Routing is a way to make your application publicly visible": "Routing is a way to make your application publicly visible", + "Rules": "Rules", + "Running": "Running", + "Save": "Save", + "Search by name...": "Search by name...", + "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.": "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.", + "Secure Route": "Secure Route", + "Security": "Security", + "Select a Project": "Select a Project", + "Select a Service": "Select a Service", + "Select all": "Select all", + "Select an operator": "Select an operator", + "Select ClusterUserDefinedNetwork": "Select ClusterUserDefinedNetwork", + "Select default ingress and egress deny rules": "Select default ingress and egress deny rules", + "Select insecure traffic type": "Select insecure traffic type", + "Select one or more NetworkAttachmentDefinitions": "Select one or more NetworkAttachmentDefinitions", + "Select resource name": "Select resource name", + "Select role": "Select role", + "Select target port": "Select target port", + "Select termination type": "Select termination type", + "Select virtual machines to connect to this network.": "Select virtual machines to connect to this network.", + "Selected categories will be displayed in the table.": "Selected categories will be displayed in the table.", "Selector": "Selector", - "Selector is required": "Se requiere un selector", - "Selector keys must be unique": "Las claves de selección deben ser únicas", - "Selectors must use valid key=value pairs": "Los selectores deben usar pares clave=valor válidos", - "Service": "Servicio", - "Service address": "Dirección de servicio", - "Service details": "Detalles del servicio", - "Service port": "Puerto de servicio", - "Service port mapping": "Mapeo de puertos de servicio", - "Service routing": "Enrutamiento de servicios", - "Service to route to.": "Servicio para ruta hacia.", - "Service weight": "Peso de servicio", - "Services": "Servicios", - "Session affinity": "Afinidad de sesión", - "Show a preview of the <2>affected pods that this egress rule will apply to.": "Mostrar una vista previa de los <2>pods afectados a los que se aplicará esta regla de salida.", - "Show a preview of the <2>affected pods that this ingress rule will apply to.": "Mostrar una vista previa de los <2>pods afectados a los que se aplicará esta regla de ingreso.", - "Show a preview of the <2>affected pods that this policy will apply to": "Mostrar una vista previa de los <2>pods afectados a los que se aplicará esta política", - "Show a preview of the <2>matching pods that this selector will apply to": "Mostrar una vista previa de los <2>pods coincidentes a los que se aplicará este selector", - "Show less": "Mostrar menos", - "Showing {{shown}} from {{total}} results": "Mostrando {{shown}} de {{total}} resultados", - "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.": "Las fuentes agregadas a esta regla permitirán el tráfico a los pods definidos anteriormente. Las fuentes de esta lista se combinan mediante una operación lógica OR.", - "Status": "Estado", - "Subnet": "Subred", - "Subnet CIDR": "CIDR de subred", - "Subnets": "Subredes", - "Subnets are used for the pod network across the cluster.": "Las subredes se utilizan para la red de pods en todo el clúster.", - "Switch and delete": "Cambiar y eliminar", - "Switching to form view will delete any invalid YAML.": "Cambiar a la vista de formulario eliminará cualquier YAML no válido.", - "Target pods": "Pods objetivo", - "Target port": "Puerto de destino", - "Target port for traffic": "Puerto de destino para el tráfico", - "Target port names must be valid DNS labels": "Los nombres de los puertos de destino deben ser etiquetas DNS válidas", - "Tech preview": "Vista previa de tecnología", - "Terminating": "Terminando", - "Termination type": "Tipo de terminación", - "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "El formato debe coincidir con la notación CIDR estándar (por ejemplo, “192.168.123.0/24”).", - "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.": "El único valor permitido es Persistente. Cuando se establecen, las direcciones IP asignadas por OVN a Kubernetes se conservarán en un objeto “ipamclaims.k8s.cni.cncf.io”.", - "These IP addresses will be reused by other pods if requested.": "Otros pods reutilizarán estas direcciones IP serán reutilizadas si se solicita.", - "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated": "Estas reglas son manejadas por una capa de enrutamiento (Controlador de ingreso) que se actualiza a medida que se modifican las reglas. La implementación del controlador de ingreso define cómo se reenvían o manipulan los encabezados y otros metadatos.", - "This action will remove all rules within the Egress section and cannot be undone.": "Esta acción quitará todas las reglas dentro de la sección de Salida y no se puede deshacer.", - "This action will remove all rules within the Ingress section and cannot be undone.": "Esta acción quitará todas las reglas dentro de la sección Ingreso y no se puede deshacer.", - "This action will remove all subnets and cannot be undone.": "Esta acción eliminará todas las subredes y no se podrá deshacer.", - "This field is only allowed for \"Primary\" network.": "Este campo solo está permitido para la red “Principal”.", - "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "Este campo solo está permitido para la red “Principal”. No se recomienda configurarlo sin necesidad explícita y sin comprender la topología de la red OVN.", - "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.": "Este campo puede omitirse. En ese caso, el conmutador lógico que implementa la red solo proporciona comunicación de capa 2, y los usuarios deben configurar direcciones IP para los pods. Por lo tanto, la seguridad del puerto solo previene la suplantación de MAC.", - "This network must be created before you create any workload in this project": "Esta red debe crearse antes de crear cualquier carga de trabajo en este proyecto", - "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.": "Esta política de red no se puede mostrar en formato. Cambie al editor YAML.", - "This route splits traffic across multiple services.": "Esta ruta divide el tráfico entre múltiples servicios.", - "TLS certificate": "Certificado TLS", - "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.": "Certificados TLS para terminación perimetral y recifrado. Si no se especifica, se utiliza el certificado predeterminado del enrutador.", - "TLS is not enabled": "TLS no está habilitado", - "TLS Settings": "Configuración TLS", - "TLS termination": "Terminación TLS", - "To": "Para", - "To ports": "Puertos de destino", - "To troubleshoot, view logs and events, then debug in terminal.": "Para solucionar problemas, vea registros y eventos, luego depure en el terminal.", - "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.": "Para utilizar una ruta personalizada, debe actualizar su proveedor de DNS creando un registro de nombre canónico (CNAME). Su registro CNAME debe apuntar a su dominio personalizado <2>{{host}}, al nombre de host del enrutador canónico de OpenShift, <5>{{routerCanonicalHostname}}, como alias.", - "Topology": "Topología", - "Topology describes network configuration.": "La topología describe la configuración de la red.", - "total limit": "límite total", - "total requested": "total solicitado", - "Traffic": "Tráfico", - "Traffic in": "Tráfico entrante", - "Traffic out": "Tráfico saliente", - "True": "Verdadero", - "Type": "Tipo", - "Type is required": "Se requiere un tipo", - "Unknown": "Desconocido", - "unknown host": "host desconocido", - "Unknown: endpoint readiness not available": "Desconocido: disponibilidad del punto de acceso no disponible", - "Unknown: endpoint readiness not loaded": "Desconocido: no se ha cargado la disponibilidad del punto de acceso", - "Updated": "Actualizado", - "Use \"{{inputValue}}\"": "Utilizar \"{{inputValue}}\"", - "Use the default Pod network": "Utilice la red pod predeterminada", + "Selector is required": "Selector is required", + "Selector keys must be unique": "Selector keys must be unique", + "Selectors must use valid key=value pairs": "Selectors must use valid key=value pairs", + "Service": "Service", + "Service address": "Service address", + "Service details": "Service details", + "Service port": "Service port", + "Service port mapping": "Service port mapping", + "Service routing": "Service routing", + "Service to route to.": "Service to route to.", + "Service weight": "Service weight", + "Services": "Services", + "Session affinity": "Session affinity", + "Show a preview of the <2>affected pods that this egress rule will apply to.": "Show a preview of the <2>affected pods that this egress rule will apply to.", + "Show a preview of the <2>affected pods that this ingress rule will apply to.": "Show a preview of the <2>affected pods that this ingress rule will apply to.", + "Show a preview of the <2>affected pods that this policy will apply to": "Show a preview of the <2>affected pods that this policy will apply to", + "Show a preview of the <2>matching pods that this selector will apply to": "Show a preview of the <2>matching pods that this selector will apply to", + "Show less": "Show less", + "Showing {{shown}} from {{total}} results": "Showing {{shown}} from {{total}} results", + "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.": "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.", + "Status": "Status", + "Subnet": "Subnet", + "Subnet CIDR": "Subnet CIDR", + "Subnets": "Subnets", + "Subnets are used for the pod network across the cluster.": "Subnets are used for the pod network across the cluster.", + "Switch and delete": "Switch and delete", + "Switching to form view will delete any invalid YAML.": "Switching to form view will delete any invalid YAML.", + "Target pods": "Target pods", + "Target port": "Target port", + "Target port for traffic": "Target port for traffic", + "Target port names must be valid DNS labels": "Target port names must be valid DNS labels", + "Tech preview": "Tech preview", + "Terminating": "Terminating", + "Termination type": "Termination type", + "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").", + "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.": "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.", + "These IP addresses will be reused by other pods if requested.": "These IP addresses will be reused by other pods if requested.", + "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated": "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated", + "This action will remove all rules within the Egress section and cannot be undone.": "This action will remove all rules within the Egress section and cannot be undone.", + "This action will remove all rules within the Ingress section and cannot be undone.": "This action will remove all rules within the Ingress section and cannot be undone.", + "This action will remove all subnets and cannot be undone.": "This action will remove all subnets and cannot be undone.", + "This field is only allowed for \"Primary\" network.": "This field is only allowed for \"Primary\" network.", + "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.", + "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.": "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.", + "This network must be created before you create any workload in this project": "This network must be created before you create any workload in this project", + "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.": "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.", + "This route splits traffic across multiple services.": "This route splits traffic across multiple services.", + "TLS certificate": "TLS certificate", + "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.": "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.", + "TLS is not enabled": "TLS is not enabled", + "TLS Settings": "TLS Settings", + "TLS termination": "TLS termination", + "To": "To", + "To ports": "To ports", + "To troubleshoot, view logs and events, then debug in terminal.": "To troubleshoot, view logs and events, then debug in terminal.", + "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.": "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.", + "Topology": "Topology", + "Topology describes network configuration.": "Topology describes network configuration.", + "total limit": "total limit", + "total requested": "total requested", + "Traffic": "Traffic", + "Traffic in": "Traffic in", + "Traffic out": "Traffic out", + "True": "True", + "Type": "Type", + "Type is required": "Type is required", + "Unknown": "Unknown", + "unknown host": "unknown host", + "Unknown: endpoint readiness not available": "Unknown: endpoint readiness not available", + "Unknown: endpoint readiness not loaded": "Unknown: endpoint readiness not loaded", + "Updated": "Updated", + "Use \"{{inputValue}}\"": "Use \"{{inputValue}}\"", + "Use the default Pod network": "Use the default Pod network", "UserDefinedNetwork": "UserDefinedNetwork", "UserDefinedNetworks": "UserDefinedNetworks", - "Value": "Valor", - "Value hidden": "Valor oculto", - "Values": "Valores", - "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.": "Valores es una matriz de valores de cadena. Si el operador es In o NotIn, la matriz Valores no debe estar vacía. Si el operador es Exists o DoesNotExist, la matriz Valores debe estar vacía. Esta matriz se reemplaza durante una revisión de fusión estratégica.", - "View all {{total}} results": "Ver todos los {{total}} resultados", - "View events": "Ver eventos", - "View logs": "Ver registros", - "View naming information": "Ver información de nombres", - "Virtual Machines": "Máquinas virtuales", + "Value": "Value", + "Value hidden": "Value hidden", + "Values": "Values", + "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", + "View all {{total}} results": "View all {{total}} results", + "View events": "View events", + "View logs": "View logs", + "View naming information": "View naming information", + "Virtual Machines": "Virtual Machines", + "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.": "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.", "VLAN": "VLAN", - "VLAN tag number": "Número de etiqueta VLAN", - "Weight": "Peso", - "When omitted, the platform will choose a reasonable default which is subject to change over time.": "Cuando se omite, la plataforma elegirá un valor predeterminado razonable que está sujeto a cambios con el tiempo.", - "When using the OpenShift SDN cluster network provider:": "Cuando utilice el proveedor de red del clúster OpenShift SDN:", - "Wildcard policy": "Política de comodines", - "with exceptions": "con excepciones", + "VLAN tag number": "VLAN tag number", + "Weight": "Weight", + "When omitted, the platform will choose a reasonable default which is subject to change over time.": "When omitted, the platform will choose a reasonable default which is subject to change over time.", + "When using the OpenShift SDN cluster network provider:": "When using the OpenShift SDN cluster network provider:", + "Wildcard policy": "Wildcard policy", + "with exceptions": "with exceptions", "YAML": "YAML", - "YAML view": "Vista YAML", - "You don't have access to this section due to cluster policy.": "No tiene acceso a esta sección debido a la política del clúster.", - "You don't have permission to perform this action": "No tiene permiso para realizar esta acción.", - "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.": "Debe crear un espacio de nombres para poder crear proyectos que comiencen con 'openshift-', 'kubernetes-' o 'kube-'." + "YAML view": "YAML view", + "You don't have access to this section due to cluster policy.": "You don't have access to this section due to cluster policy.", + "You don't have permission to perform this action": "You don't have permission to perform this action", + "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.": "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'." } diff --git a/locales/fr/plugin__networking-console-plugin.json b/locales/fr/plugin__networking-console-plugin.json index a36b6af4..38a87efc 100644 --- a/locales/fr/plugin__networking-console-plugin.json +++ b/locales/fr/plugin__networking-console-plugin.json @@ -1,509 +1,510 @@ { - " See more details in: <3>": " Pour plus d’informations, consultez\u00a0: <3>", - " See more details in: <3>.": " Pour plus d’informations, consultez\u00a0: <3>.", - "(all nodes): ": "(tous les nœuds)\u00a0: ", + " See more details in: <3>": " See more details in: <3>", + " See more details in: <3>.": " See more details in: <3>.", + "(all nodes): ": "(all nodes): ", "{{count}} annotation_one": "{{count}} annotation", "{{count}} annotation_many": "{{count}} annotation", - "{{count}} annotation_other": "{{count}} annotations", - "{{kind}} details": "{{kind}} détails", - "{{kind}} disabled": "{{kind}} d.sactivé", - "{{numCores}} cores": "{{numCores}} noyaux", - "{{path}} found in resource, but is not supported in form.": "{{path}} a été trouvé dans la ressource, mais n’est pas pris en charge dans le formulaire.", - "{{path}} is missing.": "{{path}} est manquant.", - "{{path}} should be an Array.": "{{path}} doit être un tableau.", - "{{path}} should not be empty.": "{{path}} ne doit pas être vide.", - "{{value}} at {{date}}": "{{value}} à {{date}}", - "+{{count}} more_one": "+{{count}} de plus", + "{{count}} annotation_other": "{{count}} annotation", + "{{kind}} details": "{{kind}} details", + "{{kind}} disabled": "{{kind}} disabled", + "{{numCores}} cores": "{{numCores}} cores", + "{{path}} found in resource, but is not supported in form.": "{{path}} found in resource, but is not supported in form.", + "{{path}} is missing.": "{{path}} is missing.", + "{{path}} should be an Array.": "{{path}} should be an Array.", + "{{path}} should not be empty.": "{{path}} should not be empty.", + "{{value}} at {{date}}": "{{value}} at {{date}}", + "+{{count}} more_one": "+{{count}} more", "+{{count}} more_many": "+{{count}} more", - "+{{count}} more_other": "+{{count}} de plus", - "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.": "L’<0>opérateur de virtualisation\u00a0OpenShift ou l’<3>opérateur réseau SR-IOV doit être installé sur le cluster, afin de choisir le type de réseau.", - "404: Page Not Found": "404\u00a0: Page introuvable", - "A number between 0 and 255 that depicts relative weight compared with other targets.": "Nombre compris entre 0 et 255 qui représente le poids relatif par rapport à d’autres cibles.", - "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').": "Un nom de projet doit être composé de caractères alphanumériques minuscules ou « - » et doit commencer et se terminer par un caractère alphanumérique (par exemple « mon-nom » ou « 123-abc »).", - "A unique name for the Route within the project": "Nom unique de Route dans le projet.", - "Accessible outside the cluster": "Accessible en dehors du cluster", - "Accessible within the cluster only": "Accessible au sein du cluster uniquement", + "+{{count}} more_other": "+{{count}} more", + "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.": "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.", + "404: Page Not Found": "404: Page Not Found", + "A number between 0 and 255 that depicts relative weight compared with other targets.": "A number between 0 and 255 that depicts relative weight compared with other targets.", + "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').": "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').", + "A unique name for the Route within the project": "A unique name for the Route within the project", + "Accessible outside the cluster": "Accessible outside the cluster", + "Accessible within the cluster only": "Accessible within the cluster only", "Actions": "Actions", - "Adapter model": "Modèle d'adaptateur", - "Add": "Ajouter", - "Add allowed destination": "Ajouter une destination autorisée", - "Add allowed source": "Ajouter une source autorisée", - "Add alternate Service": "Ajouter un service alternatif", - "Add egress rule": "Ajouter une règle de sortie", - "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.": "Ajoutez des règles de sortie à appliquer aux pods sélectionnés. Le trafic est autorisé vers les pods s’il correspond à au moins une règle.", - "Add exception": "Ajouter une exception", - "Add expression": "Ajouter une expression", - "Add ingress rule": "Ajouter une règle d’entrée", - "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.": "Ajoutez des règles d’entrée à appliquer aux pods sélectionnés. Le trafic est autorisé à partir des pods s’il correspond à au moins une règle.", - "Add label": "Ajouter une étiquette", - "Add namespace selector": "Ajouter un sélecteur d’espace de noms", - "Add pod selector": "Ajouter un sélecteur de pod", - "Add port": "Ajouter un port", - "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.": "Ajoutez les ports pour lesquels restreindre le trafic. Si aucun port n’est indiqué dans votre stratégie, tous les ports seront accessibles au trafic.", - "Add subnet": "Ajouter un sous-réseau", - "Add virtual machines": "Ajouter des machines virtuelles", - "All incoming traffic is denied to Pods in {{namespace}}": "Tout le trafic entrant est refusé aux pods dans {{namespace}}", - "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.": "Tout le trafic sortant est autorisé par défaut. Les règles de sortie peuvent être utilisées pour restreindre le trafic sortant si le fournisseur de réseau du cluster le permet. Lors de l’utilisation du fournisseur de réseau de cluster OpenShift SDN, la stratégie réseau de sortie n’est pas prise en charge.", - "All outgoing traffic is denied from Pods in {{namespace}}": "Tout le trafic sortant issu des pods dans {{namespace}} est refusé", - "All pods within {{namespace}}": "Tous les pods à l'intérieur {{namespace}}", - "Allow": "Autoriser", - "Allow peers by IP block": "Autoriser les homologues par bloc IP", - "Allow pods from inside the cluster": "Autoriser les pods depuis l’intérieur du cluster", - "Allow pods from the same namespace": "Autoriser les pods du même espace de noms", - "Allow traffic from peers by IP block": "Autoriser le trafic provenant des homologues par bloc\u00a0IP", - "Allow traffic from pods in the same namespace": "Autoriser le trafic provenant des pods appartenant au même espace de noms", - "Allow traffic from pods inside the cluster": "Autoriser le trafic provenant des pods à l’intérieur du cluster", - "Allow traffic to peers by IP block": "Autoriser le trafic à destination des homologues par bloc\u00a0IP", - "Allow traffic to pods in the same namespace": "Autoriser le trafic à destination des pods appartenant au même espace de noms", - "Allow traffic to pods inside the cluster": "Autoriser le trafic à destination des pods à l’intérieur du cluster", - "Alternate Service target": "Cible du service alternatif", - "Alternate Service to route to.": "Service alternatif vers lequel router le trafic.", - "Alternate Service weight": "Poids du service alternatif", - "An error occurred.": "Une erreur s’est produite.", - "An error occurred. Please try again.": "Une erreur s’est produite. Veuillez réessayer.", - "An OpenShift project is an alternative representation of a Kubernetes namespace.": "Un projet OpenShift est une représentation alternative d’un espace de noms Kubernetes.", + "Adapter model": "Adapter model", + "Add": "Add", + "Add allowed destination": "Add allowed destination", + "Add allowed source": "Add allowed source", + "Add alternate Service": "Add alternate Service", + "Add egress rule": "Add egress rule", + "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.": "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.", + "Add exception": "Add exception", + "Add expression": "Add expression", + "Add ingress rule": "Add ingress rule", + "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.": "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.", + "Add label": "Add label", + "Add namespace selector": "Add namespace selector", + "Add pod selector": "Add pod selector", + "Add port": "Add port", + "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.": "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.", + "Add subnet": "Add subnet", + "Add virtual machines": "Add virtual machines", + "All incoming traffic is denied to Pods in {{namespace}}": "All incoming traffic is denied to Pods in {{namespace}}", + "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.": "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.", + "All outgoing traffic is denied from Pods in {{namespace}}": "All outgoing traffic is denied from Pods in {{namespace}}", + "All pods within {{namespace}}": "All pods within {{namespace}}", + "Allow": "Allow", + "Allow peers by IP block": "Allow peers by IP block", + "Allow pods from inside the cluster": "Allow pods from inside the cluster", + "Allow pods from the same namespace": "Allow pods from the same namespace", + "Allow traffic from peers by IP block": "Allow traffic from peers by IP block", + "Allow traffic from pods in the same namespace": "Allow traffic from pods in the same namespace", + "Allow traffic from pods inside the cluster": "Allow traffic from pods inside the cluster", + "Allow traffic to peers by IP block": "Allow traffic to peers by IP block", + "Allow traffic to pods in the same namespace": "Allow traffic to pods in the same namespace", + "Allow traffic to pods inside the cluster": "Allow traffic to pods inside the cluster", + "Alternate Service target": "Alternate Service target", + "Alternate Service to route to.": "Alternate Service to route to.", + "Alternate Service weight": "Alternate Service weight", + "An error occurred.": "An error occurred.", + "An error occurred. Please try again.": "An error occurred. Please try again.", + "An OpenShift project is an alternative representation of a Kubernetes namespace.": "An OpenShift project is an alternative representation of a Kubernetes namespace.", "annotation_one": "annotation", "annotation_many": "annotation", - "annotation_other": "annotations", + "annotation_other": "annotation", "Annotations": "Annotations", - "Any namespace": "N’importe quel espace de noms", - "Any peer": "N’importe quel homologue", - "Any pod": "N’importe quel pod", - "Any port": "N’importe quel port", - "Are you sure you want to remove <2> from <5>{nadName}?": "Êtes-vous sûr de vouloir supprimer<2> depuis<5>{nadName} ?", - "Are you sure you want to remove <2> from <5>{udnName}?": "Êtes-vous sûr de vouloir supprimer<2> depuis<5>{udnName} ?", - "Are you sure?": "Confirmez-vous cette action\u00a0?", - "Assigns IP addresses from this subnet to Pods and VirtualMachines.": "Attribue des adresses IP de ce sous-réseau aux pods et aux machines virtuelles.", - "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.": "Lors de sa création, l'espace de noms doit être configuré avec<2>{{label}} étiquette. Aller à<5> Espaces de noms pour créer un nouvel espace de noms.", - "At least one port is required": "Au moins un port est requis", - "Backend health": "État de fonctionnement du backend", - "Bridge name": "Nom du pont", - "Browse...": "Parcourir...", - "CA certificate": "Certificat d’autorité de certification", - "Can't preview matching {{resourceName}}": "Impossible de prévisualiser la correspondance {{resourceName}}", - "Can't preview pods": "Impossible de prévisualiser les pods", - "Cancel": "Annuler", - "Certificate": "Certificat", - "Certificates": "Certificats", + "Any namespace": "Any namespace", + "Any peer": "Any peer", + "Any pod": "Any pod", + "Any port": "Any port", + "Are you sure you want to remove <2> from <5>{nadName}?": "Are you sure you want to remove <2> from <5>{nadName}?", + "Are you sure you want to remove <2> from <5>{udnName}?": "Are you sure you want to remove <2> from <5>{udnName}?", + "Are you sure?": "Are you sure?", + "Assigns IP addresses from this subnet to Pods and VirtualMachines.": "Assigns IP addresses from this subnet to Pods and VirtualMachines.", + "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.": "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.", + "At least one port is required": "At least one port is required", + "Backend health": "Backend health", + "Bridge name": "Bridge name", + "Browse...": "Browse...", + "CA certificate": "CA certificate", + "Can't preview matching {{resourceName}}": "Can't preview matching {{resourceName}}", + "Can't preview pods": "Can't preview pods", + "Cancel": "Cancel", + "Certificate": "Certificate", + "Certificates": "Certificates", "CIDR": "CIDR", - "Clear": "Effacer", - "Clear input value": "Effacer la valeur d'entrée", - "Click <1>Create {{kind}} to create your first {{kind}}": "Cliquez<1> Créer{{kind}} pour créer votre premier {{kind}}", - "Cluster administrator permissions are required to enable this feature.": "Des autorisations d’administrateur de cluster sont requises pour activer cette fonctionnalité.", - "Cluster IP": "IP du cluster", - "Cluster-wide UserDefinedNetworks": "Réseaux définis par l'utilisateur à l'échelle du cluster", + "Clear": "Clear", + "Clear input value": "Clear input value", + "Click <1>Create {{kind}} to create your first {{kind}}": "Click <1>Create {{kind}} to create your first {{kind}}", + "Cluster administrator permissions are required to enable this feature.": "Cluster administrator permissions are required to enable this feature.", + "Cluster IP": "Cluster IP", + "Cluster-wide UserDefinedNetworks": "Cluster-wide UserDefinedNetworks", "ClusterUserDefinedNetwork": "ClusterUserDefinedNetwork", - "ClusterUserDefinedNetwork name": "Nom du réseau défini par l'utilisateur du cluster", + "ClusterUserDefinedNetwork name": "ClusterUserDefinedNetwork name", "ClusterUserDefinedNetworks": "ClusterUserDefinedNetworks", - "Completed": "Terminé", + "Completed": "Completed", "Conditions": "Conditions", - "Configure in Virtual machine networks page": "Configurer dans la page Réseaux de machines virtuelles", - "Configure via:": "Configurer via\u00a0:", - "Confirm": "Confirmer", - "Connection rate": "Débit de la connexion", + "Configure in Virtual machine networks page": "Configure in Virtual machine networks page", + "Configure via:": "Configure via:", + "Confirm": "Confirm", + "Connection rate": "Connection rate", "ConsoleQuickStart": "ConsoleQuickStart", "ConsoleQuickStarts": "ConsoleQuickStarts", - "Copied": "Copié", - "Copied to clipboard": "Copié dans le Presse-papiers", - "Copy": "Copier", - "Copy to clipboard": "Copier dans le Presse-papiers", - "CPU": "Processeur", + "Copied": "Copied", + "Copied to clipboard": "Copied to clipboard", + "Copy": "Copy", + "Copy to clipboard": "Copy to clipboard", + "CPU": "CPU", "CrashLoopBackOff": "CrashLoopBackOff", - "CrashLoopBackOff indicates that the application within the container is failing to start properly.": "CrashLoopBackOff indique que l’application dans le conteneur ne parvient pas à démarrer correctement.", - "Create": "Créer", - "Create {{ kind }}": "Créer {{ kind }}", - "Create {{kind}}": "Créer {{kind}}", - "Create {{label}}": "Créer {{label}}", - "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.": "Créez un service à l'aide du formulaire. Passez en mode YAML pour un contrôle total, y compris sur les champs non affichés dans le formulaire.", - "Create by completing the form.": "Créez en remplissant le formulaire.", - "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.": "Créez en saisissant manuellement les définitions YAML ou JSON, ou en faisant glisser un fichier dans l’éditeur.", - "Create ClusterUserDefinedNetwork": "Créer un réseau défini par l'utilisateur en cluster", - "Create Ingress": "Créer Ingress", - "Create NetworkAttachmentDefinition": "Créer NetworkAttachmentDefinition", - "Create Project": "Créer Projet", - "Create Route": "Créer un itinéraire", - "Create Service": "Créer un service", - "Create UserDefinedNetwork": "Créer un réseau défini par l'utilisateur", - "Created": "Créé", - "Created at": "Heure de création", - "Current selections": "Sélections actuelles", - "Custom route": "Itinéraire personnalisé", - "Debug container {{name}}": "Déboguer le conteneur {{name}}", - "Define a new UserDefinedNetwork for this project": "Définissez un nouveau réseau défini par l'utilisateur pour ce projet.", - "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.": "Définissez le réseau utilisé par les machines virtuelles et les pods pour communiquer dans le projet donné. En savoir plus sur<2> réseau principal défini par l'utilisateur .", - "Define the network used by VirtualMachines and Pods to communicate in this project": "Définissez le réseau utilisé par les machines virtuelles et les pods pour communiquer dans ce projet.", - "Degraded: {{ready}} of {{total}} endpoints ready": "Dégradé : {{ready}} de {{total}} points de terminaison prêts", - "Delete": "Supprimer", - "Delete {{kind}}": "Supprimer {{kind}}", - "Delete Ingress": "Supprimer Ingress", - "Delete NetworkAttachmentDefinition": "Supprimer NetworkAttachmentDefinition", - "Delete Route": "Supprimer Route", - "Delete Service": "Supprimer Service", - "Deletion protection": "Protection contre la suppression", - "Deny all egress traffic": "Refuser tout le trafic sortant", - "Deny all ingress traffic": "Refuser tout le trafic entrant", + "CrashLoopBackOff indicates that the application within the container is failing to start properly.": "CrashLoopBackOff indicates that the application within the container is failing to start properly.", + "Create": "Create", + "Create {{ kind }}": "Create {{ kind }}", + "Create {{kind}}": "Create {{kind}}", + "Create {{label}}": "Create {{label}}", + "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.": "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.", + "Create by completing the form.": "Create by completing the form.", + "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.": "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.", + "Create ClusterUserDefinedNetwork": "Create ClusterUserDefinedNetwork", + "Create Ingress": "Create Ingress", + "Create NetworkAttachmentDefinition": "Create NetworkAttachmentDefinition", + "Create Project": "Create Project", + "Create Route": "Create Route", + "Create Service": "Create Service", + "Create UserDefinedNetwork": "Create UserDefinedNetwork", + "Created": "Created", + "Created at": "Created at", + "Current selections": "Current selections", + "Custom route": "Custom route", + "Debug container {{name}}": "Debug container {{name}}", + "Define a new UserDefinedNetwork for this project": "Define a new UserDefinedNetwork for this project", + "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.": "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.", + "Define the network used by VirtualMachines and Pods to communicate in this project": "Define the network used by VirtualMachines and Pods to communicate in this project", + "Degraded: {{ready}} of {{total}} endpoints ready": "Degraded: {{ready}} of {{total}} endpoints ready", + "Delete": "Delete", + "Delete {{kind}}": "Delete {{kind}}", + "Delete Ingress": "Delete Ingress", + "Delete NetworkAttachmentDefinition": "Delete NetworkAttachmentDefinition", + "Delete Route": "Delete Route", + "Delete Service": "Delete Service", + "Deletion protection": "Deletion protection", + "Deny all egress traffic": "Deny all egress traffic", + "Deny all ingress traffic": "Deny all ingress traffic", "Description": "Description", - "Destination CA certificate": "Certificat d’autorité de certification de destination", - "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.": "Les destinations ajoutées à cette règle autoriseront le trafic provenant des pods définis ci-dessus. Les destinations de cette liste sont combinées à l’aide d’une opération logique OU.", - "Details": "Détails", - "Disabled": "Désactivé", - "Display name": "Nom complet", - "Do you need to set up custom DNS?": "Avez-vous besoin de configurer un DNS\u00a0personnalisé\u00a0?", - "Down: {{ready}} of {{total}} endpoints ready": "Hors service : {{ready}} de {{total}} points de terminaison prêts", - "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.": "Les clusters à double pile peuvent définir 2 sous-réseaux (un pour chaque famille IP), sinon un seul sous-réseau est autorisé.", - "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "Les clusters à double pile peuvent configurer deux sous-réseaux (un pour chaque famille d'adresses IP)\u00a0; sinon, un seul sous-réseau est autorisé. Le format doit correspondre à la notation CIDR standard (par exemple, «\u00a0192.168.123.0/24\u00a0»).", - "Duplicate keys found in main pod selector": "Clés en double trouvées dans le sélecteur de pod principal", - "Duplicate keys found in peer namespace selector": "Clés en double trouvées dans le sélecteur d’espace de noms homologue", - "Duplicate keys found in peer pod selector": "Clés en double trouvées dans le sélecteur de pod homologue", - "Edge": "Périphérie", - "Edit": "Modifier", - "Edit {{kind}}": "Modifier {{kind}}", - "Edit {{label}}": "Modifier {{label}}", - "Edit annotations": "Modifier les annotations", - "Edit Ingress": "Modifier Ingress", - "Edit labels": "Modifier les étiquettes", - "Edit NetworkAttachmentDefinition": "Modifier NetworkAttachmentDefinition", - "Edit Pod selector": "Modifier le sélecteur de pod", - "Edit Route": "Modifier l’itinéraire", - "Edit Service": "Modifier le service", - "Egress": "Sortie", - "Egress network policy is not supported.": "La stratégie de réseau de sortie n’est pas prise en charge.", - "Egress rule": "Règle de sortie", - "Egress rules": "Règles de sortie", - "Enable {{kind}}": "Activer {{kind}}", - "Enabled": "Activé", + "Destination CA certificate": "Destination CA certificate", + "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.": "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.", + "Details": "Details", + "Disabled": "Disabled", + "Display name": "Display name", + "Do you need to set up custom DNS?": "Do you need to set up custom DNS?", + "Down: {{ready}} of {{total}} endpoints ready": "Down: {{ready}} of {{total}} endpoints ready", + "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.": "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.", + "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").", + "Duplicate keys found in main pod selector": "Duplicate keys found in main pod selector", + "Duplicate keys found in peer namespace selector": "Duplicate keys found in peer namespace selector", + "Duplicate keys found in peer pod selector": "Duplicate keys found in peer pod selector", + "Edge": "Edge", + "Edit": "Edit", + "Edit {{kind}}": "Edit {{kind}}", + "Edit {{label}}": "Edit {{label}}", + "Edit annotations": "Edit annotations", + "Edit Ingress": "Edit Ingress", + "Edit labels": "Edit labels", + "Edit NetworkAttachmentDefinition": "Edit NetworkAttachmentDefinition", + "Edit Pod selector": "Edit Pod selector", + "Edit Route": "Edit Route", + "Edit Service": "Edit Service", + "Egress": "Egress", + "Egress network policy is not supported.": "Egress network policy is not supported.", + "Egress rule": "Egress rule", + "Egress rules": "Egress rules", + "Enable {{kind}}": "Enable {{kind}}", + "Enabled": "Enabled", "EndpointSlice": "EndpointSlice", "EndpointSlices": "EndpointSlices", - "Error": "Erreur", - "Error details": "Détails de l’erreur", - "Error loading virtual machines": "Erreur lors du chargement des machines virtuelles", - "Example: 100": "Exemple: 100", + "Error": "Error", + "Error details": "Error details", + "Error loading virtual machines": "Error loading virtual machines", + "Example: 100": "Example: 100", "Exceptions": "Exceptions", - "External DNS name this service resolves to (e.g. example.com).": "Nom DNS externe auquel ce service se résout (par exemple, example.com).", - "External IP": "IP externe", - "External load balancer": "Équilibreur de charge externe", - "External name": "Nom externe", - "External name is required": "Le nom externe est requis.", - "External name must be a valid hostname": "Le nom externe doit être un nom d'hôte valide", - "External service name": "Nom du service externe", - "Failed": "Ayant échoué", - "Failed to add the following virtual machines: {{names}}": "Impossible d'ajouter les machines virtuelles suivantes\u00a0: {{names}}", - "Failed to remove virtual machine from network": "Impossible de supprimer la machine virtuelle du réseau", - "Failed to retrieve the list of projects": "Impossible de récupérer la liste des projets", - "False": "Faux", - "Form view": "Vue Formulaire", - "From": "Depuis", - "From pods": "Depuis les pods", - "Given subnet is split into smaller subnets for every node.": "Le sous-réseau donné est divisé en sous-réseaux plus petits pour chaque nœud.", - "Health": "État de fonctionnement", - "Healthy: {{ready}} of {{total}} endpoints ready": "En bon état de fonctionnement : {{ready}} de {{total}} points de terminaison prêts", - "Hide": "Masquer", - "Hide selected Namespace(s)": "Masquer les espaces de noms sélectionnés", - "Host": "Hôte", - "Hostname": "Nom d’hôte", - "Hosts": "Hôtes", - "HostSubnet": "Sous-réseau hôte", - "If no namespace selector is provided, pods from all namespaces will be eligible.": "Si aucun sélecteur d’espace de noms n’est fourni, les pods de tous les espaces de noms seront éligibles.", - "If no pod selector is provided, the policy will apply to all pods in the namespace.": "Si aucun sélecteur de pod n’est fourni, la stratégie s’appliquera à tous les pods de l’espace de noms.", - "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "Si aucun sélecteur de pod n’est fourni, le trafic provenant de tous les pods dans les espaces de noms éligibles sera autorisé.", - "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "Si aucun sélecteur de pod n’est fourni, le trafic provenant de tous les pods de cet espace de noms sera autorisé.", - "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "Si aucun sélecteur de pod n’est fourni, le trafic vers tous les pods dans les espaces de noms éligibles sera autorisé.", - "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "Si aucun sélecteur de pod n’est fourni, le trafic vers tous les pods de cet espace de noms sera autorisé.", - "If this field is empty, traffic will be allowed from all external sources.": "Si ce champ est vide, le trafic provenant de toutes les sources externes sera autorisé.", - "If this field is empty, traffic will be allowed to all external sources.": "Si ce champ est vide, le trafic sera autorisé vers toutes les sources externes.", - "Ingress": "Entrée", - "Ingress details": "Détails d’entrée", - "Ingress points of load balancer": "Points d’entrée de l’équilibreur de charge", - "Ingress rule": "Règle d’entrée", - "Ingress rules": "Règles d’entrée", - "Ingresses": "Entrées", - "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}": "Erreur de saisie\u00a0: les sélecteurs doivent commencer et se terminer par une lettre ou un chiffre, et ne peuvent contenir que les caractères -, _, / ou . Valeur erronée\u00a0: {{offendingSelector}}", - "Insecure traffic": "Trafic non sécurisé", + "External DNS name this service resolves to (e.g. example.com).": "External DNS name this service resolves to (e.g. example.com).", + "External IP": "External IP", + "External load balancer": "External load balancer", + "External name": "External name", + "External name is required": "External name is required", + "External name must be a valid hostname": "External name must be a valid hostname", + "External service name": "External service name", + "Failed": "Failed", + "Failed to add the following virtual machines: {{names}}": "Failed to add the following virtual machines: {{names}}", + "Failed to remove virtual machine from network": "Failed to remove virtual machine from network", + "Failed to retrieve the list of projects": "Failed to retrieve the list of projects", + "False": "False", + "Form view": "Form view", + "From": "From", + "From pods": "From pods", + "Given subnet is split into smaller subnets for every node.": "Given subnet is split into smaller subnets for every node.", + "Health": "Health", + "Healthy: {{ready}} of {{total}} endpoints ready": "Healthy: {{ready}} of {{total}} endpoints ready", + "Hide": "Hide", + "Hide selected Namespace(s)": "Hide selected Namespace(s)", + "Host": "Host", + "Hostname": "Hostname", + "Hosts": "Hosts", + "HostSubnet": "HostSubnet", + "If no namespace selector is provided, pods from all namespaces will be eligible.": "If no namespace selector is provided, pods from all namespaces will be eligible.", + "If no pod selector is provided, the policy will apply to all pods in the namespace.": "If no pod selector is provided, the policy will apply to all pods in the namespace.", + "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.", + "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "If no pod selector is provided, traffic from all pods in this namespace will be allowed.", + "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.", + "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "If no pod selector is provided, traffic to all pods in this namespace will be allowed.", + "If this field is empty, traffic will be allowed from all external sources.": "If this field is empty, traffic will be allowed from all external sources.", + "If this field is empty, traffic will be allowed to all external sources.": "If this field is empty, traffic will be allowed to all external sources.", + "Ingress": "Ingress", + "Ingress details": "Ingress details", + "Ingress points of load balancer": "Ingress points of load balancer", + "Ingress rule": "Ingress rule", + "Ingress rules": "Ingress rules", + "Ingresses": "Ingresses", + "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}": "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}", + "Insecure traffic": "Insecure traffic", "Interface": "Interface", - "Invalid IP address or subnet format": "Adresse IP ou format de sous-réseau non valide", - "Invalid subnet format": "Format de sous-réseau non valide", - "Invalid YAML cannot be persisted": "Un code YAML non valide ne peut pas être rendu persistant", - "IP address": "Adresse IP", - "IP address management": "Gestion des adresses IP", - "IP Addresses accepting traffic for service": "Adresses IP acceptant le trafic pour le service", - "IP block exceptions are not supported and would cause the entire IP block section to be ignored.": "Les exceptions de bloc IP ne sont pas prises en charge, car elles auraient pour effet d’ignorer la totalité de la section Bloc IP.", - "IP blocks": "Blocs\u00a0IP", - "IPAM Lifecycle": "Cycle de vie IPAM", - "IPAMLifecycle": "Cycle de vie IPAM", - "IPAMLifecycle controls IP addresses management lifecycle.": "IPAMLifecycle contrôle le cycle de vie de la gestion des adresses IP.", - "It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "Il n'est pas recommandé de renseigner ce champ sans besoin explicite et sans compréhension de la topologie du réseau OVN.", - "JoinSubnets": "Joindre des sous-réseaux", - "JoinSubnets are used inside the OVN network topology.": "Les sous-réseaux JoinSubnets sont utilisés au sein de la topologie du réseau OVN.", - "Key": "Clé", - "key is the label key that the selector applies": "La clé est la clé d'étiquette que le sélecteur applique", - "Kind": "Type", - "Labels": "Étiquettes", - "Layer2 topology creates one logical switch shared by all nodes.": "La topologie de couche 2 crée un commutateur logique partagé par tous les nœuds.", - "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.": "La topologie de couche 3 crée un segment de couche 2 par nœud, chacun avec un sous-réseau différent. Le routage de couche 3 est utilisé pour interconnecter les sous-réseaux des nœuds.", - "Learn how to use NetworkAttachmentDefinitions": "Découvrez comment utiliser les définitions de rattachement de réseau", - "Learn more about {{ kind }}": "En savoir plus sur {{ kind }}", - "Learn more about working with projects": "En savoir plus sur l’utilisation de projets", - "List of {{resourceName}} matching": "Liste de {{resourceName}} correspondants", - "List of matching {{resourceName}}": "Liste des correspondances {{resourceName}}", - "List of pods": "Liste des pods", - "List of pods matching": "Liste des pods correspondants", - "Location": "Emplacement", - "Location of the resource that backs the service": "Emplacement de la ressource qui soutient le service", - "MAC spoof check": "Vérification d’usurpation d’identité MAC", - "Manage columns": "Gérer les colonnes", - "Managed by UserDefinedNetwork": "Géré par UserDefinedNetwork", - "Match Expressions": "Correspondance des expressions", - "Match Labels": "Étiquettes correspondantes", - "matchExpressions is a list of label selector requirements. The requirements are ANDed.": "matchExpressions est une liste d'exigences de sélection d'étiquettes. Ces exigences sont combinées par un ET logique.", - "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.": "matchLabels est une carte de{key,value} paires. Un seul{key,value} Dans la carte matchLabels, chaque élément est équivalent à un élément de matchExpressions dont le champ clé est «\u00a0key\u00a0», l’opérateur est «\u00a0In\u00a0» et le tableau de valeurs contient uniquement «\u00a0value\u00a0». Les conditions sont combinées par un ET logique.", - "Memory": "Mémoire", + "Invalid IP address or subnet format": "Invalid IP address or subnet format", + "Invalid subnet format": "Invalid subnet format", + "Invalid YAML cannot be persisted": "Invalid YAML cannot be persisted", + "IP address": "IP address", + "IP address management": "IP address management", + "IP Addresses accepting traffic for service": "IP Addresses accepting traffic for service", + "IP block exceptions are not supported and would cause the entire IP block section to be ignored.": "IP block exceptions are not supported and would cause the entire IP block section to be ignored.", + "IP blocks": "IP blocks", + "IPAM Lifecycle": "IPAM Lifecycle", + "IPAMLifecycle": "IPAMLifecycle", + "IPAMLifecycle controls IP addresses management lifecycle.": "IPAMLifecycle controls IP addresses management lifecycle.", + "It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "It is not recommended to set this field without explicit need and understanding of the OVN network topology.", + "JoinSubnets": "JoinSubnets", + "JoinSubnets are used inside the OVN network topology.": "JoinSubnets are used inside the OVN network topology.", + "Key": "Key", + "key is the label key that the selector applies": "key is the label key that the selector applies", + "Kind": "Kind", + "Labels": "Labels", + "Layer2 topology creates one logical switch shared by all nodes.": "Layer2 topology creates one logical switch shared by all nodes.", + "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.": "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.", + "Learn how to use NetworkAttachmentDefinitions": "Learn how to use NetworkAttachmentDefinitions", + "Learn more about {{ kind }}": "Learn more about {{ kind }}", + "Learn more about working with projects": "Learn more about working with projects", + "List of {{resourceName}} matching": "List of {{resourceName}} matching", + "List of matching {{resourceName}}": "List of matching {{resourceName}}", + "List of pods": "List of pods", + "List of pods matching": "List of pods matching", + "Location": "Location", + "Location of the resource that backs the service": "Location of the resource that backs the service", + "MAC spoof check": "MAC spoof check", + "Manage columns": "Manage columns", + "Managed by UserDefinedNetwork": "Managed by UserDefinedNetwork", + "Match Expressions": "Match Expressions", + "Match Labels": "Match Labels", + "matchExpressions is a list of label selector requirements. The requirements are ANDed.": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", + "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", + "Memory": "Memory", "Message": "Message", - "Metrics": "Métriques", - "Missing installed operators": "Opérateurs installés manquants", - "More information:": "Informations supplémentaires\u00a0:", + "Metrics": "Metrics", + "Missing installed operators": "Missing installed operators", + "More information:": "More information:", "MTU": "MTU", - "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.": "La MTU est facultative ; si elle n'est pas fournie, la valeur configurée globalement dans OVN-Kubernetes (1400 par défaut) est utilisée pour le réseau.", - "MTU is the maximum transmission unit for a network.": "L'unité de transmission maximale (MTU) d'un réseau.", + "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.": "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.", + "MTU is the maximum transmission unit for a network.": "MTU is the maximum transmission unit for a network.", "multi-networkpolicies": "multi-networkpolicies", "multi-networkpolicy": "multi-networkpolicy", - "MultiNetworkPolicies": "Politiques multi-réseaux", - "Name": "Nom", - "Name is required": " Le nom est obligatoire.", - "Namespace": "Espace de noms", - "Namespace is required": "L'espace de noms est requis.", - "Namespace selector": "Sélecteur d’espace de noms", - "Namespace Selector": "Sélecteur d'espace de noms", - "Namespace(s)": "Espace(s) de noms", - "Namespaced UserDefinedNetworks": "Réseaux définis par l'utilisateur avec espace de noms", - "Namespaces having all the supplied key/value pairs as labels will be selected.": "Les espaces de noms dont toutes les paires clé/valeur sont fournies comme étiquettes seront sélectionnés.", - "Naming information": "Informations sur l’attribution de nom", - "network": "réseau", - "Network": "Réseau", - "Network type": "Type de réseau", - "Network Type": "Type de réseau", + "MultiNetworkPolicies": "MultiNetworkPolicies", + "Name": "Name", + "Name is required": "Name is required", + "Namespace": "Namespace", + "Namespace is required": "Namespace is required", + "Namespace selector": "Namespace selector", + "Namespace Selector": "Namespace Selector", + "Namespace(s)": "Namespace(s)", + "Namespaced UserDefinedNetworks": "Namespaced UserDefinedNetworks", + "Namespaces having all the supplied key/value pairs as labels will be selected.": "Namespaces having all the supplied key/value pairs as labels will be selected.", + "Naming information": "Naming information", + "network": "network", + "Network": "Network", + "Network type": "Network type", + "Network Type": "Network Type", "NetworkAttachmentDefinitions": "NetworkAttachmentDefinitions", "NetworkPolicies": "NetworkPolicies", - "NetworkPolicies documentation": "Documentation sur les stratégies réseau", - "networks": "réseaux", - "Networks are not project-bound. Using the same name creates a shared NAD.": "Les réseaux ne sont pas liés à un projet. L’utilisation du même nom crée un NAD partagé.", - "Networks are not project-bound. Using the same name creates a shared UDN.": "Les réseaux ne sont pas liés à un projet spécifique. Utiliser le même nom crée un UDN partagé.", - "No {{kind}} found": "{{kind}} introuvable", - "No {{label}} found": "{{label}} introuvable", - "No {{resourceName}} matching the provided labels": "Aucun {{resourceName}} correspondant aux étiquettes fournies", - "No conditions found": "Aucune condition trouvée", - "No datapoints found.": "Aucun point de données trouvé.", - "No description": "Aucune description", - "No hosts": "Aucun hôte", - "No labels": "Aucune étiquette", + "NetworkPolicies documentation": "NetworkPolicies documentation", + "networks": "networks", + "Networks are not project-bound. Using the same name creates a shared NAD.": "Networks are not project-bound. Using the same name creates a shared NAD.", + "Networks are not project-bound. Using the same name creates a shared UDN.": "Networks are not project-bound. Using the same name creates a shared UDN.", + "No {{kind}} found": "No {{kind}} found", + "No {{label}} found": "No {{label}} found", + "No {{resourceName}} matching the provided labels": "No {{resourceName}} matching the provided labels", + "No conditions found": "No conditions found", + "No datapoints found.": "No datapoints found.", + "No description": "No description", + "No hosts": "No hosts", + "No labels": "No labels", "No matching OVN bridge mapping found for \"{{name}}\".": "No matching OVN bridge mapping found for \"{{name}}\".", - "No matching projects": "Aucun projet correspondant", - "No namespace is configured for a primary user-defined network": "Aucun espace de noms n'est configuré pour un réseau principal défini par l'utilisateur.", - "No NetworkAttachmentDefinition found": "Aucune NetworkAttachmentDefinition trouvée", - "No owner": "Aucun propriétaire", - "No pods matching the provided labels in the current namespace": "Aucun pod correspondant aux étiquettes fournies dans l’espace de noms actuel", - "No projects matched": "Aucun projet ne correspond.", - "No results found for \"{{inputValue}}\"": "Aucun résultat trouvé pour \"{{inputValue}} \"", - "No route status": "Aucun statut d’itinéraire", - "No selector": "Aucun sélecteur", - "No virtual machines found": "Aucune machine virtuelle trouvée", - "Node": "Nœud", - "Node port": "Port du nœud", + "No matching projects": "No matching projects", + "No namespace is configured for a primary user-defined network": "No namespace is configured for a primary user-defined network", + "No NetworkAttachmentDefinition found": "No NetworkAttachmentDefinition found", + "No owner": "No owner", + "No pods matching the provided labels in the current namespace": "No pods matching the provided labels in the current namespace", + "No projects matched": "No projects matched", + "No results found for \"{{inputValue}}\"": "No results found for \"{{inputValue}}\"", + "No route status": "No route status", + "No selector": "No selector", + "No virtual machines found": "No virtual machines found", + "Node": "Node", + "Node port": "Node port", "NodeNetworkConfigurationPolicy": "NodeNetworkConfigurationPolicy", - "None": "Aucun", - "Not available": "Non disponible", - "Not configured": "Non configuré", - "Not found": "Introuvable", - "Not Receiving Traffic": "Aucune réception de trafic", - "NS selector": "Sélecteur NS", + "None": "None", + "Not available": "Not available", + "Not configured": "Not configured", + "Not found": "Not found", + "Not Receiving Traffic": "Not Receiving Traffic", + "NS selector": "NS selector", "of": "of", - "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).": "Un port par ligne sous la forme [nom:]port:port_cible/PROTOCOLE (par exemple http:80:9376/TCP).", - "Only supported when \"subnets\" are set.": "Prise en charge uniquement lorsque les « sous-réseaux » sont définis.", - "Operator": "Opérateur", - "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.": "L'opérateur `In` représente la relation d'une clé avec un ensemble de valeurs. Les opérateurs valides sont `In`, `NotIn`, `Exists` et `DoesNotExist`.", - "Owner": "Propriétaire", - "Passthrough": "Intermédiaire", - "Path": "Chemin", - "Path that the router watches to route traffic to the service.": "Chemin que le routeur surveille pour acheminer le trafic vers le service.", - "Path type": "Type de chemin", - "Pending": "En attente", + "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).": "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).", + "Only supported when \"subnets\" are set.": "Only supported when \"subnets\" are set.", + "Operator": "Operator", + "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", + "Owner": "Owner", + "Passthrough": "Passthrough", + "Path": "Path", + "Path that the router watches to route traffic to the service.": "Path that the router watches to route traffic to the service.", + "Path type": "Path type", + "Pending": "Pending", "per page": "per page", - "Percent": "Pourcent", - "Persistent": "Persistant", + "Percent": "Percent", + "Persistent": "Persistent", "Phase": "Phase", - "Physical network name": "Nom du réseau physique", - "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.": "Nom du réseau physique. Un mappage de ponts doit être configuré sur les nœuds du cluster pour mapper les noms de réseaux physiques et les ponts Open\u00a0vSwitch.", - "Please <2>try again.": "Veuillez <2>réessayer.", - "Pod crash loop back-off": "Interruption de la boucle d’incidents du pod", - "Pod port or name": "Port ou nom du pod", - "Pod selector": "Sélecteur de pod", - "Pod selector for": "Sélecteur de pod pour", - "Pod unschedulable": "Pod non planifiable", - "pods": " pods", + "Physical network name": "Physical network name", + "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.": "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.", + "Please <2>try again.": "Please <2>try again.", + "Pod crash loop back-off": "Pod crash loop back-off", + "Pod port or name": "Pod port or name", + "Pod selector": "Pod selector", + "Pod selector for": "Pod selector for", + "Pod unschedulable": "Pod unschedulable", + "pods": "pods", "Pods": "Pods", - "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.": "Par défaut, les pods acceptent tout le trafic. Ils peuvent être isolés via des NetworkPolicies qui définissent une liste blanche de règles d'entrée. Lorsqu'un pod est sélectionné par une NetworkPolicy, il rejette tout le trafic non explicitement autorisé par cette NetworkPolicy.", - "Pods having all the supplied key/value pairs as labels will be selected.": "Les pods dont toutes les paires clé/valeur sont fournies comme étiquettes seront sélectionnés.", - "Policy for": "Stratégie pour", - "Policy name": "Nom de la stratégie", - "Policy type": "Type de stratégie", + "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.": "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.", + "Pods having all the supplied key/value pairs as labels will be selected.": "Pods having all the supplied key/value pairs as labels will be selected.", + "Policy for": "Policy for", + "Policy name": "Policy name", + "Policy type": "Policy type", "Port": "Port", - "Port is required": "Le port est requis", - "Port must be between 1 and 65535": "Le port doit être compris entre 1 et 65535.", - "Port names must be unique": "Les noms de ports doivent être uniques", - "Port names must be valid DNS labels": "Les noms de port doivent être des étiquettes DNS valides.", + "Port is required": "Port is required", + "Port must be between 1 and 65535": "Port must be between 1 and 65535", + "Port names must be unique": "Port names must be unique", + "Port names must be valid DNS labels": "Port names must be valid DNS labels", "Ports": "Ports", - "Ports must use the format [name:]port:targetPort/PROTOCOL": "Les ports doivent utiliser le format [nom:]port:port_cible/PROTOCOLE", - "Primary network is automatically assigned to every pod created in the same namespace.": "Un réseau principal est automatiquement attribué à chaque pod créé dans le même espace de noms.", - "Private key": "Clé privée", - "Project name": "Nom du projet", - "Protocol": "Protocole", - "Protocol must be TCP, UDP, or SCTP": "Le protocole doit être TCP, UDP ou SCTP.", - "Public hostname for the Route. If not specified, a hostname is generated.": "Nom d’hôte public de l’itinéraire. En l’absence de spécification, un nom d’hôte est généré.", - "Re-encrypt": "Rechiffrer", - "Ready": "Prêt", - "Reason": "Motif", - "Receiving Traffic": "Réception du trafic", - "Redirect": "Rediriger", - "Refer an existing ClusterUserDefinedNetwork": "Référencez un réseau défini par l'utilisateur de cluster existant", - "Refer to your cluster administrator to know which network provider is used.": "Demandez à l’administrateur de votre cluster quel fournisseur de réseau est utilisé.", - "Remove": "Supprimer", - "Remove all": "Supprimer tout", - "Remove alternate Service": "Supprimer un service alternatif", - "Remove exception": "Supprimer l’exception", - "Remove from network": "Retirer du réseau", - "Remove peer": "Supprimer l’homologue", - "Remove port": "Supprimer le port", - "Remove subnets?": "Supprimer les sous-réseaux\u00a0?", - "Remove virtual machine from network?": "Supprimer la machine virtuelle du réseau\u00a0?", - "Reset to default": "Réinitialiser par défaut", - "Resource name": "Nom de la ressource", - "Restarts": "Redémarre", - "Restricted Access": "Accès restreint", - "Reveal": "Afficher", - "Review selected Namespace(s)": "Examiner les espaces de noms sélectionnés", - "Role": "Rôle", - "Role describes the network role in the pod.": "Le rôle décrit le rôle du réseau dans le pod.", - "Route details": "Détails de l’itinéraire", - "Router canonical hostname": "Nom d’hôte canonique du routeur", - "Router: {{routerName}}": "Routeur\u00a0: {{routerName}}", - "Routes": "Itinéraires", - "Routes can be secured using several TLS termination types for serving certificates.": "Les itinéraires peuvent être sécurisés à l’aide de plusieurs types de terminaison\u00a0TLS pour le traitement des certificats.", - "Routing is a way to make your application publicly visible": "Le routage est un moyen de rendre votre application visible publiquement.", - "Rules": "Règles", - "Running": "En cours d’exécution", - "Save": "Enregistrer", - "Search by name...": "Rechercher par nom...", - "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.": "Le réseau secondaire n'est attribué qu'aux pods qui utilisent l'annotation k8s.v1.cni.cncf.io/networks pour sélectionner un réseau donné.", - "Secure Route": "Sécuriser l’itinéraire", - "Security": "Sécurité", - "Select a Project": "Sélectionnez un projet", - "Select a Service": "Sélectionner un service", - "Select all": "Tout sélectionner", - "Select an operator": "Sélectionnez un opérateur", - "Select ClusterUserDefinedNetwork": "Sélectionnez ClusterUserDefinedNetwork", - "Select default ingress and egress deny rules": "Sélectionner les règles de refus d’entrée et de sortie par défaut", - "Select insecure traffic type": "Sélectionner le type de trafic non sécurisé", - "Select one or more NetworkAttachmentDefinitions": "Sélectionnez une ou plusieurs définitions NetworkAttachmentDefinitions", - "Select resource name": "Sélectionnez le nom de la ressource", - "Select role": "Sélectionner un rôle", - "Select target port": "Sélectionner le port cible", - "Select termination type": "Sélectionner le type de terminaison", - "Select virtual machines to connect to this network.": "Sélectionnez les machines virtuelles à connecter à ce réseau.", - "Selected categories will be displayed in the table.": "Les catégories sélectionnées seront affichées dans le tableau.", - "Selector": "Sélecteur", - "Selector is required": "Un sélecteur est requis", - "Selector keys must be unique": "Les touches de sélection doivent être uniques", - "Selectors must use valid key=value pairs": "Les sélecteurs doivent utiliser des paires clé=valeur valides.", + "Ports must use the format [name:]port:targetPort/PROTOCOL": "Ports must use the format [name:]port:targetPort/PROTOCOL", + "Primary network is automatically assigned to every pod created in the same namespace.": "Primary network is automatically assigned to every pod created in the same namespace.", + "Private key": "Private key", + "Project name": "Project name", + "Protocol": "Protocol", + "Protocol must be TCP, UDP, or SCTP": "Protocol must be TCP, UDP, or SCTP", + "Public hostname for the Route. If not specified, a hostname is generated.": "Public hostname for the Route. If not specified, a hostname is generated.", + "Re-encrypt": "Re-encrypt", + "Ready": "Ready", + "Reason": "Reason", + "Receiving Traffic": "Receiving Traffic", + "Redirect": "Redirect", + "Refer an existing ClusterUserDefinedNetwork": "Refer an existing ClusterUserDefinedNetwork", + "Refer to your cluster administrator to know which network provider is used.": "Refer to your cluster administrator to know which network provider is used.", + "Remove": "Remove", + "Remove all": "Remove all", + "Remove alternate Service": "Remove alternate Service", + "Remove exception": "Remove exception", + "Remove from network": "Remove from network", + "Remove peer": "Remove peer", + "Remove port": "Remove port", + "Remove subnets?": "Remove subnets?", + "Remove virtual machine from network?": "Remove virtual machine from network?", + "Reset to default": "Reset to default", + "Resource name": "Resource name", + "Restarts": "Restarts", + "Restricted Access": "Restricted Access", + "Reveal": "Reveal", + "Review selected Namespace(s)": "Review selected Namespace(s)", + "Role": "Role", + "Role describes the network role in the pod.": "Role describes the network role in the pod.", + "Route details": "Route details", + "Router canonical hostname": "Router canonical hostname", + "Router: {{routerName}}": "Router: {{routerName}}", + "Routes": "Routes", + "Routes can be secured using several TLS termination types for serving certificates.": "Routes can be secured using several TLS termination types for serving certificates.", + "Routing is a way to make your application publicly visible": "Routing is a way to make your application publicly visible", + "Rules": "Rules", + "Running": "Running", + "Save": "Save", + "Search by name...": "Search by name...", + "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.": "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.", + "Secure Route": "Secure Route", + "Security": "Security", + "Select a Project": "Select a Project", + "Select a Service": "Select a Service", + "Select all": "Select all", + "Select an operator": "Select an operator", + "Select ClusterUserDefinedNetwork": "Select ClusterUserDefinedNetwork", + "Select default ingress and egress deny rules": "Select default ingress and egress deny rules", + "Select insecure traffic type": "Select insecure traffic type", + "Select one or more NetworkAttachmentDefinitions": "Select one or more NetworkAttachmentDefinitions", + "Select resource name": "Select resource name", + "Select role": "Select role", + "Select target port": "Select target port", + "Select termination type": "Select termination type", + "Select virtual machines to connect to this network.": "Select virtual machines to connect to this network.", + "Selected categories will be displayed in the table.": "Selected categories will be displayed in the table.", + "Selector": "Selector", + "Selector is required": "Selector is required", + "Selector keys must be unique": "Selector keys must be unique", + "Selectors must use valid key=value pairs": "Selectors must use valid key=value pairs", "Service": "Service", - "Service address": "Adresse de service", - "Service details": "Détails du service", - "Service port": "Port de service", - "Service port mapping": "Mappage des ports de service", - "Service routing": "Routage des services", - "Service to route to.": "Service vers lequel router le trafic.", - "Service weight": "Poids de service", + "Service address": "Service address", + "Service details": "Service details", + "Service port": "Service port", + "Service port mapping": "Service port mapping", + "Service routing": "Service routing", + "Service to route to.": "Service to route to.", + "Service weight": "Service weight", "Services": "Services", - "Session affinity": "Affinité de session", - "Show a preview of the <2>affected pods that this egress rule will apply to.": "Affichez un aperçu des <2>pods affectés auxquels cette règle de trafic sortant s’appliquera.", - "Show a preview of the <2>affected pods that this ingress rule will apply to.": "Affichez un aperçu des <2>pods affectés auxquels cette règle de trafic entrant s’appliquera.", - "Show a preview of the <2>affected pods that this policy will apply to": "Afficher un aperçu des <2>pods affectés auxquels cette stratégie s’appliquera", - "Show a preview of the <2>matching pods that this selector will apply to": "Afficher un aperçu des <2>pods correspondants auxquels ce sélecteur s'appliquera", - "Show less": "Montrer moins", - "Showing {{shown}} from {{total}} results": "Affichage de {{shown}} sur {{total}} résultats", - "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.": "Les sources ajoutées à cette règle autoriseront le trafic vers les pods définis ci-dessus. Les sources de cette liste sont combinées à l’aide d’une opération logique OU.", - "Status": "Statut", - "Subnet": "Sous-réseau", - "Subnet CIDR": "CIDR du sous-réseau", - "Subnets": "Sous-réseaux", - "Subnets are used for the pod network across the cluster.": "Des sous-réseaux sont utilisés pour le réseau de pods au sein du cluster.", - "Switch and delete": "Changer et supprimer", - "Switching to form view will delete any invalid YAML.": "Le passage à la vue Formulaire supprimera tout code YAML non valide.", - "Target pods": "Pods cibles", - "Target port": "Port cible", - "Target port for traffic": "Port cible pour le trafic.", - "Target port names must be valid DNS labels": "Les noms de port cible doivent être des étiquettes DNS valides.", - "Tech preview": "Aperçu technique", - "Terminating": "En cours de terminaison", - "Termination type": "Type de terminaison", - "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "Le format doit correspondre à la notation CIDR standard (par exemple, « 192.168.123.0/24 »).", - "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.": "La seule valeur autorisée est «\u00a0Persistent\u00a0». Lorsqu'elle est définie, les adresses IP attribuées par OVN Kubernetes seront enregistrées dans un objet «\u00a0ipamclaims.k8s.cni.cncf.io\u00a0».", - "These IP addresses will be reused by other pods if requested.": "Ces adresses IP seront réutilisées par d'autres pods si nécessaire.", - "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated": "Ces règles sont gérées par une couche de routage (contrôleur d’entrée) qui est mise à jour au fur et à mesure que les règles sont modifiées. L’implémentation du contrôleur d’entrée définit la manière dont les en-têtes et autres métadonnées sont transmis ou manipulés.", - "This action will remove all rules within the Egress section and cannot be undone.": "Cette action supprimera toutes les règles de la section Sortie et ne pourra pas être annulée.", - "This action will remove all rules within the Ingress section and cannot be undone.": "Cette action supprimera toutes les règles de la section Entrée et ne pourra pas être annulée.", - "This action will remove all subnets and cannot be undone.": "Cette action supprimera tous les sous-réseaux et ne pourra pas être annulée.", - "This field is only allowed for \"Primary\" network.": "Ce champ est uniquement autorisé pour le réseau «\u00a0Principal\u00a0».", - "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "Ce champ est réservé au réseau «\u00a0Principal\u00a0». Il est déconseillé de le renseigner sans nécessité explicite et sans une bonne compréhension de la topologie du réseau OVN.", - "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.": "Ce champ peut être omis. Dans ce cas, le commutateur logique implémentant le réseau ne fournit que la communication de couche 2, et les utilisateurs doivent configurer les adresses IP des pods. Par conséquent, la sécurité des ports empêche uniquement l'usurpation d'adresse MAC.", - "This network must be created before you create any workload in this project": "Ce réseau doit être créé avant toute création de charge de travail dans ce projet.", - "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.": "Cette stratégie réseau ne peut pas être affichée dans le formulaire. Veuillez passer à l’éditeur YAML.", - "This route splits traffic across multiple services.": "Cet itinéraire répartit le trafic entre plusieurs services.", - "TLS certificate": "Certificat\u00a0TLS", - "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.": "Certificats\u00a0TLS pour la terminaison de périphérie et de rechiffrement. En l’absence de spécification, le certificat par défaut du routeur est utilisé.", - "TLS is not enabled": "TLS n’est pas activé", - "TLS Settings": "Paramètres\u00a0TLS", - "TLS termination": "Terminaison\u00a0TLS", - "To": "À", - "To ports": "Ports de destination", - "To troubleshoot, view logs and events, then debug in terminal.": "Pour résoudre ce problème, affichez les journaux et les événements, puis déboguez dans le terminal.", - "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.": "Pour utiliser un itinéraire personnalisé, vous devez mettre à jour votre fournisseur\u00a0DNS en créant un enregistrement de nom canonique (CNAME). Votre enregistrement\u00a0CNAME doit pointer vers votre domaine personnalisé <2>{{host}}, vers le nom d’hôte canonique du routeur OpenShift, <5>{{routerCanonicalHostname}} , comme alias.", - "Topology": "Topologie", - "Topology describes network configuration.": "La topologie décrit la configuration du réseau.", - "total limit": "limite totale", - "total requested": "total demandé", - "Traffic": "Trafic", - "Traffic in": "Trafic entrant", - "Traffic out": "Trafic sortant", - "True": "Vrai", + "Session affinity": "Session affinity", + "Show a preview of the <2>affected pods that this egress rule will apply to.": "Show a preview of the <2>affected pods that this egress rule will apply to.", + "Show a preview of the <2>affected pods that this ingress rule will apply to.": "Show a preview of the <2>affected pods that this ingress rule will apply to.", + "Show a preview of the <2>affected pods that this policy will apply to": "Show a preview of the <2>affected pods that this policy will apply to", + "Show a preview of the <2>matching pods that this selector will apply to": "Show a preview of the <2>matching pods that this selector will apply to", + "Show less": "Show less", + "Showing {{shown}} from {{total}} results": "Showing {{shown}} from {{total}} results", + "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.": "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.", + "Status": "Status", + "Subnet": "Subnet", + "Subnet CIDR": "Subnet CIDR", + "Subnets": "Subnets", + "Subnets are used for the pod network across the cluster.": "Subnets are used for the pod network across the cluster.", + "Switch and delete": "Switch and delete", + "Switching to form view will delete any invalid YAML.": "Switching to form view will delete any invalid YAML.", + "Target pods": "Target pods", + "Target port": "Target port", + "Target port for traffic": "Target port for traffic", + "Target port names must be valid DNS labels": "Target port names must be valid DNS labels", + "Tech preview": "Tech preview", + "Terminating": "Terminating", + "Termination type": "Termination type", + "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").", + "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.": "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.", + "These IP addresses will be reused by other pods if requested.": "These IP addresses will be reused by other pods if requested.", + "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated": "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated", + "This action will remove all rules within the Egress section and cannot be undone.": "This action will remove all rules within the Egress section and cannot be undone.", + "This action will remove all rules within the Ingress section and cannot be undone.": "This action will remove all rules within the Ingress section and cannot be undone.", + "This action will remove all subnets and cannot be undone.": "This action will remove all subnets and cannot be undone.", + "This field is only allowed for \"Primary\" network.": "This field is only allowed for \"Primary\" network.", + "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.", + "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.": "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.", + "This network must be created before you create any workload in this project": "This network must be created before you create any workload in this project", + "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.": "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.", + "This route splits traffic across multiple services.": "This route splits traffic across multiple services.", + "TLS certificate": "TLS certificate", + "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.": "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.", + "TLS is not enabled": "TLS is not enabled", + "TLS Settings": "TLS Settings", + "TLS termination": "TLS termination", + "To": "To", + "To ports": "To ports", + "To troubleshoot, view logs and events, then debug in terminal.": "To troubleshoot, view logs and events, then debug in terminal.", + "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.": "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.", + "Topology": "Topology", + "Topology describes network configuration.": "Topology describes network configuration.", + "total limit": "total limit", + "total requested": "total requested", + "Traffic": "Traffic", + "Traffic in": "Traffic in", + "Traffic out": "Traffic out", + "True": "True", "Type": "Type", - "Type is required": "Le type est requis", - "Unknown": "Inconnu", - "unknown host": "hôte inconnu", - "Unknown: endpoint readiness not available": "Inconnu\u00a0: état de préparation du point de terminaison non disponible", - "Unknown: endpoint readiness not loaded": "Inconnu\u00a0: état de préparation du point de terminaison non chargé", - "Updated": "Mis à jour", - "Use \"{{inputValue}}\"": "Utiliser \"{{inputValue}} \"", - "Use the default Pod network": "Utiliser le réseau Pod par défaut", - "UserDefinedNetwork": "Réseau défini par l'utilisateur", - "UserDefinedNetworks": "Réseaux définis par l'utilisateur", - "Value": "Valeur", - "Value hidden": "Valeur masquée", - "Values": "Valeurs", - "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.": "`values` est un tableau de chaînes de caractères. Si l'opérateur est `In` ou `NotIn`, le tableau `values` doit contenir des valeurs non vides. Si l'opérateur est `Exists` ou `DoesNotExist`, le tableau `values` doit être vide. Ce tableau est remplacé lors d'une fusion stratégique.", - "View all {{total}} results": "Afficher l’ensemble des {{total}} résultats", - "View events": "Afficher les événements", - "View logs": "Afficher les journaux", - "View naming information": "Afficher les informations sur l’attribution de nom", - "Virtual Machines": "Machines virtuelles", + "Type is required": "Type is required", + "Unknown": "Unknown", + "unknown host": "unknown host", + "Unknown: endpoint readiness not available": "Unknown: endpoint readiness not available", + "Unknown: endpoint readiness not loaded": "Unknown: endpoint readiness not loaded", + "Updated": "Updated", + "Use \"{{inputValue}}\"": "Use \"{{inputValue}}\"", + "Use the default Pod network": "Use the default Pod network", + "UserDefinedNetwork": "UserDefinedNetwork", + "UserDefinedNetworks": "UserDefinedNetworks", + "Value": "Value", + "Value hidden": "Value hidden", + "Values": "Values", + "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", + "View all {{total}} results": "View all {{total}} results", + "View events": "View events", + "View logs": "View logs", + "View naming information": "View naming information", + "Virtual Machines": "Virtual Machines", + "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.": "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.", "VLAN": "VLAN", - "VLAN tag number": "Numéro de balise VLAN", - "Weight": "Poids", - "When omitted, the platform will choose a reasonable default which is subject to change over time.": "En cas d'omission, la plateforme choisira une valeur par défaut raisonnable, susceptible d'évoluer au fil du temps.", - "When using the OpenShift SDN cluster network provider:": "Lors de l’utilisation du fournisseur de réseau de cluster OpenShift SDN\u00a0:", - "Wildcard policy": "Stratégie basée sur un caractère générique", - "with exceptions": "avec des exceptions", + "VLAN tag number": "VLAN tag number", + "Weight": "Weight", + "When omitted, the platform will choose a reasonable default which is subject to change over time.": "When omitted, the platform will choose a reasonable default which is subject to change over time.", + "When using the OpenShift SDN cluster network provider:": "When using the OpenShift SDN cluster network provider:", + "Wildcard policy": "Wildcard policy", + "with exceptions": "with exceptions", "YAML": "YAML", - "YAML view": "Vue YAML", - "You don't have access to this section due to cluster policy.": "Vous n’avez pas accès à cette section en raison de la stratégie de cluster.", - "You don't have permission to perform this action": "Vous n’êtes pas autorisé à effectuer cette action.", - "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.": "Vous devez créer un espace de noms pour pouvoir créer des projets commençant par «\u00a0openshift-\u00a0», «\u00a0kubernetes-\u00a0» ou «\u00a0kube-\u00a0»." + "YAML view": "YAML view", + "You don't have access to this section due to cluster policy.": "You don't have access to this section due to cluster policy.", + "You don't have permission to perform this action": "You don't have permission to perform this action", + "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.": "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'." } diff --git a/locales/ja/plugin__networking-console-plugin.json b/locales/ja/plugin__networking-console-plugin.json index 58fc72d3..6ef48800 100644 --- a/locales/ja/plugin__networking-console-plugin.json +++ b/locales/ja/plugin__networking-console-plugin.json @@ -1,506 +1,504 @@ { - " See more details in: <3>": " 詳細は以下を参照してください: <3>", - " See more details in: <3>.": " 詳細は、<3> を参照してください。", - "(all nodes): ": "(すべてのノード): ", - "{{count}} annotation_one": "{{count}} 件のアノテーション", - "{{count}} annotation_other": "{{count}} 件のアノテーション", - "{{kind}} details": "{{kind}} の詳細", - "{{kind}} disabled": "{{kind}} が無効", - "{{numCores}} cores": "{{numCores}} コア", - "{{path}} found in resource, but is not supported in form.": "リソースで検出された {{path}} は、フォームではサポートされません。", - "{{path}} is missing.": "{{path}} がありません。", - "{{path}} should be an Array.": "{{path}} は配列でなければなりません。", - "{{path}} should not be empty.": "{{path}} は空にできません。", - "{{value}} at {{date}}": "{{date}} の {{value}}", - "+{{count}} more_one": "+さらに {{count}} 個", - "+{{count}} more_other": "+さらに {{count}} 個", - "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.": "ネットワークタイプを選択するには、<0>OpenShift Virtualization Operator または <3>SR-IOV Network Operator がクラスターにインストールされている必要があります。", - "404: Page Not Found": "404: ページが見つかりません", - "A number between 0 and 255 that depicts relative weight compared with other targets.": "他のターゲットとの相対的な重みを示す 0 から 255 の間の数字。", - "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').": "プロジェクト名は、小文字の英数字または '-' で構成され、かつ先頭と末尾が英数字である必要があります (例: 'my-name' または '123-abc')。", - "A unique name for the Route within the project": "プロジェクト内の Route の一意の名前", - "Accessible outside the cluster": "クラスター外からアクセス可能", - "Accessible within the cluster only": "クラスター内でのみアクセス可能", - "Actions": "アクション", - "Adapter model": "アダプターモデル", - "Add": "追加", - "Add allowed destination": "許可される宛先の追加", - "Add allowed source": "許可されるソースの追加", - "Add alternate Service": "代替 Service の追加", - "Add egress rule": "Egress ルールの追加", - "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.": "選択した Pod に適用される Egress ルールを追加します。1 つ以上のルールにマッチする場合には、Pod へのトラフィックは許可されます。", - "Add exception": "例外の追加", - "Add expression": "式の追加", - "Add ingress rule": "Ingress ルールの追加", - "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.": "選択した Pod に適用される Ingress ルールを追加します。1 つ以上のルールにマッチする場合には、Pod からのトラフィックは許可されます。", - "Add label": "ラベルの追加", - "Add namespace selector": "namespace セレクターの追加", - "Add pod selector": "Pod セレクターの追加", - "Add port": "ポートの追加", - "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.": "トラフィックを制限するポートを追加します。ポートが指定されていない場合、ポリシーによりすべてのポートでトラフィックへのアクセスが可能になります。", - "Add subnet": "サブネットの追加", - "Add virtual machines": "仮想マシンの追加", - "All incoming traffic is denied to Pods in {{namespace}}": "すべての受信トラフィックが {{namespace}} の Pod に対して拒否されます", - "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.": "すべての送信トラフィックはデフォルトで許可されます。Egress ルールは、クラスターネットワークプロバイダーが許可する場合に、送信トラフィックを制限するために使用できます。OpenShift SDN クラスターネットワークプロバイダーを使用する場合、Egress ネットワークポリシーはサポートされません。", - "All outgoing traffic is denied from Pods in {{namespace}}": "すべての送信トラフィックは {{namespace}} の Pod で拒否されます", - "All pods within {{namespace}}": "{{namespace}} 内のすべての Pod", - "Allow": "許可", - "Allow peers by IP block": "IP ブロックによるピアの許可", - "Allow pods from inside the cluster": "クラスター内からの Pod の許可", - "Allow pods from the same namespace": "同じ namespace からの Pod の許可", - "Allow traffic from peers by IP block": "IP ブロックによるピアからのトラフィックの許可", - "Allow traffic from pods in the same namespace": "同じ namespace の Pod からのトラフィックの許可", - "Allow traffic from pods inside the cluster": "クラスター内の Pod からのトラフィックの許可", - "Allow traffic to peers by IP block": "IP ブロックによるピアへのトラフィックの許可", - "Allow traffic to pods in the same namespace": "同じ namespace の Pod へのトラフィックの許可", - "Allow traffic to pods inside the cluster": "クラスター内の Pod へのトラフィックの許可", - "Alternate Service target": "代替 Service のターゲット", - "Alternate Service to route to.": "ルーティングする代替 Service。", - "Alternate Service weight": "代替 Service の重み", - "An error occurred.": "エラーが発生しました。", - "An error occurred. Please try again.": "エラーが発生しました。もう一度試してください。", - "An OpenShift project is an alternative representation of a Kubernetes namespace.": "OpenShift プロジェクトは、Kubernetes namespace を別の形で表現したものです。", - "annotation_one": "件のアノテーション", - "annotation_other": "件のアノテーション", - "Annotations": "アノテーション", - "Any namespace": "任意の namespace", - "Any peer": "任意のピア", - "Any pod": "任意の Pod", - "Any port": "任意のポート", - "Are you sure you want to remove <2> from <5>{nadName}?": "<2> を <5>{nadName} から削除してもよろしいですか?", - "Are you sure you want to remove <2> from <5>{udnName}?": "<2> を <5>{udnName} から削除してもよろしいですか?", - "Are you sure?": "操作を実行してもよろしいですか?", - "Assigns IP addresses from this subnet to Pods and VirtualMachines.": "このサブネットから Pod と VirtualMachine に IP アドレスを割り当てます。", - "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.": "作成時に、namespace に <2>{{label}} ラベルを設定する必要があります。<5>Namespaces に移動して、新しい namespace を作成してください。", - "At least one port is required": "少なくとも 1 つのポートが必要です", - "Backend health": "バックエンドの健全性", - "Bridge name": "ブリッジ名", - "Browse...": "参照...", - "CA certificate": "CA 証明書", - "Can't preview matching {{resourceName}}": "一致する {{resourceName}} をプレビューできません", - "Can't preview pods": "Pod をプレビューできません", - "Cancel": "キャンセル", - "Certificate": "証明書", - "Certificates": "証明書", + " See more details in: <3>": " See more details in: <3>", + " See more details in: <3>.": " See more details in: <3>.", + "(all nodes): ": "(all nodes): ", + "{{count}} annotation_other": "{{count}} annotation", + "{{kind}} details": "{{kind}} details", + "{{kind}} disabled": "{{kind}} disabled", + "{{numCores}} cores": "{{numCores}} cores", + "{{path}} found in resource, but is not supported in form.": "{{path}} found in resource, but is not supported in form.", + "{{path}} is missing.": "{{path}} is missing.", + "{{path}} should be an Array.": "{{path}} should be an Array.", + "{{path}} should not be empty.": "{{path}} should not be empty.", + "{{value}} at {{date}}": "{{value}} at {{date}}", + "+{{count}} more_other": "+{{count}} more", + "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.": "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.", + "404: Page Not Found": "404: Page Not Found", + "A number between 0 and 255 that depicts relative weight compared with other targets.": "A number between 0 and 255 that depicts relative weight compared with other targets.", + "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').": "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').", + "A unique name for the Route within the project": "A unique name for the Route within the project", + "Accessible outside the cluster": "Accessible outside the cluster", + "Accessible within the cluster only": "Accessible within the cluster only", + "Actions": "Actions", + "Adapter model": "Adapter model", + "Add": "Add", + "Add allowed destination": "Add allowed destination", + "Add allowed source": "Add allowed source", + "Add alternate Service": "Add alternate Service", + "Add egress rule": "Add egress rule", + "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.": "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.", + "Add exception": "Add exception", + "Add expression": "Add expression", + "Add ingress rule": "Add ingress rule", + "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.": "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.", + "Add label": "Add label", + "Add namespace selector": "Add namespace selector", + "Add pod selector": "Add pod selector", + "Add port": "Add port", + "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.": "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.", + "Add subnet": "Add subnet", + "Add virtual machines": "Add virtual machines", + "All incoming traffic is denied to Pods in {{namespace}}": "All incoming traffic is denied to Pods in {{namespace}}", + "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.": "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.", + "All outgoing traffic is denied from Pods in {{namespace}}": "All outgoing traffic is denied from Pods in {{namespace}}", + "All pods within {{namespace}}": "All pods within {{namespace}}", + "Allow": "Allow", + "Allow peers by IP block": "Allow peers by IP block", + "Allow pods from inside the cluster": "Allow pods from inside the cluster", + "Allow pods from the same namespace": "Allow pods from the same namespace", + "Allow traffic from peers by IP block": "Allow traffic from peers by IP block", + "Allow traffic from pods in the same namespace": "Allow traffic from pods in the same namespace", + "Allow traffic from pods inside the cluster": "Allow traffic from pods inside the cluster", + "Allow traffic to peers by IP block": "Allow traffic to peers by IP block", + "Allow traffic to pods in the same namespace": "Allow traffic to pods in the same namespace", + "Allow traffic to pods inside the cluster": "Allow traffic to pods inside the cluster", + "Alternate Service target": "Alternate Service target", + "Alternate Service to route to.": "Alternate Service to route to.", + "Alternate Service weight": "Alternate Service weight", + "An error occurred.": "An error occurred.", + "An error occurred. Please try again.": "An error occurred. Please try again.", + "An OpenShift project is an alternative representation of a Kubernetes namespace.": "An OpenShift project is an alternative representation of a Kubernetes namespace.", + "annotation_other": "annotation", + "Annotations": "Annotations", + "Any namespace": "Any namespace", + "Any peer": "Any peer", + "Any pod": "Any pod", + "Any port": "Any port", + "Are you sure you want to remove <2> from <5>{nadName}?": "Are you sure you want to remove <2> from <5>{nadName}?", + "Are you sure you want to remove <2> from <5>{udnName}?": "Are you sure you want to remove <2> from <5>{udnName}?", + "Are you sure?": "Are you sure?", + "Assigns IP addresses from this subnet to Pods and VirtualMachines.": "Assigns IP addresses from this subnet to Pods and VirtualMachines.", + "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.": "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.", + "At least one port is required": "At least one port is required", + "Backend health": "Backend health", + "Bridge name": "Bridge name", + "Browse...": "Browse...", + "CA certificate": "CA certificate", + "Can't preview matching {{resourceName}}": "Can't preview matching {{resourceName}}", + "Can't preview pods": "Can't preview pods", + "Cancel": "Cancel", + "Certificate": "Certificate", + "Certificates": "Certificates", "CIDR": "CIDR", - "Clear": "消去", - "Clear input value": "入力値のクリア", - "Click <1>Create {{kind}} to create your first {{kind}}": "<1>{{kind}} の作成 をクリックして最初の {{kind}} を作成", - "Cluster administrator permissions are required to enable this feature.": "この機能を有効にするには、クラスター管理者権限が必要です。", - "Cluster IP": "クラスター IP", - "Cluster-wide UserDefinedNetworks": "クラスター全体の UserDefinedNetworks", + "Clear": "Clear", + "Clear input value": "Clear input value", + "Click <1>Create {{kind}} to create your first {{kind}}": "Click <1>Create {{kind}} to create your first {{kind}}", + "Cluster administrator permissions are required to enable this feature.": "Cluster administrator permissions are required to enable this feature.", + "Cluster IP": "Cluster IP", + "Cluster-wide UserDefinedNetworks": "Cluster-wide UserDefinedNetworks", "ClusterUserDefinedNetwork": "ClusterUserDefinedNetwork", - "ClusterUserDefinedNetwork name": "ClusterUserDefinedNetwork 名", + "ClusterUserDefinedNetwork name": "ClusterUserDefinedNetwork name", "ClusterUserDefinedNetworks": "ClusterUserDefinedNetworks", - "Completed": "完了済み", - "Conditions": "状態", - "Configure in Virtual machine networks page": "仮想マシンネットワークページで設定する", - "Configure via:": "設定方法:", - "Confirm": "確定", - "Connection rate": "接続速度", + "Completed": "Completed", + "Conditions": "Conditions", + "Configure in Virtual machine networks page": "Configure in Virtual machine networks page", + "Configure via:": "Configure via:", + "Confirm": "Confirm", + "Connection rate": "Connection rate", "ConsoleQuickStart": "ConsoleQuickStart", "ConsoleQuickStarts": "ConsoleQuickStarts", - "Copied": "コピー済み", - "Copied to clipboard": "クリップボードにコピー済み", - "Copy": "コピー", - "Copy to clipboard": "クリップボードにコピー", + "Copied": "Copied", + "Copied to clipboard": "Copied to clipboard", + "Copy": "Copy", + "Copy to clipboard": "Copy to clipboard", "CPU": "CPU", "CrashLoopBackOff": "CrashLoopBackOff", - "CrashLoopBackOff indicates that the application within the container is failing to start properly.": "CrashLoopBackOff は、コンテナー内のアプリケーションが正しく起動できないことを示します。", - "Create": "作成", - "Create {{ kind }}": "{{ kind }} の作成", - "Create {{kind}}": "{{kind}} の作成", - "Create {{label}}": "{{label}} の作成", - "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.": "フォームを使用して Service を作成します。フォームに表示されていないフィールドも含め、完全な制御を行うには、YAML ビューに切り替えてください。", - "Create by completing the form.": "このフォームに入力して作成します。", - "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.": "YAML または JSON 定義を手動で入力するか、またはファイルをエディターにドラッグアンドドロップして作成します。", - "Create ClusterUserDefinedNetwork": "ClusterUserDefinedNetwork の作成", - "Create Ingress": "Ingress の作成", - "Create NetworkAttachmentDefinition": "NetworkAttachmentDefinition の作成", - "Create Project": "プロジェクトの作成", - "Create Route": "Route の作成", - "Create Service": "Service の作成", - "Create UserDefinedNetwork": "UserDefinedNetwork の作成", - "Created": "作成済み", - "Created at": "作成日時", - "Current selections": "現在の選択内容", - "Custom route": "カスタムルート", - "Debug container {{name}}": "コンテナー {{name}} のデバッグ", - "Define a new UserDefinedNetwork for this project": "このプロジェクトの新しい UserDefinedNetwork を定義する", - "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.": "特定のプロジェクト内で VirtualMachine と Pod が通信するために使用するネットワークを定義します。詳細は <2>プライマリーユーザー定義ネットワーク を参照してください。", - "Define the network used by VirtualMachines and Pods to communicate in this project": "このプロジェクト内で VirtualMachine と Pod が通信するために使用するネットワークを定義する", - "Degraded: {{ready}} of {{total}} endpoints ready": "デグレード: {{total}} 個のエンドポイントのうち{{ready}} 個が準備完了", - "Delete": "削除", - "Delete {{kind}}": "{{kind}} の削除", - "Delete Ingress": "Ingress の削除", - "Delete NetworkAttachmentDefinition": "NetworkAttachmentDefinition の削除", - "Delete Route": "Route の削除", - "Delete Service": "Service の削除", - "Deletion protection": "削除保護", - "Deny all egress traffic": "すべての Egress トラフィックを拒否", - "Deny all ingress traffic": "すべての Ingress トラフィックを拒否", - "Description": "説明", - "Destination CA certificate": "宛先 CA 証明書", - "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.": "このルールに追加された宛先は、上記で定義された Pod からのトラフィックを許可します。このリストの宛先は、論理 OR 演算を使用して結合されます。", - "Details": "詳細", - "Disabled": "無効", - "Display name": "表示名", - "Do you need to set up custom DNS?": "カスタム DNS を設定する必要がありますか?", - "Down: {{ready}} of {{total}} endpoints ready": "ダウン: {{total}} 個のエンドポイントのうち {{ready}} 個が準備完了", - "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.": "デュアルスタッククラスターでは、2 つのサブネット (IP ファミリーごとに 1 つ) を設定できます。それ以外の場合、サブネットは 1 つだけ許可されます。", - "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "デュアルスタッククラスターでは、2 つのサブネット (IP ファミリーごとに 1 つ) を設定できます。それ以外の場合、サブネットは 1 つだけ許可されます。形式は標準的な CIDR 表記に準拠する必要があります (例: \"192.168.123.0/24\")。", - "Duplicate keys found in main pod selector": "メイン Pod セレクターで鍵の重複が見つかりました", - "Duplicate keys found in peer namespace selector": "ピア namespace セレクターで鍵の重複が見つかりました", - "Duplicate keys found in peer pod selector": "ピア Pod セレクターで鍵の重複が見つかりました", + "CrashLoopBackOff indicates that the application within the container is failing to start properly.": "CrashLoopBackOff indicates that the application within the container is failing to start properly.", + "Create": "Create", + "Create {{ kind }}": "Create {{ kind }}", + "Create {{kind}}": "Create {{kind}}", + "Create {{label}}": "Create {{label}}", + "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.": "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.", + "Create by completing the form.": "Create by completing the form.", + "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.": "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.", + "Create ClusterUserDefinedNetwork": "Create ClusterUserDefinedNetwork", + "Create Ingress": "Create Ingress", + "Create NetworkAttachmentDefinition": "Create NetworkAttachmentDefinition", + "Create Project": "Create Project", + "Create Route": "Create Route", + "Create Service": "Create Service", + "Create UserDefinedNetwork": "Create UserDefinedNetwork", + "Created": "Created", + "Created at": "Created at", + "Current selections": "Current selections", + "Custom route": "Custom route", + "Debug container {{name}}": "Debug container {{name}}", + "Define a new UserDefinedNetwork for this project": "Define a new UserDefinedNetwork for this project", + "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.": "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.", + "Define the network used by VirtualMachines and Pods to communicate in this project": "Define the network used by VirtualMachines and Pods to communicate in this project", + "Degraded: {{ready}} of {{total}} endpoints ready": "Degraded: {{ready}} of {{total}} endpoints ready", + "Delete": "Delete", + "Delete {{kind}}": "Delete {{kind}}", + "Delete Ingress": "Delete Ingress", + "Delete NetworkAttachmentDefinition": "Delete NetworkAttachmentDefinition", + "Delete Route": "Delete Route", + "Delete Service": "Delete Service", + "Deletion protection": "Deletion protection", + "Deny all egress traffic": "Deny all egress traffic", + "Deny all ingress traffic": "Deny all ingress traffic", + "Description": "Description", + "Destination CA certificate": "Destination CA certificate", + "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.": "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.", + "Details": "Details", + "Disabled": "Disabled", + "Display name": "Display name", + "Do you need to set up custom DNS?": "Do you need to set up custom DNS?", + "Down: {{ready}} of {{total}} endpoints ready": "Down: {{ready}} of {{total}} endpoints ready", + "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.": "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.", + "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").", + "Duplicate keys found in main pod selector": "Duplicate keys found in main pod selector", + "Duplicate keys found in peer namespace selector": "Duplicate keys found in peer namespace selector", + "Duplicate keys found in peer pod selector": "Duplicate keys found in peer pod selector", "Edge": "Edge", - "Edit": "編集", - "Edit {{kind}}": "{{kind}} の編集", - "Edit {{label}}": "{{label}} の編集", - "Edit annotations": "アノテーションの編集", - "Edit Ingress": "Ingress の編集", - "Edit labels": "ラベルの編集", - "Edit NetworkAttachmentDefinition": "NetworkAttachmentDefinition の編集", - "Edit Pod selector": "Pod セレクターの編集", - "Edit Route": "Route の編集", - "Edit Service": "Service の編集", + "Edit": "Edit", + "Edit {{kind}}": "Edit {{kind}}", + "Edit {{label}}": "Edit {{label}}", + "Edit annotations": "Edit annotations", + "Edit Ingress": "Edit Ingress", + "Edit labels": "Edit labels", + "Edit NetworkAttachmentDefinition": "Edit NetworkAttachmentDefinition", + "Edit Pod selector": "Edit Pod selector", + "Edit Route": "Edit Route", + "Edit Service": "Edit Service", "Egress": "Egress", - "Egress network policy is not supported.": "Egress ネットワークポリシーはサポートされていません。", - "Egress rule": "Egress ルール", - "Egress rules": "Egress ルール", - "Enable {{kind}}": "{{kind}} の有効化", - "Enabled": "有効", + "Egress network policy is not supported.": "Egress network policy is not supported.", + "Egress rule": "Egress rule", + "Egress rules": "Egress rules", + "Enable {{kind}}": "Enable {{kind}}", + "Enabled": "Enabled", "EndpointSlice": "EndpointSlice", "EndpointSlices": "EndpointSlices", - "Error": "エラー", - "Error details": "エラーの詳細", - "Error loading virtual machines": "仮想マシンの読み込みエラー", - "Example: 100": "例: 100", - "Exceptions": "例外", - "External DNS name this service resolves to (e.g. example.com).": "このサービスの解決先となる外部 DNS 名 (例: example.com)。", - "External IP": "外部 IP", - "External load balancer": "外部ロードバランサー", - "External name": "外部名", - "External name is required": "外部名は必須です", - "External name must be a valid hostname": "外部名は有効なホスト名である必要があります", - "External service name": "外部サービス名", - "Failed": "失敗", - "Failed to add the following virtual machines: {{names}}": "次の仮想マシンの追加に失敗しました: {{names}}", - "Failed to remove virtual machine from network": "仮想マシンをネットワークから削除できませんでした", - "Failed to retrieve the list of projects": "プロジェクトのリストを取得できませんでした", + "Error": "Error", + "Error details": "Error details", + "Error loading virtual machines": "Error loading virtual machines", + "Example: 100": "Example: 100", + "Exceptions": "Exceptions", + "External DNS name this service resolves to (e.g. example.com).": "External DNS name this service resolves to (e.g. example.com).", + "External IP": "External IP", + "External load balancer": "External load balancer", + "External name": "External name", + "External name is required": "External name is required", + "External name must be a valid hostname": "External name must be a valid hostname", + "External service name": "External service name", + "Failed": "Failed", + "Failed to add the following virtual machines: {{names}}": "Failed to add the following virtual machines: {{names}}", + "Failed to remove virtual machine from network": "Failed to remove virtual machine from network", + "Failed to retrieve the list of projects": "Failed to retrieve the list of projects", "False": "False", - "Form view": "フォームビュー", - "From": "ソース", - "From pods": "ソース Pod", - "Given subnet is split into smaller subnets for every node.": "指定されたサブネットは、各ノード用に、より小さなサブネットに分割されます。", - "Health": "健全性", - "Healthy: {{ready}} of {{total}} endpoints ready": "正常: {{total}} 個のエンドポイントのうち {{ready}} 個が準備完了", - "Hide": "非表示", - "Hide selected Namespace(s)": "選択した Namespace を非表示にする", - "Host": "ホスト", - "Hostname": "ホスト名", - "Hosts": "ホスト", + "Form view": "Form view", + "From": "From", + "From pods": "From pods", + "Given subnet is split into smaller subnets for every node.": "Given subnet is split into smaller subnets for every node.", + "Health": "Health", + "Healthy: {{ready}} of {{total}} endpoints ready": "Healthy: {{ready}} of {{total}} endpoints ready", + "Hide": "Hide", + "Hide selected Namespace(s)": "Hide selected Namespace(s)", + "Host": "Host", + "Hostname": "Hostname", + "Hosts": "Hosts", "HostSubnet": "HostSubnet", - "If no namespace selector is provided, pods from all namespaces will be eligible.": "namespace セレクターが指定されていない場合、すべての namespace からの Pod が対象となります。", - "If no pod selector is provided, the policy will apply to all pods in the namespace.": "Pod セレクターが指定されていない場合、ポリシーは namespace のすべての Pod に適用されます。", - "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "Pod セレクターが指定されていない場合、対象となる namespace のすべての Pod からのトラフィックが許可されます。", - "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "Pod セレクターが指定されていない場合、この namespace のすべての Pod からのトラフィックが許可されます。", - "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "Pod セレクターが指定されていない場合、対象となる namespace のすべての Pod へのトラフィックが許可されます。", - "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "Pod セレクターが指定されていない場合、この namespace のすべての Pod へのトラフィックが許可されます。", - "If this field is empty, traffic will be allowed from all external sources.": "このフィールドが空の場合には、全外部ソースからのトラフィックが許可されます。", - "If this field is empty, traffic will be allowed to all external sources.": "このフィールドが空の場合には、全外部ソースへのトラフィックが許可されます。", + "If no namespace selector is provided, pods from all namespaces will be eligible.": "If no namespace selector is provided, pods from all namespaces will be eligible.", + "If no pod selector is provided, the policy will apply to all pods in the namespace.": "If no pod selector is provided, the policy will apply to all pods in the namespace.", + "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.", + "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "If no pod selector is provided, traffic from all pods in this namespace will be allowed.", + "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.", + "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "If no pod selector is provided, traffic to all pods in this namespace will be allowed.", + "If this field is empty, traffic will be allowed from all external sources.": "If this field is empty, traffic will be allowed from all external sources.", + "If this field is empty, traffic will be allowed to all external sources.": "If this field is empty, traffic will be allowed to all external sources.", "Ingress": "Ingress", - "Ingress details": "Ingress の詳細", - "Ingress points of load balancer": "ロードバランサーの Ingress ポイント", - "Ingress rule": "Ingress ルール", - "Ingress rules": "Ingress ルール", + "Ingress details": "Ingress details", + "Ingress points of load balancer": "Ingress points of load balancer", + "Ingress rule": "Ingress rule", + "Ingress rules": "Ingress rules", "Ingresses": "Ingresses", - "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}": "入力エラー: セレクターは文字または数字で開始および終了する必要があり、-、_、/、または . しか含めることができません。無効な値: {{offendingSelector}}", - "Insecure traffic": "非セキュアなトラフィック", - "Interface": "インターフェイス", - "Invalid IP address or subnet format": "無効な IP アドレスまたはサブネット形式", - "Invalid subnet format": "無効なサブネット形式", - "Invalid YAML cannot be persisted": "無効な YAML を永続化できません", - "IP address": "IP アドレス", - "IP address management": "IP アドレス管理", - "IP Addresses accepting traffic for service": "サービス用のトラフィックを受け入れる IP アドレス", - "IP block exceptions are not supported and would cause the entire IP block section to be ignored.": "IP ブロックの例外はサポートされず、これにより IP ブロックセクション全体が無視されます。", - "IP blocks": "IP ブロック", - "IPAM Lifecycle": "IPAM ライフサイクル", + "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}": "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}", + "Insecure traffic": "Insecure traffic", + "Interface": "Interface", + "Invalid IP address or subnet format": "Invalid IP address or subnet format", + "Invalid subnet format": "Invalid subnet format", + "Invalid YAML cannot be persisted": "Invalid YAML cannot be persisted", + "IP address": "IP address", + "IP address management": "IP address management", + "IP Addresses accepting traffic for service": "IP Addresses accepting traffic for service", + "IP block exceptions are not supported and would cause the entire IP block section to be ignored.": "IP block exceptions are not supported and would cause the entire IP block section to be ignored.", + "IP blocks": "IP blocks", + "IPAM Lifecycle": "IPAM Lifecycle", "IPAMLifecycle": "IPAMLifecycle", - "IPAMLifecycle controls IP addresses management lifecycle.": "IPAMLifecycle は IP アドレス管理ライフサイクルを制御します。", - "It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "明確な必要性と OVN のネットワークトポロジーへの理解がない限り、このフィールドを設定することは推奨されません。", + "IPAMLifecycle controls IP addresses management lifecycle.": "IPAMLifecycle controls IP addresses management lifecycle.", + "It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "It is not recommended to set this field without explicit need and understanding of the OVN network topology.", "JoinSubnets": "JoinSubnets", - "JoinSubnets are used inside the OVN network topology.": "JoinSubnets は、OVN ネットワークトポロジー内で使用されます。", - "Key": "キー", - "key is the label key that the selector applies": "key はセレクターの適用対象となるラベルのキーです", - "Kind": "種類", - "Labels": "ラベル", - "Layer2 topology creates one logical switch shared by all nodes.": "Layer2 トポロジーは、すべてのノードで共有される 1 つの論理スイッチを作成します。", - "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.": "Layer3 トポロジーは、それぞれ異なるサブネットを持つレイヤー 2 セグメントをノードごとに作成します。ノードのサブネット間の相互接続には、レイヤー 3 ルーティングが使用されます。", - "Learn how to use NetworkAttachmentDefinitions": "NetworkAttachmentDefinitions の使用方法の詳細", - "Learn more about {{ kind }}": "{{ kind }} の詳細", - "Learn more about working with projects": "プロジェクトの使用方法は、こちらを参照してください", - "List of {{resourceName}} matching": "一致する {{resourceName}} のリスト", - "List of matching {{resourceName}}": "一致する {{resourceName}} のリスト", - "List of pods": "Pod のリスト", - "List of pods matching": "一致する Pod のリスト", - "Location": "場所", - "Location of the resource that backs the service": "サービスを支えるリソースの場所", - "MAC spoof check": "MAC spoof チェック", - "Manage columns": "列の管理", - "Managed by UserDefinedNetwork": "UserDefinedNetwork によって管理されています", - "Match Expressions": "一致式", - "Match Labels": "一致ラベル", - "matchExpressions is a list of label selector requirements. The requirements are ANDed.": "matchExpressions はラベルセレクターの要件のリストです。これらの要件は AND で結合されます。", - "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.": "matchLabels は {key,value} ペアのマップです。matchLabels のマップに {key,value} を 1 つ指定することは、matchExpressions の要素の key フィールドに \"key\"、operator に \"In\"、values 配列に \"value\" を指定することと等価です。これらの要件は AND で結合されます。", - "Memory": "メモリー", - "Message": "メッセージ", - "Metrics": "メトリクス", - "Missing installed operators": "インストール済みの Operator がありません", - "More information:": "詳細情報:", + "JoinSubnets are used inside the OVN network topology.": "JoinSubnets are used inside the OVN network topology.", + "Key": "Key", + "key is the label key that the selector applies": "key is the label key that the selector applies", + "Kind": "Kind", + "Labels": "Labels", + "Layer2 topology creates one logical switch shared by all nodes.": "Layer2 topology creates one logical switch shared by all nodes.", + "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.": "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.", + "Learn how to use NetworkAttachmentDefinitions": "Learn how to use NetworkAttachmentDefinitions", + "Learn more about {{ kind }}": "Learn more about {{ kind }}", + "Learn more about working with projects": "Learn more about working with projects", + "List of {{resourceName}} matching": "List of {{resourceName}} matching", + "List of matching {{resourceName}}": "List of matching {{resourceName}}", + "List of pods": "List of pods", + "List of pods matching": "List of pods matching", + "Location": "Location", + "Location of the resource that backs the service": "Location of the resource that backs the service", + "MAC spoof check": "MAC spoof check", + "Manage columns": "Manage columns", + "Managed by UserDefinedNetwork": "Managed by UserDefinedNetwork", + "Match Expressions": "Match Expressions", + "Match Labels": "Match Labels", + "matchExpressions is a list of label selector requirements. The requirements are ANDed.": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", + "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", + "Memory": "Memory", + "Message": "Message", + "Metrics": "Metrics", + "Missing installed operators": "Missing installed operators", + "More information:": "More information:", "MTU": "MTU", - "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.": "MTU の指定は任意です。指定しない場合、OVN-Kubernetes でグローバルに設定された値 (デフォルトは 1400) がネットワークに使用されます。", - "MTU is the maximum transmission unit for a network.": "MTU はネットワークの最大転送単位です。", + "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.": "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.", + "MTU is the maximum transmission unit for a network.": "MTU is the maximum transmission unit for a network.", "multi-networkpolicies": "multi-networkpolicies", "multi-networkpolicy": "multi-networkpolicy", "MultiNetworkPolicies": "MultiNetworkPolicies", - "Name": "名前", - "Name is required": "名前は必須です", + "Name": "Name", + "Name is required": "Name is required", "Namespace": "Namespace", - "Namespace is required": "Namespace は必須です", - "Namespace selector": "Namespace セレクター", - "Namespace Selector": "Namespace セレクター", - "Namespace(s)": "Namespace", - "Namespaced UserDefinedNetworks": "Namespace スコープの UserDefinedNetworks", - "Namespaces having all the supplied key/value pairs as labels will be selected.": "指定されたすべてのキーと値のペアをラベルとして持つ namespace が選択されます。", - "Naming information": "命名情報", - "network": "ネットワーク", + "Namespace is required": "Namespace is required", + "Namespace selector": "Namespace selector", + "Namespace Selector": "Namespace Selector", + "Namespace(s)": "Namespace(s)", + "Namespaced UserDefinedNetworks": "Namespaced UserDefinedNetworks", + "Namespaces having all the supplied key/value pairs as labels will be selected.": "Namespaces having all the supplied key/value pairs as labels will be selected.", + "Naming information": "Naming information", + "network": "network", "Network": "Network", - "Network type": "ネットワークタイプ", - "Network Type": "ネットワークタイプ", + "Network type": "Network type", + "Network Type": "Network Type", "NetworkAttachmentDefinitions": "NetworkAttachmentDefinitions", "NetworkPolicies": "NetworkPolicies", - "NetworkPolicies documentation": "NetworkPolicies のドキュメント", - "networks": "ネットワーク", - "Networks are not project-bound. Using the same name creates a shared NAD.": "ネットワークはプロジェクトに紐づくものではありません。同じ名前を使用すると、共有 NAD が作成されます。", - "Networks are not project-bound. Using the same name creates a shared UDN.": "ネットワークはプロジェクトに紐づくものではありません。同じ名前を使用すると、共有 UDN が作成されます。", - "No {{kind}} found": "{{kind}} が見つかりません", - "No {{label}} found": "{{label}} が見つかりません", - "No {{resourceName}} matching the provided labels": "指定されたラベルに一致する {{resourceName}} がありません", - "No conditions found": "条件が見つかりません", - "No datapoints found.": "データポイントが見つかりません。", - "No description": "説明がありません", - "No hosts": "ホストなし", - "No labels": "ラベルがありません", + "NetworkPolicies documentation": "NetworkPolicies documentation", + "networks": "networks", + "Networks are not project-bound. Using the same name creates a shared NAD.": "Networks are not project-bound. Using the same name creates a shared NAD.", + "Networks are not project-bound. Using the same name creates a shared UDN.": "Networks are not project-bound. Using the same name creates a shared UDN.", + "No {{kind}} found": "No {{kind}} found", + "No {{label}} found": "No {{label}} found", + "No {{resourceName}} matching the provided labels": "No {{resourceName}} matching the provided labels", + "No conditions found": "No conditions found", + "No datapoints found.": "No datapoints found.", + "No description": "No description", + "No hosts": "No hosts", + "No labels": "No labels", "No matching OVN bridge mapping found for \"{{name}}\".": "No matching OVN bridge mapping found for \"{{name}}\".", - "No matching projects": "一致するプロジェクトがありません", - "No namespace is configured for a primary user-defined network": "プライマリーユーザー定義ネットワークに namespace が設定されていません", - "No NetworkAttachmentDefinition found": "NetworkAttachmentDefinition が見つかりません", - "No owner": "オーナーなし", - "No pods matching the provided labels in the current namespace": "現在の namespace には、指定されたラベルに一致する Pod がありません", - "No projects matched": "一致するプロジェクトがありません", - "No results found for \"{{inputValue}}\"": "\"{{inputValue}}\" の結果が見つかりません", - "No route status": "ルートステータスがありません", - "No selector": "セレクターがありません", - "No virtual machines found": "仮想マシンが見つかりません", - "Node": "ノード", - "Node port": "ノードポート", + "No matching projects": "No matching projects", + "No namespace is configured for a primary user-defined network": "No namespace is configured for a primary user-defined network", + "No NetworkAttachmentDefinition found": "No NetworkAttachmentDefinition found", + "No owner": "No owner", + "No pods matching the provided labels in the current namespace": "No pods matching the provided labels in the current namespace", + "No projects matched": "No projects matched", + "No results found for \"{{inputValue}}\"": "No results found for \"{{inputValue}}\"", + "No route status": "No route status", + "No selector": "No selector", + "No virtual machines found": "No virtual machines found", + "Node": "Node", + "Node port": "Node port", "NodeNetworkConfigurationPolicy": "NodeNetworkConfigurationPolicy", - "None": "なし", - "Not available": "利用不可", - "Not configured": "未設定", - "Not found": "見つかりません", - "Not Receiving Traffic": "トラフィックは受信していません", - "NS selector": "NS セレクター", + "None": "None", + "Not available": "Not available", + "Not configured": "Not configured", + "Not found": "Not found", + "Not Receiving Traffic": "Not Receiving Traffic", + "NS selector": "NS selector", "of": "of", - "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).": "[name:]port:targetPort/PROTOCOL (例: http:80:9376/TCP) という形式で、1 行に 1 つのポートを記述してください。", - "Only supported when \"subnets\" are set.": "\"サブネット\" が設定されている場合にのみサポートされます。", - "Operator": "演算子", - "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.": "operator は、キーと一連の値との関係を表します。有効な演算子は、In、NotIn、Exists、および DoesNotExist です。", - "Owner": "オーナー", - "Passthrough": "パススルー", - "Path": "パス", - "Path that the router watches to route traffic to the service.": "ルーターがトラフィックをサービスにルーティングするために監視するパス。", - "Path type": "パスのタイプ", - "Pending": "保留中", + "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).": "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).", + "Only supported when \"subnets\" are set.": "Only supported when \"subnets\" are set.", + "Operator": "Operator", + "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", + "Owner": "Owner", + "Passthrough": "Passthrough", + "Path": "Path", + "Path that the router watches to route traffic to the service.": "Path that the router watches to route traffic to the service.", + "Path type": "Path type", + "Pending": "Pending", "per page": "per page", - "Percent": "パーセント", - "Persistent": "永続的", - "Phase": "フェーズ", - "Physical network name": "物理ネットワーク名", - "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.": "物理ネットワーク名。物理ネットワーク名と Open vSwitch ブリッジの間をマッピングするには、クラスターノード上にブリッジマッピングを設定する必要があります。", - "Please <2>try again.": "<2>再試行 してください。", - "Pod crash loop back-off": "Pod クラッシュループのバックオフ", - "Pod port or name": "Pod ポートまたは名前", - "Pod selector": "Pod セレクター", - "Pod selector for": "以下の Pod セレクター", - "Pod unschedulable": "Pod がスケジュール対象外である", - "pods": "Pod", - "Pods": "Pod", - "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.": "Pod はデフォルトですべてのトラフィックを受け入れます。Ingress ルールの許可リストを指定する NetworkPolicy を使用することで、Pod を分離できます。NetworkPolicy によって Pod が選択されると、NetworkPolicy で明示的に許可されていないすべてのトラフィックが拒否されます。", - "Pods having all the supplied key/value pairs as labels will be selected.": "指定のキー/値の全ペアがラベルとして指定されている Pod が選択されます。", - "Policy for": "次のポリシー:", - "Policy name": "ポリシー名", - "Policy type": "ポリシータイプ", - "Port": "ポート", - "Port is required": "ポートは必須です", - "Port must be between 1 and 65535": "ポートは 1 から 65535 である必要があります", - "Port names must be unique": "ポート名は一意である必要があります", - "Port names must be valid DNS labels": "ポート名は有効な DNS ラベルである必要があります", - "Ports": "ポート", - "Ports must use the format [name:]port:targetPort/PROTOCOL": "ポートは [name:]port:targetPort/PROTOCOL という形式を使用する必要があります", - "Primary network is automatically assigned to every pod created in the same namespace.": "プライマリーネットワークは、同じ namespace に作成されたすべての Pod に自動的に割り当てられます。", - "Private key": "秘密鍵", - "Project name": "プロジェクト名", - "Protocol": "プロトコル", - "Protocol must be TCP, UDP, or SCTP": "プロトコルは TCP、UDP、または SCTP である必要があります", - "Public hostname for the Route. If not specified, a hostname is generated.": "Route のパブリックホスト名。指定されない場合は、ホスト名が生成されます。", + "Percent": "Percent", + "Persistent": "Persistent", + "Phase": "Phase", + "Physical network name": "Physical network name", + "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.": "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.", + "Please <2>try again.": "Please <2>try again.", + "Pod crash loop back-off": "Pod crash loop back-off", + "Pod port or name": "Pod port or name", + "Pod selector": "Pod selector", + "Pod selector for": "Pod selector for", + "Pod unschedulable": "Pod unschedulable", + "pods": "pods", + "Pods": "Pods", + "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.": "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.", + "Pods having all the supplied key/value pairs as labels will be selected.": "Pods having all the supplied key/value pairs as labels will be selected.", + "Policy for": "Policy for", + "Policy name": "Policy name", + "Policy type": "Policy type", + "Port": "Port", + "Port is required": "Port is required", + "Port must be between 1 and 65535": "Port must be between 1 and 65535", + "Port names must be unique": "Port names must be unique", + "Port names must be valid DNS labels": "Port names must be valid DNS labels", + "Ports": "Ports", + "Ports must use the format [name:]port:targetPort/PROTOCOL": "Ports must use the format [name:]port:targetPort/PROTOCOL", + "Primary network is automatically assigned to every pod created in the same namespace.": "Primary network is automatically assigned to every pod created in the same namespace.", + "Private key": "Private key", + "Project name": "Project name", + "Protocol": "Protocol", + "Protocol must be TCP, UDP, or SCTP": "Protocol must be TCP, UDP, or SCTP", + "Public hostname for the Route. If not specified, a hostname is generated.": "Public hostname for the Route. If not specified, a hostname is generated.", "Re-encrypt": "Re-encrypt", - "Ready": "準備完了", - "Reason": "理由", - "Receiving Traffic": "トラフィック受信中", - "Redirect": "リダイレクト", - "Refer an existing ClusterUserDefinedNetwork": "既存の ClusterUserDefinedNetwork を参照する", - "Refer to your cluster administrator to know which network provider is used.": "クラスター管理者を参照して、使用するネットワークプロバイダーを確認します。", - "Remove": "削除", - "Remove all": "すべてを削除", - "Remove alternate Service": "代替 Service の削除", - "Remove exception": "例外の削除", - "Remove from network": "ネットワークから削除", - "Remove peer": "ピアの削除", - "Remove port": "ポートの削除", - "Remove subnets?": "サブネットを削除しますか?", - "Remove virtual machine from network?": "仮想マシンをネットワークから削除しますか?", - "Reset to default": "デフォルトにリセット", - "Resource name": "リソース名", - "Restarts": "再起動回数", - "Restricted Access": "制限されたアクセス", - "Reveal": "公開", - "Review selected Namespace(s)": "選択した Namespace を確認する", + "Ready": "Ready", + "Reason": "Reason", + "Receiving Traffic": "Receiving Traffic", + "Redirect": "Redirect", + "Refer an existing ClusterUserDefinedNetwork": "Refer an existing ClusterUserDefinedNetwork", + "Refer to your cluster administrator to know which network provider is used.": "Refer to your cluster administrator to know which network provider is used.", + "Remove": "Remove", + "Remove all": "Remove all", + "Remove alternate Service": "Remove alternate Service", + "Remove exception": "Remove exception", + "Remove from network": "Remove from network", + "Remove peer": "Remove peer", + "Remove port": "Remove port", + "Remove subnets?": "Remove subnets?", + "Remove virtual machine from network?": "Remove virtual machine from network?", + "Reset to default": "Reset to default", + "Resource name": "Resource name", + "Restarts": "Restarts", + "Restricted Access": "Restricted Access", + "Reveal": "Reveal", + "Review selected Namespace(s)": "Review selected Namespace(s)", "Role": "Role", - "Role describes the network role in the pod.": "Role は Pod におけるネットワークの役割を表します。", - "Route details": "Route の詳細", - "Router canonical hostname": "ルーターの正規ホスト名", - "Router: {{routerName}}": "ルーター: {{routerName}}", + "Role describes the network role in the pod.": "Role describes the network role in the pod.", + "Route details": "Route details", + "Router canonical hostname": "Router canonical hostname", + "Router: {{routerName}}": "Router: {{routerName}}", "Routes": "Routes", - "Routes can be secured using several TLS termination types for serving certificates.": "Route は、証明書を提供するためのいくつかの TLS 終端タイプを使用して保護できます。", - "Routing is a way to make your application publicly visible": "ルーティングはアプリケーションを公開する方法です", - "Rules": "ルール", - "Running": "実行中", - "Save": "保存", - "Search by name...": "名前で検索...", - "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.": "セカンダリーネットワークは、k8s.v1.cni.cncf.io/networks アノテーションを使用して特定のネットワークを選択する Pod にのみ割り当てられます。", - "Secure Route": "セキュアなルート", - "Security": "セキュリティー", - "Select a Project": "プロジェクトの選択", - "Select a Service": "Service の選択", - "Select all": "すべて選択", - "Select an operator": "演算子の選択", - "Select ClusterUserDefinedNetwork": "ClusterUserDefinedNetwork の選択", - "Select default ingress and egress deny rules": "デフォルトの Ingress および Egress 拒否ルールの選択", - "Select insecure traffic type": "非セキュアなトラフィックタイプの選択", - "Select one or more NetworkAttachmentDefinitions": "1 つ以上の NetworkAttachmentDefinitions の選択", - "Select resource name": "リソース名の選択", - "Select role": "ロールの選択", - "Select target port": "ターゲットポートの選択", - "Select termination type": "終端タイプの選択", - "Select virtual machines to connect to this network.": "このネットワークに接続する仮想マシンを選択します。", - "Selected categories will be displayed in the table.": "選択したカテゴリーが表に表示されます。", - "Selector": "セレクター", - "Selector is required": "セレクターは必須です", - "Selector keys must be unique": "セレクターのキーは一意である必要があります", - "Selectors must use valid key=value pairs": "セレクターは有効なキーと値のペアを使用する必要があります", + "Routes can be secured using several TLS termination types for serving certificates.": "Routes can be secured using several TLS termination types for serving certificates.", + "Routing is a way to make your application publicly visible": "Routing is a way to make your application publicly visible", + "Rules": "Rules", + "Running": "Running", + "Save": "Save", + "Search by name...": "Search by name...", + "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.": "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.", + "Secure Route": "Secure Route", + "Security": "Security", + "Select a Project": "Select a Project", + "Select a Service": "Select a Service", + "Select all": "Select all", + "Select an operator": "Select an operator", + "Select ClusterUserDefinedNetwork": "Select ClusterUserDefinedNetwork", + "Select default ingress and egress deny rules": "Select default ingress and egress deny rules", + "Select insecure traffic type": "Select insecure traffic type", + "Select one or more NetworkAttachmentDefinitions": "Select one or more NetworkAttachmentDefinitions", + "Select resource name": "Select resource name", + "Select role": "Select role", + "Select target port": "Select target port", + "Select termination type": "Select termination type", + "Select virtual machines to connect to this network.": "Select virtual machines to connect to this network.", + "Selected categories will be displayed in the table.": "Selected categories will be displayed in the table.", + "Selector": "Selector", + "Selector is required": "Selector is required", + "Selector keys must be unique": "Selector keys must be unique", + "Selectors must use valid key=value pairs": "Selectors must use valid key=value pairs", "Service": "Service", - "Service address": "Service アドレス", - "Service details": "Service の詳細", - "Service port": "Service ポート", - "Service port mapping": "Service ポートマッピング", - "Service routing": "Service ルーティング", - "Service to route to.": "ルーティングする Service。", - "Service weight": "Service の重み", + "Service address": "Service address", + "Service details": "Service details", + "Service port": "Service port", + "Service port mapping": "Service port mapping", + "Service routing": "Service routing", + "Service to route to.": "Service to route to.", + "Service weight": "Service weight", "Services": "Services", - "Session affinity": "セッションアフィニティー", - "Show a preview of the <2>affected pods that this egress rule will apply to.": "この Egress ルールが適用される <2>影響を受ける Pod のプレビューを表示します。", - "Show a preview of the <2>affected pods that this ingress rule will apply to.": "この Ingress ルールが適用される <2>影響を受ける Pod のプレビューを表示します。", - "Show a preview of the <2>affected pods that this policy will apply to": "このポリシーが適用される <2>影響を受ける Pod のプレビューを表示します", - "Show a preview of the <2>matching pods that this selector will apply to": "このセレクターが適用される <2>一致する Pod のプレビューを表示します", - "Show less": "簡易表示", - "Showing {{shown}} from {{total}} results": "{{total}} 件中 {{shown}} 件の結果を表示中", - "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.": "このルールに追加されたソースは、上記で定義された Pod へのトラフィックを許可します。このリストのソースは、論理 OR 演算を使用して結合されます。", - "Status": "ステータス", - "Subnet": "サブネット", - "Subnet CIDR": "サブネット CIDR", - "Subnets": "サブネット", - "Subnets are used for the pod network across the cluster.": "サブネットは、クラスター全体の Pod ネットワークに使用されます。", - "Switch and delete": "切り替えおよび削除", - "Switching to form view will delete any invalid YAML.": "フォームビューに切り替えると、無効な YAML が削除されます。", - "Target pods": "ターゲット Pod", - "Target port": "ターゲットポート", - "Target port for traffic": "トラフィックのターゲットポート", - "Target port names must be valid DNS labels": "ターゲットポート名は有効な DNS ラベルである必要があります", - "Tech preview": "テクノロジープレビュー", - "Terminating": "終了中", - "Termination type": "終端タイプ", - "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "形式は標準的な CIDR 表記に準拠する必要があります (例: \"192.168.123.0/24\")。", - "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.": "許可される値は Persistent (永続的) のみです。これを設定すると、OVN Kubernetes によって割り当てられた IP アドレスが \"ipamclaims.k8s.cni.cncf.io\" オブジェクトに永続化されます。", - "These IP addresses will be reused by other pods if requested.": "これらの IP アドレスは、要求された場合、他の Pod によって再利用されます。", - "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated": "これらのルールは、ルーティング層 (Ingress コントローラー) によって処理されます。このルーティング層は、ルールが変更されると更新されます。Ingress コントローラーの実装で、ヘッダーやその他のメタデータの転送または操作方法を定義します", - "This action will remove all rules within the Egress section and cannot be undone.": "この操作を行うと、Egress セクション内のすべてのルールが削除されます。この操作は元に戻せません。", - "This action will remove all rules within the Ingress section and cannot be undone.": "この操作を行うと、Ingress セクション内のすべてのルールが削除されます。この操作は元に戻せません。", - "This action will remove all subnets and cannot be undone.": "この操作を行うと、すべてのサブネットが削除されます。この操作は元に戻せません。", - "This field is only allowed for \"Primary\" network.": "このフィールドは \"プライマリー\" ネットワーク専用です。", - "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "このフィールドは \"プライマリー\" ネットワーク専用です。明確な必要性と OVN のネットワークトポロジーへの理解がない限り、このフィールドを設定することは推奨されません。", - "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.": "このフィールドは省略可能です。省略した場合、ネットワークを実装する論理スイッチはレイヤー 2 通信のみを提供するため、ユーザー自身で Pod の IP アドレスを設定する必要があります。その結果、ポートセキュリティー機能によって防止されるものが MAC スプーフィングだけになります。", - "This network must be created before you create any workload in this project": "このプロジェクトでワークロードを作成する前に、このネットワークを作成する必要があります", - "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.": "フォームでは、この NetworkPolicy は表示できません。YAML エディターに切り替えてください。", - "This route splits traffic across multiple services.": "このルートは複数のサービス間のトラフィックを分割します。", - "TLS certificate": "TLS 証明書", - "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.": "edge および re-encrypt 終端の TLS 証明書。指定されない場合は、ルーターのデフォルト証明書が使用されます。", - "TLS is not enabled": "TLS が有効にされていません", - "TLS Settings": "TLS 設定", - "TLS termination": "TLS 終端", - "To": "宛先", - "To ports": "宛先ポート", - "To troubleshoot, view logs and events, then debug in terminal.": "トラブルシューティングを行うには、ログとイベントを表示してから、ターミナルでデバッグを実行します。", - "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.": "カスタムルートを使用するには、正規名 (CNAME) レコードを作成して DNS プロバイダーを更新する必要があります。カスタムドメイン <2>{{host}} が、エイリアスとなる OpenShift の正規ルーターホスト名 <5>{{routerCanonicalHostname}} を指すように CNAME レコードを設定してください。", - "Topology": "トポロジー", - "Topology describes network configuration.": "トポロジーはネットワーク構成を表します。", - "total limit": "制限の合計", - "total requested": "要求の合計", - "Traffic": "トラフィック", - "Traffic in": "トラフィック IN", - "Traffic out": "トラフィック OUT", + "Session affinity": "Session affinity", + "Show a preview of the <2>affected pods that this egress rule will apply to.": "Show a preview of the <2>affected pods that this egress rule will apply to.", + "Show a preview of the <2>affected pods that this ingress rule will apply to.": "Show a preview of the <2>affected pods that this ingress rule will apply to.", + "Show a preview of the <2>affected pods that this policy will apply to": "Show a preview of the <2>affected pods that this policy will apply to", + "Show a preview of the <2>matching pods that this selector will apply to": "Show a preview of the <2>matching pods that this selector will apply to", + "Show less": "Show less", + "Showing {{shown}} from {{total}} results": "Showing {{shown}} from {{total}} results", + "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.": "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.", + "Status": "Status", + "Subnet": "Subnet", + "Subnet CIDR": "Subnet CIDR", + "Subnets": "Subnets", + "Subnets are used for the pod network across the cluster.": "Subnets are used for the pod network across the cluster.", + "Switch and delete": "Switch and delete", + "Switching to form view will delete any invalid YAML.": "Switching to form view will delete any invalid YAML.", + "Target pods": "Target pods", + "Target port": "Target port", + "Target port for traffic": "Target port for traffic", + "Target port names must be valid DNS labels": "Target port names must be valid DNS labels", + "Tech preview": "Tech preview", + "Terminating": "Terminating", + "Termination type": "Termination type", + "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").", + "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.": "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.", + "These IP addresses will be reused by other pods if requested.": "These IP addresses will be reused by other pods if requested.", + "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated": "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated", + "This action will remove all rules within the Egress section and cannot be undone.": "This action will remove all rules within the Egress section and cannot be undone.", + "This action will remove all rules within the Ingress section and cannot be undone.": "This action will remove all rules within the Ingress section and cannot be undone.", + "This action will remove all subnets and cannot be undone.": "This action will remove all subnets and cannot be undone.", + "This field is only allowed for \"Primary\" network.": "This field is only allowed for \"Primary\" network.", + "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.", + "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.": "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.", + "This network must be created before you create any workload in this project": "This network must be created before you create any workload in this project", + "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.": "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.", + "This route splits traffic across multiple services.": "This route splits traffic across multiple services.", + "TLS certificate": "TLS certificate", + "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.": "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.", + "TLS is not enabled": "TLS is not enabled", + "TLS Settings": "TLS Settings", + "TLS termination": "TLS termination", + "To": "To", + "To ports": "To ports", + "To troubleshoot, view logs and events, then debug in terminal.": "To troubleshoot, view logs and events, then debug in terminal.", + "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.": "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.", + "Topology": "Topology", + "Topology describes network configuration.": "Topology describes network configuration.", + "total limit": "total limit", + "total requested": "total requested", + "Traffic": "Traffic", + "Traffic in": "Traffic in", + "Traffic out": "Traffic out", "True": "True", - "Type": "タイプ", - "Type is required": "タイプは必須です", - "Unknown": "不明", - "unknown host": "不明なホスト", - "Unknown: endpoint readiness not available": "不明: エンドポイントの準備状況が利用できません", - "Unknown: endpoint readiness not loaded": "不明: エンドポイントの準備状況がロードされていません", - "Updated": "更新", - "Use \"{{inputValue}}\"": "\"{{inputValue}}\" の使用", - "Use the default Pod network": "デフォルトの Pod ネットワークを使用する", + "Type": "Type", + "Type is required": "Type is required", + "Unknown": "Unknown", + "unknown host": "unknown host", + "Unknown: endpoint readiness not available": "Unknown: endpoint readiness not available", + "Unknown: endpoint readiness not loaded": "Unknown: endpoint readiness not loaded", + "Updated": "Updated", + "Use \"{{inputValue}}\"": "Use \"{{inputValue}}\"", + "Use the default Pod network": "Use the default Pod network", "UserDefinedNetwork": "UserDefinedNetwork", "UserDefinedNetworks": "UserDefinedNetworks", - "Value": "値", - "Value hidden": "非表示の値", - "Values": "値", - "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.": "values は文字列値の配列です。演算子が In または NotIn の場合、values 配列は空にできません。演算子が Exists または DoesNotExist の場合、values 配列は空である必要があります。この配列は、strategic merge patch の実行時に置換されます。", - "View all {{total}} results": "全 {{total}} 件の結果を表示", - "View events": "イベントの表示", - "View logs": "ログの表示", - "View naming information": "命名情報の表示", - "Virtual Machines": "仮想マシン", + "Value": "Value", + "Value hidden": "Value hidden", + "Values": "Values", + "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", + "View all {{total}} results": "View all {{total}} results", + "View events": "View events", + "View logs": "View logs", + "View naming information": "View naming information", + "Virtual Machines": "Virtual Machines", + "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.": "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.", "VLAN": "VLAN", - "VLAN tag number": "VLAN タグ番号", - "Weight": "重み", - "When omitted, the platform will choose a reasonable default which is subject to change over time.": "省略した場合、プラットフォームによって適切なデフォルト値が選択されます。デフォルト値は時間の経過とともに変更される可能性があります。", - "When using the OpenShift SDN cluster network provider:": "OpenShift SDN クラスターネットワークプロバイダーを使用する場合:", - "Wildcard policy": "ワイルドカードポリシー", - "with exceptions": "例外", + "VLAN tag number": "VLAN tag number", + "Weight": "Weight", + "When omitted, the platform will choose a reasonable default which is subject to change over time.": "When omitted, the platform will choose a reasonable default which is subject to change over time.", + "When using the OpenShift SDN cluster network provider:": "When using the OpenShift SDN cluster network provider:", + "Wildcard policy": "Wildcard policy", + "with exceptions": "with exceptions", "YAML": "YAML", - "YAML view": "YAML ビュー", - "You don't have access to this section due to cluster policy.": "クラスターのポリシーにより、このセクションにアクセスできません。", - "You don't have permission to perform this action": "このアクションを実行する権限がありません", - "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.": "'openshift-'、'kubernetes-'、または 'kube-' が先頭に付くプロジェクトを作成するには、Namespace を作成する必要があります。" + "YAML view": "YAML view", + "You don't have access to this section due to cluster policy.": "You don't have access to this section due to cluster policy.", + "You don't have permission to perform this action": "You don't have permission to perform this action", + "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.": "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'." } diff --git a/locales/ko/plugin__networking-console-plugin.json b/locales/ko/plugin__networking-console-plugin.json index 514d4657..6ef48800 100644 --- a/locales/ko/plugin__networking-console-plugin.json +++ b/locales/ko/plugin__networking-console-plugin.json @@ -1,506 +1,504 @@ { - " See more details in: <3>": " 자세한 내용은 다음을 참조하십시오.<3>", - " See more details in: <3>.": " 자세한 내용은 다음을 참조하십시오.<3>", - "(all nodes): ": "(모든 노드): ", - "{{count}} annotation_one": "{{count}} 주석", - "{{count}} annotation_other": "{{count}} 주석", - "{{kind}} details": "{{kind}} 세부 정보", - "{{kind}} disabled": "{{kind}} 비활성화됨", - "{{numCores}} cores": "{{numCores}} 코어", - "{{path}} found in resource, but is not supported in form.": "{{path}}은/는 리소스에 있지만 양식에서 지원되지 않습니다.", - "{{path}} is missing.": "{{path}}이/가 누락되어 있습니다.", - "{{path}} should be an Array.": "{{path}}이/가 배열이 될 수 있습니다.", - "{{path}} should not be empty.": "{{path}}은/는 비워 둘 수 없습니다.", - "{{value}} at {{date}}": "{{date}}의 {{value}}", - "+{{count}} more_one": "+{{count}} 추가", - "+{{count}} more_other": "+{{count}} 추가", - "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.": "네트워크 유형을 선택하려면 <0>OpenShift Virtualization Operator 또는 <3>SR-IOV Network Operator 를 클러스터에 설치해야 합니다.", - "404: Page Not Found": "404: 페이지를 찾을 수 없음", - "A number between 0 and 255 that depicts relative weight compared with other targets.": "다른 대상과 비교했을 때 상대적 가중치를 나타내는 0에서 255 사이의 숫자입니다.", - "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').": "프로젝트 이름은 소문자 영숫자 또는 '-'로 구성되어야하며 영숫자나 문자로 시작하고 끝나야 합니다. (예 : 'my-name' 또는 '123-abc')", - "A unique name for the Route within the project": "프로젝트 내 경로의 고유 이름", - "Accessible outside the cluster": "클러스터 외부에서 액세스 가능", - "Accessible within the cluster only": "클러스터 내에서만 액세스 가능", - "Actions": "작업", - "Adapter model": "어댑터 모델", - "Add": "추가", - "Add allowed destination": "허용된 대상 추가", - "Add allowed source": "허용된 소스 추가", - "Add alternate Service": "대체 서비스 추가", - "Add egress rule": "Egress 규칙 추가", - "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.": "선택한 pod에 적용할 Egress 규칙을 추가합니다. 하나 이상의 규칙과 일치하는 경우 pod로의 트래픽이 허용됩니다.", - "Add exception": "예외 추가", - "Add expression": "표현식 추가", - "Add ingress rule": "Ingress 규칙 추가", - "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.": "선택한 pod에 적용할 Ingress 규칙을 추가합니다. 하나 이상의 규칙과 일치하는 경우 pod에서 트래픽이 허용됩니다.", - "Add label": "라벨 추가", - "Add namespace selector": "네임스페이스 선택기 추가", - "Add pod selector": "Pod 선택기 추가", - "Add port": "포트 추가", - "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.": "포트를 추가하여 포트를 통한 트래픽을 제한합니다. 포트가 제공되지 않으면 정책에 따라 모든 포트가 트래픽에 액세스할 수 있습니다.", - "Add subnet": "서브넷 추가", - "Add virtual machines": "가상 머신 추가", - "All incoming traffic is denied to Pods in {{namespace}}": "수신되는 모든 트래픽은 {{namespace}}의 Pod에 거부됩니다.", - "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.": "모든 나가는 트래픽은 기본적으로 허용됩니다. 클러스터 네트워크 공급자가 송신 트래픽을 허용하는 경우 송신 규칙을 사용하여 나가는 트래픽을 제한할 수 있습니다. OpenShift SDN 클러스터 네트워크 공급자를 사용하는 경우 송신 네트워크 정책이 지원되지 않습니다.", - "All outgoing traffic is denied from Pods in {{namespace}}": "모든 나가는 트래픽은 {{namespace}}의 Pod에서 거부됩니다.", - "All pods within {{namespace}}": "{{namespace}} 내의 모든 pod", - "Allow": "허용", - "Allow peers by IP block": "IP 차단으로 피어 허용", - "Allow pods from inside the cluster": "클러스터 내부에서 Pod 허용", - "Allow pods from the same namespace": "동일한 네임스페이스에서 Pod 허용", - "Allow traffic from peers by IP block": "IP 차단으로 피어에서의 트래픽 허용", - "Allow traffic from pods in the same namespace": "동일한 네임스페이스에 있는 pod에서의 트래픽 허용", - "Allow traffic from pods inside the cluster": "클러스터 내부 pod에서의 트래픽 허용", - "Allow traffic to peers by IP block": "IP 차단으로 피어에 대한 트래픽 허용", - "Allow traffic to pods in the same namespace": "동일한 네임스페이스의 pod에 대한 트래픽 허용", - "Allow traffic to pods inside the cluster": "클러스터 내부의 pod에 대한 트래픽 허용", - "Alternate Service target": "대체 서비스 대상", - "Alternate Service to route to.": "라우팅 할 대체 서비스입니다.", - "Alternate Service weight": "대체 서비스 가중치", - "An error occurred.": "오류가 발생하였습니다.", - "An error occurred. Please try again.": "오류가 발생했습니다. 다시 시도하십시오.", - "An OpenShift project is an alternative representation of a Kubernetes namespace.": "OpenShift 프로젝트는 Kubernetes 네임스페이스의 대체 표현입니다.", - "annotation_one": "주석", - "annotation_other": "주석", - "Annotations": "주석", - "Any namespace": "모든 네임 스페이스", - "Any peer": "모든 피어", - "Any pod": "모든 pod", - "Any port": "모든 포트", - "Are you sure you want to remove <2> from <5>{nadName}?": "<2>을/를 <5>{nadName}에서 삭제하시겠습니까?", - "Are you sure you want to remove <2> from <5>{udnName}?": "<2>을/를 <5>{udnName}에서 삭제하시겠습니까?", - "Are you sure?": "정말로 실행하시겠습니까?", - "Assigns IP addresses from this subnet to Pods and VirtualMachines.": "이 서브넷의 IP 주소를 Pod 및 VirtualMachines에 할당합니다.", - "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.": "생성 시 <2>{{label}} 라벨을 사용하여 네임스페이스를 구성해야 합니다. 새 네임스페이스를 생성하려면 <5>Namespaces 로 이동하십시오.", - "At least one port is required": "하나 이상의 포트가 필요합니다.", - "Backend health": "백엔드 상태", - "Bridge name": "브리지 이름", - "Browse...": "찾아보기...", - "CA certificate": "CA 인증서", - "Can't preview matching {{resourceName}}": "일치하는 {{resourceName}}을(를) 미리 볼 수 없음", - "Can't preview pods": "pod를 미리 볼 수 없음", - "Cancel": "취소", - "Certificate": "인증서", - "Certificates": "인증서", + " See more details in: <3>": " See more details in: <3>", + " See more details in: <3>.": " See more details in: <3>.", + "(all nodes): ": "(all nodes): ", + "{{count}} annotation_other": "{{count}} annotation", + "{{kind}} details": "{{kind}} details", + "{{kind}} disabled": "{{kind}} disabled", + "{{numCores}} cores": "{{numCores}} cores", + "{{path}} found in resource, but is not supported in form.": "{{path}} found in resource, but is not supported in form.", + "{{path}} is missing.": "{{path}} is missing.", + "{{path}} should be an Array.": "{{path}} should be an Array.", + "{{path}} should not be empty.": "{{path}} should not be empty.", + "{{value}} at {{date}}": "{{value}} at {{date}}", + "+{{count}} more_other": "+{{count}} more", + "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.": "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.", + "404: Page Not Found": "404: Page Not Found", + "A number between 0 and 255 that depicts relative weight compared with other targets.": "A number between 0 and 255 that depicts relative weight compared with other targets.", + "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').": "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').", + "A unique name for the Route within the project": "A unique name for the Route within the project", + "Accessible outside the cluster": "Accessible outside the cluster", + "Accessible within the cluster only": "Accessible within the cluster only", + "Actions": "Actions", + "Adapter model": "Adapter model", + "Add": "Add", + "Add allowed destination": "Add allowed destination", + "Add allowed source": "Add allowed source", + "Add alternate Service": "Add alternate Service", + "Add egress rule": "Add egress rule", + "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.": "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.", + "Add exception": "Add exception", + "Add expression": "Add expression", + "Add ingress rule": "Add ingress rule", + "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.": "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.", + "Add label": "Add label", + "Add namespace selector": "Add namespace selector", + "Add pod selector": "Add pod selector", + "Add port": "Add port", + "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.": "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.", + "Add subnet": "Add subnet", + "Add virtual machines": "Add virtual machines", + "All incoming traffic is denied to Pods in {{namespace}}": "All incoming traffic is denied to Pods in {{namespace}}", + "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.": "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.", + "All outgoing traffic is denied from Pods in {{namespace}}": "All outgoing traffic is denied from Pods in {{namespace}}", + "All pods within {{namespace}}": "All pods within {{namespace}}", + "Allow": "Allow", + "Allow peers by IP block": "Allow peers by IP block", + "Allow pods from inside the cluster": "Allow pods from inside the cluster", + "Allow pods from the same namespace": "Allow pods from the same namespace", + "Allow traffic from peers by IP block": "Allow traffic from peers by IP block", + "Allow traffic from pods in the same namespace": "Allow traffic from pods in the same namespace", + "Allow traffic from pods inside the cluster": "Allow traffic from pods inside the cluster", + "Allow traffic to peers by IP block": "Allow traffic to peers by IP block", + "Allow traffic to pods in the same namespace": "Allow traffic to pods in the same namespace", + "Allow traffic to pods inside the cluster": "Allow traffic to pods inside the cluster", + "Alternate Service target": "Alternate Service target", + "Alternate Service to route to.": "Alternate Service to route to.", + "Alternate Service weight": "Alternate Service weight", + "An error occurred.": "An error occurred.", + "An error occurred. Please try again.": "An error occurred. Please try again.", + "An OpenShift project is an alternative representation of a Kubernetes namespace.": "An OpenShift project is an alternative representation of a Kubernetes namespace.", + "annotation_other": "annotation", + "Annotations": "Annotations", + "Any namespace": "Any namespace", + "Any peer": "Any peer", + "Any pod": "Any pod", + "Any port": "Any port", + "Are you sure you want to remove <2> from <5>{nadName}?": "Are you sure you want to remove <2> from <5>{nadName}?", + "Are you sure you want to remove <2> from <5>{udnName}?": "Are you sure you want to remove <2> from <5>{udnName}?", + "Are you sure?": "Are you sure?", + "Assigns IP addresses from this subnet to Pods and VirtualMachines.": "Assigns IP addresses from this subnet to Pods and VirtualMachines.", + "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.": "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.", + "At least one port is required": "At least one port is required", + "Backend health": "Backend health", + "Bridge name": "Bridge name", + "Browse...": "Browse...", + "CA certificate": "CA certificate", + "Can't preview matching {{resourceName}}": "Can't preview matching {{resourceName}}", + "Can't preview pods": "Can't preview pods", + "Cancel": "Cancel", + "Certificate": "Certificate", + "Certificates": "Certificates", "CIDR": "CIDR", - "Clear": "지우기", - "Clear input value": "입력 값 지우기", - "Click <1>Create {{kind}} to create your first {{kind}}": "<1>만들기 {{kind}}를 클릭하여 첫 번째 {{kind}}를 생성합니다.", - "Cluster administrator permissions are required to enable this feature.": "이 기능을 활성화하려면 클러스터 관리자 권한이 필요합니다.", - "Cluster IP": "클러스터 IP", - "Cluster-wide UserDefinedNetworks": "클러스터 전체 UserDefinedNetworks", + "Clear": "Clear", + "Clear input value": "Clear input value", + "Click <1>Create {{kind}} to create your first {{kind}}": "Click <1>Create {{kind}} to create your first {{kind}}", + "Cluster administrator permissions are required to enable this feature.": "Cluster administrator permissions are required to enable this feature.", + "Cluster IP": "Cluster IP", + "Cluster-wide UserDefinedNetworks": "Cluster-wide UserDefinedNetworks", "ClusterUserDefinedNetwork": "ClusterUserDefinedNetwork", - "ClusterUserDefinedNetwork name": "ClusterUserDefinedNetwork 이름", + "ClusterUserDefinedNetwork name": "ClusterUserDefinedNetwork name", "ClusterUserDefinedNetworks": "ClusterUserDefinedNetworks", - "Completed": "완료됨", - "Conditions": "조건", - "Configure in Virtual machine networks page": "가상 머신 네트워크 페이지에서 구성", - "Configure via:": "다음을 사용하여 설정:", - "Confirm": "확인", - "Connection rate": "연결 속도", + "Completed": "Completed", + "Conditions": "Conditions", + "Configure in Virtual machine networks page": "Configure in Virtual machine networks page", + "Configure via:": "Configure via:", + "Confirm": "Confirm", + "Connection rate": "Connection rate", "ConsoleQuickStart": "ConsoleQuickStart", "ConsoleQuickStarts": "ConsoleQuickStarts", - "Copied": "복사됨", - "Copied to clipboard": "클립 보드에 복사됨", - "Copy": "복사", - "Copy to clipboard": "클립 보드에 복사", + "Copied": "Copied", + "Copied to clipboard": "Copied to clipboard", + "Copy": "Copy", + "Copy to clipboard": "Copy to clipboard", "CPU": "CPU", "CrashLoopBackOff": "CrashLoopBackOff", - "CrashLoopBackOff indicates that the application within the container is failing to start properly.": "CrashLoopBackOff는 컨테이너 내의 애플리케이션이 제대로 시작되지 않고 있음을 나타냅니다.", - "Create": "만들기", - "Create {{ kind }}": "{{ kind }} 만들기", - "Create {{kind}}": "{{kind}} 만들기", - "Create {{label}}": "{{label}} 만들기", - "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.": "양식을 사용하여 서비스를 생성합니다. 양식에 표시되지 않는 필드를 포함하여 모든 항목을 직접 설정하려면 YAML 보기로 전환합니다.", - "Create by completing the form.": "양식을 작성하여 만듭니다.", - "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.": "YAML 또는 JSON 정의를 수동으로 입력하거나 파일을 편집기로 드래그 앤 드롭하여 만듭니다.", - "Create ClusterUserDefinedNetwork": "ClusterUserDefinedNetwork 생성", - "Create Ingress": "Ingress 생성", - "Create NetworkAttachmentDefinition": "NetworkAttachmentDefinition 생성", - "Create Project": "프로젝트 만들기", - "Create Route": "경로 생성", - "Create Service": "서비스 생성", - "Create UserDefinedNetwork": "UserDefinedNetwork 생성", - "Created": "생성됨", - "Created at": "생성일", - "Current selections": "현재 선택 사항", - "Custom route": "사용자 지정 경로", - "Debug container {{name}}": "디버그 컨테이너 {{name}}", - "Define a new UserDefinedNetwork for this project": "이 프로젝트에 대한 새 UserDefinedNetwork 정의", - "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.": "VirtualMachines 및 Pod에서 지정된 프로젝트에서 통신하는 데 사용하는 네트워크를 정의합니다. <2>기본 사용자 정의 네트워크 에 대해 자세히 알아보십시오.", - "Define the network used by VirtualMachines and Pods to communicate in this project": "이 프로젝트에서 통신하기 위해 VirtualMachines 및 Pod에서 사용하는 네트워크를 정의합니다.", - "Degraded: {{ready}} of {{total}} endpoints ready": "성능 저하됨: {{total}}개 엔드포인트 중 {{ready}}개 준비됨", - "Delete": "삭제", - "Delete {{kind}}": "{{kind}} 삭제", - "Delete Ingress": "Ingress 삭제", - "Delete NetworkAttachmentDefinition": "NetworkAttachmentDefinition 삭제", - "Delete Route": "경로 삭제", - "Delete Service": "서비스 삭제", - "Deletion protection": "삭제 보호", - "Deny all egress traffic": "모든 Egress 트래픽 거부", - "Deny all ingress traffic": "모든 Ingress 트래픽 거부", - "Description": "설명", - "Destination CA certificate": "대상 CA 인증서", - "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.": "이 규칙에 추가된 대상은 위에 정의된 pod의 트래픽을 허용합니다. 이 목록의 대상은 논리적 OR 연산을 사용하여 결합됩니다.", - "Details": "세부 정보", - "Disabled": "비활성화됨", - "Display name": "표시 이름", - "Do you need to set up custom DNS?": "사용자 지정 DNS를 설정해야 합니까?", - "Down: {{ready}} of {{total}} endpoints ready": "중지됨: {{total}}개 엔드포인트 중 {{ready}}개 준비됨", - "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.": "듀얼 스택 클러스터는 2개의 서브넷(IP 제품군마다 하나씩)을 설정할 수 있으며, 그렇지 않으면 서브넷은 1개만 허용됩니다.", - "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "듀얼 스택 클러스터는 2개의 서브넷(각 IP 제품군마다 하나)을 설정할 수 있으며, 그렇지 않으면 하나의 서브넷만 허용됩니다. 형식은 표준 CIDR 표기법(예: \"192.168.123.0/24\")과 일치해야 합니다.", - "Duplicate keys found in main pod selector": "기본 pod 선택기에서 중복 키가 발견됨", - "Duplicate keys found in peer namespace selector": "피어 네임스페이스 선택기에서 중복 키가 발견됨", - "Duplicate keys found in peer pod selector": "피어 pod 선택기에서 중복 키가 발견됨", + "CrashLoopBackOff indicates that the application within the container is failing to start properly.": "CrashLoopBackOff indicates that the application within the container is failing to start properly.", + "Create": "Create", + "Create {{ kind }}": "Create {{ kind }}", + "Create {{kind}}": "Create {{kind}}", + "Create {{label}}": "Create {{label}}", + "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.": "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.", + "Create by completing the form.": "Create by completing the form.", + "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.": "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.", + "Create ClusterUserDefinedNetwork": "Create ClusterUserDefinedNetwork", + "Create Ingress": "Create Ingress", + "Create NetworkAttachmentDefinition": "Create NetworkAttachmentDefinition", + "Create Project": "Create Project", + "Create Route": "Create Route", + "Create Service": "Create Service", + "Create UserDefinedNetwork": "Create UserDefinedNetwork", + "Created": "Created", + "Created at": "Created at", + "Current selections": "Current selections", + "Custom route": "Custom route", + "Debug container {{name}}": "Debug container {{name}}", + "Define a new UserDefinedNetwork for this project": "Define a new UserDefinedNetwork for this project", + "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.": "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.", + "Define the network used by VirtualMachines and Pods to communicate in this project": "Define the network used by VirtualMachines and Pods to communicate in this project", + "Degraded: {{ready}} of {{total}} endpoints ready": "Degraded: {{ready}} of {{total}} endpoints ready", + "Delete": "Delete", + "Delete {{kind}}": "Delete {{kind}}", + "Delete Ingress": "Delete Ingress", + "Delete NetworkAttachmentDefinition": "Delete NetworkAttachmentDefinition", + "Delete Route": "Delete Route", + "Delete Service": "Delete Service", + "Deletion protection": "Deletion protection", + "Deny all egress traffic": "Deny all egress traffic", + "Deny all ingress traffic": "Deny all ingress traffic", + "Description": "Description", + "Destination CA certificate": "Destination CA certificate", + "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.": "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.", + "Details": "Details", + "Disabled": "Disabled", + "Display name": "Display name", + "Do you need to set up custom DNS?": "Do you need to set up custom DNS?", + "Down: {{ready}} of {{total}} endpoints ready": "Down: {{ready}} of {{total}} endpoints ready", + "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.": "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.", + "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").", + "Duplicate keys found in main pod selector": "Duplicate keys found in main pod selector", + "Duplicate keys found in peer namespace selector": "Duplicate keys found in peer namespace selector", + "Duplicate keys found in peer pod selector": "Duplicate keys found in peer pod selector", "Edge": "Edge", - "Edit": "편집", - "Edit {{kind}}": "{{kind}} 편집", - "Edit {{label}}": "{{label}} 편집", - "Edit annotations": "주석 편집", - "Edit Ingress": "Ingress 편집", - "Edit labels": "라벨 편집", - "Edit NetworkAttachmentDefinition": "NetworkAttachmentDefinition 편집", - "Edit Pod selector": "Pod 선택기 편집", - "Edit Route": "경로 수정", - "Edit Service": "서비스 편집", + "Edit": "Edit", + "Edit {{kind}}": "Edit {{kind}}", + "Edit {{label}}": "Edit {{label}}", + "Edit annotations": "Edit annotations", + "Edit Ingress": "Edit Ingress", + "Edit labels": "Edit labels", + "Edit NetworkAttachmentDefinition": "Edit NetworkAttachmentDefinition", + "Edit Pod selector": "Edit Pod selector", + "Edit Route": "Edit Route", + "Edit Service": "Edit Service", "Egress": "Egress", - "Egress network policy is not supported.": "Egress 네트워크 정책은 지원되지 않습니다.", - "Egress rule": "Egress 규칙", - "Egress rules": "송신 규칙", - "Enable {{kind}}": "{{kind}} 활성화", - "Enabled": "활성화됨", + "Egress network policy is not supported.": "Egress network policy is not supported.", + "Egress rule": "Egress rule", + "Egress rules": "Egress rules", + "Enable {{kind}}": "Enable {{kind}}", + "Enabled": "Enabled", "EndpointSlice": "EndpointSlice", "EndpointSlices": "EndpointSlices", - "Error": "오류", - "Error details": "오류 정보", - "Error loading virtual machines": "가상 머신 로드 중 오류 발생", - "Example: 100": "예: 100", - "Exceptions": "예외", - "External DNS name this service resolves to (e.g. example.com).": "이 서비스가 확인되는 외부 DNS 이름(예: example.com).", - "External IP": "외부 IP", - "External load balancer": "외부 로드 밸런서", - "External name": "외부 이름", - "External name is required": "외부 이름이 필요합니다.", - "External name must be a valid hostname": "외부 이름은 유효한 호스트 이름이어야 합니다", - "External service name": "외부 서비스 이름", - "Failed": "실패", - "Failed to add the following virtual machines: {{names}}": "다음 가상 머신을 추가하지 못했습니다. {{names}}", - "Failed to remove virtual machine from network": "네트워크에서 가상 머신을 제거하지 못했습니다", - "Failed to retrieve the list of projects": "프로젝트 목록을 검색하지 못했습니다", + "Error": "Error", + "Error details": "Error details", + "Error loading virtual machines": "Error loading virtual machines", + "Example: 100": "Example: 100", + "Exceptions": "Exceptions", + "External DNS name this service resolves to (e.g. example.com).": "External DNS name this service resolves to (e.g. example.com).", + "External IP": "External IP", + "External load balancer": "External load balancer", + "External name": "External name", + "External name is required": "External name is required", + "External name must be a valid hostname": "External name must be a valid hostname", + "External service name": "External service name", + "Failed": "Failed", + "Failed to add the following virtual machines: {{names}}": "Failed to add the following virtual machines: {{names}}", + "Failed to remove virtual machine from network": "Failed to remove virtual machine from network", + "Failed to retrieve the list of projects": "Failed to retrieve the list of projects", "False": "False", - "Form view": "양식보기", - "From": "출처", - "From pods": "출처: 포드", - "Given subnet is split into smaller subnets for every node.": "지정된 서브넷은 각 노드별로 더 작은 서브넷으로 분할됩니다.", - "Health": "상태", - "Healthy: {{ready}} of {{total}} endpoints ready": "정상: {{total}}개 엔드포인트 중 {{ready}}개 준비됨", - "Hide": "숨기기", - "Hide selected Namespace(s)": "선택한 네임스페이스 숨기기", - "Host": "호스트", - "Hostname": "호스트 이름", - "Hosts": "호스트", + "Form view": "Form view", + "From": "From", + "From pods": "From pods", + "Given subnet is split into smaller subnets for every node.": "Given subnet is split into smaller subnets for every node.", + "Health": "Health", + "Healthy: {{ready}} of {{total}} endpoints ready": "Healthy: {{ready}} of {{total}} endpoints ready", + "Hide": "Hide", + "Hide selected Namespace(s)": "Hide selected Namespace(s)", + "Host": "Host", + "Hostname": "Hostname", + "Hosts": "Hosts", "HostSubnet": "HostSubnet", - "If no namespace selector is provided, pods from all namespaces will be eligible.": "네임스페이스 선택기가 제공되지 않으면 모든 네임스페이스의 pod를 사용할 수 있습니다.", - "If no pod selector is provided, the policy will apply to all pods in the namespace.": "Pod 선택기가 제공되지 않으면 정책이 네임스페이스의 모든 Pod에 적용됩니다.", - "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "pod 선택기가 제공되지 않으면 적합한 네임스페이스에 있는 모든 pod의 트래픽이 허용됩니다.", - "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "pod 선택기가 제공되지 않으면 이 네임스페이스에 있는 모든 pod의 트래픽이 허용됩니다.", - "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "pod 선택기가 제공되지 않으면 적합한 네임스페이스의 모든 pod에 대한 트래픽이 허용됩니다.", - "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "pod 선택기가 제공되지 않으면 이 네임스페이스의 모든 pod에 대한 트래픽이 허용됩니다.", - "If this field is empty, traffic will be allowed from all external sources.": "이 필드가 비어 있으면 모든 외부 소스의 트래픽이 허용됩니다.", - "If this field is empty, traffic will be allowed to all external sources.": "이 필드가 비어 있으면 모든 외부 소스에 대한 트래픽이 허용됩니다.", + "If no namespace selector is provided, pods from all namespaces will be eligible.": "If no namespace selector is provided, pods from all namespaces will be eligible.", + "If no pod selector is provided, the policy will apply to all pods in the namespace.": "If no pod selector is provided, the policy will apply to all pods in the namespace.", + "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.", + "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "If no pod selector is provided, traffic from all pods in this namespace will be allowed.", + "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.", + "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "If no pod selector is provided, traffic to all pods in this namespace will be allowed.", + "If this field is empty, traffic will be allowed from all external sources.": "If this field is empty, traffic will be allowed from all external sources.", + "If this field is empty, traffic will be allowed to all external sources.": "If this field is empty, traffic will be allowed to all external sources.", "Ingress": "Ingress", - "Ingress details": "Ingress 세부 정보", - "Ingress points of load balancer": "로드 밸런서의 Ingress 포인트", - "Ingress rule": "Ingress 규칙", - "Ingress rules": "Ingress 규칙", - "Ingresses": "Ingress", - "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}": "입력 오류: 선택기는 문자나 숫자로 시작하고 끝나야 하며 -, _, / 또는 . 만 포함할 수 있습니다. 잘못된 값: {{offendingSelector}}", - "Insecure traffic": "안전하지 않은 트래픽", - "Interface": "인터페이스", - "Invalid IP address or subnet format": "잘못된 IP 주소 또는 서브넷 형식", - "Invalid subnet format": "잘못된 서브넷 형식", - "Invalid YAML cannot be persisted": "잘못된 YAML을 유지할 수 없습니다.", - "IP address": "IP 주소", - "IP address management": "IP 주소 관리", - "IP Addresses accepting traffic for service": "서비스 트래픽을 허용하는 IP 주소", - "IP block exceptions are not supported and would cause the entire IP block section to be ignored.": "IP 블록 예외는 지원되지 않으므로 전체 IP 블록 섹션이 무시됩니다.", - "IP blocks": "IP 블록", - "IPAM Lifecycle": "IPAM 라이프 사이클", + "Ingress details": "Ingress details", + "Ingress points of load balancer": "Ingress points of load balancer", + "Ingress rule": "Ingress rule", + "Ingress rules": "Ingress rules", + "Ingresses": "Ingresses", + "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}": "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}", + "Insecure traffic": "Insecure traffic", + "Interface": "Interface", + "Invalid IP address or subnet format": "Invalid IP address or subnet format", + "Invalid subnet format": "Invalid subnet format", + "Invalid YAML cannot be persisted": "Invalid YAML cannot be persisted", + "IP address": "IP address", + "IP address management": "IP address management", + "IP Addresses accepting traffic for service": "IP Addresses accepting traffic for service", + "IP block exceptions are not supported and would cause the entire IP block section to be ignored.": "IP block exceptions are not supported and would cause the entire IP block section to be ignored.", + "IP blocks": "IP blocks", + "IPAM Lifecycle": "IPAM Lifecycle", "IPAMLifecycle": "IPAMLifecycle", - "IPAMLifecycle controls IP addresses management lifecycle.": "IPAMLifecycle은 IP 주소 관리 라이프사이클을 제어합니다.", - "It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "OVN 네트워크 토폴로지에 대한 명확한 이해와 필요성이 없는 상태에서 이 필드를 설정하지 않는 것이 좋습니다.", + "IPAMLifecycle controls IP addresses management lifecycle.": "IPAMLifecycle controls IP addresses management lifecycle.", + "It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "It is not recommended to set this field without explicit need and understanding of the OVN network topology.", "JoinSubnets": "JoinSubnets", - "JoinSubnets are used inside the OVN network topology.": "JoinSubnets는 OVN 네트워크 토폴로지 내에서 사용됩니다.", - "Key": "키", - "key is the label key that the selector applies": "key는 선택기가 적용되는 라벨 키입니다.", - "Kind": "유형", - "Labels": "라벨", - "Layer2 topology creates one logical switch shared by all nodes.": "Layer2 토폴로지는 모든 노드에서 공유하는 하나의 논리 스위치를 생성합니다.", - "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.": "Layer3 토폴로지는 각각 다른 서브넷이 있는 노드당 계층 2 세그먼트를 생성합니다. 계층 3 라우팅은 노드 서브넷을 상호 연결하는 데 사용됩니다.", - "Learn how to use NetworkAttachmentDefinitions": "NetworkAttachmentDefinitions 사용 방법 알아보기", - "Learn more about {{ kind }}": "{{ kind }}에 대해 자세히 알아보기", - "Learn more about working with projects": "프로젝트 작업에 대해 자세히 알아보기", - "List of {{resourceName}} matching": "일치하는 {{resourceName}} 목록", - "List of matching {{resourceName}}": "일치하는 {{resourceName}} 목록", - "List of pods": "pod 목록", - "List of pods matching": "일치하는 pod 목록", - "Location": "위치", - "Location of the resource that backs the service": "서비스를 백업할 리소스의 위치", - "MAC spoof check": "MAC 스푸핑 검사", - "Manage columns": "열 관리", - "Managed by UserDefinedNetwork": "UserDefinedNetwork에 의해 관리", - "Match Expressions": "표현식 일치", - "Match Labels": "라벨 일치", - "matchExpressions is a list of label selector requirements. The requirements are ANDed.": "matchExpressions는 라벨 선택기 요구 사항 목록입니다. 이러한 요구 사항은 AND로 결합됩니다.", - "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.": "matchLabels는 {key,value} 쌍의 맵입니다. matchLabels 맵의 단일 {key,value} 는 key 필드가 \"key\"이고 operator는 \"In\"이고 값 배열에는 \"value\"만 포함됩니다. 이러한 요구 사항은 AND로 결합됩니다.", - "Memory": "메모리", - "Message": "메시지", - "Metrics": "메트릭", - "Missing installed operators": "설치된 Operator가 누락됨", - "More information:": "자세한 내용:", + "JoinSubnets are used inside the OVN network topology.": "JoinSubnets are used inside the OVN network topology.", + "Key": "Key", + "key is the label key that the selector applies": "key is the label key that the selector applies", + "Kind": "Kind", + "Labels": "Labels", + "Layer2 topology creates one logical switch shared by all nodes.": "Layer2 topology creates one logical switch shared by all nodes.", + "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.": "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.", + "Learn how to use NetworkAttachmentDefinitions": "Learn how to use NetworkAttachmentDefinitions", + "Learn more about {{ kind }}": "Learn more about {{ kind }}", + "Learn more about working with projects": "Learn more about working with projects", + "List of {{resourceName}} matching": "List of {{resourceName}} matching", + "List of matching {{resourceName}}": "List of matching {{resourceName}}", + "List of pods": "List of pods", + "List of pods matching": "List of pods matching", + "Location": "Location", + "Location of the resource that backs the service": "Location of the resource that backs the service", + "MAC spoof check": "MAC spoof check", + "Manage columns": "Manage columns", + "Managed by UserDefinedNetwork": "Managed by UserDefinedNetwork", + "Match Expressions": "Match Expressions", + "Match Labels": "Match Labels", + "matchExpressions is a list of label selector requirements. The requirements are ANDed.": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", + "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", + "Memory": "Memory", + "Message": "Message", + "Metrics": "Metrics", + "Missing installed operators": "Missing installed operators", + "More information:": "More information:", "MTU": "MTU", - "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.": "MTU는 선택 사항이며 제공되지 않는 경우 네트워크에 전역적으로 구성된 OVN-Kubernetes 값(기본값: 1400)이 사용됩니다.", - "MTU is the maximum transmission unit for a network.": "MTU는 네트워크의 최대 전송 단위입니다.", + "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.": "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.", + "MTU is the maximum transmission unit for a network.": "MTU is the maximum transmission unit for a network.", "multi-networkpolicies": "multi-networkpolicies", "multi-networkpolicy": "multi-networkpolicy", "MultiNetworkPolicies": "MultiNetworkPolicies", - "Name": "이름", - "Name is required": "이름은 필수 입력사항입니다.", - "Namespace": "네임 스페이스", - "Namespace is required": "네임스페이스가 필요합니다.", - "Namespace selector": "네임스페이스 선택기", - "Namespace Selector": "네임스페이스 선택기", - "Namespace(s)": "네임스페이스", - "Namespaced UserDefinedNetworks": "네임스페이스가 지정된 UserDefinedNetworks", - "Namespaces having all the supplied key/value pairs as labels will be selected.": "레이블로 제공된 모든 키/값 쌍이 있는 네임스페이스가 선택됩니다.", - "Naming information": "이름 지정 정보", - "network": "네트워크", - "Network": "네트워크", - "Network type": "네트워크 유형", - "Network Type": "네트워크 유형", + "Name": "Name", + "Name is required": "Name is required", + "Namespace": "Namespace", + "Namespace is required": "Namespace is required", + "Namespace selector": "Namespace selector", + "Namespace Selector": "Namespace Selector", + "Namespace(s)": "Namespace(s)", + "Namespaced UserDefinedNetworks": "Namespaced UserDefinedNetworks", + "Namespaces having all the supplied key/value pairs as labels will be selected.": "Namespaces having all the supplied key/value pairs as labels will be selected.", + "Naming information": "Naming information", + "network": "network", + "Network": "Network", + "Network type": "Network type", + "Network Type": "Network Type", "NetworkAttachmentDefinitions": "NetworkAttachmentDefinitions", - "NetworkPolicies": "네트워크 정책", - "NetworkPolicies documentation": "네트워크 정책 문서", - "networks": "네트워크", - "Networks are not project-bound. Using the same name creates a shared NAD.": "네트워크는 프로젝트에 바인딩되지 않습니다. 동일한 이름을 사용하면 공유 NAD가 생성됩니다.", - "Networks are not project-bound. Using the same name creates a shared UDN.": "네트워크는 프로젝트 바인딩이 아닙니다. 동일한 이름을 사용하면 공유 UDN이 생성됩니다.", - "No {{kind}} found": "{{kind}}을/를 찾을 수 없음", - "No {{label}} found": "{{label}}을/를 찾을 수 없음", - "No {{resourceName}} matching the provided labels": "제공된 레이블과 일치하는 {{resourceName}}이(가) 없습니다.", - "No conditions found": "조건을 찾을 수 없습니다.", - "No datapoints found.": "데이터 포인트를 찾을 수 없습니다", - "No description": "설명 없음", - "No hosts": "호스트 없음", - "No labels": "라벨 없음", + "NetworkPolicies": "NetworkPolicies", + "NetworkPolicies documentation": "NetworkPolicies documentation", + "networks": "networks", + "Networks are not project-bound. Using the same name creates a shared NAD.": "Networks are not project-bound. Using the same name creates a shared NAD.", + "Networks are not project-bound. Using the same name creates a shared UDN.": "Networks are not project-bound. Using the same name creates a shared UDN.", + "No {{kind}} found": "No {{kind}} found", + "No {{label}} found": "No {{label}} found", + "No {{resourceName}} matching the provided labels": "No {{resourceName}} matching the provided labels", + "No conditions found": "No conditions found", + "No datapoints found.": "No datapoints found.", + "No description": "No description", + "No hosts": "No hosts", + "No labels": "No labels", "No matching OVN bridge mapping found for \"{{name}}\".": "No matching OVN bridge mapping found for \"{{name}}\".", - "No matching projects": "일치하는 프로젝트 없음", - "No namespace is configured for a primary user-defined network": "기본 사용자 정의 네트워크에 대해 네임스페이스가 구성되지 않음", - "No NetworkAttachmentDefinition found": "NetworkAttachmentDefinition을 찾을 수 없음", - "No owner": "소유자 없음", - "No pods matching the provided labels in the current namespace": "현재 네임스페이스에 제공된 라벨과 일치하는 pod가 없음", - "No projects matched": "일치하는 프로젝트가 없음", - "No results found for \"{{inputValue}}\"": "\"{{inputValue}}\"의 결과를 찾을 수 없음", - "No route status": "라우팅 상태 없음", - "No selector": "선택기 없음", - "No virtual machines found": "가상 머신을 찾을 수 없습니다", - "Node": "노드", - "Node port": "노드 포트", + "No matching projects": "No matching projects", + "No namespace is configured for a primary user-defined network": "No namespace is configured for a primary user-defined network", + "No NetworkAttachmentDefinition found": "No NetworkAttachmentDefinition found", + "No owner": "No owner", + "No pods matching the provided labels in the current namespace": "No pods matching the provided labels in the current namespace", + "No projects matched": "No projects matched", + "No results found for \"{{inputValue}}\"": "No results found for \"{{inputValue}}\"", + "No route status": "No route status", + "No selector": "No selector", + "No virtual machines found": "No virtual machines found", + "Node": "Node", + "Node port": "Node port", "NodeNetworkConfigurationPolicy": "NodeNetworkConfigurationPolicy", - "None": "없음", - "Not available": "사용할 수 없음", - "Not configured": "설정되지 않음", - "Not found": "찾을 수 없음", - "Not Receiving Traffic": "트래픽을 수신하지 않음", - "NS selector": "NS 선택기", + "None": "None", + "Not available": "Not available", + "Not configured": "Not configured", + "Not found": "Not found", + "Not Receiving Traffic": "Not Receiving Traffic", + "NS selector": "NS selector", "of": "of", - "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).": "한줄에 하나의 포트를 [name:]port:targetPort/PROTOCOL(예: http:80:9376/TCP) 형식으로 입력합니다.", - "Only supported when \"subnets\" are set.": "\"subnets\"가 설정된 경우에만 지원됩니다.", + "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).": "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).", + "Only supported when \"subnets\" are set.": "Only supported when \"subnets\" are set.", "Operator": "Operator", - "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.": "Operator는 값 집합에 대한 키의 관계를 나타냅니다. 유효한 연산자는 In, NotIn, Exists 및 DoesNotExist입니다.", - "Owner": "소유자", + "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", + "Owner": "Owner", "Passthrough": "Passthrough", - "Path": "경로", - "Path that the router watches to route traffic to the service.": "라우터가 트래픽을 서비스로 라우팅하기 위해 모니터링하는 경로입니다.", - "Path type": "경로 유형", - "Pending": "대기 중", + "Path": "Path", + "Path that the router watches to route traffic to the service.": "Path that the router watches to route traffic to the service.", + "Path type": "Path type", + "Pending": "Pending", "per page": "per page", - "Percent": "백분율", - "Persistent": "영구적", - "Phase": "단계", - "Physical network name": "물리적 네트워크 이름", - "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.": "물리적 네트워크 이름. 브리지 매핑은 물리적 네트워크 이름과 Open vSwitch 브리지 간에 매핑하려면 클러스터 노드에 구성해야 합니다.", - "Please <2>try again.": "<2>다시 시도하십시오", - "Pod crash loop back-off": "Pod 크래시 루프 백오프", - "Pod port or name": "Pod 포트 또는 이름", - "Pod selector": "Pod 선택기", - "Pod selector for": "다음의 Pod 선택기", - "Pod unschedulable": "Pod 예약 불가", + "Percent": "Percent", + "Persistent": "Persistent", + "Phase": "Phase", + "Physical network name": "Physical network name", + "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.": "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.", + "Please <2>try again.": "Please <2>try again.", + "Pod crash loop back-off": "Pod crash loop back-off", + "Pod port or name": "Pod port or name", + "Pod selector": "Pod selector", + "Pod selector for": "Pod selector for", + "Pod unschedulable": "Pod unschedulable", "pods": "pods", - "Pods": "Pod", - "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.": "Pod는 기본적으로 모든 트래픽을 허용합니다. NetworkPolicy를 통해 Pod를 격리할 수 있으며, 이 정책에서는 허용할 인그레스 규칙의 허용 목록을 지정합니다. NetworkPolicy에서 Pod를 선택하면 NetworkPolicy를 통해 명시적으로 허용되지 않는 모든 트래픽을 거부합니다.", - "Pods having all the supplied key/value pairs as labels will be selected.": "레이블로 제공된 모든 키/값 쌍이 있는 Pod가 선택됩니다.", - "Policy for": "정책 대상", - "Policy name": "정책 이름", - "Policy type": "정책 유형", - "Port": "포트", - "Port is required": "포트가 필요합니다.", - "Port must be between 1 and 65535": "포트는 1에서 65535 사이의 값이어야합니다.", - "Port names must be unique": "포트 이름은 고유해야 합니다.", - "Port names must be valid DNS labels": "포트 이름은 유효한 DNS 레이블이어야 합니다.", - "Ports": "포트", - "Ports must use the format [name:]port:targetPort/PROTOCOL": "포트는 [name:]port:targetPort/PROTOCOL 형식을 사용해야 합니다", - "Primary network is automatically assigned to every pod created in the same namespace.": "기본 네트워크는 동일한 네임스페이스에서 생성된 모든 pod에 자동으로 할당됩니다.", - "Private key": "개인 키", - "Project name": "프로젝트 이름", - "Protocol": "프로토콜", - "Protocol must be TCP, UDP, or SCTP": "프로토콜은 TCP, UDP 또는 SCTP여야 합니다.", - "Public hostname for the Route. If not specified, a hostname is generated.": "경로의 공개 호스트 이름입니다. 지정되지 않은 경우 호스트 이름이 생성됩니다.", + "Pods": "Pods", + "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.": "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.", + "Pods having all the supplied key/value pairs as labels will be selected.": "Pods having all the supplied key/value pairs as labels will be selected.", + "Policy for": "Policy for", + "Policy name": "Policy name", + "Policy type": "Policy type", + "Port": "Port", + "Port is required": "Port is required", + "Port must be between 1 and 65535": "Port must be between 1 and 65535", + "Port names must be unique": "Port names must be unique", + "Port names must be valid DNS labels": "Port names must be valid DNS labels", + "Ports": "Ports", + "Ports must use the format [name:]port:targetPort/PROTOCOL": "Ports must use the format [name:]port:targetPort/PROTOCOL", + "Primary network is automatically assigned to every pod created in the same namespace.": "Primary network is automatically assigned to every pod created in the same namespace.", + "Private key": "Private key", + "Project name": "Project name", + "Protocol": "Protocol", + "Protocol must be TCP, UDP, or SCTP": "Protocol must be TCP, UDP, or SCTP", + "Public hostname for the Route. If not specified, a hostname is generated.": "Public hostname for the Route. If not specified, a hostname is generated.", "Re-encrypt": "Re-encrypt", - "Ready": "준비 완료", - "Reason": "이유", - "Receiving Traffic": "트래픽 수신", - "Redirect": "리디렉션", - "Refer an existing ClusterUserDefinedNetwork": "기존 ClusterUserDefinedNetwork 참조", - "Refer to your cluster administrator to know which network provider is used.": "사용 중인 네트워크 공급자를 확인하려면 클러스터 관리자에게 문의하십시오.", - "Remove": "삭제", - "Remove all": "모두 삭제", - "Remove alternate Service": "대체 서비스 삭제", - "Remove exception": "예외 제거", - "Remove from network": "네트워크에서 제거", - "Remove peer": "피어 제거", - "Remove port": "포트 제거", - "Remove subnets?": "서브넷을 제거하시겠습니까?", - "Remove virtual machine from network?": "네트워크에서 가상 머신을 제거하시겠습니까?", - "Reset to default": "기본값으로 재설정", - "Resource name": "리소스 이름", - "Restarts": "재시작", - "Restricted Access": "제한된 액세스", - "Reveal": "공개", - "Review selected Namespace(s)": "선택한 네임스페이스 검토", - "Role": "역할", - "Role describes the network role in the pod.": "역할은 Pod의 네트워크 역할을 설명합니다.", - "Route details": "경로 세부 정보", - "Router canonical hostname": "라우터의 표준 호스트 이름", - "Router: {{routerName}}": "라우터: {{routerName}}", - "Routes": "경로", - "Routes can be secured using several TLS termination types for serving certificates.": "보안 인증서 제공을 위해 여러 TLS 종료 유형을 사용하여 경로를 보호할 수 있습니다.", - "Routing is a way to make your application publicly visible": "라우팅은 애플리케이션을 공개적으로 표시할 수 있는 방법입니다", - "Rules": "규칙", - "Running": "실행 중", - "Save": "저장", - "Search by name...": "이름으로 검색 ...", - "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.": "보조 네트워크는 k8s.v1.cni.cncf.io/networks 주석을 사용하여 지정된 네트워크를 선택하는 Pod에만 할당됩니다.", - "Secure Route": "안전한 경로", - "Security": "보안", - "Select a Project": "프로젝트 선택", - "Select a Service": "서비스 선택", - "Select all": "모두 선택", - "Select an operator": "Operator 선택", - "Select ClusterUserDefinedNetwork": "ClusterUserDefinedNetwork 선택", - "Select default ingress and egress deny rules": "기본 Ingress 및 Egress 거부 규칙 선택", - "Select insecure traffic type": "안전하지 않은 트래픽 유형 선택", - "Select one or more NetworkAttachmentDefinitions": "하나 이상의 네트워크 첨부 파일 정의 선택", - "Select resource name": "리소스 이름 선택", - "Select role": "역할 선택", - "Select target port": "대상 포트 선택", - "Select termination type": "종료 유형 선택", - "Select virtual machines to connect to this network.": "가상 머신을 선택하여 이 네트워크에 연결합니다.", - "Selected categories will be displayed in the table.": "선택한 카테고리가 표에 표시됩니다.", - "Selector": "선택기", - "Selector is required": "선택기가 필요합니다.", - "Selector keys must be unique": "선택기 키는 고유해야 합니다.", - "Selectors must use valid key=value pairs": "선택기에서 유효한 key=value 쌍을 사용해야 합니다.", - "Service": "서비스", - "Service address": "서비스 주소", - "Service details": "서비스 내용", - "Service port": "서비스 포트", - "Service port mapping": "서비스 포트 매핑", - "Service routing": "서비스 라우팅", - "Service to route to.": "라우트할 서비스입니다.", - "Service weight": "서비스 가중치", - "Services": "서비스", - "Session affinity": "세션 유사성", - "Show a preview of the <2>affected pods that this egress rule will apply to.": "이 egress 규칙이 적용되는 <2>영향을 받는 pod의 미리보기를 표시합니다.", - "Show a preview of the <2>affected pods that this ingress rule will apply to.": "이 ingress 규칙이 적용되는 <2>영향을 받는 pod의 미리보기를 표시합니다.", - "Show a preview of the <2>affected pods that this policy will apply to": "이 정책이 적용되는 <2>영향을 받는 pod의 미리보기를 표시합니다.", - "Show a preview of the <2>matching pods that this selector will apply to": "이 선택기가 적용될 <2>일치하는 pod의 미리 보기를 표시합니다.", - "Show less": "적게 표시", - "Showing {{shown}} from {{total}} results": "{{total}} 결과에서 {{shown}} 표시", - "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.": "이 규칙에 추가된 소스는 위에 정의된 pod에 대한 트래픽을 허용합니다. 이 목록의 소스는 논리적 OR 연산을 사용하여 결합됩니다.", - "Status": "상태", - "Subnet": "서브넷", - "Subnet CIDR": "서브넷 CIDR", - "Subnets": "서브넷", - "Subnets are used for the pod network across the cluster.": "서브넷은 클러스터 전체의 pod 네트워크에 사용됩니다.", - "Switch and delete": "전환 및 삭제", - "Switching to form view will delete any invalid YAML.": "양식보기로 전환하면 잘못된 YAML이 삭제됩니다.", - "Target pods": "대상 pod", - "Target port": "대상 포트", - "Target port for traffic": "트래픽의 대상 포트", - "Target port names must be valid DNS labels": "대상 포트 이름은 유효한 DNS 레이블이어야 합니다.", - "Tech preview": "기술 프리뷰", - "Terminating": "중지 중", - "Termination type": "종료 유형", - "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "형식은 표준 CIDR 표기법과 일치해야 합니다(예: \"192.168.123.0/24\").", - "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.": "허용되는 유일한 값은 Persistent입니다. 설정할 때 OVN Kubernetes 할당된 IP 주소는 \"ipamclaims.k8s.cni.cncf.io\" 오브젝트에 영구적으로 저장됩니다.", - "These IP addresses will be reused by other pods if requested.": "요청된 경우 다른 Pod에서 이러한 IP 주소를 재사용합니다.", - "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated": "이러한 규칙은 규칙이 변경되면 업데이트된 라우팅 레이어 (Ingress Controller)에 의해 처리됩니다. Ingress 컨트롤러 구현은 헤더 및 기타 메타 데이터를 전송하거나 조작하는 방법을 정의합니다", - "This action will remove all rules within the Egress section and cannot be undone.": "이 작업은 Egress 섹션 내의 모든 규칙을 제거하며 취소할 수 없습니다.", - "This action will remove all rules within the Ingress section and cannot be undone.": "이 작업은 Ingress 섹션 내의 모든 규칙을 제거하며 취소할 수 없습니다.", - "This action will remove all subnets and cannot be undone.": "이 작업은 모든 서브넷을 제거하고 취소할 수 없습니다.", - "This field is only allowed for \"Primary\" network.": "이 필드는 \"Primary\" 네트워크에만 허용됩니다.", - "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "이 필드는 \"Primary\" 네트워크에만 허용됩니다. OVN 네트워크 토폴로지의 명시적 필요 및 이해없이 이 필드를 설정하지 않는 것이 좋습니다.", - "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.": "이 필드를 생략할 수 있습니다. 네트워크를 구현하는 논리 스위치는 계층 2 통신만 제공하며 사용자는 Pod의 IP 주소를 구성해야 합니다. 결과적으로 포트 보안은 MAC 스푸핑만 방지합니다.", - "This network must be created before you create any workload in this project": "이 프로젝트에서 워크로드를 생성하기 전에 이 네트워크를 생성해야 합니다.", - "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.": "이 네트워크 정책은 양식에 표시할 수 없습니다. YAML 편집기로 전환하십시오.", - "This route splits traffic across multiple services.": "이 라우팅은 여러 서비스간에 네트워크 트래픽을 분산시킵니다.", - "TLS certificate": "TLS 인증서", - "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.": "에지(edge) 및 재암호화 종료를 위한 TLS 인증서. 지정되지 않는 경우 라우터의 기본 인증서가 사용됩니다.", - "TLS is not enabled": "TLS가 활성화되어 있지 않습니다.", - "TLS Settings": "TLS 설정", - "TLS termination": "TLS 종료", - "To": "대상", - "To ports": "대상 포트", - "To troubleshoot, view logs and events, then debug in terminal.": "문제를 해결하려면 로그 및 이벤트를 확인한 다음 터미널에서 디버그하십시오.", - "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.": "사용자 지정 경로를 사용하려면 정식 이름 (CNAME) 레코드를 만들어 DNS 공급자를 업데이트해야 합니다. CNAME 레코드는 사용자 지정 도메인 <2>{{host}}, OpenShift 정규 라우터 호스트 이름 <5>{{routerCanonicalHostname}}을 별칭으로 포인트해야 합니다.", - "Topology": "토폴로지", - "Topology describes network configuration.": "토폴로지는 네트워크 구성을 설명합니다.", - "total limit": "총 한도", - "total requested": "총 요청", - "Traffic": "트래픽", - "Traffic in": "들어오는 네트워크 트래픽", - "Traffic out": "나가는 네트워크 트래픽", + "Ready": "Ready", + "Reason": "Reason", + "Receiving Traffic": "Receiving Traffic", + "Redirect": "Redirect", + "Refer an existing ClusterUserDefinedNetwork": "Refer an existing ClusterUserDefinedNetwork", + "Refer to your cluster administrator to know which network provider is used.": "Refer to your cluster administrator to know which network provider is used.", + "Remove": "Remove", + "Remove all": "Remove all", + "Remove alternate Service": "Remove alternate Service", + "Remove exception": "Remove exception", + "Remove from network": "Remove from network", + "Remove peer": "Remove peer", + "Remove port": "Remove port", + "Remove subnets?": "Remove subnets?", + "Remove virtual machine from network?": "Remove virtual machine from network?", + "Reset to default": "Reset to default", + "Resource name": "Resource name", + "Restarts": "Restarts", + "Restricted Access": "Restricted Access", + "Reveal": "Reveal", + "Review selected Namespace(s)": "Review selected Namespace(s)", + "Role": "Role", + "Role describes the network role in the pod.": "Role describes the network role in the pod.", + "Route details": "Route details", + "Router canonical hostname": "Router canonical hostname", + "Router: {{routerName}}": "Router: {{routerName}}", + "Routes": "Routes", + "Routes can be secured using several TLS termination types for serving certificates.": "Routes can be secured using several TLS termination types for serving certificates.", + "Routing is a way to make your application publicly visible": "Routing is a way to make your application publicly visible", + "Rules": "Rules", + "Running": "Running", + "Save": "Save", + "Search by name...": "Search by name...", + "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.": "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.", + "Secure Route": "Secure Route", + "Security": "Security", + "Select a Project": "Select a Project", + "Select a Service": "Select a Service", + "Select all": "Select all", + "Select an operator": "Select an operator", + "Select ClusterUserDefinedNetwork": "Select ClusterUserDefinedNetwork", + "Select default ingress and egress deny rules": "Select default ingress and egress deny rules", + "Select insecure traffic type": "Select insecure traffic type", + "Select one or more NetworkAttachmentDefinitions": "Select one or more NetworkAttachmentDefinitions", + "Select resource name": "Select resource name", + "Select role": "Select role", + "Select target port": "Select target port", + "Select termination type": "Select termination type", + "Select virtual machines to connect to this network.": "Select virtual machines to connect to this network.", + "Selected categories will be displayed in the table.": "Selected categories will be displayed in the table.", + "Selector": "Selector", + "Selector is required": "Selector is required", + "Selector keys must be unique": "Selector keys must be unique", + "Selectors must use valid key=value pairs": "Selectors must use valid key=value pairs", + "Service": "Service", + "Service address": "Service address", + "Service details": "Service details", + "Service port": "Service port", + "Service port mapping": "Service port mapping", + "Service routing": "Service routing", + "Service to route to.": "Service to route to.", + "Service weight": "Service weight", + "Services": "Services", + "Session affinity": "Session affinity", + "Show a preview of the <2>affected pods that this egress rule will apply to.": "Show a preview of the <2>affected pods that this egress rule will apply to.", + "Show a preview of the <2>affected pods that this ingress rule will apply to.": "Show a preview of the <2>affected pods that this ingress rule will apply to.", + "Show a preview of the <2>affected pods that this policy will apply to": "Show a preview of the <2>affected pods that this policy will apply to", + "Show a preview of the <2>matching pods that this selector will apply to": "Show a preview of the <2>matching pods that this selector will apply to", + "Show less": "Show less", + "Showing {{shown}} from {{total}} results": "Showing {{shown}} from {{total}} results", + "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.": "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.", + "Status": "Status", + "Subnet": "Subnet", + "Subnet CIDR": "Subnet CIDR", + "Subnets": "Subnets", + "Subnets are used for the pod network across the cluster.": "Subnets are used for the pod network across the cluster.", + "Switch and delete": "Switch and delete", + "Switching to form view will delete any invalid YAML.": "Switching to form view will delete any invalid YAML.", + "Target pods": "Target pods", + "Target port": "Target port", + "Target port for traffic": "Target port for traffic", + "Target port names must be valid DNS labels": "Target port names must be valid DNS labels", + "Tech preview": "Tech preview", + "Terminating": "Terminating", + "Termination type": "Termination type", + "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").", + "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.": "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.", + "These IP addresses will be reused by other pods if requested.": "These IP addresses will be reused by other pods if requested.", + "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated": "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated", + "This action will remove all rules within the Egress section and cannot be undone.": "This action will remove all rules within the Egress section and cannot be undone.", + "This action will remove all rules within the Ingress section and cannot be undone.": "This action will remove all rules within the Ingress section and cannot be undone.", + "This action will remove all subnets and cannot be undone.": "This action will remove all subnets and cannot be undone.", + "This field is only allowed for \"Primary\" network.": "This field is only allowed for \"Primary\" network.", + "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.", + "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.": "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.", + "This network must be created before you create any workload in this project": "This network must be created before you create any workload in this project", + "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.": "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.", + "This route splits traffic across multiple services.": "This route splits traffic across multiple services.", + "TLS certificate": "TLS certificate", + "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.": "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.", + "TLS is not enabled": "TLS is not enabled", + "TLS Settings": "TLS Settings", + "TLS termination": "TLS termination", + "To": "To", + "To ports": "To ports", + "To troubleshoot, view logs and events, then debug in terminal.": "To troubleshoot, view logs and events, then debug in terminal.", + "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.": "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.", + "Topology": "Topology", + "Topology describes network configuration.": "Topology describes network configuration.", + "total limit": "total limit", + "total requested": "total requested", + "Traffic": "Traffic", + "Traffic in": "Traffic in", + "Traffic out": "Traffic out", "True": "True", - "Type": "유형", - "Type is required": "유형을 입력해야 합니다", - "Unknown": "알 수 없음", - "unknown host": "알 수 없는 호스트", - "Unknown: endpoint readiness not available": "알 수 없음: 엔드포인트 준비 상태를 확인할 수 없음", - "Unknown: endpoint readiness not loaded": "알 수 없음: 엔드포인트 준비 상태를 불러올 수 없음", - "Updated": "업데이트됨", - "Use \"{{inputValue}}\"": "\"{{inputValue}}\" 사용", - "Use the default Pod network": "기본 Pod 네트워크 사용", + "Type": "Type", + "Type is required": "Type is required", + "Unknown": "Unknown", + "unknown host": "unknown host", + "Unknown: endpoint readiness not available": "Unknown: endpoint readiness not available", + "Unknown: endpoint readiness not loaded": "Unknown: endpoint readiness not loaded", + "Updated": "Updated", + "Use \"{{inputValue}}\"": "Use \"{{inputValue}}\"", + "Use the default Pod network": "Use the default Pod network", "UserDefinedNetwork": "UserDefinedNetwork", "UserDefinedNetworks": "UserDefinedNetworks", - "Value": "값", - "Value hidden": "숨겨진 값", - "Values": "값", - "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.": "값은 문자열 값의 배열입니다. operator가 In 또는 NotIn이면 값 배열은 비어 있지 않아야 합니다. operator가 Exists 또는 DoesNotExist인 경우 값 배열은 비어 있어야 합니다. 이 배열은 전략적 병합 패치 과정에서 교체됩니다.", - "View all {{total}} results": "모든 {{total}} 결과 표시", - "View events": "이벤트보기", - "View logs": "로그보기", - "View naming information": "이름 지정 정보 보기", - "Virtual Machines": "가상 머신", + "Value": "Value", + "Value hidden": "Value hidden", + "Values": "Values", + "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", + "View all {{total}} results": "View all {{total}} results", + "View events": "View events", + "View logs": "View logs", + "View naming information": "View naming information", + "Virtual Machines": "Virtual Machines", + "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.": "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.", "VLAN": "VLAN", - "VLAN tag number": "VLAN 태그 번호", - "Weight": "가중치", - "When omitted, the platform will choose a reasonable default which is subject to change over time.": "생략하면 플랫폼은 시간이 지남에 따라 변경될 수 있는 적절한 기본값을 선택합니다.", - "When using the OpenShift SDN cluster network provider:": "OpenShift SDN 클러스터 네트워크 공급자를 사용하여 마이그레이션", - "Wildcard policy": "와일드 카드 정책", - "with exceptions": "예외 사용", + "VLAN tag number": "VLAN tag number", + "Weight": "Weight", + "When omitted, the platform will choose a reasonable default which is subject to change over time.": "When omitted, the platform will choose a reasonable default which is subject to change over time.", + "When using the OpenShift SDN cluster network provider:": "When using the OpenShift SDN cluster network provider:", + "Wildcard policy": "Wildcard policy", + "with exceptions": "with exceptions", "YAML": "YAML", - "YAML view": "YAML보기", - "You don't have access to this section due to cluster policy.": "클러스터 정책으로 인해 이 섹션에 액세스할 수 없습니다.", - "You don't have permission to perform this action": "이 작업을 수행할 수 있는 권한이 없습니다", - "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.": "'openshift-', 'kubernetes-'또는 'kube-'로 시작하는 프로젝트를 만들려면 네임 스페이스를 만들어야합니다." + "YAML view": "YAML view", + "You don't have access to this section due to cluster policy.": "You don't have access to this section due to cluster policy.", + "You don't have permission to perform this action": "You don't have permission to perform this action", + "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.": "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'." } diff --git a/locales/zh/plugin__networking-console-plugin.json b/locales/zh/plugin__networking-console-plugin.json index 426e6f86..6ef48800 100644 --- a/locales/zh/plugin__networking-console-plugin.json +++ b/locales/zh/plugin__networking-console-plugin.json @@ -1,506 +1,504 @@ { - " See more details in: <3>": " 详情请参阅:<3>", - " See more details in: <3>.": " 详情请参阅:<3>。", - "(all nodes): ": "(所有节点):", - "{{count}} annotation_one": "{{count}} 个注解", - "{{count}} annotation_other": "{{count}} 个注解", - "{{kind}} details": "{{kind}} 详情", - "{{kind}} disabled": "{{kind}} 禁用", - "{{numCores}} cores": "{{numCores}} 核", - "{{path}} found in resource, but is not supported in form.": "在资源中找到了 {{path}},但格式不支持。", - "{{path}} is missing.": "缺少 {{path}}。", - "{{path}} should be an Array.": "{{path}} 需要是一个数组。", - "{{path}} should not be empty.": "{{path}} 不能为空。", - "{{value}} at {{date}}": "{{value}} 于 {{date}}", - "+{{count}} more_one": "+{{count}} 个", - "+{{count}} more_other": "+{{count}} 个", - "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.": "<0>OpenShift Virtualization Operator 或 <3>SR-IOV Network Operator 需要在集群中安装,以便选择网络类型。", - "404: Page Not Found": "404:页未找到", - "A number between 0 and 255 that depicts relative weight compared with other targets.": "0 到 255 之间的数字,它显示了与其他目标相比的相对权重。", - "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').": "项目名称必须包含小写字母数字字符或 '-',且必须以字母数字字符(如 'my-name' 或 '123-abc')开头和结尾。", - "A unique name for the Route within the project": "项目中的路由的唯一名称", - "Accessible outside the cluster": "在集群外可以访问", - "Accessible within the cluster only": "仅在集群内可访问", - "Actions": "行动", - "Adapter model": "适配器模型", - "Add": "添加", - "Add allowed destination": "添加允许的目的地", - "Add allowed source": "添加允许的源", - "Add alternate Service": "添加备用服务", - "Add egress rule": "添加 egress 规则", - "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.": "添加要应用到所选 pod 的 egress 规则。如果网络流量数据至少匹配一条规则,则允许到 pod 的流量。", - "Add exception": "添加例外", - "Add expression": "添加表达式", - "Add ingress rule": "添加 ingress 规则", - "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.": "添加要应用到所选 pod 的 ingress 规则。如果网络流量数据至少匹配一条规则,则允许来自 pod 的流量。", - "Add label": "添加标签", - "Add namespace selector": "添加命名空间选择器", - "Add pod selector": "添加 pod 选择器", - "Add port": "添加端口", - "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.": "添加端口以限制通过它们的流量。如果没有提供端口,您的策略将允许所有端口对流量进行访问。", - "Add subnet": "添加子网", - "Add virtual machines": "添加虚拟机", - "All incoming traffic is denied to Pods in {{namespace}}": "所有传入的流量都被 {{namespace}} 中的 Pod 拒绝", - "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.": "所有外向流量都是默认允许的。如果集群网络供应商允许,可以使用 egress 规则来限制外向流量。在使用 OpenShift SDN 集群网络供应商时,不支持 egress 网络策略。", - "All outgoing traffic is denied from Pods in {{namespace}}": "所有外向流量都会从 {{namespace}} 中的 Pod 拒绝", - "All pods within {{namespace}}": "{{namespace}} 中的所有 pod", - "Allow": "允许", - "Allow peers by IP block": "允许对等点按 IP 块", - "Allow pods from inside the cluster": "允许来自集群内部的 pod", - "Allow pods from the same namespace": "允许来自同一命名空间中的 pod", - "Allow traffic from peers by IP block": "允许从对等点的流量,按 IP 块", - "Allow traffic from pods in the same namespace": "允许来自同一命名空间中的 pod 的流量", - "Allow traffic from pods inside the cluster": "允许来自集群内 pod 的流量", - "Allow traffic to peers by IP block": "允许到对等点的流量,按 IP 块", - "Allow traffic to pods in the same namespace": "允许到同一命名空间中的 pod 的流量", - "Allow traffic to pods inside the cluster": "允许到集群内 pod 的流量", - "Alternate Service target": "替换服务目标", - "Alternate Service to route to.": "替换服务到路由到。", - "Alternate Service weight": "替换服务权重", - "An error occurred.": "发生错误。", - "An error occurred. Please try again.": "发生错误。请再试一次。", - "An OpenShift project is an alternative representation of a Kubernetes namespace.": "OpenShift 项目是 Kubernetes 命名空间的一个替代表示。", - "annotation_one": "注解", - "annotation_other": "注解", - "Annotations": "注解", - "Any namespace": "任何命名空间", - "Any peer": "任何对等者", - "Any pod": "任何 pod", - "Any port": "任何端口", - "Are you sure you want to remove <2> from <5>{nadName}?": "您确定要从 <5>{nadName} 中删除 <2> 吗?", - "Are you sure you want to remove <2> from <5>{udnName}?": "您确定要从 <5>{udnName} 中删除 <2> 吗?", - "Are you sure?": "您确定吗?", - "Assigns IP addresses from this subnet to Pods and VirtualMachines.": "将这个子网的 IP 地址分配给 Pod 和 VirtualMachines。", - "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.": "在创建时,命名空间必须配置带有 <2>{{label}} 标签。进入 <5>Namespaces 以创建一个新命名空间。", - "At least one port is required": "至少需要一个端口", - "Backend health": "后端健康状况", - "Bridge name": "网桥名称", - "Browse...": "浏览...", - "CA certificate": "CA 证书", - "Can't preview matching {{resourceName}}": "无法预览匹配 {{resourceName}}", - "Can't preview pods": "无法预览 pod", - "Cancel": "取消", - "Certificate": "证书", - "Certificates": "证书", + " See more details in: <3>": " See more details in: <3>", + " See more details in: <3>.": " See more details in: <3>.", + "(all nodes): ": "(all nodes): ", + "{{count}} annotation_other": "{{count}} annotation", + "{{kind}} details": "{{kind}} details", + "{{kind}} disabled": "{{kind}} disabled", + "{{numCores}} cores": "{{numCores}} cores", + "{{path}} found in resource, but is not supported in form.": "{{path}} found in resource, but is not supported in form.", + "{{path}} is missing.": "{{path}} is missing.", + "{{path}} should be an Array.": "{{path}} should be an Array.", + "{{path}} should not be empty.": "{{path}} should not be empty.", + "{{value}} at {{date}}": "{{value}} at {{date}}", + "+{{count}} more_other": "+{{count}} more", + "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.": "<0>OpenShift Virtualization Operator or <3>SR-IOV Network Operator needs to be installed on the cluster, in order to pick the Network Type.", + "404: Page Not Found": "404: Page Not Found", + "A number between 0 and 255 that depicts relative weight compared with other targets.": "A number between 0 and 255 that depicts relative weight compared with other targets.", + "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').": "A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').", + "A unique name for the Route within the project": "A unique name for the Route within the project", + "Accessible outside the cluster": "Accessible outside the cluster", + "Accessible within the cluster only": "Accessible within the cluster only", + "Actions": "Actions", + "Adapter model": "Adapter model", + "Add": "Add", + "Add allowed destination": "Add allowed destination", + "Add allowed source": "Add allowed source", + "Add alternate Service": "Add alternate Service", + "Add egress rule": "Add egress rule", + "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.": "Add egress rules to be applied to your selected pods. Traffic is allowed to pods if it matches at least one rule.", + "Add exception": "Add exception", + "Add expression": "Add expression", + "Add ingress rule": "Add ingress rule", + "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.": "Add ingress rules to be applied to your selected pods. Traffic is allowed from pods if it matches at least one rule.", + "Add label": "Add label", + "Add namespace selector": "Add namespace selector", + "Add pod selector": "Add pod selector", + "Add port": "Add port", + "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.": "Add ports to restrict traffic through them. If no ports are provided, your policy will make all ports accessible to traffic.", + "Add subnet": "Add subnet", + "Add virtual machines": "Add virtual machines", + "All incoming traffic is denied to Pods in {{namespace}}": "All incoming traffic is denied to Pods in {{namespace}}", + "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.": "All outgoing traffic is allowed by default. Egress rules can be used to restrict outgoing traffic if the cluster network provider allows it. When using the OpenShift SDN cluster network provider, egress network policy is not supported.", + "All outgoing traffic is denied from Pods in {{namespace}}": "All outgoing traffic is denied from Pods in {{namespace}}", + "All pods within {{namespace}}": "All pods within {{namespace}}", + "Allow": "Allow", + "Allow peers by IP block": "Allow peers by IP block", + "Allow pods from inside the cluster": "Allow pods from inside the cluster", + "Allow pods from the same namespace": "Allow pods from the same namespace", + "Allow traffic from peers by IP block": "Allow traffic from peers by IP block", + "Allow traffic from pods in the same namespace": "Allow traffic from pods in the same namespace", + "Allow traffic from pods inside the cluster": "Allow traffic from pods inside the cluster", + "Allow traffic to peers by IP block": "Allow traffic to peers by IP block", + "Allow traffic to pods in the same namespace": "Allow traffic to pods in the same namespace", + "Allow traffic to pods inside the cluster": "Allow traffic to pods inside the cluster", + "Alternate Service target": "Alternate Service target", + "Alternate Service to route to.": "Alternate Service to route to.", + "Alternate Service weight": "Alternate Service weight", + "An error occurred.": "An error occurred.", + "An error occurred. Please try again.": "An error occurred. Please try again.", + "An OpenShift project is an alternative representation of a Kubernetes namespace.": "An OpenShift project is an alternative representation of a Kubernetes namespace.", + "annotation_other": "annotation", + "Annotations": "Annotations", + "Any namespace": "Any namespace", + "Any peer": "Any peer", + "Any pod": "Any pod", + "Any port": "Any port", + "Are you sure you want to remove <2> from <5>{nadName}?": "Are you sure you want to remove <2> from <5>{nadName}?", + "Are you sure you want to remove <2> from <5>{udnName}?": "Are you sure you want to remove <2> from <5>{udnName}?", + "Are you sure?": "Are you sure?", + "Assigns IP addresses from this subnet to Pods and VirtualMachines.": "Assigns IP addresses from this subnet to Pods and VirtualMachines.", + "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.": "At creation time the namespace must be configured with <2>{{label}} label. Go to <5>Namespaces to create a new namespace.", + "At least one port is required": "At least one port is required", + "Backend health": "Backend health", + "Bridge name": "Bridge name", + "Browse...": "Browse...", + "CA certificate": "CA certificate", + "Can't preview matching {{resourceName}}": "Can't preview matching {{resourceName}}", + "Can't preview pods": "Can't preview pods", + "Cancel": "Cancel", + "Certificate": "Certificate", + "Certificates": "Certificates", "CIDR": "CIDR", - "Clear": "清理", - "Clear input value": "清除输入值", - "Click <1>Create {{kind}} to create your first {{kind}}": "点<1>创建 {{kind}} 创建您的第一个 {{kind}}", - "Cluster administrator permissions are required to enable this feature.": "启用此功能需要具有集群管理员权限。", - "Cluster IP": "集群 IP", - "Cluster-wide UserDefinedNetworks": "集群范围的 UserDefinedNetworks", + "Clear": "Clear", + "Clear input value": "Clear input value", + "Click <1>Create {{kind}} to create your first {{kind}}": "Click <1>Create {{kind}} to create your first {{kind}}", + "Cluster administrator permissions are required to enable this feature.": "Cluster administrator permissions are required to enable this feature.", + "Cluster IP": "Cluster IP", + "Cluster-wide UserDefinedNetworks": "Cluster-wide UserDefinedNetworks", "ClusterUserDefinedNetwork": "ClusterUserDefinedNetwork", - "ClusterUserDefinedNetwork name": "ClusterUserDefinedNetwork 名称", + "ClusterUserDefinedNetwork name": "ClusterUserDefinedNetwork name", "ClusterUserDefinedNetworks": "ClusterUserDefinedNetworks", - "Completed": "完成", - "Conditions": "条件", - "Configure in Virtual machine networks page": "在虚拟机网络页中配置", - "Configure via:": "通过以下配置:", - "Confirm": "确认", - "Connection rate": "连接率", + "Completed": "Completed", + "Conditions": "Conditions", + "Configure in Virtual machine networks page": "Configure in Virtual machine networks page", + "Configure via:": "Configure via:", + "Confirm": "Confirm", + "Connection rate": "Connection rate", "ConsoleQuickStart": "ConsoleQuickStart", "ConsoleQuickStarts": "ConsoleQuickStarts", - "Copied": "已复制", - "Copied to clipboard": "复制到剪贴板", - "Copy": "复制", - "Copy to clipboard": "复制到剪贴板", + "Copied": "Copied", + "Copied to clipboard": "Copied to clipboard", + "Copy": "Copy", + "Copy to clipboard": "Copy to clipboard", "CPU": "CPU", "CrashLoopBackOff": "CrashLoopBackOff", - "CrashLoopBackOff indicates that the application within the container is failing to start properly.": "CrashLoopBackOff 表示容器内的应用程序无法正确启动。", - "Create": "创建", - "Create {{ kind }}": "创建 {{ kind }}", - "Create {{kind}}": "创建 {{kind}}", - "Create {{label}}": "创建 {{label}}", - "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.": "使用表单创建服务。切换到 YAML 视图以获得完整的控制权限,包括设置表单中未显示的字段。", - "Create by completing the form.": "通过填写表单创建。", - "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.": "手动输入 YAML 或 JSON 定义进行创建,或者将文件拖放到编辑器中。", - "Create ClusterUserDefinedNetwork": "创建 ClusterUserDefinedNetwork", - "Create Ingress": "创建 Ingress", - "Create NetworkAttachmentDefinition": "创建 NetworkAttachmentDefinition", - "Create Project": "创建项目", - "Create Route": "创建路由", - "Create Service": "创建服务", - "Create UserDefinedNetwork": "创建 UserDefinedNetwork", - "Created": "已创建", - "Created at": "创建于", - "Current selections": "当前选择", - "Custom route": "自定义路线", - "Debug container {{name}}": "调试容器 {{name}}", - "Define a new UserDefinedNetwork for this project": "为此项目定义一个新的 UserDefinedNetwork", - "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.": "定义 VirtualMachines 和 Pod 在给定项目中进行通信的网络。了解更多有关<2>主用户定义的网络的信息。", - "Define the network used by VirtualMachines and Pods to communicate in this project": "定义 VirtualMachines 和 Pod 用于在此项目中进行通信的网络", - "Degraded: {{ready}} of {{total}} endpoints ready": "已降级: {{ready}}/{{total}} 个端点已就绪", - "Delete": "删除", - "Delete {{kind}}": "删除 {{kind}}", - "Delete Ingress": "删除 Ingress", - "Delete NetworkAttachmentDefinition": "删除 NetworkAttachmentDefinition", - "Delete Route": "删除路由", - "Delete Service": "删除服务", - "Deletion protection": "删除保护", - "Deny all egress traffic": "拒绝所有 egress 流量", - "Deny all ingress traffic": "拒绝所有 ingress 流量", - "Description": "描述", - "Destination CA certificate": "目的 CA 证书", - "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.": "添加到此规则中的目的地将允许来自上述定义的 pod 的流量。此列表是使用逻辑 OR 操作的目的地组合。", - "Details": "详情", - "Disabled": "禁用", - "Display name": "显示名称", - "Do you need to set up custom DNS?": "您需要设置自定义 DNS 吗?", - "Down: {{ready}} of {{total}} endpoints ready": "下线: {{ready}}/{{total}} 个端点已就绪", - "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.": "双栈集群可以设置 2 个子网(每个 IP 系列一个),否则只允许 1 个子网。", - "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "双栈集群可以设置 2 个子网(每个 IP 系列一个),否则只允许 1 个子网。格式应与标准 CIDR 匹配(如 \"192.168.123.0/24\")。", - "Duplicate keys found in main pod selector": "在主 pod 选择器中找到重复的密钥", - "Duplicate keys found in peer namespace selector": "在 peer 命名空间选择器中找到重复的密钥", - "Duplicate keys found in peer pod selector": "在 peer pod 选择器中找到重复的密钥", + "CrashLoopBackOff indicates that the application within the container is failing to start properly.": "CrashLoopBackOff indicates that the application within the container is failing to start properly.", + "Create": "Create", + "Create {{ kind }}": "Create {{ kind }}", + "Create {{kind}}": "Create {{kind}}", + "Create {{label}}": "Create {{label}}", + "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.": "Create a Service using the form. Switch to YAML view for full control, including fields not shown in the form.", + "Create by completing the form.": "Create by completing the form.", + "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.": "Create by manually entering YAML or JSON definitions, or by dragging and dropping a file into the editor.", + "Create ClusterUserDefinedNetwork": "Create ClusterUserDefinedNetwork", + "Create Ingress": "Create Ingress", + "Create NetworkAttachmentDefinition": "Create NetworkAttachmentDefinition", + "Create Project": "Create Project", + "Create Route": "Create Route", + "Create Service": "Create Service", + "Create UserDefinedNetwork": "Create UserDefinedNetwork", + "Created": "Created", + "Created at": "Created at", + "Current selections": "Current selections", + "Custom route": "Custom route", + "Debug container {{name}}": "Debug container {{name}}", + "Define a new UserDefinedNetwork for this project": "Define a new UserDefinedNetwork for this project", + "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.": "Define the network used by VirtualMachines and Pods to communicate in the given project. Learn more about <2>primary user-defined network.", + "Define the network used by VirtualMachines and Pods to communicate in this project": "Define the network used by VirtualMachines and Pods to communicate in this project", + "Degraded: {{ready}} of {{total}} endpoints ready": "Degraded: {{ready}} of {{total}} endpoints ready", + "Delete": "Delete", + "Delete {{kind}}": "Delete {{kind}}", + "Delete Ingress": "Delete Ingress", + "Delete NetworkAttachmentDefinition": "Delete NetworkAttachmentDefinition", + "Delete Route": "Delete Route", + "Delete Service": "Delete Service", + "Deletion protection": "Deletion protection", + "Deny all egress traffic": "Deny all egress traffic", + "Deny all ingress traffic": "Deny all ingress traffic", + "Description": "Description", + "Destination CA certificate": "Destination CA certificate", + "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.": "Destinations added to this rule will allow traffic from the pods defined above. Destinations in this list are combined using a logical OR operation.", + "Details": "Details", + "Disabled": "Disabled", + "Display name": "Display name", + "Do you need to set up custom DNS?": "Do you need to set up custom DNS?", + "Down: {{ready}} of {{total}} endpoints ready": "Down: {{ready}} of {{total}} endpoints ready", + "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.": "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed.", + "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "Dual-stack clusters may set 2 subnets (one for each IP family), otherwise only 1 subnet is allowed. The format should match standard CIDR notation (for example, \"192.168.123.0/24\").", + "Duplicate keys found in main pod selector": "Duplicate keys found in main pod selector", + "Duplicate keys found in peer namespace selector": "Duplicate keys found in peer namespace selector", + "Duplicate keys found in peer pod selector": "Duplicate keys found in peer pod selector", "Edge": "Edge", - "Edit": "编辑", - "Edit {{kind}}": "编辑 {{kind}}", - "Edit {{label}}": "编辑 {{label}}", - "Edit annotations": "编辑注解", - "Edit Ingress": "编辑 Ingress", - "Edit labels": "编辑标签", - "Edit NetworkAttachmentDefinition": "编辑 NetworkAttachmentDefinition", - "Edit Pod selector": "编辑 Pod 选择器", - "Edit Route": "编辑路由", - "Edit Service": "编辑服务", + "Edit": "Edit", + "Edit {{kind}}": "Edit {{kind}}", + "Edit {{label}}": "Edit {{label}}", + "Edit annotations": "Edit annotations", + "Edit Ingress": "Edit Ingress", + "Edit labels": "Edit labels", + "Edit NetworkAttachmentDefinition": "Edit NetworkAttachmentDefinition", + "Edit Pod selector": "Edit Pod selector", + "Edit Route": "Edit Route", + "Edit Service": "Edit Service", "Egress": "Egress", - "Egress network policy is not supported.": "不支持 Egress 网络策略。", - "Egress rule": "Egress 规则", - "Egress rules": "Egress 规则", - "Enable {{kind}}": "启用 {{kind}}", - "Enabled": "已启用", + "Egress network policy is not supported.": "Egress network policy is not supported.", + "Egress rule": "Egress rule", + "Egress rules": "Egress rules", + "Enable {{kind}}": "Enable {{kind}}", + "Enabled": "Enabled", "EndpointSlice": "EndpointSlice", "EndpointSlices": "EndpointSlices", - "Error": "错误", - "Error details": "错误详情", - "Error loading virtual machines": "加载虚拟机出错", - "Example: 100": "示例:100", - "Exceptions": "例外", - "External DNS name this service resolves to (e.g. example.com).": "此服务对应的外部 DNS 名称(如 example.com)。", - "External IP": "外部 IP", - "External load balancer": "外部负载均衡器", - "External name": "外部名称", - "External name is required": "需要外部名称", - "External name must be a valid hostname": "外部名称必须是有效的主机名", - "External service name": "外部服务名称", - "Failed": "失败", - "Failed to add the following virtual machines: {{names}}": "添加以下虚拟机失败: {{names}}", - "Failed to remove virtual machine from network": "从网络中删除虚拟机失败", - "Failed to retrieve the list of projects": "检索项目列表失败", - "False": "假", - "Form view": "表单视图", - "From": "从", - "From pods": "来自 pod", - "Given subnet is split into smaller subnets for every node.": "给定子网为每个节点分成较小的子网。", - "Health": "健康", - "Healthy: {{ready}} of {{total}} endpoints ready": "健康: {{ready}}/{{total}} 个端点已就绪", - "Hide": "隐藏", - "Hide selected Namespace(s)": "隐藏所选命名空间", - "Host": "主机", - "Hostname": "主机名", - "Hosts": "主机", + "Error": "Error", + "Error details": "Error details", + "Error loading virtual machines": "Error loading virtual machines", + "Example: 100": "Example: 100", + "Exceptions": "Exceptions", + "External DNS name this service resolves to (e.g. example.com).": "External DNS name this service resolves to (e.g. example.com).", + "External IP": "External IP", + "External load balancer": "External load balancer", + "External name": "External name", + "External name is required": "External name is required", + "External name must be a valid hostname": "External name must be a valid hostname", + "External service name": "External service name", + "Failed": "Failed", + "Failed to add the following virtual machines: {{names}}": "Failed to add the following virtual machines: {{names}}", + "Failed to remove virtual machine from network": "Failed to remove virtual machine from network", + "Failed to retrieve the list of projects": "Failed to retrieve the list of projects", + "False": "False", + "Form view": "Form view", + "From": "From", + "From pods": "From pods", + "Given subnet is split into smaller subnets for every node.": "Given subnet is split into smaller subnets for every node.", + "Health": "Health", + "Healthy: {{ready}} of {{total}} endpoints ready": "Healthy: {{ready}} of {{total}} endpoints ready", + "Hide": "Hide", + "Hide selected Namespace(s)": "Hide selected Namespace(s)", + "Host": "Host", + "Hostname": "Hostname", + "Hosts": "Hosts", "HostSubnet": "HostSubnet", - "If no namespace selector is provided, pods from all namespaces will be eligible.": "如果没有提供命名空间选择器,则来自所有命名空间中的 pod 都将是有效的。", - "If no pod selector is provided, the policy will apply to all pods in the namespace.": "如果没有提供 pod 选择器,策略将应用到命名空间中的所有 pod。", - "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "如果没有提供 pod 选择器,则允许来自有效命名空间中的所有 pod 的流量。", - "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "如果没有提供 pod 选择器,则允许来自此命名空间中的所有 pod 的流量。", - "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "如果没有提供 pod 选择器,则允许到有效命名空间中的所有 pod 的流量。", - "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "如果没有提供 pod 选择器,则允许到此命名空间中的所有 pod 的流量。", - "If this field is empty, traffic will be allowed from all external sources.": "如果此字段为空,则允许来自所有外部源的流量。", - "If this field is empty, traffic will be allowed to all external sources.": "如果此字段为空,则允许到所有外部源的流量。", + "If no namespace selector is provided, pods from all namespaces will be eligible.": "If no namespace selector is provided, pods from all namespaces will be eligible.", + "If no pod selector is provided, the policy will apply to all pods in the namespace.": "If no pod selector is provided, the policy will apply to all pods in the namespace.", + "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.", + "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "If no pod selector is provided, traffic from all pods in this namespace will be allowed.", + "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.", + "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "If no pod selector is provided, traffic to all pods in this namespace will be allowed.", + "If this field is empty, traffic will be allowed from all external sources.": "If this field is empty, traffic will be allowed from all external sources.", + "If this field is empty, traffic will be allowed to all external sources.": "If this field is empty, traffic will be allowed to all external sources.", "Ingress": "Ingress", - "Ingress details": "Ingress 详情", - "Ingress points of load balancer": "负载均衡器的 Ingress 点", - "Ingress rule": "Ingress 规则", - "Ingress rules": "Ingress 规则", + "Ingress details": "Ingress details", + "Ingress points of load balancer": "Ingress points of load balancer", + "Ingress rule": "Ingress rule", + "Ingress rules": "Ingress rules", "Ingresses": "Ingresses", - "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}": "输入错误:选择器必须以字母或数字开头和结尾,并且只能包含 -、_、/ 或 . 输出值:{{offendingSelector}}", - "Insecure traffic": "不安全的流量", - "Interface": "接口", - "Invalid IP address or subnet format": "无效的 IP 地址或子网格式", - "Invalid subnet format": "无效的子网格式", - "Invalid YAML cannot be persisted": "无效的 YAML 无法保留", - "IP address": "IP 地址", - "IP address management": "IP 地址管理", - "IP Addresses accepting traffic for service": "服务接受的流量的 IP 地址", - "IP block exceptions are not supported and would cause the entire IP block section to be ignored.": "不支持 IP 块例外,并可能导致忽略整个 IP 块部分。", - "IP blocks": "IP 块", - "IPAM Lifecycle": "IPAM 生命周期", + "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}": "Input error: selectors must start and end by a letter or number, and can only contain -, _, / or . Offending value: {{offendingSelector}}", + "Insecure traffic": "Insecure traffic", + "Interface": "Interface", + "Invalid IP address or subnet format": "Invalid IP address or subnet format", + "Invalid subnet format": "Invalid subnet format", + "Invalid YAML cannot be persisted": "Invalid YAML cannot be persisted", + "IP address": "IP address", + "IP address management": "IP address management", + "IP Addresses accepting traffic for service": "IP Addresses accepting traffic for service", + "IP block exceptions are not supported and would cause the entire IP block section to be ignored.": "IP block exceptions are not supported and would cause the entire IP block section to be ignored.", + "IP blocks": "IP blocks", + "IPAM Lifecycle": "IPAM Lifecycle", "IPAMLifecycle": "IPAMLifecycle", - "IPAMLifecycle controls IP addresses management lifecycle.": "IPAMLifecycle 控制 IP 地址管理生命周期。", - "It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "不建议在没有明确需要并了解 OVN 网络拓扑的情况下设置此字段。", + "IPAMLifecycle controls IP addresses management lifecycle.": "IPAMLifecycle controls IP addresses management lifecycle.", + "It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "It is not recommended to set this field without explicit need and understanding of the OVN network topology.", "JoinSubnets": "JoinSubnets", - "JoinSubnets are used inside the OVN network topology.": "JoinSubnets 在 OVN 网络拓扑中使用。", - "Key": "键", - "key is the label key that the selector applies": "key 是选择器应用的标签键", - "Kind": "种类(Kind)", - "Labels": "标签", - "Layer2 topology creates one logical switch shared by all nodes.": "Layer2 拓扑创建一个供所有节点共享的逻辑交换机。", - "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.": "Layer3 拓扑为每个节点创建一个第 2 层网段,每个节点都会使用不同的子网。第 3 层路由用于互连节点子网。", - "Learn how to use NetworkAttachmentDefinitions": "了解如何使用 NetworkAttachmentDefinitions", - "Learn more about {{ kind }}": "了解更多与 {{ kind }} 相关的信息", - "Learn more about working with projects": "了解更多有关使用项目的信息", - "List of {{resourceName}} matching": "{{resourceName}} 匹配列表", - "List of matching {{resourceName}}": "匹配列表 {{resourceName}}", - "List of pods": "pod 列表", - "List of pods matching": "pod 匹配列表", - "Location": "位置", - "Location of the resource that backs the service": "支持服务的资源的位置", - "MAC spoof check": "MAC spoof 检查", - "Manage columns": "管理列", - "Managed by UserDefinedNetwork": "由 UserDefinedNetwork 管理", - "Match Expressions": "匹配表达式", - "Match Labels": "匹配标签", - "matchExpressions is a list of label selector requirements. The requirements are ANDed.": "matchExpressions 是一个标签选择器要求列表。要求的逻辑是 AND。", - "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.": "matchLabels 是 {key,value} 对的映射。matchLabels 映射中的单个 {key,value} 相当于 matchExpressions 的一个元素,其 key 字段为 \"key\",运算符是 \"In\",值数组仅包含 \"value\"。要求的逻辑是 AND。", - "Memory": "内存", - "Message": "消息", - "Metrics": "指标", - "Missing installed operators": "缺少安装的 Operator", - "More information:": "更多信息:", + "JoinSubnets are used inside the OVN network topology.": "JoinSubnets are used inside the OVN network topology.", + "Key": "Key", + "key is the label key that the selector applies": "key is the label key that the selector applies", + "Kind": "Kind", + "Labels": "Labels", + "Layer2 topology creates one logical switch shared by all nodes.": "Layer2 topology creates one logical switch shared by all nodes.", + "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.": "Layer3 topology creates a layer 2 segment per node, each with a different subnet. Layer 3 routing is used to interconnect node subnets.", + "Learn how to use NetworkAttachmentDefinitions": "Learn how to use NetworkAttachmentDefinitions", + "Learn more about {{ kind }}": "Learn more about {{ kind }}", + "Learn more about working with projects": "Learn more about working with projects", + "List of {{resourceName}} matching": "List of {{resourceName}} matching", + "List of matching {{resourceName}}": "List of matching {{resourceName}}", + "List of pods": "List of pods", + "List of pods matching": "List of pods matching", + "Location": "Location", + "Location of the resource that backs the service": "Location of the resource that backs the service", + "MAC spoof check": "MAC spoof check", + "Manage columns": "Manage columns", + "Managed by UserDefinedNetwork": "Managed by UserDefinedNetwork", + "Match Expressions": "Match Expressions", + "Match Labels": "Match Labels", + "matchExpressions is a list of label selector requirements. The requirements are ANDed.": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", + "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", + "Memory": "Memory", + "Message": "Message", + "Metrics": "Metrics", + "Missing installed operators": "Missing installed operators", + "More information:": "More information:", "MTU": "MTU", - "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.": "MTU 是可选的,如果没有提供,网络会使用 OVN-Kubernetes 中全局配置的值(默认为 1400)。", - "MTU is the maximum transmission unit for a network.": "MTU 是网络的最大传输单元。", + "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.": "MTU is optional, if not provided, the globally configured value in OVN-Kubernetes (defaults to 1400) is used for the network.", + "MTU is the maximum transmission unit for a network.": "MTU is the maximum transmission unit for a network.", "multi-networkpolicies": "multi-networkpolicies", "multi-networkpolicy": "multi-networkpolicy", "MultiNetworkPolicies": "MultiNetworkPolicies", - "Name": "名称", - "Name is required": "名称是必需的", - "Namespace": "命名空间", - "Namespace is required": "命名空间是必需的", - "Namespace selector": "命名空间选择器", - "Namespace Selector": "命名空间选择器", - "Namespace(s)": "命名空间", - "Namespaced UserDefinedNetworks": "命名空间范围的 UserDefinedNetworks", - "Namespaces having all the supplied key/value pairs as labels will be selected.": "将选择包含所有提供的键/值对作为标签的命名空间。", - "Naming information": "命名信息", - "network": "网络", - "Network": "网络", - "Network type": "网络类型", - "Network Type": "网络类型", + "Name": "Name", + "Name is required": "Name is required", + "Namespace": "Namespace", + "Namespace is required": "Namespace is required", + "Namespace selector": "Namespace selector", + "Namespace Selector": "Namespace Selector", + "Namespace(s)": "Namespace(s)", + "Namespaced UserDefinedNetworks": "Namespaced UserDefinedNetworks", + "Namespaces having all the supplied key/value pairs as labels will be selected.": "Namespaces having all the supplied key/value pairs as labels will be selected.", + "Naming information": "Naming information", + "network": "network", + "Network": "Network", + "Network type": "Network type", + "Network Type": "Network Type", "NetworkAttachmentDefinitions": "NetworkAttachmentDefinitions", - "NetworkPolicies": "网络策略", - "NetworkPolicies documentation": "网络策略文档", - "networks": "网络", - "Networks are not project-bound. Using the same name creates a shared NAD.": "网络不是与项目绑定的。使用相同的名称会创建一个共享的 NAD。", - "Networks are not project-bound. Using the same name creates a shared UDN.": "网络不是与项目绑定的。使用相同的名称会创建一个共享的 UDN。", - "No {{kind}} found": "没有找到 {{kind}}", - "No {{label}} found": "没有找到 {{label}}", - "No {{resourceName}} matching the provided labels": "没有与提供的标签匹配的 {{resourceName}}", - "No conditions found": "未找到条件", - "No datapoints found.": "找不到数据点。", - "No description": "没有描述", - "No hosts": "没有主机", - "No labels": "没有标签", + "NetworkPolicies": "NetworkPolicies", + "NetworkPolicies documentation": "NetworkPolicies documentation", + "networks": "networks", + "Networks are not project-bound. Using the same name creates a shared NAD.": "Networks are not project-bound. Using the same name creates a shared NAD.", + "Networks are not project-bound. Using the same name creates a shared UDN.": "Networks are not project-bound. Using the same name creates a shared UDN.", + "No {{kind}} found": "No {{kind}} found", + "No {{label}} found": "No {{label}} found", + "No {{resourceName}} matching the provided labels": "No {{resourceName}} matching the provided labels", + "No conditions found": "No conditions found", + "No datapoints found.": "No datapoints found.", + "No description": "No description", + "No hosts": "No hosts", + "No labels": "No labels", "No matching OVN bridge mapping found for \"{{name}}\".": "No matching OVN bridge mapping found for \"{{name}}\".", - "No matching projects": "没有匹配项目", - "No namespace is configured for a primary user-defined network": "没有为主用户定义的网络配置命名空间", - "No NetworkAttachmentDefinition found": "没有找到 NetworkAttachmentDefinition", - "No owner": "没有所有者", - "No pods matching the provided labels in the current namespace": "当前命名空间中没有与提供的标签相匹配的 pod", - "No projects matched": "没有匹配的项目", - "No results found for \"{{inputValue}}\"": "没有为 \"{{inputValue}}\" 找到结果", - "No route status": "没有路由状态", - "No selector": "没有选择器", - "No virtual machines found": "没有找到虚拟机", - "Node": "节点", - "Node port": "节点端口", + "No matching projects": "No matching projects", + "No namespace is configured for a primary user-defined network": "No namespace is configured for a primary user-defined network", + "No NetworkAttachmentDefinition found": "No NetworkAttachmentDefinition found", + "No owner": "No owner", + "No pods matching the provided labels in the current namespace": "No pods matching the provided labels in the current namespace", + "No projects matched": "No projects matched", + "No results found for \"{{inputValue}}\"": "No results found for \"{{inputValue}}\"", + "No route status": "No route status", + "No selector": "No selector", + "No virtual machines found": "No virtual machines found", + "Node": "Node", + "Node port": "Node port", "NodeNetworkConfigurationPolicy": "NodeNetworkConfigurationPolicy", - "None": "无", - "Not available": "不可用", - "Not configured": "未配置", - "Not found": "没有找到", - "Not Receiving Traffic": "非接收流量", - "NS selector": "NS 选择器", + "None": "None", + "Not available": "Not available", + "Not configured": "Not configured", + "Not found": "Not found", + "Not Receiving Traffic": "Not Receiving Traffic", + "NS selector": "NS selector", "of": "of", - "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).": "每行一个端口 [name:]port:targetPort/PROTOCOL (例如:http:80:9376/TCP)。", - "Only supported when \"subnets\" are set.": "仅在设置 \"subnets\" 时支持。", + "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).": "One port per line as [name:]port:targetPort/PROTOCOL (e.g. http:80:9376/TCP).", + "Only supported when \"subnets\" are set.": "Only supported when \"subnets\" are set.", "Operator": "Operator", - "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.": "Operator 代表键与一组值的关系。有效的操作符是 In、NotIn、Exists 和 DoesNotExist。", - "Owner": "所有者", + "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", + "Owner": "Owner", "Passthrough": "Passthrough", - "Path": "路径", - "Path that the router watches to route traffic to the service.": "路由监视流向服务路由的路径。", - "Path type": "路径类型", - "Pending": "待处理", + "Path": "Path", + "Path that the router watches to route traffic to the service.": "Path that the router watches to route traffic to the service.", + "Path type": "Path type", + "Pending": "Pending", "per page": "per page", - "Percent": "百分比", - "Persistent": "持久性", - "Phase": "阶段", - "Physical network name": "物理网络名称", - "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.": "物理网络名称。必须在集群节点上配置网桥映射,以便在物理网络名称和 Open vSwitch 网桥之间进行映射。", - "Please <2>try again.": "请<2>再次尝试。", - "Pod crash loop back-off": "Pod 崩溃(crash loop back-off)", - "Pod port or name": "Pod 端口或名称", - "Pod selector": "Pod 选择器", - "Pod selector for": "Pod 选择器", - "Pod unschedulable": "Pod 不可调度", + "Percent": "Percent", + "Persistent": "Persistent", + "Phase": "Phase", + "Physical network name": "Physical network name", + "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.": "Physical network name. A bridge mapping must be configured on cluster nodes to map between physical network names and Open vSwitch bridges.", + "Please <2>try again.": "Please <2>try again.", + "Pod crash loop back-off": "Pod crash loop back-off", + "Pod port or name": "Pod port or name", + "Pod selector": "Pod selector", + "Pod selector for": "Pod selector for", + "Pod unschedulable": "Pod unschedulable", "pods": "pods", - "Pods": "Pod", - "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.": "Pod 默认接受所有流量。它们可以通过指定了 ingress 规则允许列表的网络策略来隔离。当一个 pod 被网络策略选择时,它将拒绝所有没有通过网络策略明确指定允许的流量。", - "Pods having all the supplied key/value pairs as labels will be selected.": "将选择包含所有提供的键/值对作为标签的 Pod。", - "Policy for": "策略", - "Policy name": "策略名称", - "Policy type": "策略类型", - "Port": "端口", - "Port is required": "端口是必需的", - "Port must be between 1 and 65535": "端口必须在 1 到 65535 之间", - "Port names must be unique": "端口名称必须是唯一的", - "Port names must be valid DNS labels": "端口名称必须是有效的 DNS 标签", - "Ports": "端口", - "Ports must use the format [name:]port:targetPort/PROTOCOL": "端口必须使用格式 [name:]port:targetPort/PROTOCOL", - "Primary network is automatically assigned to every pod created in the same namespace.": "主网络会自动分配给在同一命名空间中创建的每个 pod。", - "Private key": "私钥", - "Project name": "项目名称", - "Protocol": "协议", - "Protocol must be TCP, UDP, or SCTP": "协议必须是 TCP、UDP 或 SCTP", - "Public hostname for the Route. If not specified, a hostname is generated.": "路由的公共主机名。如果没有指定,则会生成一个主机名。", + "Pods": "Pods", + "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.": "Pods accept all traffic by default. They can be isolated via NetworkPolicies which specify an allowlist of ingress rules. When a Pod is selected by a NetworkPolicy, it will reject all traffic not explicitly allowed via a NetworkPolicy.", + "Pods having all the supplied key/value pairs as labels will be selected.": "Pods having all the supplied key/value pairs as labels will be selected.", + "Policy for": "Policy for", + "Policy name": "Policy name", + "Policy type": "Policy type", + "Port": "Port", + "Port is required": "Port is required", + "Port must be between 1 and 65535": "Port must be between 1 and 65535", + "Port names must be unique": "Port names must be unique", + "Port names must be valid DNS labels": "Port names must be valid DNS labels", + "Ports": "Ports", + "Ports must use the format [name:]port:targetPort/PROTOCOL": "Ports must use the format [name:]port:targetPort/PROTOCOL", + "Primary network is automatically assigned to every pod created in the same namespace.": "Primary network is automatically assigned to every pod created in the same namespace.", + "Private key": "Private key", + "Project name": "Project name", + "Protocol": "Protocol", + "Protocol must be TCP, UDP, or SCTP": "Protocol must be TCP, UDP, or SCTP", + "Public hostname for the Route. If not specified, a hostname is generated.": "Public hostname for the Route. If not specified, a hostname is generated.", "Re-encrypt": "Re-encrypt", - "Ready": "就绪", - "Reason": "原因", - "Receiving Traffic": "接收流量", - "Redirect": "重定向", - "Refer an existing ClusterUserDefinedNetwork": "请参阅现有 ClusterUserDefinedNetwork", - "Refer to your cluster administrator to know which network provider is used.": "请联系您的集群管理员,以了解使用了哪个网络供应商。", - "Remove": "删除", - "Remove all": "删除所有", - "Remove alternate Service": "删除备用服务", - "Remove exception": "删除异常", - "Remove from network": "从网络中删除", - "Remove peer": "删除对等点", - "Remove port": "删除端口", - "Remove subnets?": "删除子网?", - "Remove virtual machine from network?": "从网络中删除虚拟机?", - "Reset to default": "重置为默认", - "Resource name": "资源名称", - "Restarts": "重启", - "Restricted Access": "限制的访问", - "Reveal": "显示", - "Review selected Namespace(s)": "查看所选命名空间", - "Role": "角色", - "Role describes the network role in the pod.": "Role 用于描述 pod 中的 network 角色。", - "Route details": "路由详情", - "Router canonical hostname": "路由器真实主机名", - "Router: {{routerName}}": "路由器:{{routerName}}", - "Routes": "路由", - "Routes can be secured using several TLS termination types for serving certificates.": "对于证书服务,可使用几种 TLS 终止类型来保护路由。", - "Routing is a way to make your application publicly visible": "路由是公开应用程序的一种方式", - "Rules": "规则", - "Running": "运行", - "Save": "保存", - "Search by name...": "按名称搜索...", - "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.": "二级网络只分配给使用 k8s.v1.cni.cncf.io/networks 注解来选择给定网络的 pod。", - "Secure Route": "安全路由", - "Security": "安全性", - "Select a Project": "选择一个项目", - "Select a Service": "选择一个服务", - "Select all": "选择所有", - "Select an operator": "选择 operator", - "Select ClusterUserDefinedNetwork": "选择 ClusterUserDefinedNetwork", - "Select default ingress and egress deny rules": "选择默认入口和出口拒绝规则", - "Select insecure traffic type": "选择不安全的流量类型", - "Select one or more NetworkAttachmentDefinitions": "选择一个或多个 NetworkAttachmentDefinition", - "Select resource name": "选择资源名称", - "Select role": "选择角色", - "Select target port": "选择目标端口", - "Select termination type": "选择终止类型", - "Select virtual machines to connect to this network.": "选择要连接到此网络的虚拟机。", - "Selected categories will be displayed in the table.": "所选类别将显示在表中。", - "Selector": "选择器", - "Selector is required": "选择器是必需的", - "Selector keys must be unique": "选择器键必须是唯一的", - "Selectors must use valid key=value pairs": "选择器必须使用有效的 key=value 对", - "Service": "服务", - "Service address": "服务地址", - "Service details": "服务详情", - "Service port": "服务端口", - "Service port mapping": "服务端口映射", - "Service routing": "服务路由", - "Service to route to.": "服务到路由到。", - "Service weight": "服务权重", - "Services": "服务", - "Session affinity": "会话关联性", - "Show a preview of the <2>affected pods that this egress rule will apply to.": "显示此 egress 规则要应用到的<2>受影响 pod 的预览。", - "Show a preview of the <2>affected pods that this ingress rule will apply to.": "显示此 ingress 规则要应用到的<2>受影响 pod 的预览。", - "Show a preview of the <2>affected pods that this policy will apply to": "显示此策略要应用到的<2>受影响 pod 的预览", - "Show a preview of the <2>matching pods that this selector will apply to": "显示此选择器将应用到的<2>匹配 pod的预览", - "Show less": "显示更少", - "Showing {{shown}} from {{total}} results": "显示来自 {{total}} 结果的 {{shown}}", - "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.": "添加到此规则的源将允许到以上定义的 pod 的流量。此列表是使用逻辑 OR 操作的源组合。", - "Status": "状态", - "Subnet": "子网", - "Subnet CIDR": "子网 CIDR", - "Subnets": "子网", - "Subnets are used for the pod network across the cluster.": "子网用于集群中的 pod 网络。", - "Switch and delete": "切换和删除", - "Switching to form view will delete any invalid YAML.": "切换到表单视图将删除所有无效的 YAML。", - "Target pods": "目标 pod", - "Target port": "目标端口", - "Target port for traffic": "流量的目标端口", - "Target port names must be valid DNS labels": "目标端口名称必须是有效的 DNS 标签", - "Tech preview": "技术预览", - "Terminating": "终止", - "Termination type": "端接类型", - "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "格式应与标准 CIDR 匹配(例如 \"192.168.123.0/24\")。", - "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.": "唯一允许的值是 Persistent。如果设置,OVN Kubernetes 分配的 IP 地址将持久保留在 \"ipamclaims.k8s.cni.cncf.io\" 对象中。", - "These IP addresses will be reused by other pods if requested.": "如果请求,其他 pod 会重复使用这些 IP 地址。", - "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated": "这些规则由路由层(Ingress 控制器)处理,路由层会随规则的修改而更新。 Ingress 控制器定义了如何转发或处理标头和其他元数据", - "This action will remove all rules within the Egress section and cannot be undone.": "此操作将删除 Egress 部分中的所有规则,且无法撤消。", - "This action will remove all rules within the Ingress section and cannot be undone.": "此操作将删除 Ingress 部分中的所有规则,且无法撤消。", - "This action will remove all subnets and cannot be undone.": "此操作将删除所有子网,且无法撤消。", - "This field is only allowed for \"Primary\" network.": "此字段仅允许用于 \"Primary\" 网络。", - "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "此字段仅允许用于 \"Primary\" 网络。不建议在没有明确需要并了解 OVN 网络拓扑的情况下设置此字段。", - "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.": "此字段可以被忽略,在这种情况下,实现网络的逻辑交换机只提供第 2 层网络通信,用户必须为 pod 配置 IP 地址。因此,端口安全性能限于阻止 MAC 欺骗。", - "This network must be created before you create any workload in this project": "在此项目中创建任何工作负载之前,必须先创建此网络", - "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.": "此网络策略无法在表单中显示。请切换到 YAML 编辑器。", - "This route splits traffic across multiple services.": "这个路由会在多个服务间分散网络流量。", - "TLS certificate": "TLS 证书", - "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.": "边缘和重新加密终止的 TLS 证书。如果没有指定,则使用路由器的默认证书。", - "TLS is not enabled": "TLS 未启用", - "TLS Settings": "TLS 设置", - "TLS termination": "TLS 终止", - "To": "到", - "To ports": "到端口", - "To troubleshoot, view logs and events, then debug in terminal.": "要进行故障排除,请查看日志和事件,然后在终端中进行。", - "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.": "要使用自定义路由,您必须创建真实名称(CNAME)记录来更新 DNS。您的 CNAME 记录应指向您的自定义域<2>{{host}},到 OpenShift 真实路由器的主机名,<5>{{routerCanonicalHostname}} ,作为别名。", - "Topology": "拓扑", - "Topology describes network configuration.": "拓扑用于描述网络配置。", - "total limit": "总限制", - "total requested": "请求的总量", - "Traffic": "网络流量", - "Traffic in": "进入的网络流量", - "Traffic out": "输出的网络流量", - "True": "真", - "Type": "类型", - "Type is required": "类型是必需的", - "Unknown": "未知", - "unknown host": "未知主机", - "Unknown: endpoint readiness not available": "未知:端点就绪状态不可用", - "Unknown: endpoint readiness not loaded": "未知:端点就绪状态尚未加载", - "Updated": "已更新", - "Use \"{{inputValue}}\"": "使用 \"{{inputValue}}\"", - "Use the default Pod network": "使用默认 Pod 网络", + "Ready": "Ready", + "Reason": "Reason", + "Receiving Traffic": "Receiving Traffic", + "Redirect": "Redirect", + "Refer an existing ClusterUserDefinedNetwork": "Refer an existing ClusterUserDefinedNetwork", + "Refer to your cluster administrator to know which network provider is used.": "Refer to your cluster administrator to know which network provider is used.", + "Remove": "Remove", + "Remove all": "Remove all", + "Remove alternate Service": "Remove alternate Service", + "Remove exception": "Remove exception", + "Remove from network": "Remove from network", + "Remove peer": "Remove peer", + "Remove port": "Remove port", + "Remove subnets?": "Remove subnets?", + "Remove virtual machine from network?": "Remove virtual machine from network?", + "Reset to default": "Reset to default", + "Resource name": "Resource name", + "Restarts": "Restarts", + "Restricted Access": "Restricted Access", + "Reveal": "Reveal", + "Review selected Namespace(s)": "Review selected Namespace(s)", + "Role": "Role", + "Role describes the network role in the pod.": "Role describes the network role in the pod.", + "Route details": "Route details", + "Router canonical hostname": "Router canonical hostname", + "Router: {{routerName}}": "Router: {{routerName}}", + "Routes": "Routes", + "Routes can be secured using several TLS termination types for serving certificates.": "Routes can be secured using several TLS termination types for serving certificates.", + "Routing is a way to make your application publicly visible": "Routing is a way to make your application publicly visible", + "Rules": "Rules", + "Running": "Running", + "Save": "Save", + "Search by name...": "Search by name...", + "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.": "Secondary network is only assigned to pods that use k8s.v1.cni.cncf.io/networks annotation to select given network.", + "Secure Route": "Secure Route", + "Security": "Security", + "Select a Project": "Select a Project", + "Select a Service": "Select a Service", + "Select all": "Select all", + "Select an operator": "Select an operator", + "Select ClusterUserDefinedNetwork": "Select ClusterUserDefinedNetwork", + "Select default ingress and egress deny rules": "Select default ingress and egress deny rules", + "Select insecure traffic type": "Select insecure traffic type", + "Select one or more NetworkAttachmentDefinitions": "Select one or more NetworkAttachmentDefinitions", + "Select resource name": "Select resource name", + "Select role": "Select role", + "Select target port": "Select target port", + "Select termination type": "Select termination type", + "Select virtual machines to connect to this network.": "Select virtual machines to connect to this network.", + "Selected categories will be displayed in the table.": "Selected categories will be displayed in the table.", + "Selector": "Selector", + "Selector is required": "Selector is required", + "Selector keys must be unique": "Selector keys must be unique", + "Selectors must use valid key=value pairs": "Selectors must use valid key=value pairs", + "Service": "Service", + "Service address": "Service address", + "Service details": "Service details", + "Service port": "Service port", + "Service port mapping": "Service port mapping", + "Service routing": "Service routing", + "Service to route to.": "Service to route to.", + "Service weight": "Service weight", + "Services": "Services", + "Session affinity": "Session affinity", + "Show a preview of the <2>affected pods that this egress rule will apply to.": "Show a preview of the <2>affected pods that this egress rule will apply to.", + "Show a preview of the <2>affected pods that this ingress rule will apply to.": "Show a preview of the <2>affected pods that this ingress rule will apply to.", + "Show a preview of the <2>affected pods that this policy will apply to": "Show a preview of the <2>affected pods that this policy will apply to", + "Show a preview of the <2>matching pods that this selector will apply to": "Show a preview of the <2>matching pods that this selector will apply to", + "Show less": "Show less", + "Showing {{shown}} from {{total}} results": "Showing {{shown}} from {{total}} results", + "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.": "Sources added to this rule will allow traffic to the pods defined above. Sources in this list are combined using a logical OR operation.", + "Status": "Status", + "Subnet": "Subnet", + "Subnet CIDR": "Subnet CIDR", + "Subnets": "Subnets", + "Subnets are used for the pod network across the cluster.": "Subnets are used for the pod network across the cluster.", + "Switch and delete": "Switch and delete", + "Switching to form view will delete any invalid YAML.": "Switching to form view will delete any invalid YAML.", + "Target pods": "Target pods", + "Target port": "Target port", + "Target port for traffic": "Target port for traffic", + "Target port names must be valid DNS labels": "Target port names must be valid DNS labels", + "Tech preview": "Tech preview", + "Terminating": "Terminating", + "Termination type": "Termination type", + "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").": "The format should match standard CIDR notation (for example, \"192.168.123.0/24\").", + "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.": "The only allowed value is Persistent. When set, OVN Kubernetes assigned IP addresses will be persisted in an \"ipamclaims.k8s.cni.cncf.io\" object.", + "These IP addresses will be reused by other pods if requested.": "These IP addresses will be reused by other pods if requested.", + "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated": "These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated", + "This action will remove all rules within the Egress section and cannot be undone.": "This action will remove all rules within the Egress section and cannot be undone.", + "This action will remove all rules within the Ingress section and cannot be undone.": "This action will remove all rules within the Ingress section and cannot be undone.", + "This action will remove all subnets and cannot be undone.": "This action will remove all subnets and cannot be undone.", + "This field is only allowed for \"Primary\" network.": "This field is only allowed for \"Primary\" network.", + "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.": "This field is only allowed for \"Primary\" network. It is not recommended to set this field without explicit need and understanding of the OVN network topology.", + "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.": "This field may be omitted. In that case the logical switch implementing the network only provides layer 2 communication, and users must configure IP addresses for the pods. As a consequence, Port security only prevents MAC spoofing.", + "This network must be created before you create any workload in this project": "This network must be created before you create any workload in this project", + "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.": "This NetworkPolicy cannot be displayed in form. Please switch to the YAML editor.", + "This route splits traffic across multiple services.": "This route splits traffic across multiple services.", + "TLS certificate": "TLS certificate", + "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.": "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.", + "TLS is not enabled": "TLS is not enabled", + "TLS Settings": "TLS Settings", + "TLS termination": "TLS termination", + "To": "To", + "To ports": "To ports", + "To troubleshoot, view logs and events, then debug in terminal.": "To troubleshoot, view logs and events, then debug in terminal.", + "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.": "To use a custom route, you must update your DNS provider by creating a canonical name (CNAME) record. Your CNAME record should point to your custom domain <2>{{host}}, to the OpenShift canonical router hostname, <5>{{routerCanonicalHostname}}, as the alias.", + "Topology": "Topology", + "Topology describes network configuration.": "Topology describes network configuration.", + "total limit": "total limit", + "total requested": "total requested", + "Traffic": "Traffic", + "Traffic in": "Traffic in", + "Traffic out": "Traffic out", + "True": "True", + "Type": "Type", + "Type is required": "Type is required", + "Unknown": "Unknown", + "unknown host": "unknown host", + "Unknown: endpoint readiness not available": "Unknown: endpoint readiness not available", + "Unknown: endpoint readiness not loaded": "Unknown: endpoint readiness not loaded", + "Updated": "Updated", + "Use \"{{inputValue}}\"": "Use \"{{inputValue}}\"", + "Use the default Pod network": "Use the default Pod network", "UserDefinedNetwork": "UserDefinedNetwork", "UserDefinedNetworks": "UserDefinedNetworks", - "Value": "值", - "Value hidden": "值隐藏", - "Values": "值", - "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.": "值是一个字符串值的数组。如果运算符是 In 或 NotIn,则值数组不能为空。如果运算符是 Exists 或 DoesNotExist,值数组必须为空。此数组在策略合并补丁中被替换。", - "View all {{total}} results": "查看所有 {{total}} 结果", - "View events": "查看事件", - "View logs": "查看日志", - "View naming information": "查看命名信息", - "Virtual Machines": "虚拟机", + "Value": "Value", + "Value hidden": "Value hidden", + "Values": "Values", + "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", + "View all {{total}} results": "View all {{total}} results", + "View events": "View events", + "View logs": "View logs", + "View naming information": "View naming information", + "Virtual Machines": "Virtual Machines", + "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.": "Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.", "VLAN": "VLAN", - "VLAN tag number": "VLAN 标签号", - "Weight": "权重", - "When omitted, the platform will choose a reasonable default which is subject to change over time.": "如果省略,平台将选择一个合理的默认值,该值可能会随时间变化。", - "When using the OpenShift SDN cluster network provider:": "当使用 OpenShift SDN 集群网络供应商时:", - "Wildcard policy": "通配符策略", - "with exceptions": "带有例外", + "VLAN tag number": "VLAN tag number", + "Weight": "Weight", + "When omitted, the platform will choose a reasonable default which is subject to change over time.": "When omitted, the platform will choose a reasonable default which is subject to change over time.", + "When using the OpenShift SDN cluster network provider:": "When using the OpenShift SDN cluster network provider:", + "Wildcard policy": "Wildcard policy", + "with exceptions": "with exceptions", "YAML": "YAML", - "YAML view": "YAML 视图", - "You don't have access to this section due to cluster policy.": "由于集群策略您无法访问此部分。", - "You don't have permission to perform this action": "您没有执行此操作的权限", - "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.": "您必须创建一个命名空间,才能创建以 'openshift-'、'kubernetes-' 或 'kube-' 开头的项目。" + "YAML view": "YAML view", + "You don't have access to this section due to cluster policy.": "You don't have access to this section due to cluster policy.", + "You don't have permission to perform this action": "You don't have permission to perform this action", + "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.": "You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'." } diff --git a/package-lock.json b/package-lock.json index 73d01c43..602713bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "@patternfly/react-styles": "6.6.1", "@patternfly/react-table": "6.6.2", "@patternfly/react-tokens": "6.6.1", + "@patternfly/react-topology": "^6.6.0", "classnames": "^2.5.1", "js-yaml": "^4.3.2", "linkify-it": "6.1.0", @@ -1827,6 +1828,24 @@ "ms": "^2.1.1" } }, + "node_modules/@dagrejs/dagre": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-1.1.2.tgz", + "integrity": "sha512-F09dphqvHsbe/6C2t2unbmpr5q41BNPEfJCdn8Z7aEBpVSy/zFQ/b4SWsweQjWNsYMDvE2ffNUN8X0CeFsEGNw==", + "license": "MIT", + "dependencies": { + "@dagrejs/graphlib": "2.2.2" + } + }, + "node_modules/@dagrejs/graphlib": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@dagrejs/graphlib/-/graphlib-2.2.2.tgz", + "integrity": "sha512-CbyGpCDKsiTg/wuk79S7Muoj8mghDGAESWGxcSyhHX5jD35vYMBZochYVFzlHxynpE9unpu6O+4ZuhrLxASsOg==", + "license": "MIT", + "engines": { + "node": ">17.0.0" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -3923,6 +3942,24 @@ "react-dom": "^17 || ^18 || ^19" } }, + "node_modules/@patternfly/react-component-groups/node_modules/@patternfly/react-table": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-6.6.2.tgz", + "integrity": "sha512-HIxECFB1eiVcAi/DP+FYQMzA7JU4zTg/7idVKuEvWJfILx66ZBwpitwOt27IPxQ3AjCgixLMyh6lTDFAfmd3Kw==", + "license": "MIT", + "dependencies": { + "@patternfly/react-core": "^6.6.2", + "@patternfly/react-icons": "~6.6.1", + "@patternfly/react-styles": "~6.6.1", + "@patternfly/react-tokens": "~6.6.1", + "lodash": "^4.18.1", + "tslib": "^2.8.1" + }, + "peerDependencies": { + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" + } + }, "node_modules/@patternfly/react-core": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.6.2.tgz", @@ -4021,6 +4058,31 @@ "integrity": "sha512-t7dDEJMnO3QkdIKyjbyKJznVYki9ONZG27Cn/9RXwaM0lDGCrgQEJXy2XoVUCdYhIdXZu+TGSEqXeNFYUyZECg==", "license": "MIT" }, + "node_modules/@patternfly/react-topology": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-topology/-/react-topology-6.6.0.tgz", + "integrity": "sha512-Ake5kYZMKwhe5DqCo3w4J0aX970wWNdWotwLNq65Ad0hBxnKw3e3FEhjyaw1OJJN+H9L/AV9VazU/u56qYeBZA==", + "license": "MIT", + "dependencies": { + "@dagrejs/dagre": "1.1.2", + "@patternfly/react-core": "^6.5.1", + "@patternfly/react-icons": "^6.5.1", + "@patternfly/react-styles": "^6.5.1", + "@types/d3": "^7.4.0", + "@types/d3-force": "^1.2.1", + "d3": "^7.8.0", + "mobx": "^6.9.0", + "mobx-react": "^7.6.0", + "point-in-svg-path": "^1.0.1", + "popper.js": "^1.16.1", + "tslib": "^2.0.0", + "webcola": "3.4.0" + }, + "peerDependencies": { + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" + } + }, "node_modules/@peculiar/asn1-cms": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.11.0.tgz", @@ -4308,24 +4370,159 @@ "@types/node": "*" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, "node_modules/@types/d3-array": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", "license": "MIT" }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "license": "MIT" }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, "node_modules/@types/d3-ease": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "license": "MIT" }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.7.tgz", + "integrity": "sha512-zySqZfnxn67RVEGWzpD9dQA0AbNIp4Rj0qGvAuUdUNfGLrwuGCbEGAGze5hEdNaHJKQT2gTqr6j+qAzncm11ew==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", @@ -4341,6 +4538,24 @@ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", "license": "MIT" }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz", + "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==", + "license": "MIT" + }, "node_modules/@types/d3-scale": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", @@ -4350,6 +4565,18 @@ "@types/d3-time": "*" } }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.12.tgz", + "integrity": "sha512-Qe/KWYhEiIIxGs7HrAAjMfShxKldx19SJtr5zu53f3afPsdZNz7HHtdTLXo/kqeiWNXVycI24kSnfzBYkTzpgw==", + "license": "MIT" + }, "node_modules/@types/d3-shape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz", @@ -4365,12 +4592,37 @@ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", "license": "MIT" }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, "node_modules/@types/d3-timer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -4404,6 +4656,12 @@ "@types/send": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/http-errors": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", @@ -7288,6 +7546,47 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", @@ -7300,6 +7599,43 @@ "node": ">=12" } }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", @@ -7309,6 +7645,86 @@ "node": ">=12" } }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", @@ -7318,6 +7734,32 @@ "node": ">=12" } }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-format": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", @@ -7327,6 +7769,27 @@ "node": ">=12" } }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", @@ -7348,6 +7811,33 @@ "node": ">=12" } }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", @@ -7364,6 +7854,28 @@ "node": ">=12" } }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/d3-shape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", @@ -7409,6 +7921,41 @@ "node": ">=12" } }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -7607,6 +8154,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/delaunay-find": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/delaunay-find/-/delaunay-find-0.0.6.tgz", @@ -11195,7 +11751,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -13385,6 +13940,63 @@ "node": "20 || 22 || 24 || 26" } }, + "node_modules/mobx": { + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.16.1.tgz", + "integrity": "sha512-syNcDdX3KT+Jq3je6eGjBhuc24Z68td2VG0zNFqRswaE433D9SNH5VRy/xrGbJsUixfppLLccXhAW9JSf6n+SQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + } + }, + "node_modules/mobx-react": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz", + "integrity": "sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==", + "license": "MIT", + "dependencies": { + "mobx-react-lite": "^3.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mobx-react-lite": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz", + "integrity": "sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/mocha": { "version": "12.0.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-12.0.3.tgz", @@ -14971,6 +15583,26 @@ "node": ">=4" } }, + "node_modules/point-in-svg-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/point-in-svg-path/-/point-in-svg-path-1.0.2.tgz", + "integrity": "sha512-+Smsf7B9e7eRFHIwpN+4rE8inF2APbFWeywPfUgbeh02xdJSkbTz6Pqdt7A36wVCR+CnLbaNkRnBjgOpF5RMVQ==", + "license": "ISC", + "engines": { + "node": ">=8.x.x" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -16076,6 +16708,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -16099,6 +16737,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, "node_modules/safe-array-concat": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", @@ -16193,7 +16837,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "license": "MIT" }, "node_modules/sass": { @@ -18887,6 +19530,61 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/webcola": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webcola/-/webcola-3.4.0.tgz", + "integrity": "sha512-4BiLXjXw3SJHo3Xd+rF+7fyClT6n7I+AR6TkBqyQ4kTsePSAMDLRCXY1f3B/kXJeP9tYn4G1TblxTO+jAt0gaw==", + "license": "MIT", + "dependencies": { + "d3-dispatch": "^1.0.3", + "d3-drag": "^1.0.4", + "d3-shape": "^1.3.5", + "d3-timer": "^1.0.5" + } + }, + "node_modules/webcola/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", + "license": "BSD-3-Clause" + }, + "node_modules/webcola/node_modules/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "node_modules/webcola/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/webcola/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==", + "license": "BSD-3-Clause" + }, + "node_modules/webcola/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/webcola/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "license": "BSD-3-Clause" + }, "node_modules/webpack": { "version": "5.112.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.112.0.tgz", diff --git a/package.json b/package.json index ef79856a..16b2dcf0 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@patternfly/react-styles": "6.6.1", "@patternfly/react-table": "6.6.2", "@patternfly/react-tokens": "6.6.1", + "@patternfly/react-topology": "^6.6.0", "classnames": "^2.5.1", "js-yaml": "^4.3.2", "linkify-it": "6.1.0", diff --git a/plugin-manifest.ts b/plugin-manifest.ts index 4a469656..ddf6905a 100644 --- a/plugin-manifest.ts +++ b/plugin-manifest.ts @@ -12,6 +12,7 @@ import { } from './src/views/networkpolicies/manifest'; import { RoutesExposedModules, RoutesExtensions } from './src/views/routes/manifest'; import { ServicesExposedModules, ServicesExtensions } from './src/views/services/manifest'; +import { TopologyExposedModules, TopologyExtensions } from './src/views/topology/manifest'; import { UserDefinedNetworksExposedModules, UserDefinedNetworksExtensions, @@ -31,6 +32,7 @@ export const pluginMetadata: ConsolePluginBuildMetadata = { ...FlagsExposedModules, ...RoutesExposedModules, ...UserDefinedNetworksExposedModules, + ...TopologyExposedModules, yamlTemplates: './templates/index.ts', }, name: 'networking-console-plugin', @@ -45,4 +47,5 @@ export const extensions: EncodedExtension[] = [ ...NADsExtensions, ...FlagsExtensions, ...UserDefinedNetworksExtensions, + ...TopologyExtensions, ]; diff --git a/src/utils/resources/pods/constants.ts b/src/utils/resources/pods/constants.ts new file mode 100644 index 00000000..fe49ac3f --- /dev/null +++ b/src/utils/resources/pods/constants.ts @@ -0,0 +1,2 @@ +export const VIRT_LAUNCHER_POD_LABEL_KEY = 'kubevirt.io'; +export const VIRT_LAUNCHER_POD_LABEL_VALUE = 'virt-launcher'; diff --git a/src/utils/resources/udns/constants.ts b/src/utils/resources/udns/constants.ts index 174e6fcf..4ffc058b 100644 --- a/src/utils/resources/udns/constants.ts +++ b/src/utils/resources/udns/constants.ts @@ -7,3 +7,6 @@ export const LAYER2_TOPOLOGY = 'Layer2'; export const LAYER3_TOPOLOGY = 'Layer3'; export const CLUSTER_UDN_NAD_NAME_PREFIX = 'cluster.udn.'; + +export const NETWORK_CREATED = 'NetworkCreated'; +export const NETWORK_ALLOCATION_SUCCEEDED = 'NetworkAllocationSucceeded'; diff --git a/src/utils/resources/udns/helper.ts b/src/utils/resources/udns/helper.ts index e917edf4..81a27a1d 100644 --- a/src/utils/resources/udns/helper.ts +++ b/src/utils/resources/udns/helper.ts @@ -1,7 +1,18 @@ +import { + K8sResourceCommon, + MatchExpression, + Operator, +} from '@openshift-console/dynamic-plugin-sdk'; import { ClusterUserDefinedNetworkModel } from '@utils/models'; import { getName } from '@utils/resources/shared'; +import { getUDNConditions } from '@utils/resources/udns/selectors'; +import { verifyMatchExpressions } from '@utils/utils'; -import { CLUSTER_UDN_NAD_NAME_PREFIX } from './constants'; +import { + CLUSTER_UDN_NAD_NAME_PREFIX, + NETWORK_ALLOCATION_SUCCEEDED, + NETWORK_CREATED, +} from './constants'; import { ClusterUserDefinedNetworkKind, UserDefinedNetworkKind, @@ -10,13 +21,18 @@ import { export type UDNResource = ClusterUserDefinedNetworkKind | UserDefinedNetworkKind; -export const isPrimaryUDN = (udn: ClusterUserDefinedNetworkKind | UserDefinedNetworkKind) => - udn?.spec?.layer2?.role === UserDefinedNetworkRole.Primary || - udn?.spec?.network?.layer2?.role === UserDefinedNetworkRole.Primary; - export const isClusterUDN = (udn: UDNResource): udn is ClusterUserDefinedNetworkKind => udn.kind === ClusterUserDefinedNetworkModel.kind; +export const isPrimaryUDN = (udn: ClusterUserDefinedNetworkKind | UserDefinedNetworkKind) => { + const spec = isClusterUDN(udn) ? udn?.spec?.network : udn?.spec; + return ( + spec?.layer2?.role === UserDefinedNetworkRole.Primary || + spec?.layer3?.role === UserDefinedNetworkRole.Primary || + spec?.localnet?.role === UserDefinedNetworkRole.Primary + ); +}; + export const getUDNNADNameCandidates = (udn: UDNResource): string[] => { const udnName = getName(udn); @@ -30,3 +46,40 @@ export const getUDNNADNameCandidates = (udn: UDNResource): string[] => { return [udnName]; }; + +export const udnIsReady = (udn: UDNResource) => { + const conditions = getUDNConditions(udn); + const networkCreationSuccessful = + conditions?.find((condition) => condition.type === NETWORK_CREATED)?.status === 'True'; + const networkAllocationSuccessful = + conditions?.find((condition) => condition.type === NETWORK_ALLOCATION_SUCCEEDED)?.status === + 'True'; + + return networkCreationSuccessful && networkAllocationSuccessful; +}; + +export const getCUDNProjects = ( + cudn: ClusterUserDefinedNetworkKind, + projects: K8sResourceCommon[], +): K8sResourceCommon[] => { + const namespaceSelector = cudn?.spec?.namespaceSelector || {}; + + const matchLabelsToExpressions = Object.entries(namespaceSelector.matchLabels || {}).map( + ([key, value]): MatchExpression => ({ + key, + operator: Operator.Equals, + values: [value], + }), + ); + + const matchExpressions = namespaceSelector.matchExpressions || []; + + const combinedExpressions = [...matchLabelsToExpressions, ...matchExpressions]; + + return projects?.filter((project) => verifyMatchExpressions(project, combinedExpressions)) || []; +}; + +export const getCUDNNamespaceNames = ( + cudn: ClusterUserDefinedNetworkKind, + projects: K8sResourceCommon[], +) => getCUDNProjects(cudn, projects).map((project) => getName(project)) || []; diff --git a/src/utils/resources/vm/constants.ts b/src/utils/resources/vm/constants.ts index 0f435a7d..4be46442 100644 --- a/src/utils/resources/vm/constants.ts +++ b/src/utils/resources/vm/constants.ts @@ -1,3 +1,34 @@ export const NETWORK_PATH = '/spec/template/spec/networks'; export const INTERFACE_PATH = '/spec/template/spec/domain/devices/interfaces'; export const INTERFACE_STATE_ABSENT = 'absent'; + +// https://github.com/kubevirt/api/blob/9689e71fe2bed9e7da5f165760bbbf6981cc1087/core/v1/types.go#L1277 +export const PrintableVMStatus = { + Deleting: 'Deleting', + Migrating: 'Migrating', + Paused: 'Paused', + Provisioning: 'Provisioning', + Running: 'Running', + Starting: 'Starting', + Stopped: 'Stopped', + Stopping: 'Stopping', + Terminating: 'Terminating', + Unknown: 'Unknown', + WaitingForReceiver: 'WaitingForReceiver', + WaitingForVolumeBinding: 'WaitingForVolumeBinding', +} as const; + +export type PrintableVMStatus = (typeof PrintableVMStatus)[keyof typeof PrintableVMStatus]; + +export const PrintableVMErrorStatus = { + CrashLoopBackOff: 'CrashLoopBackOff', + DataVolumeError: 'DataVolumeError', + ErrImagePull: 'ErrImagePull', + ErrorDataVolumeNotFound: 'ErrorDataVolumeNotFound', + ErrorPvcNotFound: 'ErrorPvcNotFound', + ErrorUnschedulable: 'ErrorUnschedulable', + ImagePullBackOff: 'ImagePullBackOff', +} as const; + +export type PrintableVMErrorStatus = + (typeof PrintableVMErrorStatus)[keyof typeof PrintableVMErrorStatus]; diff --git a/src/utils/resources/vm/utils.ts b/src/utils/resources/vm/utils.ts index ef6bb402..124381dc 100644 --- a/src/utils/resources/vm/utils.ts +++ b/src/utils/resources/vm/utils.ts @@ -4,7 +4,7 @@ import { k8sPatch } from '@openshift-console/dynamic-plugin-sdk'; import { UserDefinedNetworkModel } from '@utils/models'; import { NADNetworkPair, NetworkAttachmentDefinitionKind } from '@utils/resources/nads/types'; import { getName, getNamespace } from '@utils/resources/shared'; -import { getUDNNADNameCandidates, UDNResource } from '@utils/resources/udns/helper'; +import { getUDNNADNameCandidates, isPrimaryUDN, UDNResource } from '@utils/resources/udns/helper'; import { INTERFACE_PATH, INTERFACE_STATE_ABSENT, NETWORK_PATH } from './constants'; import { getInterfaces, getNetworks, getVMStatus } from './selectors'; @@ -131,13 +131,8 @@ export const multusNetworkMatchesNAD = ( export const getUDNNetworkNamespace = ( udn: UDNResource, vm: V1VirtualMachine, -): string | undefined => { - if (udn.kind === UserDefinedNetworkModel.kind) { - return getNamespace(udn); - } - - return getNamespace(vm); -}; +): string | undefined => + udn.kind === UserDefinedNetworkModel.kind ? getNamespace(udn) : getNamespace(vm); const multusNetworkNameMatchesCandidates = ( multusNetworkName: string, @@ -180,6 +175,49 @@ export const multusNetworkMatchesUDN = ( ); }; +export const vmUsesUDN = ( + vm: V1VirtualMachine, + udn: UDNResource, + cudnNamespaces?: string[], +): boolean => { + if (!udn) return false; + + const networks = getNetworks(vm); + const interfaces = getInterfaces(vm); + + // Check for secondary UDN connection via multus networks + const hasSecondaryConnection = networks.some((network) => { + if (!multusNetworkMatchesUDN(network, udn, vm)) return false; + + const iface = interfaces.find((item) => item.name === network.name); + return Boolean(iface && iface.state !== INTERFACE_STATE_ABSENT); + }); + + if (hasSecondaryConnection) return true; + + // Check for primary UDN connection via pod network + // Primary UDNs replace the default pod network for VMs in the same namespace + if (isPrimaryUDN(udn)) { + const vmNamespace = getNamespace(vm); + const udnNamespace = getNamespace(udn); + + // For namespace-scoped primary UDNs, VM must be in the same namespace + if (udnNamespace && vmNamespace === udnNamespace) { + // Check if VM has a pod network (which would use the primary UDN) + const hasPodNetwork = networks.some((network) => Boolean(network.pod)); + if (hasPodNetwork) return true; + } + + // For cluster-scoped primary CUDNs, check if VM's namespace is in the active namespaces + if (!udnNamespace && cudnNamespaces) { + const hasPodNetwork = networks.some((network) => Boolean(network.pod)); + if (hasPodNetwork && cudnNamespaces.includes(vmNamespace)) return true; + } + } + + return false; +}; + export const buildNADReferenceForUDN = ( udn: UDNResource, vm: V1VirtualMachine, diff --git a/src/views/routes/list/components/RouteStatus.tsx b/src/views/routes/list/components/RouteStatus.tsx index f125849a..13f53384 100644 --- a/src/views/routes/list/components/RouteStatus.tsx +++ b/src/views/routes/list/components/RouteStatus.tsx @@ -3,14 +3,14 @@ import React, { FC } from 'react'; import Status from '@openshift-console/dynamic-plugin-sdk/lib/app/components/status/Status'; import { RouteKind } from '@utils/types'; -import { routeStatus } from '../utils/utils'; +import { getRouteStatus } from '../utils/utils'; type RouteStatusProps = { route: RouteKind; }; const RouteStatus: FC = ({ route }) => { - const status: string = routeStatus(route); + const status: string = getRouteStatus(route); return ; }; diff --git a/src/views/routes/list/hooks/useRouteFilters.ts b/src/views/routes/list/hooks/useRouteFilters.ts index 5b85155e..3dec61ec 100644 --- a/src/views/routes/list/hooks/useRouteFilters.ts +++ b/src/views/routes/list/hooks/useRouteFilters.ts @@ -3,7 +3,7 @@ import { RoutesStatuses } from '@utils/constants/routes'; import { useNetworkingTranslation } from '@utils/hooks/useNetworkingTranslation'; import { RouteKind } from '@utils/types'; -import { routeStatus } from '../utils/utils'; +import { getRouteStatus } from '../utils/utils'; const useRouteFilters = (): RowFilter[] => { const { t } = useNetworkingTranslation(); @@ -13,13 +13,13 @@ const useRouteFilters = (): RowFilter[] => { filter: ({ selected }, obj) => { if (selected?.length === 0) return true; - const status = routeStatus(obj); + const status = getRouteStatus(obj); return selected.includes(status); }, filterGroupName: t('Status'), items: RoutesStatuses.map((status) => ({ id: status, title: status })), - reducer: (obj) => routeStatus(obj), + reducer: (obj) => getRouteStatus(obj), type: 'route-status', }, ]; diff --git a/src/views/routes/list/utils/utils.ts b/src/views/routes/list/utils/utils.ts index 5a9b7974..1cd98064 100644 --- a/src/views/routes/list/utils/utils.ts +++ b/src/views/routes/list/utils/utils.ts @@ -4,7 +4,7 @@ import { RoutesStatusesType } from '@utils/constants/routes'; import { t } from '@utils/hooks/useNetworkingTranslation'; import { RouteIngress, RouteKind } from '@utils/types'; -export const routeStatus = (route: RouteKind): RoutesStatusesType => { +export const getRouteStatus = (route: RouteKind): RoutesStatusesType => { let atLeastOneAdmitted = false; if (!route.status || !route.status.ingress) { @@ -92,8 +92,8 @@ export const sortRoutesByLocation = (direction: string) => (a: RouteKind, b: Rou export const sortRoutesByStatus = (direction: string) => (a: RouteKind, b: RouteKind) => { const { first, second } = direction === 'asc' ? { first: a, second: b } : { first: b, second: a }; - const firstValue = routeStatus(first); - const secondValue = routeStatus(second); + const firstValue = getRouteStatus(first); + const secondValue = getRouteStatus(second); return firstValue?.localeCompare(secondValue); }; diff --git a/src/views/services/details/tabs/pods/components/PodRow.tsx b/src/views/services/details/tabs/pods/components/PodRow.tsx index 9f56d831..93981494 100644 --- a/src/views/services/details/tabs/pods/components/PodRow.tsx +++ b/src/views/services/details/tabs/pods/components/PodRow.tsx @@ -1,6 +1,5 @@ import React, { FC } from 'react'; import classNames from 'classnames'; -import * as _ from 'lodash'; import { modelToGroupVersionKind, PodModel } from '@kubevirt-ui-ext/kubevirt-api/console'; import type { IoK8sApiCoreV1Pod } from '@kubevirt-ui-ext/kubevirt-api/kubernetes'; @@ -18,7 +17,13 @@ import { useNetworkingTranslation } from '@utils/hooks/useNetworkingTranslation' import { podColumnInfo } from '../hooks/usePodColumns'; import { formatBytesAsMiB, formatCores } from '../units'; -import { getPodCPUUsage, getPodMemoryUsage, podPhase, podReadiness, podRestarts } from '../utils'; +import { + getPodCPUUsage, + getPodMemoryUsage, + getPodPhase, + podReadiness, + podRestarts, +} from '../utils'; import { PodStatus } from './PodStatus'; import { PodTraffic } from './PodTraffic'; @@ -37,7 +42,7 @@ const PodRow: FC = ({ const { creationTimestamp, labels, name, namespace } = pod.metadata; const { readyCount, totalContainers } = podReadiness(pod); - const phase = podPhase(pod); + const phase = getPodPhase(pod); const restarts = podRestarts(pod); const context = { [`core~${PodModel.apiVersion}~${PodModel.kind}`]: pod }; diff --git a/src/views/services/details/tabs/pods/components/PodStatus.tsx b/src/views/services/details/tabs/pods/components/PodStatus.tsx index 6279aafc..66b13e7d 100644 --- a/src/views/services/details/tabs/pods/components/PodStatus.tsx +++ b/src/views/services/details/tabs/pods/components/PodStatus.tsx @@ -11,7 +11,7 @@ import { Button, ButtonVariant, Content, Divider, Popover } from '@patternfly/re import { useNetworkingTranslation } from '@utils/hooks/useNetworkingTranslation'; import { resourcePathFromModel } from '@utils/resources/shared'; -import { isContainerCrashLoopBackOff, isWindowsPod, podPhase } from '../utils'; +import { getPodPhase, isContainerCrashLoopBackOff, isWindowsPod } from '../utils'; type PodStatusPopoverProps = { bodyContent: string; @@ -40,7 +40,7 @@ const PodStatusPopover: FC = ({ }; export const PodStatus: FC = ({ pod }) => { - const status = podPhase(pod); + const status = getPodPhase(pod); const unschedulableCondition = pod.status?.conditions?.find( (condition) => condition.reason === 'Unschedulable' && condition.status === 'False', ); diff --git a/src/views/services/details/tabs/pods/constants.ts b/src/views/services/details/tabs/pods/constants.ts index aba9fbc5..85bd3c7c 100644 --- a/src/views/services/details/tabs/pods/constants.ts +++ b/src/views/services/details/tabs/pods/constants.ts @@ -3,3 +3,15 @@ export const PROMETHEUS_TENANCY_BASE_PATH = window.SERVER_FLAGS.prometheusTenanc export const MILLISECONDS_TO_SECONDS_MULTIPLIER = 1000; export const MIGRATION__PROMETHEUS_DELAY = 15 * MILLISECONDS_TO_SECONDS_MULTIPLIER; + +export const PodPhase = { + Evicted: 'Evicted', + Failed: 'Failed', + Pending: 'Pending', + Running: 'Running', + Succeeded: 'Succeeded', + Terminating: 'Terminating', + Unknown: 'Unknown', +} as const; + +export type PodPhase = (typeof PodPhase)[keyof typeof PodPhase]; diff --git a/src/views/services/details/tabs/pods/hooks/usePodColumns.tsx b/src/views/services/details/tabs/pods/hooks/usePodColumns.tsx index a2724d73..ae698706 100644 --- a/src/views/services/details/tabs/pods/hooks/usePodColumns.tsx +++ b/src/views/services/details/tabs/pods/hooks/usePodColumns.tsx @@ -15,7 +15,7 @@ import { PROMETHEUS_BASE_PATH, PROMETHEUS_TENANCY_BASE_PATH } from '../constants import { getPodCPUUsage, getPodMemoryUsage, - podPhase, + getPodPhase, podReadiness, podRestarts, sortResourceByValue, @@ -105,7 +105,7 @@ const usePodColumns = ( id: podColumnInfo.status.id, props: { className: podColumnInfo.status.classes }, sort: (data, direction) => - data.sort(sortResourceByValue(direction, podPhase)), + data.sort(sortResourceByValue(direction, getPodPhase)), title: t('Status'), transforms: [sortable], }, diff --git a/src/views/services/details/tabs/pods/utils.ts b/src/views/services/details/tabs/pods/utils.ts index 9e2e9fc4..6de5b0f1 100644 --- a/src/views/services/details/tabs/pods/utils.ts +++ b/src/views/services/details/tabs/pods/utils.ts @@ -13,7 +13,7 @@ import { getName, getNamespace } from '@utils/resources/shared'; export type PodPhase = string; // (See https://github.com/kubernetes/kubernetes/blob/release-1.17/pkg/printers/internalversion/printers.go) -export const podPhase = (pod: IoK8sApiCoreV1Pod): PodPhase => { +export const getPodPhase = (pod: IoK8sApiCoreV1Pod): PodPhase => { if (!pod || !pod.status) { return ''; } @@ -89,7 +89,7 @@ export const podPhase = (pod: IoK8sApiCoreV1Pod): PodPhase => { }; export const podPhaseFilterReducer = (pod: IoK8sApiCoreV1Pod): PodPhase => { - const status = podPhase(pod); + const status = getPodPhase(pod); if (status === 'Terminating') { return status; } diff --git a/src/views/topology/TopologyPage.scss b/src/views/topology/TopologyPage.scss new file mode 100644 index 00000000..82e1f6b4 --- /dev/null +++ b/src/views/topology/TopologyPage.scss @@ -0,0 +1,21 @@ +.networking-topology { + &__layout { + display: flex; + flex-direction: column; + height: calc(100vh - var(--pf-v6-c-page__main-section--PaddingTop, 0px)); + overflow: hidden; + } + + &__sticky-header { + flex-shrink: 0; + } + + &__topology-content { + flex: 1; + height: 100%; + min-height: 600px; + overflow: hidden; + display: flex; + flex-direction: column; + } +} diff --git a/src/views/topology/TopologyPage.tsx b/src/views/topology/TopologyPage.tsx new file mode 100644 index 00000000..10f16df8 --- /dev/null +++ b/src/views/topology/TopologyPage.tsx @@ -0,0 +1,49 @@ +import React, { FC } from 'react'; + +import { DocumentTitle, useActiveNamespace } from '@openshift-console/dynamic-plugin-sdk'; +import { Content, ContentVariants, PageSection, Title } from '@patternfly/react-core'; +import { useNetworkingTranslation } from '@utils/hooks/useNetworkingTranslation'; +import Topology from '@views/topology/components/Topology'; +import { TopologyContextProvider } from '@views/topology/context/TopologyContext'; +import useNetworkTopologyResources from '@views/topology/hooks/useNetworkTopologyResources'; + +import './TopologyPage.scss'; + +const TopologyPage: FC = () => { + const { t } = useNetworkingTranslation(); + const [activeNamespace] = useActiveNamespace(); + const { loaded, resources } = useNetworkTopologyResources(); + + return ( + <> + {t('Topology')} +
+
+ + {t('Topology')} + + {t( + 'Visualize, scale, and manage your cluster topology. Right-click the canvas for additional actions.', + )} + + +
+ + + + + +
+ + ); +}; + +export default TopologyPage; diff --git a/src/views/topology/components/CustomGroup/CustomGroup.scss b/src/views/topology/components/CustomGroup/CustomGroup.scss new file mode 100644 index 00000000..0d123555 --- /dev/null +++ b/src/views/topology/components/CustomGroup/CustomGroup.scss @@ -0,0 +1,10 @@ +.custom-group { + .pf-topology__group__label > text { + fill: var(--pf-topology__node__label__text--Fill); + } + + .pf-topology__node__label__background { + fill: var(--pf-topology__node__label__background--Fill); + stroke: var(--pf-topology__node__background--Stroke); + } +} diff --git a/src/views/topology/components/CustomGroup/CustomGroup.tsx b/src/views/topology/components/CustomGroup/CustomGroup.tsx new file mode 100644 index 00000000..815aecc5 --- /dev/null +++ b/src/views/topology/components/CustomGroup/CustomGroup.tsx @@ -0,0 +1,25 @@ +import React, { FC } from 'react'; + +import { + DefaultGroup, + Node, + WithDndDropProps, + WithDragNodeProps, + WithSelectionProps, +} from '@patternfly/react-topology'; + +import './CustomGroup.scss'; + +type CustomGroupProps = { + element: Node; +} & WithDndDropProps & + WithDragNodeProps & + WithSelectionProps; + +const CustomGroup: FC = ({ element, ...rest }) => { + const data = element.getData(); + + return ; +}; + +export default CustomGroup; diff --git a/src/views/topology/components/CustomNode/CustomNode.scss b/src/views/topology/components/CustomNode/CustomNode.scss new file mode 100644 index 00000000..3533e5d6 --- /dev/null +++ b/src/views/topology/components/CustomNode/CustomNode.scss @@ -0,0 +1,19 @@ +.custom-node { + position: relative; + + &__inner-border { + pointer-events: none; + } + + .pf-topology__node__background { + stroke-width: 4px; + } + + .pf-topology__node__label__background { + stroke-width: 2px; + } +} + +.custom-node.pf-topology__node.pf-m-selected .pf-topology__node__background { + stroke-width: 4px; +} diff --git a/src/views/topology/components/CustomNode/CustomNode.tsx b/src/views/topology/components/CustomNode/CustomNode.tsx new file mode 100644 index 00000000..91eaee04 --- /dev/null +++ b/src/views/topology/components/CustomNode/CustomNode.tsx @@ -0,0 +1,59 @@ +import React, { FC } from 'react'; + +import { + DefaultNode, + Node, + WithDndDropProps, + WithDragNodeProps, + WithSelectionProps, +} from '@patternfly/react-topology'; +import { ICON_SIZE } from '@views/topology/utils/constants'; + +import './CustomNode.scss'; + +type CustomNodeProps = { + element: Node; +} & WithDndDropProps & + WithDragNodeProps & + WithSelectionProps; + +const CustomNode: FC = ({ element, ...rest }) => { + const data = element.getData(); + const Icon = data.icon; + const { height, width } = element.getBounds(); + + const xCenter = (width - ICON_SIZE) / 2; + const yCenter = (height - ICON_SIZE) / 2; + + const isDerivedFromPolicy = data.isDerivedFromPolicy; + return ( + + + + + {isDerivedFromPolicy && ( + + )} + + ); +}; + +export default CustomNode; diff --git a/src/views/topology/components/Topology.tsx b/src/views/topology/components/Topology.tsx new file mode 100644 index 00000000..f8985a9d --- /dev/null +++ b/src/views/topology/components/Topology.tsx @@ -0,0 +1,69 @@ +import React, { FC, useEffect, useState } from 'react'; + +import { + TopologyView, + Visualization, + VisualizationProvider, + VisualizationSurface, +} from '@patternfly/react-topology'; +import { isEmpty } from '@utils/utils'; +import ControlBar from '@views/topology/components/TopologyControlBar'; +import { useTopologyContext } from '@views/topology/context/TopologyContext'; +import { GRAPH_POSITIONING_EVENT, NODE_POSITIONING_EVENT } from '@views/topology/utils/constants'; +import { generateDataModel } from '@views/topology/utils/dataTransformation/dataTransformation'; +import { componentFactory, layoutFactory } from '@views/topology/utils/factories'; +import { restoreNodePositions, saveNodePositions } from '@views/topology/utils/nodePositionUtils'; + +const Topology: FC = () => { + const [controller, setController] = useState(); + const { resources } = useTopologyContext(); + + useEffect(() => { + if (!resources || isEmpty(resources)) return; + const topologyModel = generateDataModel(resources); + + if (!controller) { + const newController = new Visualization(); + newController.registerLayoutFactory(layoutFactory); + newController.registerComponentFactory(componentFactory); + + newController.addEventListener(NODE_POSITIONING_EVENT, () => + saveNodePositions(newController), + ); + newController.addEventListener(GRAPH_POSITIONING_EVENT, () => + saveNodePositions(newController), + ); + + newController.setFitToScreenOnLayout(true); + newController.fromModel(topologyModel, false); + restoreNodePositions(newController); + + newController.setFitToScreenOnLayout(true); + setController(newController); + return; + } + + controller.fromModel(topologyModel); + }, [controller, resources]); + + // Re-run fit after mount to ensure correct scale when container size stabilizes (e.g. navigation from create flow) + useEffect(() => { + if (!controller) return; + + const id = requestAnimationFrame(() => { + controller.getGraph().fit(40); + }); + + return () => cancelAnimationFrame(id); + }, [controller]); + + return ( + + }> + + + + ); +}; + +export default Topology; diff --git a/src/views/topology/components/TopologyControlBar.tsx b/src/views/topology/components/TopologyControlBar.tsx new file mode 100644 index 00000000..980978f4 --- /dev/null +++ b/src/views/topology/components/TopologyControlBar.tsx @@ -0,0 +1,43 @@ +import React, { FC } from 'react'; + +import { + action, + Controller, + createTopologyControlButtons, + defaultControlButtonsOptions, + TopologyControlBar, +} from '@patternfly/react-topology'; + +type ControlBarProps = { + controller: Controller; +}; + +const ControlBar: FC = ({ controller }) => { + if (!controller) { + return null; + } + return ( + { + controller.getGraph().fit(40); + }), + resetViewCallback: action(() => { + controller.getGraph().reset(); + controller.getGraph().layout(); + }), + zoomInCallback: action(() => { + const scale = controller.getGraph().getScale(); + controller.getGraph().setScale(scale * 1.1); + }), + zoomOutCallback: action(() => { + const scale = controller.getGraph().getScale(); + controller.getGraph().setScale(scale * 0.9); + }), + })} + /> + ); +}; + +export default ControlBar; diff --git a/src/views/topology/context/TopologyContext.tsx b/src/views/topology/context/TopologyContext.tsx new file mode 100644 index 00000000..d8feb436 --- /dev/null +++ b/src/views/topology/context/TopologyContext.tsx @@ -0,0 +1,32 @@ +import React, { createContext, FC, PropsWithChildren, useContext } from 'react'; + +import { ALL_NAMESPACES_KEY } from '@utils/constants'; +import { NetworkTopologyResources } from '@views/topology/hooks/useNetworkTopologyResources'; + +type TopologyContextType = { + activeNamespace: string; + resources: NetworkTopologyResources | undefined; + resourcesLoaded: boolean; +}; + +const TopologyContext = createContext({ + activeNamespace: ALL_NAMESPACES_KEY, + resources: undefined, + resourcesLoaded: false, +}); + +export const TopologyContextProvider: FC> = ({ + activeNamespace, + children, + resources, + resourcesLoaded, +}) => ( + + {children} + +); + +export const useTopologyContext = (): TopologyContextType => { + const contextData = useContext(TopologyContext); + return contextData; +}; diff --git a/src/views/topology/hooks/useNetworkTopologyResources.ts b/src/views/topology/hooks/useNetworkTopologyResources.ts new file mode 100644 index 00000000..f5ae825b --- /dev/null +++ b/src/views/topology/hooks/useNetworkTopologyResources.ts @@ -0,0 +1,122 @@ +import { useMemo } from 'react'; + +import { + modelToGroupVersionKind, + NetworkAttachmentDefinitionModel, + PodModel, + VirtualMachineModel, +} from '@kubevirt-ui-ext/kubevirt-api/console'; +import { IoK8sApiCoreV1Pod } from '@kubevirt-ui-ext/kubevirt-api/kubernetes'; +import { V1VirtualMachine } from '@kubevirt-ui-ext/kubevirt-api/kubevirt'; +import { + K8sResourceCommon, + useActiveNamespace, + useK8sWatchResources, +} from '@openshift-console/dynamic-plugin-sdk'; +import { ALL_NAMESPACES_KEY } from '@utils/constants'; +import useProjects from '@utils/hooks/useProjects/useProjects'; +import { + ClusterUserDefinedNetworkModelGroupVersionKind, + IngressModel, + UserDefinedNetworkModelGroupVersionKind, +} from '@utils/models'; +import { NetworkAttachmentDefinitionKind } from '@utils/resources/nads/types'; +import { ClusterUserDefinedNetworkKind, UserDefinedNetworkKind } from '@utils/resources/udns/types'; +import { + isVirtLauncherPod, + podHasSecondaryNetworks, + vmHasSecondaryNetworks, +} from '@views/topology/utils/filteringUtils'; + +export type NetworkTopologyResources = { + clusterUserDefinedNetworks: ClusterUserDefinedNetworkKind[]; + networkAttachmentDefinitions: NetworkAttachmentDefinitionKind[]; + pods: IoK8sApiCoreV1Pod[]; + projects: K8sResourceCommon[]; + userDefinedNetworks: UserDefinedNetworkKind[]; + virtualMachines: V1VirtualMachine[]; +}; + +type UseNetworkTopologyResourcesResult = { + loaded: boolean; + loadError: unknown; + resources: NetworkTopologyResources; +}; + +const useNetworkTopologyResources = (): UseNetworkTopologyResourcesResult => { + const [activeNamespace] = useActiveNamespace(); + const [projects, projectsLoaded] = useProjects(); + + const namespaceProperties = { + ...(activeNamespace !== ALL_NAMESPACES_KEY && { namespace: activeNamespace }), + namespaced: activeNamespace !== ALL_NAMESPACES_KEY, + }; + + const watchedResources = useK8sWatchResources({ + clusterUserDefinedNetworks: { + groupVersionKind: ClusterUserDefinedNetworkModelGroupVersionKind, + isList: true, + ...namespaceProperties, + }, + ingresses: { + groupVersionKind: modelToGroupVersionKind(IngressModel), + isList: true, + ...namespaceProperties, + }, + networkAttachmentDefinitions: { + groupVersionKind: modelToGroupVersionKind(NetworkAttachmentDefinitionModel), + isList: true, + ...namespaceProperties, + }, + pods: { + groupVersionKind: modelToGroupVersionKind(PodModel), + isList: true, + ...namespaceProperties, + }, + userDefinedNetworks: { + groupVersionKind: UserDefinedNetworkModelGroupVersionKind, + isList: true, + ...namespaceProperties, + }, + virtualMachines: { + groupVersionKind: modelToGroupVersionKind(VirtualMachineModel), + isList: true, + ...namespaceProperties, + }, + }); + + const loaded = + Object.values(watchedResources).every((resource) => resource.loaded) && projectsLoaded; + const loadError = Object.values(watchedResources).find( + (resource) => resource.loadError?.loadError, + ); + + const filteredPods = useMemo(() => { + const pods = (watchedResources.pods.data || []) as IoK8sApiCoreV1Pod[]; + return pods.filter(podHasSecondaryNetworks).filter((pod) => !isVirtLauncherPod(pod)); + }, [watchedResources.pods.data]); + + const filteredVMs = useMemo(() => { + const vms = (watchedResources.virtualMachines.data || []) as V1VirtualMachine[]; + return vms.filter(vmHasSecondaryNetworks); + }, [watchedResources.virtualMachines.data]); + + const resources: NetworkTopologyResources = { + clusterUserDefinedNetworks: watchedResources.clusterUserDefinedNetworks + .data as ClusterUserDefinedNetworkKind[], + networkAttachmentDefinitions: watchedResources.networkAttachmentDefinitions + .data as NetworkAttachmentDefinitionKind[], + pods: filteredPods, + projects: projects || [], + userDefinedNetworks: watchedResources.userDefinedNetworks.data as UserDefinedNetworkKind[], + virtualMachines: filteredVMs, + }; + + return { + loaded, + loadError, + resources, + }; +}; + +export default useNetworkTopologyResources; diff --git a/src/views/topology/manifest.ts b/src/views/topology/manifest.ts new file mode 100644 index 00000000..cf937e77 --- /dev/null +++ b/src/views/topology/manifest.ts @@ -0,0 +1,36 @@ +import { HrefNavItem, RoutePage } from '@openshift-console/dynamic-plugin-sdk'; +import { + ConsolePluginBuildMetadata, + EncodedExtension, +} from '@openshift-console/dynamic-plugin-sdk-webpack'; + +export const TopologyExtensions: EncodedExtension[] = [ + { + properties: { + component: { $codeRef: 'Topology' }, + exact: true, + path: [`/k8s/ns/:ns/networking-topology`, '/k8s/all-namespaces/networking-topology'], + }, + type: 'console.page/route', + } as EncodedExtension, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-configuration-topology', + 'data-test-id': 'configuration-topology-nav-item', + }, + href: 'networking-topology', + id: 'network-configuration-topology', + insertBefore: 'services', + name: '%plugin__networking-console-plugin~Configuration Topology%', + perspective: 'admin', + prefixNamespaced: true, + section: 'networking', + }, + type: 'console.navigation/href', + } as EncodedExtension, +]; + +export const TopologyExposedModules: ConsolePluginBuildMetadata['exposedModules'] = { + Topology: './views/topology/TopologyPage.tsx', +}; diff --git a/src/views/topology/utils/LevelsLayout.ts b/src/views/topology/utils/LevelsLayout.ts new file mode 100644 index 00000000..34ccc537 --- /dev/null +++ b/src/views/topology/utils/LevelsLayout.ts @@ -0,0 +1,209 @@ +import { + BaseLayout, + Edge, + Graph, + GRAPH_LAYOUT_END_EVENT, + GridLayoutOptions, + Layout, + LayoutLink, + LayoutNode, + Node, +} from '@patternfly/react-topology'; +import { GridGroup } from '@patternfly/react-topology/dist/esm/layouts/GridGroup'; +import { GridLink } from '@patternfly/react-topology/dist/esm/layouts/GridLink'; +import { GridNode } from '@patternfly/react-topology/dist/esm/layouts/GridNode'; + +export class LevelsLayout extends BaseLayout implements Layout { + constructor(graph: Graph, options?: Partial) { + super(graph, options); + } + + // Method to calculate maximum group dimensions + private calculateMaxGroupDimensions(groups: { [groupId: string]: LayoutNode[] }): { + maxGroupHeight: number; + maxGroupWidth: number; + } { + const groupDimensions = Object.keys(groups || {}).map((key) => + this.positionGroupNodes(groups[key], 0, 0), + ); + const maxGroupWidth = Math.max(...groupDimensions.map((dim) => dim.width)); + const maxGroupHeight = Math.max(...groupDimensions.map((dim) => dim.height)); + return { maxGroupHeight, maxGroupWidth }; + } + + // Method to count nodes per level + private countNodesPerLevel(nodes: LayoutNode[]): { [level: number]: number } { + const levelCounts: { [level: number]: number } = {}; + (nodes || []).forEach((node) => { + const level = node?.element?.getData()?.level; + if (!levelCounts[level]) { + levelCounts[level] = 0; + } + levelCounts[level]++; + }); + return levelCounts; + } + + // Method to determine maximum node dimensions + private getMaxNodeDimensions(groupNodes: LayoutNode[]): { padX: number; padY: number } { + let padX = 0; + let padY = 0; + + (groupNodes || []).forEach((node) => { + if (padX < node.width) { + padX = node.width; + } + if (padY < node.height) { + padY = node.height; + } + }); + + return { padX, padY }; + } + + // Method to group nodes by their parent group + private groupNodesByParent(): { [groupId: string]: LayoutNode[] } { + const groups: { [groupId: string]: LayoutNode[] } = {}; + (this.nodes || []).forEach((node) => { + const parentGroupId = node.element.getParent()?.getId(); + if (parentGroupId) { + if (!groups[parentGroupId]) { + groups[parentGroupId] = []; + } + groups[parentGroupId].push(node); + } + }); + return groups; + } + + // Method to layout nodes by level + private layoutNodesByLevel( + sortedNodes: LayoutNode[], + offsetX: number, + offsetY: number, + padX: number, + padY: number, + ): { maxX: number; maxY: number } { + const levelCounts = this.countNodesPerLevel(sortedNodes); + let currentLevel = sortedNodes[0]?.element?.getData()?.level; + let nodesInCurrentLevel = 0; + + let x = offsetX; + let y = offsetY; + let maxX = x; + let maxY = y; + + (sortedNodes || []).forEach((node) => { + if (node?.element?.getData()?.level !== currentLevel) { + // Move to the next level when the level changes + currentLevel = node?.element?.getData()?.level; + x = offsetX; + y += padY + 20; // Adding some extra space between levels + nodesInCurrentLevel = 0; + } + + node.x = x; + node.y = y; + node.update(); + + nodesInCurrentLevel++; + const numNodesInRow = levelCounts[currentLevel]; + + if (nodesInCurrentLevel < numNodesInRow) { + x += padX + 20; // Adding some extra space between nodes + } else { + x = offsetX; + y += padY + 20; // Move to the next row within the same level + nodesInCurrentLevel = 0; + } + + // Track maxX and maxY to determine the total space used by this group + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + }); + + return { maxX, maxY }; + } + + // Method to layout nodes within a group + private positionGroupNodes( + groupNodes: LayoutNode[], + offsetX: number, + offsetY: number, + ): { height: number; width: number } { + const sortedNodes = this.sortNodesByLevel(groupNodes); + const { padX, padY } = this.getMaxNodeDimensions(sortedNodes); + const { maxX, maxY } = this.layoutNodesByLevel(sortedNodes, offsetX, offsetY, padX, padY); + + // Return the dimensions of the group layout + return { height: maxY - offsetY + padY, width: maxX - offsetX + padX }; + } + + // Method to position groups in a grid layout + private positionGroupsInGrid( + groups: { [groupId: string]: LayoutNode[] }, + maxGroupWidth: number, + maxGroupHeight: number, + ): void { + const groupKeys = Object.keys(groups); + const totalGroups = groupKeys.length; + const numCols = Math.ceil(Math.sqrt(totalGroups)); + + let offsetX = 0; + let offsetY = 0; + + for (let row = 0; row < Math.ceil(totalGroups / numCols); row++) { + for (let col = 0; col < numCols; col++) { + const groupIndex = row * numCols + col; + if (groupIndex < totalGroups) { + const groupNodes = groups[groupKeys[groupIndex]]; + this.positionGroupNodes(groupNodes, offsetX, offsetY); + offsetX += maxGroupWidth + 50; // Adding some extra space between groups + } + } + offsetX = 0; + offsetY += maxGroupHeight + 50; // Adding some extra space between rows of groups + } + } + + // Method to sort nodes by their level + private sortNodesByLevel(nodes: LayoutNode[]): LayoutNode[] { + return (nodes || []).sort((a, b) => { + const aLevel = a?.element?.getData()?.level; + const bLevel = b?.element?.getData()?.level; + return aLevel - bLevel; + }); + } + + // Method to create a layout group + protected createLayoutGroup(node: Node, padding: number, index: number) { + return new GridGroup(node, padding, index); + } + + // Method to create a layout link + protected createLayoutLink( + edge: Edge, + source: LayoutNode, + target: LayoutNode, + isFalse: boolean, + ): LayoutLink { + return new GridLink(edge, source, target, isFalse); + } + + // Method to create a layout node + protected createLayoutNode(node: Node, nodeDistance: number, index: number) { + return new GridNode(node, nodeDistance, index); + } + + // Main layout method + protected startLayout(graph: Graph, initialRun: boolean, addingNodes: boolean): void { + if (initialRun || addingNodes) { + this.nodes.sort((a, b) => a.id.localeCompare(b.id)); + const groups = this.groupNodesByParent(); + const { maxGroupHeight, maxGroupWidth } = this.calculateMaxGroupDimensions(groups); + this.positionGroupsInGrid(groups, maxGroupWidth, maxGroupHeight); + } + + this.graph.getController().fireEvent(GRAPH_LAYOUT_END_EVENT, { graph: this.graph }); + } +} diff --git a/src/views/topology/utils/constants.ts b/src/views/topology/utils/constants.ts new file mode 100644 index 00000000..b8adec6f --- /dev/null +++ b/src/views/topology/utils/constants.ts @@ -0,0 +1,48 @@ +export enum TopologyViewTypes { + namespace = 'namespace', + network = 'network', + node = 'node', + owner = 'owner', + resource = 'resource', +} + +export enum ResourceType { + ClusterUserDefinedNetwork = 'ClusterUserDefinedNetwork', + Ingress = 'Ingress', + MultiNetworkPolicy = 'MultiNetworkPolicy', + NetworkAttachmentDefinition = 'NetworkAttachmentDefinition', + NetworkPolicy = 'NetworkPolicy', + Pod = 'Pod', + Route = 'Route', + Service = 'Service', + UserDefinedNetwork = 'UserDefinedNetwork', + VirtualMachine = 'VirtualMachine', +} + +export enum RelationshipType { + CUDNToNAD = 'cudn-to-nad', + CUDNToPod = 'cudn-to-pod', + CUDNToVM = 'cudn-to-vm', + IngressToService = 'ingress-to-service', + MultiNetworkPolicyToNAD = 'multi-network-policy-to-nad', + PodToNAD = 'pod-to-nad', + RouteToService = 'route-to-service', + UDNToNAD = 'udn-to-nad', + UDNToPod = 'udn-to-pod', + UDNToVM = 'udn-to-vm', + VirtualMachineToNAD = 'vm-to-nad', +} + +export const TOPOLOGY_POSITION_LOCAL_STORAGE_KEY = 'topology-node-positions'; + +export const NODE_POSITIONING_EVENT = 'node-positioned'; +export const GRAPH_POSITIONING_EVENT = 'graph-position-change'; + +export const NODE_DIAMETER = 70; +export const ICON_SIZE = 30; + +export const GROUP = 'group'; + +export const MULTI_NETWORK_POLICY_NADS_ANNOTATION_KEY = 'k8s.v1.cni.cncf.io/policy-for'; + +export const L2_BRIDGE_BINDING_NAME = 'l2bridge'; diff --git a/src/views/topology/utils/dataTransformation/dataTransformation.ts b/src/views/topology/utils/dataTransformation/dataTransformation.ts new file mode 100644 index 00000000..822aa3aa --- /dev/null +++ b/src/views/topology/utils/dataTransformation/dataTransformation.ts @@ -0,0 +1,191 @@ +import { ComponentType } from 'react'; + +import { IoK8sApiCoreV1Pod } from '@kubevirt-ui/kubevirt-api/kubernetes/models'; +import { V1VirtualMachine } from '@kubevirt-ui/kubevirt-api/kubevirt'; +import { K8sResourceCommon } from '@openshift-console/dynamic-plugin-sdk'; +import { CubeIcon, NetworkIcon, ServerIcon } from '@patternfly/react-icons'; +import { + EdgeModel, + EdgeStyle, + EdgeTerminalType, + Model, + ModelKind, + NodeModel, + NodeShape, + NodeStatus, +} from '@patternfly/react-topology'; +import { getName, getNamespace } from '@utils/resources/shared'; +import { udnIsReady } from '@utils/resources/udns/helper'; +import { PrintableVMErrorStatus, PrintableVMStatus } from '@utils/resources/vm/constants'; +import { getVMStatus } from '@utils/resources/vm/selectors'; +import { PodPhase } from '@views/services/details/tabs/pods/constants'; +import { getPodPhase } from '@views/services/details/tabs/pods/utils'; +import { NetworkTopologyResources } from '@views/topology/hooks/useNetworkTopologyResources'; +import { + addClusterUserDefinedNetworkNodesAndEdges, + addNetworkAttachmentDefinitionNodes, + addPodNodesAndEdges, + addUserDefinedNetworkNodesAndEdges, + addVirtualMachineNodesAndEdges, + getResourceID, +} from '@views/topology/utils/dataTransformation/resourceUtils'; + +import { NODE_DIAMETER, RelationshipType, ResourceType } from '../constants'; + +const getIconForResourceType = (resourceType: ResourceType): ComponentType => { + switch (resourceType) { + case ResourceType.NetworkAttachmentDefinition: + case ResourceType.UserDefinedNetwork: + case ResourceType.ClusterUserDefinedNetwork: + return NetworkIcon; + case ResourceType.Pod: + return CubeIcon; + case ResourceType.VirtualMachine: + return ServerIcon; + default: + return NetworkIcon; + } +}; + +const getShapeForResourceType = (resourceType: ResourceType): NodeShape => { + switch (resourceType) { + case ResourceType.NetworkAttachmentDefinition: + return NodeShape.octagon; + case ResourceType.UserDefinedNetwork: + case ResourceType.ClusterUserDefinedNetwork: + return NodeShape.hexagon; + case ResourceType.Pod: + case ResourceType.VirtualMachine: + return NodeShape.ellipse; + default: + return NodeShape.ellipse; + } +}; + +const getResourceStatus = (resource: K8sResourceCommon, resourceType: ResourceType): NodeStatus => { + switch (resourceType) { + case ResourceType.Pod: { + const podPhase = getPodPhase(resource as IoK8sApiCoreV1Pod); + if (podPhase === PodPhase.Succeeded || podPhase === PodPhase.Running) + return NodeStatus.success; + if (podPhase === PodPhase.Failed) return NodeStatus.danger; + return NodeStatus.default; + } + case ResourceType.VirtualMachine: { + const vmStatus = getVMStatus(resource as V1VirtualMachine) as + PrintableVMErrorStatus | PrintableVMStatus; + + if (Object.keys(PrintableVMErrorStatus).includes(vmStatus)) return NodeStatus.danger; + if (vmStatus === PrintableVMStatus.Unknown) return NodeStatus.warning; + if (Object.keys(PrintableVMStatus).includes(vmStatus)) return NodeStatus.success; + return NodeStatus.default; + } + case ResourceType.UserDefinedNetwork: + case ResourceType.ClusterUserDefinedNetwork: + return udnIsReady(resource) ? NodeStatus.success : NodeStatus.danger; + case ResourceType.NetworkAttachmentDefinition: + default: + return NodeStatus.default; + } +}; + +export const createNode = ( + resource: K8sResourceCommon, + resourceType: ResourceType, + level: number, + options?: { badge?: string; isDerivedFromPolicy?: boolean }, +): NodeModel => { + const id = getResourceID(resource); + const status = getResourceStatus(resource, resourceType); + + return { + data: { + badge: options?.badge, + icon: getIconForResourceType(resourceType), + isDerivedFromPolicy: options?.isDerivedFromPolicy, + level, + namespace: getNamespace(resource), + resource, + resourceType, + status, + }, + height: NODE_DIAMETER, + id, + label: getName(resource) || 'Unknown', + shape: getShapeForResourceType(resourceType), + status, + type: 'node', + width: NODE_DIAMETER, + }; +}; + +export const createEdge = ( + sourceId: string, + targetId: string, + relationshipType: RelationshipType, +): EdgeModel => { + return { + data: { + endTerminalType: EdgeTerminalType.directional, + relationshipType, + sourceId, + targetId, + }, + edgeStyle: EdgeStyle.solid, + id: `${sourceId}-to-${targetId}`, + source: sourceId, + target: targetId, + type: 'edge', + }; +}; + +export const findExistingEdge = ( + edges: EdgeModel[], + sourceId: string, + targetId: string, +): EdgeModel | undefined => { + return edges.find( + (e) => + (e.data.sourceId === sourceId && e.data.targetId === targetId) || + (e.data.sourceId === targetId && e.data.targetId === sourceId), + ); +}; + +export const generateDataModel = (resources: NetworkTopologyResources): Model => { + const nodes: NodeModel[] = []; + const edges: EdgeModel[] = []; + const nodeMap = new Map(); + + addNetworkAttachmentDefinitionNodes(resources.networkAttachmentDefinitions, nodes, nodeMap); + addPodNodesAndEdges(resources.pods, nodes, edges, nodeMap); + addVirtualMachineNodesAndEdges(resources.virtualMachines, nodes, edges, nodeMap); + addUserDefinedNetworkNodesAndEdges( + resources.userDefinedNetworks, + nodes, + edges, + nodeMap, + resources.pods, + resources.virtualMachines, + resources.networkAttachmentDefinitions, + ); + addClusterUserDefinedNetworkNodesAndEdges( + resources.clusterUserDefinedNetworks, + nodes, + edges, + nodeMap, + resources.pods, + resources.virtualMachines, + resources.networkAttachmentDefinitions, + resources.projects, + ); + + return { + edges, + graph: { + id: 'networking-configuration-topology', + layout: 'Levels', + type: ModelKind.graph, + }, + nodes: nodes.filter((n) => n.type !== 'group' || (n.children && n.children.length)), + }; +}; diff --git a/src/views/topology/utils/dataTransformation/resourceUtils.ts b/src/views/topology/utils/dataTransformation/resourceUtils.ts new file mode 100644 index 00000000..756ed733 --- /dev/null +++ b/src/views/topology/utils/dataTransformation/resourceUtils.ts @@ -0,0 +1,226 @@ +import { IoK8sApiCoreV1Pod } from '@kubevirt-ui/kubevirt-api/kubernetes/models'; +import { V1VirtualMachine } from '@kubevirt-ui/kubevirt-api/kubevirt'; +import { K8sResourceCommon } from '@openshift-console/dynamic-plugin-sdk'; +import { EdgeModel, NodeModel } from '@patternfly/react-topology'; +import { NetworkAttachmentDefinitionKind } from '@utils/resources/nads/types'; +import { getName, getNamespace } from '@utils/resources/shared'; +import { CLUSTER_UDN_NAD_NAME_PREFIX } from '@utils/resources/udns/constants'; +import { getCUDNNamespaceNames } from '@utils/resources/udns/helper'; +import { ClusterUserDefinedNetworkKind, UserDefinedNetworkKind } from '@utils/resources/udns/types'; +import { vmUsesUDN } from '@utils/resources/vm/utils'; +import { RelationshipType, ResourceType } from '@views/topology/utils/constants'; +import { + createEdge, + createNode, + findExistingEdge, +} from '@views/topology/utils/dataTransformation/dataTransformation'; +import { + getPodNADReferences, + getVMNADReferences, + podUsesUDN, +} from '@views/topology/utils/filteringUtils'; + +export const getResourceID = (resource: K8sResourceCommon): string => { + const namespace = getNamespace(resource) || 'cluster'; + const name = getName(resource) || 'unknown'; + const kind = resource.kind || 'unknown'; + return `${kind}-${namespace}-${name}`; +}; + +export const addNetworkAttachmentDefinitionNodes = ( + nads: NetworkAttachmentDefinitionKind[], + nodes: NodeModel[], + nodeMap: Map, +) => + nads?.forEach((nad: NetworkAttachmentDefinitionKind) => { + const id = getResourceID(nad); + const node = createNode(nad, ResourceType.NetworkAttachmentDefinition, 2, { + badge: 'NAD', + }); + nodes.push(node); + nodeMap.set(id, node); + }); + +export const addPodNodesAndEdges = ( + pods: IoK8sApiCoreV1Pod[], + nodes: NodeModel[], + edges: EdgeModel[], + nodeMap: Map, +) => + pods?.forEach((pod: IoK8sApiCoreV1Pod) => { + const id = getResourceID(pod); + const node = createNode(pod, ResourceType.Pod, 5, { badge: 'POD' }); + nodes.push(node); + nodeMap.set(id, node); + + const nadReferences = getPodNADReferences(pod); + nadReferences.forEach((nadRef) => { + const [nadNamespace, nadName] = nadRef.split('/'); + const nadID = `NetworkAttachmentDefinition-${nadNamespace}-${nadName}`; + const nadNode = nodeMap.get(nadID); + + if (nadNode && id !== nadID) { + const existingEdge = findExistingEdge(edges, id, nadID); + if (!existingEdge) { + edges.push(createEdge(id, nadID, RelationshipType.PodToNAD)); + } + } + }); + }); + +export const addVirtualMachineNodesAndEdges = ( + vms: V1VirtualMachine[], + nodes: NodeModel[], + edges: EdgeModel[], + nodeMap: Map, +) => + vms?.forEach((vm: V1VirtualMachine) => { + const id = getResourceID(vm); + const node = createNode(vm, ResourceType.VirtualMachine, 5, { badge: 'VM' }); + nodes.push(node); + nodeMap.set(id, node); + + const nadReferences = getVMNADReferences(vm); + nadReferences.forEach((nadRef) => { + const [nadNamespace, nadName] = nadRef.split('/'); + const nadID = `NetworkAttachmentDefinition-${nadNamespace}-${nadName}`; + const nadNode = nodeMap.get(nadID); + + if (nadNode && id !== nadID) { + const existingEdge = findExistingEdge(edges, id, nadID); + if (!existingEdge) { + edges.push(createEdge(id, nadID, RelationshipType.VirtualMachineToNAD)); + } + } + }); + }); + +export const addUserDefinedNetworkNodesAndEdges = ( + udns: UserDefinedNetworkKind[], + nodes: NodeModel[], + edges: EdgeModel[], + nodeMap: Map, + pods: IoK8sApiCoreV1Pod[], + vms: V1VirtualMachine[], + nads: NetworkAttachmentDefinitionKind[], +) => + udns?.forEach((udn: UserDefinedNetworkKind) => { + const id = getResourceID(udn); + const node = createNode(udn, ResourceType.UserDefinedNetwork, 3, { badge: 'UDN' }); + nodes.push(node); + nodeMap.set(id, node); + + const udnName = getName(udn); + const udnNamespace = getNamespace(udn); + + nads?.forEach((nad) => { + const nadName = getName(nad); + const nadNamespace = getNamespace(nad); + + if (nadName === udnName && nadNamespace === udnNamespace) { + const nadID = getResourceID(nad); + const nadNode = nodeMap.get(nadID); + if (nadNode && id !== nadID) { + const existingEdge = findExistingEdge(edges, id, nadID); + if (!existingEdge) { + edges.push(createEdge(id, nadID, RelationshipType.UDNToNAD)); + } + } + } + }); + + pods?.forEach((pod) => { + if (podUsesUDN(pod, udn)) { + const podID = getResourceID(pod); + const podNode = nodeMap.get(podID); + if (podNode && id !== podID) { + const existingEdge = findExistingEdge(edges, id, podID); + if (!existingEdge) { + edges.push(createEdge(id, podID, RelationshipType.UDNToPod)); + } + } + } + }); + + vms?.forEach((vm) => { + if (vmUsesUDN(vm, udn)) { + const vmID = getResourceID(vm); + const vmNode = nodeMap.get(vmID); + if (vmNode && id !== vmID) { + const existingEdge = findExistingEdge(edges, id, vmID); + if (!existingEdge) { + edges.push(createEdge(id, vmID, RelationshipType.UDNToVM)); + } + } + } + }); + }); + +export const addClusterUserDefinedNetworkNodesAndEdges = ( + clusterUDNs: ClusterUserDefinedNetworkKind[], + nodes: NodeModel[], + edges: EdgeModel[], + nodeMap: Map, + pods: IoK8sApiCoreV1Pod[], + vms: V1VirtualMachine[], + nads: NetworkAttachmentDefinitionKind[], + projects?: K8sResourceCommon[], +) => + clusterUDNs?.forEach((cudn: ClusterUserDefinedNetworkKind) => { + const id = getResourceID(cudn); + const node = createNode(cudn, ResourceType.ClusterUserDefinedNetwork, 3, { + badge: 'CUDN', + }); + nodes.push(node); + nodeMap.set(id, node); + + const cudnName = getName(cudn); + const candidateNames = [ + cudnName, + `${CLUSTER_UDN_NAD_NAME_PREFIX}${cudnName}`, + `cluster-udn-${cudnName}`, + ]; + + const cudnNamespaces = getCUDNNamespaceNames(cudn, projects); + + nads?.forEach((nad) => { + const nadName = getName(nad); + + if (candidateNames.includes(nadName)) { + const nadID = getResourceID(nad); + const nadNode = nodeMap.get(nadID); + if (nadNode && id !== nadID) { + const existingEdge = findExistingEdge(edges, id, nadID); + if (!existingEdge) { + edges.push(createEdge(id, nadID, RelationshipType.CUDNToNAD)); + } + } + } + }); + + pods?.forEach((pod) => { + if (podUsesUDN(pod, cudn)) { + const podID = getResourceID(pod); + const podNode = nodeMap.get(podID); + if (podNode && id !== podID) { + const existingEdge = findExistingEdge(edges, id, podID); + if (!existingEdge) { + edges.push(createEdge(id, podID, RelationshipType.CUDNToPod)); + } + } + } + }); + + vms?.forEach((vm) => { + if (vmUsesUDN(vm, cudn, cudnNamespaces)) { + const vmID = getResourceID(vm); + const vmNode = nodeMap.get(vmID); + if (vmNode && id !== vmID) { + const existingEdge = findExistingEdge(edges, id, vmID); + if (!existingEdge) { + edges.push(createEdge(id, vmID, RelationshipType.CUDNToVM)); + } + } + } + }); + }); diff --git a/src/views/topology/utils/factories.ts b/src/views/topology/utils/factories.ts new file mode 100644 index 00000000..7eea7d9f --- /dev/null +++ b/src/views/topology/utils/factories.ts @@ -0,0 +1,39 @@ +import { + ComponentFactory, + DefaultEdge, + GraphComponent, + ModelKind, + nodeDragSourceSpec, + withDragNode, + withPanZoom, + withSelection, +} from '@patternfly/react-topology'; +import { GROUP } from '@views/topology/utils/constants'; +import { LevelsLayout } from '@views/topology/utils/LevelsLayout'; + +import CustomGroup from '../components/CustomGroup/CustomGroup'; +import CustomNode from '../components/CustomNode/CustomNode'; + +export const layoutFactory = (type, graph) => { + return new LevelsLayout(graph, { layoutOnDrag: true }); +}; + +export const componentFactory: ComponentFactory = (kind: ModelKind, type: string) => { + switch (type) { + case GROUP: + return withDragNode(nodeDragSourceSpec(GROUP))(withSelection()(CustomGroup)); + default: + switch (kind) { + case ModelKind.graph: + return withPanZoom()(GraphComponent); + case ModelKind.node: + return withDragNode(nodeDragSourceSpec(ModelKind.node, true, true))( + withSelection()(CustomNode), + ); + case ModelKind.edge: + return DefaultEdge; + default: + return undefined; + } + } +}; diff --git a/src/views/topology/utils/filteringUtils.ts b/src/views/topology/utils/filteringUtils.ts new file mode 100644 index 00000000..46dcc034 --- /dev/null +++ b/src/views/topology/utils/filteringUtils.ts @@ -0,0 +1,99 @@ +import { IoK8sApiCoreV1Pod } from '@kubevirt-ui/kubevirt-api/kubernetes/models'; +import { V1VirtualMachine } from '@kubevirt-ui/kubevirt-api/kubevirt'; +import { + VIRT_LAUNCHER_POD_LABEL_KEY, + VIRT_LAUNCHER_POD_LABEL_VALUE, +} from '@utils/resources/pods/constants'; +import { getAnnotations, getLabels, getNamespace } from '@utils/resources/shared'; +import { getUDNNADNameCandidates, isClusterUDN, UDNResource } from '@utils/resources/udns/helper'; +import { getInterfaces, getNetworks } from '@utils/resources/vm/selectors'; +import { L2_BRIDGE_BINDING_NAME } from '@views/topology/utils/constants'; + +export const POD_NETWORKS_ANNOTATION_KEY = 'k8s.v1.cni.cncf.io/networks'; + +/** + * Extract NAD names from Pod's network annotation + * Handles both simple names and namespace-qualified names + */ +export const getPodNetworkAttachments = (pod: IoK8sApiCoreV1Pod): string[] => { + const annotation = getAnnotations(pod)?.[POD_NETWORKS_ANNOTATION_KEY]; + if (!annotation) return []; + + return annotation + .split(',') + .map((nad) => nad.trim()) + .filter(Boolean); +}; + +export const podHasSecondaryNetworks = (pod: IoK8sApiCoreV1Pod): boolean => + getPodNetworkAttachments(pod).length > 0; + +export const isVirtLauncherPod = (pod: IoK8sApiCoreV1Pod): boolean => + getLabels(pod)?.[VIRT_LAUNCHER_POD_LABEL_KEY] === VIRT_LAUNCHER_POD_LABEL_VALUE; + +export const vmHasSecondaryNetworks = (vm: V1VirtualMachine): boolean => { + // TODO Check logic + // const networks = getNetworks(vm); + // return networks.some((network) => network.multus?.networkName); + const interfaces = getInterfaces(vm); + return ( + interfaces?.some((iface) => iface?.binding?.name === L2_BRIDGE_BINDING_NAME) || + getNetworks(vm)?.length > 1 + ); +}; + +/** + * Get all NAD names that a Pod connects to (normalized to namespace/name format) + */ +export const getPodNADReferences = (pod: IoK8sApiCoreV1Pod): string[] => { + const podNamespace = getNamespace(pod); + const attachments = getPodNetworkAttachments(pod); + + return attachments.map((attachment) => { + if (attachment.includes('/')) { + return attachment; + } + return `${podNamespace}/${attachment}`; + }); +}; + +/** + * Get all NAD names that a VM connects to (normalized to namespace/name format) + */ +export const getVMNADReferences = (vm: V1VirtualMachine): string[] => { + const vmNamespace = getNamespace(vm); + const networks = getNetworks(vm); + + return networks + .filter((network) => network.multus?.networkName) + .map((network) => { + const networkName = network.multus.networkName; + if (networkName.includes('/')) { + return networkName; + } + return `${vmNamespace}/${networkName}`; + }); +}; + +/** + * Check if a Pod uses a UDN or ClusterUDN + */ +export const podUsesUDN = (pod: IoK8sApiCoreV1Pod, udn: UDNResource): boolean => { + const udnNamespace = getNamespace(udn); + const nadCandidates = getUDNNADNameCandidates(udn); + const podNADRefs = getPodNADReferences(pod); + + return podNADRefs.some((nadRef) => { + const [refNamespace, refName] = nadRef.split('/'); + + if (!nadCandidates.includes(refName)) { + return false; + } + + if (isClusterUDN(udn)) { + return true; + } + + return refNamespace === udnNamespace; + }); +}; diff --git a/src/views/topology/utils/nodePositionUtils.ts b/src/views/topology/utils/nodePositionUtils.ts new file mode 100644 index 00000000..daa8626b --- /dev/null +++ b/src/views/topology/utils/nodePositionUtils.ts @@ -0,0 +1,44 @@ +import { Controller, Point } from '@patternfly/react-topology'; +import { TOPOLOGY_POSITION_LOCAL_STORAGE_KEY } from '@views/topology/utils/constants'; + +export const saveNodePositions = (visualization: Controller) => { + const graph = visualization.getGraph(); + const nodePositions = {}; + + // Traverse all nodes and their children + graph.getNodes().forEach((node) => { + nodePositions[node.getId()] = node.getPosition(); + if (node.isGroup()) { + node.getAllNodeChildren().forEach((childNode) => { + nodePositions[childNode.getId()] = childNode.getPosition(); + }); + } + }); + + localStorage.setItem(TOPOLOGY_POSITION_LOCAL_STORAGE_KEY, JSON.stringify(nodePositions)); +}; + +export const restoreNodePositions = (visualization: Controller) => { + const savedPositions = localStorage.getItem(TOPOLOGY_POSITION_LOCAL_STORAGE_KEY); + if (savedPositions) { + const nodePositions = JSON.parse(savedPositions); + const graph = visualization.getGraph(); + + // Traverse all nodes and their children + graph.getNodes().forEach((node) => { + if (nodePositions[node.getId()]) { + node.setPosition(new Point(nodePositions[node.getId()].x, nodePositions[node.getId()].y)); + } + + if (node.isGroup()) { + node.getAllNodeChildren().forEach((childNode) => { + if (nodePositions[childNode.getId()]) { + childNode.setPosition( + new Point(nodePositions[childNode.getId()].x, nodePositions[childNode.getId()].y), + ); + } + }); + } + }); + } +}; diff --git a/src/views/udns/details/hooks/useUDNVirtualMachines/useUDNVirtualMachines.ts b/src/views/udns/details/hooks/useUDNVirtualMachines/useUDNVirtualMachines.ts index 2d19be04..40a5df41 100644 --- a/src/views/udns/details/hooks/useUDNVirtualMachines/useUDNVirtualMachines.ts +++ b/src/views/udns/details/hooks/useUDNVirtualMachines/useUDNVirtualMachines.ts @@ -9,9 +9,9 @@ import { V1VirtualMachine } from '@kubevirt-ui-ext/kubevirt-api/kubevirt'; import { useK8sWatchResource } from '@openshift-console/dynamic-plugin-sdk'; import { NetworkAttachmentDefinitionKind } from '@utils/resources/nads/types'; import { UDNResource } from '@utils/resources/udns/helper'; -import { findNADForUDN } from '@utils/resources/vm/utils'; +import { findNADForUDN, vmUsesUDN } from '@utils/resources/vm/utils'; -import { getUDNVirtualMachines, UDNVirtualMachine, vmUsesUDN } from './utils/utils'; +import { getUDNVirtualMachines, UDNVirtualMachine } from './utils/utils'; export type { UDNVirtualMachine }; diff --git a/src/views/udns/details/hooks/useUDNVirtualMachines/utils/utils.ts b/src/views/udns/details/hooks/useUDNVirtualMachines/utils/utils.ts index 78a0c6cb..8c202dfe 100644 --- a/src/views/udns/details/hooks/useUDNVirtualMachines/utils/utils.ts +++ b/src/views/udns/details/hooks/useUDNVirtualMachines/utils/utils.ts @@ -21,14 +21,6 @@ const networkUsesUDN = (network: V1Network, udn: UDNResource, vm: V1VirtualMachi return Boolean(iface && iface.state !== INTERFACE_STATE_ABSENT); }; -export const vmUsesUDN = (vm: V1VirtualMachine, udn: UDNResource | undefined): boolean => { - if (!udn) { - return false; - } - - return getNetworks(vm).some((network) => networkUsesUDN(network, udn, vm)); -}; - export const getUDNVirtualMachines = ( vms: undefined | V1VirtualMachine[], udn: UDNResource | undefined,