diff --git a/Localize/locales/en/plugin-translation.json b/Localize/locales/en/plugin-translation.json
index 6430b98ae..365bad1bd 100644
--- a/Localize/locales/en/plugin-translation.json
+++ b/Localize/locales/en/plugin-translation.json
@@ -78,6 +78,8 @@
"_Azure CLI/aks-preview requirements not met.comment": "{Locked=\"Azure\",\"aks-preview\"}",
"Azure Monitor Metrics (Managed Prometheus)": "Azure Monitor Metrics (Managed Prometheus)",
"_Azure Monitor Metrics (Managed Prometheus).comment": "{Locked=\"Azure\",\"Prometheus\"}",
+ "Azure Role Assignments": "Azure Role Assignments",
+ "_Azure Role Assignments.comment": "{Locked=\"Azure\"}",
"Azure sign-in is required to configure workload identity.": "Azure sign-in is required to configure workload identity.",
"_Azure sign-in is required to configure workload identity..comment": "{Locked=\"Azure\"}",
"Azure Workload Identity enables pods to authenticate to Azure services using a managed identity without storing credentials. Creates a service account with federated credentials.": "Azure Workload Identity enables pods to authenticate to Azure services using a managed identity without storing credentials. Creates a service account with federated credentials.",
@@ -282,6 +284,7 @@
"_Failed to load Azure context.comment": "{Locked=\"Azure\"}",
"Failed to load pipeline runs": "Failed to load pipeline runs",
"Failed to load repositories": "Failed to load repositories",
+ "Failed to load role assignments": "Failed to load role assignments",
"Failed to load subscriptions": "Failed to load subscriptions",
"Failed to merge cluster: {{message}}": "Failed to merge cluster: {{message}}",
"Failed to monitor deployment health": "Failed to monitor deployment health",
@@ -384,6 +387,7 @@
"Loading deployments": "Loading deployments",
"Loading identities...": "Loading identities...",
"Loading metrics": "Loading metrics",
+ "Loading role assignments…": "Loading role assignments…",
"Loading scaling metrics from Prometheus": "Loading scaling metrics from Prometheus",
"_Loading scaling metrics from Prometheus.comment": "{Locked=\"Prometheus\"}",
"Loading subscriptions": "Loading subscriptions",
@@ -479,6 +483,7 @@
"No repositories found": "No repositories found",
"No repositories match your filter": "No repositories match your filter",
"No response time data available": "No response time data available",
+ "No role assignments found for this namespace.": "No role assignments found for this namespace.",
"No scaling data available": "No scaling data available",
"No subscriptions found": "No subscriptions found",
"No users found": "No users found",
@@ -515,6 +520,7 @@
"Premium": "Premium",
"Preview and basic validation before apply": "Preview and basic validation before apply",
"Preview Features": "Preview Features",
+ "Principal": "Principal",
"Project '{{name}}' successfully imported": "Project '{{name}}' successfully imported",
"Project Basics": "Project Basics",
"Project Created Successfully!": "Project Created Successfully!",
diff --git a/plugins/aks-desktop/locales/cs/translation.json b/plugins/aks-desktop/locales/cs/translation.json
index b82663619..ded924551 100644
--- a/plugins/aks-desktop/locales/cs/translation.json
+++ b/plugins/aks-desktop/locales/cs/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Aktualizovat",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Typ",
+ "Role": "Role",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Nepovedlo se načíst předplatná.",
"Failed to load AKS clusters": "Nepovedlo se načíst clustery AKS.",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Cluster {{cluster}} se úspěšně sloučil v kubeconfig.",
@@ -50,7 +58,6 @@
"Assignee": "Pověřená osoba",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Role",
"Remove assignee": "Odebrat pověřenou osobu",
"Add assignee": "Přidat pověřenou osobu",
"Only clusters with Azure Entra ID authentication are shown.": "Zobrazují se jenom clustery s ověřováním Azure Entra ID.",
@@ -98,7 +105,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Pro toto předplatné se nenašly žádné clustery s ověřováním Azure Entra ID.",
"Cluster Not Ready": "Cluster není připravený",
"Refreshing": "Aktualizace",
- "Refresh": "Aktualizovat",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "V kubeconfig chybí vybraný cluster. Než budete pokračovat, zaregistrujte ho.",
"Registering cluster": "Registruje se cluster",
"Wizard steps": "Postup průvodce",
@@ -207,7 +213,6 @@
"Namespace Name": "Název oboru názvů",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Musí obsahovat jenom malá písmena, číslice a spojovníky a začínat a končit alfanumerickým znakem",
"The namespace will be created on the selected cluster and set up as a project": "Obor názvů se vytvoří ve vybraném clusteru a nastaví se jako projekt",
- "Type": "Typ",
"Regular Kubernetes namespace": "Běžný obor názvů Kubernetes",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "V clusteru se vytvoří nový obor názvů s použitými popisky projektu. Zobrazí se okamžitě v seznamu projektů.",
"Create New Namespace": "Vytvořit nový obor názvů",
diff --git a/plugins/aks-desktop/locales/de/translation.json b/plugins/aks-desktop/locales/de/translation.json
index 3f0b5bae8..60c82ff23 100644
--- a/plugins/aks-desktop/locales/de/translation.json
+++ b/plugins/aks-desktop/locales/de/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Aktualisieren",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Typ",
+ "Role": "Rolle",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Fehler beim Laden von Abonnements.",
"Failed to load AKS clusters": "Fehler beim Laden von AKS-Clustern",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Der Cluster „{{cluster}}“ wurde erfolgreich in kubeconfig zusammengeführt",
@@ -50,7 +58,6 @@
"Assignee": "Zugewiesene Person",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Rolle",
"Remove assignee": "Zugewiesene Person entfernen",
"Add assignee": "Zugewiesene Person hinzufügen",
"Only clusters with Azure Entra ID authentication are shown.": "Es werden nur Cluster mit Azure Entra ID-Authentifizierung angezeigt.",
@@ -94,7 +101,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Für dieses Abonnement wurden keine Cluster mit Azure Entra ID-Authentifizierung gefunden",
"Cluster Not Ready": "Cluster nicht bereit",
"Refreshing": "Wird aktualisiert",
- "Refresh": "Aktualisieren",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Der ausgewählte Cluster fehlt in kubeconfig. Registrieren Sie ihn, bevor Sie fortfahren.",
"Registering cluster": "Cluster wird registriert",
"Wizard steps": "Assistentenschritte",
@@ -201,7 +207,6 @@
"Namespace Name": "Namespacename",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Darf nur Kleinbuchstaben, Zahlen und Bindestriche enthalten und muss mit einem alphanumerischen Zeichen beginnen und enden.",
"The namespace will be created on the selected cluster and set up as a project": "Der Namespace wird auf dem ausgewählten Cluster erstellt und als Projekt eingerichtet.",
- "Type": "Typ",
"Regular Kubernetes namespace": "Namespace für reguläres Kubernetes",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Auf dem Cluster wird ein neuer Namespace mit angewendeten Projektlabels erstellt. Er erscheint sofort in Ihrer Projektliste.",
"Create New Namespace": "Neuen Namespace erstellen",
diff --git a/plugins/aks-desktop/locales/en/translation.json b/plugins/aks-desktop/locales/en/translation.json
index 03cfa8fdb..3426a8732 100644
--- a/plugins/aks-desktop/locales/en/translation.json
+++ b/plugins/aks-desktop/locales/en/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "Loading role assignments…",
+ "Azure Role Assignments": "Azure Role Assignments",
+ "Refresh": "Refresh",
+ "No role assignments found for this namespace.": "No role assignments found for this namespace.",
+ "Principal": "Principal",
+ "Type": "Type",
+ "Role": "Role",
+ "Failed to load role assignments": "Failed to load role assignments",
"Failed to load subscriptions": "Failed to load subscriptions",
"Failed to load AKS clusters": "Failed to load AKS clusters",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Cluster '{{cluster}}' successfully merged in kubeconfig",
@@ -50,7 +58,6 @@
"Assignee": "Assignee",
"Search for a user or remove this entry": "Search for a user or remove this entry",
"Select a user from the search results or enter a valid object ID (UUID)": "Select a user from the search results or enter a valid object ID (UUID)",
- "Role": "Role",
"Remove assignee": "Remove assignee",
"Add assignee": "Add assignee",
"Only clusters with Azure Entra ID authentication are shown.": "Only clusters with Azure Entra ID authentication are shown.",
@@ -94,7 +101,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "No clusters with Azure Entra ID authentication found for this subscription",
"Cluster Not Ready": "Cluster Not Ready",
"Refreshing": "Refreshing",
- "Refresh": "Refresh",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Selected cluster is missing from the kubeconfig. Register it before proceeding.",
"Registering cluster": "Registering cluster",
"Wizard steps": "Wizard steps",
@@ -201,7 +207,6 @@
"Namespace Name": "Namespace Name",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character",
"The namespace will be created on the selected cluster and set up as a project": "The namespace will be created on the selected cluster and set up as a project",
- "Type": "Type",
"Regular Kubernetes namespace": "Regular Kubernetes namespace",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.",
"Create New Namespace": "Create New Namespace",
diff --git a/plugins/aks-desktop/locales/es/translation.json b/plugins/aks-desktop/locales/es/translation.json
index 06c49a408..b2864db77 100644
--- a/plugins/aks-desktop/locales/es/translation.json
+++ b/plugins/aks-desktop/locales/es/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Actualizar",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Tipo",
+ "Role": "Rol",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Error al cargar las suscripciones.",
"Failed to load AKS clusters": "No se pudieron cargar los clústeres de AKS",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "El clúster '{{cluster}}' se ha combinado correctamente en kubeconfig",
@@ -50,7 +58,6 @@
"Assignee": "Usuario asignado",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Rol",
"Remove assignee": "Quitar usuario asignado",
"Add assignee": "Agregar usuario asignado",
"Only clusters with Azure Entra ID authentication are shown.": "Solo se muestran los clústeres con autenticación de Azure Entra ID.",
@@ -96,7 +103,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "No se encontraron clústeres con autenticación de Azure Entra ID para esta suscripción",
"Cluster Not Ready": "El clúster no está listo",
"Refreshing": "Actualización en curso",
- "Refresh": "Actualizar",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Falta el clúster seleccionado en kubeconfig. Regístrelo antes de continuar.",
"Registering cluster": "Registrando clúster",
"Wizard steps": "Pasos del asistente",
@@ -204,7 +210,6 @@
"Namespace Name": "Nombre de espacio de nombres",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Debe contener solo letras minúsculas, números y guiones, y comenzar y terminar con un carácter alfanumérico",
"The namespace will be created on the selected cluster and set up as a project": "El espacio de nombres se creará en el clúster seleccionado y se configurará como un proyecto",
- "Type": "Tipo",
"Regular Kubernetes namespace": "Espacio de nombres de Kubernetes normal",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Se creará un nuevo espacio de nombres en el clúster con las etiquetas de proyecto aplicadas. Aparecerá inmediatamente en tu lista de proyectos.",
"Create New Namespace": "Crear un espacio de nombres nuevo",
diff --git a/plugins/aks-desktop/locales/fr/translation.json b/plugins/aks-desktop/locales/fr/translation.json
index 13b245251..0064ec953 100644
--- a/plugins/aks-desktop/locales/fr/translation.json
+++ b/plugins/aks-desktop/locales/fr/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Actualiser",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Type",
+ "Role": "Rôle",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Échec du chargement des abonnements",
"Failed to load AKS clusters": "Nous n’avons pas pu charger de clusters AKS",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Le cluster «\u00a0{{cluster}}\u00a0» a été fusionné dans kubeconfig avec succès",
@@ -50,7 +58,6 @@
"Assignee": "Personne responsable",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Rôle",
"Remove assignee": "Supprimer une personne responsable",
"Add assignee": "Ajouter une personne responsable",
"Only clusters with Azure Entra ID authentication are shown.": "Seuls les clusters avec authentification Azure Entra ID s’affichent.",
@@ -96,7 +103,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Aucun cluster avec authentification Azure Entra ID n’a été trouvé pour cet abonnement",
"Cluster Not Ready": "Cluster non prêt",
"Refreshing": "Actualisation",
- "Refresh": "Actualiser",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Le cluster sélectionné est absent du kubeconfig. Inscrivez-le avant de continuer.",
"Registering cluster": "Inscription du cluster",
"Wizard steps": "Étapes de l’Assistant",
@@ -204,7 +210,6 @@
"Namespace Name": "Nom de l’espace de noms",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Doit contenir uniquement des lettres minuscules, des chiffres et des traits d’union, tout en commençant et en se terminant par un caractère alphanumérique",
"The namespace will be created on the selected cluster and set up as a project": "L’espace de noms sera créé sur le cluster sélectionné et sera configuré en tant que projet",
- "Type": "Type",
"Regular Kubernetes namespace": "Espace de noms Kubernetes normal",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Un espace de noms sera créé sur le cluster avec des étiquettes de projet appliquées. Il apparaîtra immédiatement dans votre liste de projets.",
"Create New Namespace": "Créer un espace de noms",
diff --git a/plugins/aks-desktop/locales/hu/translation.json b/plugins/aks-desktop/locales/hu/translation.json
index 2e071d4a8..94512d8c5 100644
--- a/plugins/aks-desktop/locales/hu/translation.json
+++ b/plugins/aks-desktop/locales/hu/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Frissítés",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Típus",
+ "Role": "Szerepkör",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Az előfizetéseket nem sikerült betölteni",
"Failed to load AKS clusters": "Nem sikerült betölteni az AKS-fürtöket",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "A(z) {{cluster}} fürt sikeresen egyesítve a kubeconfig állományban",
@@ -50,7 +58,6 @@
"Assignee": "Felelős",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Szerepkör",
"Remove assignee": "Felelős eltávolítása",
"Add assignee": "Felelős hozzáadása",
"Only clusters with Azure Entra ID authentication are shown.": "Csak az Azure Entra ID-hitelesítéssel rendelkező fürtök jelennek meg.",
@@ -94,7 +101,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Ehhez az előfizetéshez nem található Azure Entra ID-hitelesítéssel rendelkező fürt",
"Cluster Not Ready": "A fürt nem áll készen",
"Refreshing": "Frissítés",
- "Refresh": "Frissítés",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "A kiválasztott fürt hiányzik a kubeconfig állományból. A folytatás előtt regisztrálja.",
"Registering cluster": "Fürt regisztrálása",
"Wizard steps": "Varázsló lépései",
@@ -201,7 +207,6 @@
"Namespace Name": "Névtér neve",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Csak kisbetűket, számokat és kötőjeleket tartalmazhat, és alfanumerikus karakterrel kell kezdődnie és végződnie",
"The namespace will be created on the selected cluster and set up as a project": "A névtér létrejön a kiválasztott fürtön, és projektként lesz beállítva",
- "Type": "Típus",
"Regular Kubernetes namespace": "Normál Kubernetes-névtér",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Új névtér jön létre a fürtön, amelyen projektcímkék lesznek alkalmazva. Azonnal megjelenik a projektlistában.",
"Create New Namespace": "Új névtér létrehozása",
diff --git a/plugins/aks-desktop/locales/id/translation.json b/plugins/aks-desktop/locales/id/translation.json
index 1f450ea29..c67cb90ef 100644
--- a/plugins/aks-desktop/locales/id/translation.json
+++ b/plugins/aks-desktop/locales/id/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Refresh",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Jenis",
+ "Role": "Peran",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Gagal memuat langganan",
"Failed to load AKS clusters": "Gagal memuat kluster AKS",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Kluster '{{cluster}}' berhasil digabungkan di kubeconfig",
@@ -50,7 +58,6 @@
"Assignee": "Penerima tugas",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Peran",
"Remove assignee": "Hapus penerima tugas",
"Add assignee": "Tambahkan penerima tugas",
"Only clusters with Azure Entra ID authentication are shown.": "Hanya kluster dengan autentikasi Azure Entra ID yang ditampilkan.",
@@ -92,7 +99,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Tidak ada kluster dengan autentikasi Azure Entra ID yang ditemukan untuk langganan ini",
"Cluster Not Ready": "Kluster Belum Siap",
"Refreshing": "Melakukan refresh",
- "Refresh": "Refresh",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Kluster yang dipilih hilang dari kubeconfig. Daftarkan sebelum melanjutkan.",
"Registering cluster": "Mendaftarkan kluster",
"Wizard steps": "Langkah wizard",
@@ -198,7 +204,6 @@
"Namespace Name": "Nama namespace",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Hanya boleh berisi huruf kecil, angka, dan tanda hubung, serta harus diawali dan diakhiri dengan karakter alfanumerik",
"The namespace will be created on the selected cluster and set up as a project": "Namespace akan dibuat pada kluster yang dipilih dan disiapkan sebagai proyek",
- "Type": "Jenis",
"Regular Kubernetes namespace": "Namespace Kubernetes reguler",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Namespace baru akan dibuat di kluster yang menerapkan label proyek. Namespace akan langsung muncul dalam daftar proyek Anda.",
"Create New Namespace": "Buat Namespace Baru",
diff --git a/plugins/aks-desktop/locales/it/translation.json b/plugins/aks-desktop/locales/it/translation.json
index 08c6fbd78..0935a361b 100644
--- a/plugins/aks-desktop/locales/it/translation.json
+++ b/plugins/aks-desktop/locales/it/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Aggiorna",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Tipo",
+ "Role": "Ruolo",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Non è stato possibile caricare le sottoscrizioni",
"Failed to load AKS clusters": "Non è possibile caricare i cluster del servizio Azure Kubernetes",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Il cluster '{{cluster}}' è stato unito in kubeconfig",
@@ -50,7 +58,6 @@
"Assignee": "Assegnatario",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Ruolo",
"Remove assignee": "Rimuovi assegnatario",
"Add assignee": "Aggiungi assegnatario",
"Only clusters with Azure Entra ID authentication are shown.": "Vengono visualizzati solo i cluster con l'autenticazione con Entra ID di Azure.",
@@ -96,7 +103,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Non sono stati trovati cluster con l'autenticazione Entra ID di Azure per questa sottoscrizione",
"Cluster Not Ready": "Cluster non pronto",
"Refreshing": "Aggiornamento",
- "Refresh": "Aggiorna",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Cluster selezionato mancante da kubeconfig. Registrarlo prima di procedere.",
"Registering cluster": "Registrazione del cluster",
"Wizard steps": "Passaggi della procedura guidata",
@@ -204,7 +210,6 @@
"Namespace Name": "Nome spazio dei nomi",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Deve contenere solo lettere minuscole, numeri e trattini, oltre a iniziare e terminare con un carattere alfanumerico",
"The namespace will be created on the selected cluster and set up as a project": "Lo spazio dei nomi verrà creato nel cluster selezionato e configurato come progetto",
- "Type": "Tipo",
"Regular Kubernetes namespace": "Spazio dei nomi Kubernetes normale",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Verrà creato un nuovo spazio dei nomi nel cluster con le etichette di progetto applicate. Verrà visualizzato immediatamente nell'elenco di progetti.",
"Create New Namespace": "Crea nuovo spazio dei nomi",
diff --git a/plugins/aks-desktop/locales/ja/translation.json b/plugins/aks-desktop/locales/ja/translation.json
index def084dd7..95ed6a027 100644
--- a/plugins/aks-desktop/locales/ja/translation.json
+++ b/plugins/aks-desktop/locales/ja/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "最新の情報に更新",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "型",
+ "Role": "ロール",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "サブスクリプションを読み込めませんでした",
"Failed to load AKS clusters": "AKS クラスターを読み込めませんでした",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "クラスター '{{cluster}}' が kubeconfig に正常にマージされました",
@@ -50,7 +58,6 @@
"Assignee": "担当者",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "ロール",
"Remove assignee": "担当者を削除する",
"Add assignee": "担当者の追加",
"Only clusters with Azure Entra ID authentication are shown.": "Azure Entra ID 認証を使用しているクラスターのみが表示されています。",
@@ -92,7 +99,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "このサブスクリプションには Azure Entra ID 認証を使用しているクラスターが見つかりません",
"Cluster Not Ready": "クラスターが準備できていません",
"Refreshing": "更新中",
- "Refresh": "最新の情報に更新",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "選択したクラスターが kubeconfig にありません。続行する前に登録してください。",
"Registering cluster": "クラスターを登録しています",
"Wizard steps": "ウィザードの手順",
@@ -198,7 +204,6 @@
"Namespace Name": "名前空間の名前",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "小文字、数字、ハイフンのみを含み、先頭と末尾は英数字である必要があります",
"The namespace will be created on the selected cluster and set up as a project": "選択したクラスターに名前空間が作成され、プロジェクトとして設定されます",
- "Type": "型",
"Regular Kubernetes namespace": "標準の Kubernetes 名前空間",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "プロジェクト ラベルが適用された新しい名前空間がクラスターに作成されます。それはプロジェクト リストにすぐに表示されます。",
"Create New Namespace": "新しい名前空間の作成",
diff --git a/plugins/aks-desktop/locales/ko/translation.json b/plugins/aks-desktop/locales/ko/translation.json
index 9d8e2d4b7..f41e56865 100644
--- a/plugins/aks-desktop/locales/ko/translation.json
+++ b/plugins/aks-desktop/locales/ko/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "새로 고침",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "유형",
+ "Role": "역할",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "구독을 로드하지 못했음",
"Failed to load AKS clusters": "AKS 클러스터를 로드하지 못 함",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "클러스터 '{{cluster}}'이(가) kubeconfig에 병합됨",
@@ -50,7 +58,6 @@
"Assignee": "담당자",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "역할",
"Remove assignee": "담당자 제거",
"Add assignee": "담당자 추가",
"Only clusters with Azure Entra ID authentication are shown.": "Azure Entra ID 인증을 사용하는 클러스터만 표시됩니다.",
@@ -92,7 +99,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "이 구독에 Azure Entra ID 인증이 있는 클러스터가 없음",
"Cluster Not Ready": "클러스터가 준비되지 않음",
"Refreshing": "새로 고치는 중",
- "Refresh": "새로 고침",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "선택한 클러스터가 kubeconfig에 없습니다. 계속하기 전에 등록하세요.",
"Registering cluster": "클러스터 등록 중",
"Wizard steps": "마법사 단계",
@@ -198,7 +204,6 @@
"Namespace Name": "네임스페이스 이름",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "소문자, 숫자, 하이픈만 포함할 수 있으며, 시작과 끝은 영숫자여야 합니다.",
"The namespace will be created on the selected cluster and set up as a project": "선택한 클러스터에 네임스페이스가 생성되고 프로젝트로 설정됩니다.",
- "Type": "유형",
"Regular Kubernetes namespace": "일반 Kubernetes 네임스페이스",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "프로젝트 레이블이 적용된 새 네임스페이스가 클러스터에 생성됩니다. 새 네임스페이스는 프로젝트 목록에 즉시 표시됩니다.",
"Create New Namespace": "새 네임스페이스 만들기",
diff --git a/plugins/aks-desktop/locales/nl/translation.json b/plugins/aks-desktop/locales/nl/translation.json
index 02325875b..8a7aff21e 100644
--- a/plugins/aks-desktop/locales/nl/translation.json
+++ b/plugins/aks-desktop/locales/nl/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Vernieuwen",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Type",
+ "Role": "Rol",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Kan de abonnementen niet laden",
"Failed to load AKS clusters": "Kan AKS-clusters niet laden",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Het cluster '{{cluster}}' is samengevoegd in kubeconfig",
@@ -50,7 +58,6 @@
"Assignee": "Toegewezen gebruiker",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Rol",
"Remove assignee": "Toegewezen gebruiker verwijderen",
"Add assignee": "Toegewezen gebruiker toevoegen",
"Only clusters with Azure Entra ID authentication are shown.": "Alleen clusters met Azure Entra ID-verificatie worden weergegeven.",
@@ -94,7 +101,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Er zijn geen clusters met Azure Entra ID-verificatie gevonden voor dit abonnement",
"Cluster Not Ready": "Cluster niet gereed",
"Refreshing": "Vernieuwen",
- "Refresh": "Vernieuwen",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Het geselecteerde cluster ontbreekt in de kubeconfig. Registreer het voordat je verdergaat.",
"Registering cluster": "Cluster registreren",
"Wizard steps": "Wizardstappen",
@@ -201,7 +207,6 @@
"Namespace Name": "Naam van naamruimte",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Mag alleen kleine letters, cijfers en koppeltekens bevatten, en moet beginnen en eindigen met een alfanumeriek teken",
"The namespace will be created on the selected cluster and set up as a project": "De naamruimte wordt op het geselecteerde cluster gemaakt en ingesteld als project",
- "Type": "Type",
"Regular Kubernetes namespace": "Standaard Kubernetes-naamruimte",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Er wordt een nieuwe naamruimte op het cluster gemaakt met toegepaste projectlabels. Deze verschijnt direct in je projectlijst.",
"Create New Namespace": "Nieuwe naamruimte maken",
diff --git a/plugins/aks-desktop/locales/pl/translation.json b/plugins/aks-desktop/locales/pl/translation.json
index 6fc17c1a4..95c794769 100644
--- a/plugins/aks-desktop/locales/pl/translation.json
+++ b/plugins/aks-desktop/locales/pl/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Odśwież",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Typ",
+ "Role": "Rola",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Nie można załadować subskrypcji",
"Failed to load AKS clusters": "Nie można załadować klastrów usługi AKS",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Klaster „{{cluster}}” został pomyślnie scalony w pliku kubeconfig",
@@ -50,7 +58,6 @@
"Assignee": "Osoba przydzielona",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Rola",
"Remove assignee": "Usuń osoby przydzielone",
"Add assignee": "Dodaj osoby przydzielone",
"Only clusters with Azure Entra ID authentication are shown.": "Wyświetlane są tylko klastry z uwierzytelnianiem Azure Entra ID.",
@@ -98,7 +105,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Nie znaleziono klastrów z uwierzytelnianiem Azure Entra ID dla tej subskrypcji",
"Cluster Not Ready": "Klaster nie jest gotowy",
"Refreshing": "Odświeżanie",
- "Refresh": "Odśwież",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Brak wybranego klastra w pliku kubeconfig. Zarejestruj go przed kontynuowaniem.",
"Registering cluster": "Rejestrowanie klastra",
"Wizard steps": "Kroki kreatora",
@@ -207,7 +213,6 @@
"Namespace Name": "Nazwa obszaru nazw",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Musi zawierać tylko małe litery, cyfry i łączniki, zaczynać się i kończyć znakiem alfanumerycznym",
"The namespace will be created on the selected cluster and set up as a project": "Przestrzeń nazw zostanie utworzona w wybranym klastrze i skonfigurowana jako projekt",
- "Type": "Typ",
"Regular Kubernetes namespace": "Zwykła przestrzeń nazw Kubernetes",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "W klastrze zostanie utworzona nowa przestrzeń nazw z zastosowanymi etykietami projektu. Zostanie ona natychmiast wyświetlona na liście projektów.",
"Create New Namespace": "Utwórz nową przestrzeń nazw",
diff --git a/plugins/aks-desktop/locales/pt-BR/translation.json b/plugins/aks-desktop/locales/pt-BR/translation.json
index becf1682b..87e1f5075 100644
--- a/plugins/aks-desktop/locales/pt-BR/translation.json
+++ b/plugins/aks-desktop/locales/pt-BR/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Atualizar",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Tipo",
+ "Role": "Função",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Falha ao carregar as assinaturas",
"Failed to load AKS clusters": "Falha ao carregar os clusters do\u00a0AKS",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Cluster '{{cluster}}' mesclado com êxito\u00a0no kubeconfig",
@@ -50,7 +58,6 @@
"Assignee": "Destinatário",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Função",
"Remove assignee": "Remover destinatário",
"Add assignee": "Adicionar\u00a0destinatário",
"Only clusters with Azure Entra ID authentication are shown.": "Somente os clusters com a autenticação do Entra ID do Azure são mostrados.",
@@ -96,7 +103,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Nenhum cluster com a autenticação do Entra ID do Azure foi encontrado para essa assinatura",
"Cluster Not Ready": "Cluster não\u00a0está pronto",
"Refreshing": "Atualizando",
- "Refresh": "Atualizar",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "O cluster selecionado está ausente do kubeconfig. Registre-o antes de continuar.",
"Registering cluster": "Registrando cluster",
"Wizard steps": "Etapas do assistente",
@@ -204,7 +210,6 @@
"Namespace Name": "Nome do namespace",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Deve conter apenas letras minúsculas, números e hifens, começando e terminando com um caractere alfanumérico",
"The namespace will be created on the selected cluster and set up as a project": "O namespace será criado no cluster selecionado e configurado como um projeto",
- "Type": "Tipo",
"Regular Kubernetes namespace": "Namespace regular do Kubernetes",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Um novo namespace será criado no cluster com rótulos de projeto aplicados. Ele aparecerá na lista de projetos imediatamente.",
"Create New Namespace": "Criar Novo Namespace",
diff --git a/plugins/aks-desktop/locales/pt-PT/translation.json b/plugins/aks-desktop/locales/pt-PT/translation.json
index 2d7867309..1669c4ac2 100644
--- a/plugins/aks-desktop/locales/pt-PT/translation.json
+++ b/plugins/aks-desktop/locales/pt-PT/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Atualizar",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Tipo",
+ "Role": "Função",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Falha ao carregar subscrições",
"Failed to load AKS clusters": "Falha ao carregar clusters AKS",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Cluster “{{cluster}}” intercalado com sucesso no kubeconfig",
@@ -50,7 +58,6 @@
"Assignee": "Detentor",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Função",
"Remove assignee": "Remover detentor",
"Add assignee": "Adicionar detentor",
"Only clusters with Azure Entra ID authentication are shown.": "Apenas são mostrados clusters com autenticação Azure Entra ID.",
@@ -96,7 +103,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Não foram encontrados clusters com autenticação Azure Entra ID para esta subscrição.",
"Cluster Not Ready": "Cluster Não Preparado",
"Refreshing": "A atualizar",
- "Refresh": "Atualizar",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "O cluster selecionado está em falta no kubeconfig. Registe-o antes de continuar.",
"Registering cluster": "A registar cluster",
"Wizard steps": "Passos do assistente",
@@ -204,7 +210,6 @@
"Namespace Name": "Nome do Espaço de Nomes",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Tem de conter apenas letras minúsculas, números e hífenes, a começar e terminar num caráter alfanumérico",
"The namespace will be created on the selected cluster and set up as a project": "O espaço de nomes será criado no cluster selecionado e configurado como projeto",
- "Type": "Tipo",
"Regular Kubernetes namespace": "Espaço de nomes do Kubernetes normal",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Será criado um novo espaço de nomes no cluster com etiquetas de projeto aplicadas. Aparecerá na sua lista de projetos imediatamente.",
"Create New Namespace": "Criar Novo Espaço de Nomes",
diff --git a/plugins/aks-desktop/locales/ru/translation.json b/plugins/aks-desktop/locales/ru/translation.json
index f0e82b403..17d7a678d 100644
--- a/plugins/aks-desktop/locales/ru/translation.json
+++ b/plugins/aks-desktop/locales/ru/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Обновить",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Тип",
+ "Role": "Роль",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Не удалось загрузить подписки.",
"Failed to load AKS clusters": "Не удалось загрузить кластеры AKS",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Кластер \"{{cluster}}\" успешно добавлен в kubeconfig",
@@ -50,7 +58,6 @@
"Assignee": "Уполномоченный",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Роль",
"Remove assignee": "Удалить назначенного пользователя",
"Add assignee": "Добавить назначенного пользователя",
"Only clusters with Azure Entra ID authentication are shown.": "Показаны только кластеры с аутентификацией Azure Entra ID.",
@@ -98,7 +105,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Для этой подписки не найдены кластеры с аутентификацией Azure Entra ID",
"Cluster Not Ready": "Кластер не готов",
"Refreshing": "Идет обновление",
- "Refresh": "Обновить",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Выбранный кластер отсутствует в kubeconfig. Зарегистрируйте его, прежде чем продолжить работу.",
"Registering cluster": "Выполняется регистрация кластера",
"Wizard steps": "Шаги мастера",
@@ -207,7 +213,6 @@
"Namespace Name": "Имя пространства имен",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Должно содержать только строчные буквы, цифры и дефисы, при этом начинаться и заканчиваться буквенно-цифровым символом",
"The namespace will be created on the selected cluster and set up as a project": "Пространство имен будет создано в выбранном кластере и настроено в качестве проекта",
- "Type": "Тип",
"Regular Kubernetes namespace": "Обычное пространство имен Kubernetes",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "В кластере будет создано новое пространство имен с примененными метками проектов. Оно сразу появится в вашем списке проектов.",
"Create New Namespace": "Создать пространство имен",
diff --git a/plugins/aks-desktop/locales/sv/translation.json b/plugins/aks-desktop/locales/sv/translation.json
index 8890451c4..8d8dc435c 100644
--- a/plugins/aks-desktop/locales/sv/translation.json
+++ b/plugins/aks-desktop/locales/sv/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Uppdatera",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Typ",
+ "Role": "Roll",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Det gick inte att läsa in prenumerationer",
"Failed to load AKS clusters": "Det gick inte att läsa in AKS-kluster",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "Klustret {{cluster}} har sammanslagits i kubeconfig",
@@ -50,7 +58,6 @@
"Assignee": "Tilldelad person",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Roll",
"Remove assignee": "Ta bort tilldelad person",
"Add assignee": "Lägg till tilldelad person",
"Only clusters with Azure Entra ID authentication are shown.": "Endast kluster med Azure Entra ID-autentisering visas.",
@@ -94,7 +101,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Inga kluster med Azure Entra ID-autentisering hittades för den här prenumerationen",
"Cluster Not Ready": "Klustret är inte klart",
"Refreshing": "Uppdaterar",
- "Refresh": "Uppdatera",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Det valda klustret saknas i kubeconfig. Registrera det innan du fortsätter.",
"Registering cluster": "Registrerar kluster",
"Wizard steps": "Guidesteg",
@@ -201,7 +207,6 @@
"Namespace Name": "Namn på namnområde",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Får bara innehålla gemener, siffror och bindestreck, som börjar och slutar med ett alfanumeriskt tecken",
"The namespace will be created on the selected cluster and set up as a project": "Namnområdet skapas i det valda klustret och konfigureras som ett projekt",
- "Type": "Typ",
"Regular Kubernetes namespace": "Vanligt Kubernetes-namnområde",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Ett nytt namnområde skapas i klustret med projektetiketter tillämpade. Den visas direkt i projektlistan.",
"Create New Namespace": "Skapa nytt namnområde",
diff --git a/plugins/aks-desktop/locales/tr/translation.json b/plugins/aks-desktop/locales/tr/translation.json
index 5a770e712..c6c8e5469 100644
--- a/plugins/aks-desktop/locales/tr/translation.json
+++ b/plugins/aks-desktop/locales/tr/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "Yenile",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "Tür",
+ "Role": "Rol",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "Abonelikler yüklenemedi",
"Failed to load AKS clusters": "AKS kümeleri yüklenemedi",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "'{{cluster}}' kümesi kubeconfig dosyasına başarıyla eklendi",
@@ -50,7 +58,6 @@
"Assignee": "Atanan",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "Rol",
"Remove assignee": "Atananı kaldır",
"Add assignee": "Atanan ekle",
"Only clusters with Azure Entra ID authentication are shown.": "Yalnızca Azure Entra ID kimlik doğrulamasına sahip kümeler gösterilir.",
@@ -94,7 +101,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "Bu abonelik için Azure Entra ID kimlik doğrulamasına sahip küme bulunamadı",
"Cluster Not Ready": "Küme Hazır Değil",
"Refreshing": "Yenileniyor",
- "Refresh": "Yenile",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Seçilen küme kubeconfig dosyasında yok. Devam etmeden önce dosyaya kaydedin.",
"Registering cluster": "Küme kaydediliyor",
"Wizard steps": "Sihirbaz adımları",
@@ -201,7 +207,6 @@
"Namespace Name": "Ad Alanı Adı",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Yalnızca küçük harf, rakam ve kısa çizgi içermelidir. Başında ve sonunda alfasayısal karakter olmalıdır",
"The namespace will be created on the selected cluster and set up as a project": "Ad alanı seçili kümede oluşturulacak ve proje olarak ayarlanacak",
- "Type": "Tür",
"Regular Kubernetes namespace": "Normal Kubernetes ad alanı",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Kümede proje etiketleri uygulanmış yeni bir ad alanı oluşturulacak. Proje listenizde hemen görünecek.",
"Create New Namespace": "Yeni Ad Alanı Oluştur",
diff --git a/plugins/aks-desktop/locales/zh-Hans/translation.json b/plugins/aks-desktop/locales/zh-Hans/translation.json
index 79100194a..ebab3c04f 100644
--- a/plugins/aks-desktop/locales/zh-Hans/translation.json
+++ b/plugins/aks-desktop/locales/zh-Hans/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "刷新",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "类型",
+ "Role": "角色",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "无法加载订阅",
"Failed to load AKS clusters": "未能加载 AKS 群集",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "群集“{{cluster}}”已成功合并到 kubeconfig 中",
@@ -50,7 +58,6 @@
"Assignee": "代理人",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "角色",
"Remove assignee": "移除被分派人",
"Add assignee": "添加被分配者",
"Only clusters with Azure Entra ID authentication are shown.": "仅显示启用 Azure Entra ID 身份验证的群集。",
@@ -92,7 +99,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "此订阅中未找到启用 Azure Entra ID 身份验证的群集",
"Cluster Not Ready": "群集未就绪",
"Refreshing": "正在刷新",
- "Refresh": "刷新",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "kubeconfig 中缺少所选群集。请先注册,然后继续。",
"Registering cluster": "正在注册群集",
"Wizard steps": "向导步骤",
@@ -198,7 +204,6 @@
"Namespace Name": "命名空间名称",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "必须仅包含小写字母、数字和连字符,并以字母数字字符开头和结尾",
"The namespace will be created on the selected cluster and set up as a project": "命名空间将在所选群集上创建,并设置为项目",
- "Type": "类型",
"Regular Kubernetes namespace": "常规 Kubernetes 命名空间",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "将在该群集上创建新的命名空间并应用项目标签。它将立即显示在项目列表中。",
"Create New Namespace": "创建新命名空间",
diff --git a/plugins/aks-desktop/locales/zh-Hant/translation.json b/plugins/aks-desktop/locales/zh-Hant/translation.json
index a0ff1f7d6..49276be88 100644
--- a/plugins/aks-desktop/locales/zh-Hant/translation.json
+++ b/plugins/aks-desktop/locales/zh-Hant/translation.json
@@ -1,4 +1,12 @@
{
+ "Loading role assignments…": "",
+ "Azure Role Assignments": "",
+ "Refresh": "重新整理",
+ "No role assignments found for this namespace.": "",
+ "Principal": "",
+ "Type": "類型",
+ "Role": "角色",
+ "Failed to load role assignments": "",
"Failed to load subscriptions": "無法載入訂用帳戶",
"Failed to load AKS clusters": "無法載入 AKS 叢集",
"Cluster '{{cluster}}' successfully merged in kubeconfig": "已順利在 kubeconfig 中合併叢集 '{{cluster}}'",
@@ -50,7 +58,6 @@
"Assignee": "受託人",
"Search for a user or remove this entry": "",
"Select a user from the search results or enter a valid object ID (UUID)": "",
- "Role": "角色",
"Remove assignee": "移除受託人",
"Add assignee": "新增受託人",
"Only clusters with Azure Entra ID authentication are shown.": "僅顯示具有 Azure Entra ID 驗證的叢集。",
@@ -92,7 +99,6 @@
"No clusters with Azure Entra ID authentication found for this subscription": "找不到此訂用帳戶具有 Azure Entra ID 驗證的叢集",
"Cluster Not Ready": "叢集未就緒",
"Refreshing": "正在重新整理",
- "Refresh": "重新整理",
"Selected cluster is missing from the kubeconfig. Register it before proceeding.": "kubeconfig 遺漏已選取的叢集。在繼續之前請先註冊。",
"Registering cluster": "正在註冊叢集",
"Wizard steps": "精靈步驟",
@@ -198,7 +204,6 @@
"Namespace Name": "命名空間名稱",
"Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "必須只包含小寫字母、數字和連字號,且開頭和結尾必須為英數字元",
"The namespace will be created on the selected cluster and set up as a project": "將在選取的叢集上建立命名空間,並設定為專案",
- "Type": "類型",
"Regular Kubernetes namespace": "一般 Kubernetes 命名空間",
"A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "將在已套用專案標籤的叢集上建立新的命名空間。該命名空間會立即出現在您的專案清單中。",
"Create New Namespace": "建立新的命名空間",
diff --git a/plugins/aks-desktop/src/components/AccessTab/AccessTab.tsx b/plugins/aks-desktop/src/components/AccessTab/AccessTab.tsx
new file mode 100644
index 000000000..365906894
--- /dev/null
+++ b/plugins/aks-desktop/src/components/AccessTab/AccessTab.tsx
@@ -0,0 +1,80 @@
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache 2.0.
+
+import { Icon } from '@iconify/react';
+import { useTranslation } from '@kinvolk/headlamp-plugin/lib';
+import { Loader } from '@kinvolk/headlamp-plugin/lib/CommonComponents';
+import {
+ Alert,
+ Box,
+ IconButton,
+ Table,
+ TableBody,
+ TableCell,
+ TableContainer,
+ TableHead,
+ TableRow,
+ Tooltip,
+ Typography,
+} from '@mui/material';
+import React from 'react';
+import { useAccessTab } from './hooks/useAccessTab';
+
+/** Component to display table of present Azure Role Assignments */
+export default function AccessTab({
+ project,
+}: {
+ project: { clusters: string[]; namespaces: string[] };
+}) {
+ const { loading, error, assignments, refresh } = useAccessTab(project);
+ const { t } = useTranslation();
+
+ if (loading && assignments.length === 0) {
+ return ;
+ }
+
+ return (
+
+
+ {t('Azure Role Assignments')}
+
+
+
+
+
+
+ {error ? (
+
+ {error}
+
+ ) : assignments.length === 0 ? (
+
+ {t('No role assignments found for this namespace.')}
+
+ ) : (
+
+
+
+
+ {t('Principal')}
+ {t('Type')}
+ {t('Role')}
+
+
+
+ {assignments.map(a => (
+
+ {a.principalName || '—'}
+ {a.principalType}
+ {a.roleDefinitionName}
+
+ ))}
+
+
+
+ )}
+
+ );
+}
diff --git a/plugins/aks-desktop/src/components/AccessTab/hooks/useAccessTab.test.ts b/plugins/aks-desktop/src/components/AccessTab/hooks/useAccessTab.test.ts
new file mode 100644
index 000000000..8e0a100f2
--- /dev/null
+++ b/plugins/aks-desktop/src/components/AccessTab/hooks/useAccessTab.test.ts
@@ -0,0 +1,143 @@
+// @vitest-environment jsdom
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache 2.0.
+
+import { act, renderHook, waitFor } from '@testing-library/react';
+import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
+
+const mockUseGet = vi.hoisted(() => vi.fn());
+const mockListNamespaceRoleAssignments = vi.hoisted(() => vi.fn());
+const mockT = vi.hoisted(() => (key: string) => key);
+
+vi.mock('@kinvolk/headlamp-plugin/lib', () => ({
+ K8s: {
+ ResourceClasses: {
+ Namespace: {
+ useGet: mockUseGet,
+ },
+ },
+ },
+ useTranslation: () => ({ t: mockT }),
+}));
+
+vi.mock('../../../utils/azure/az-namespace-access', () => ({
+ listNamespaceRoleAssignments: mockListNamespaceRoleAssignments,
+}));
+
+import { useAccessTab } from './useAccessTab';
+
+function createNamespaceInstance(subscription = 'test-sub', resourceGroup = 'test-rg') {
+ return {
+ jsonData: {
+ metadata: {
+ labels: {
+ 'aks-desktop/project-subscription': subscription,
+ 'aks-desktop/project-resource-group': resourceGroup,
+ },
+ },
+ },
+ };
+}
+
+function createProject(suffix: string) {
+ return {
+ clusters: [`cluster-${suffix}`],
+ namespaces: [`namespace-${suffix}`],
+ };
+}
+
+describe('useAccessTab', () => {
+ beforeEach(() => {
+ mockUseGet.mockReturnValue([createNamespaceInstance()]);
+ mockListNamespaceRoleAssignments.mockReset();
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ test('uses cache on re-mount if within TTL window', async () => {
+ const project = createProject('test-project');
+ const assignments = [
+ {
+ principalName: 'bob@example.com',
+ principalType: 'User',
+ roleDefinitionName: 'Reader',
+ scope: '/scope/one',
+ },
+ ];
+
+ mockListNamespaceRoleAssignments.mockResolvedValue({
+ success: true,
+ assignments,
+ });
+
+ const first = renderHook(() => useAccessTab(project));
+
+ await waitFor(() => expect(first.result.current.loading).toBe(false));
+ expect(first.result.current.assignments).toEqual(assignments);
+ expect(mockListNamespaceRoleAssignments).toHaveBeenCalledTimes(1);
+
+ first.unmount();
+
+ const second = renderHook(() => useAccessTab(project));
+
+ await waitFor(() => expect(second.result.current.loading).toBe(false));
+ expect(second.result.current.assignments).toEqual(assignments);
+ expect(mockListNamespaceRoleAssignments).toHaveBeenCalledTimes(1);
+ });
+
+ test('refresh bypasses the cache and does a re-fetch', async () => {
+ const project = createProject('refresh');
+ const firstAssignments = [
+ {
+ principalName: 'jack@example.com',
+ principalType: 'User',
+ roleDefinitionName: 'Reader',
+ scope: '/scope/one',
+ },
+ ];
+ const refreshedAssignments = [
+ {
+ principalName: 'bill@example.com',
+ principalType: 'User',
+ roleDefinitionName: 'Writer',
+ scope: '/scope/two',
+ },
+ ];
+
+ mockListNamespaceRoleAssignments
+ .mockResolvedValueOnce({ success: true, assignments: firstAssignments })
+ .mockResolvedValueOnce({ success: true, assignments: refreshedAssignments });
+
+ const { result } = renderHook(() => useAccessTab(project));
+
+ await waitFor(() => expect(result.current.loading).toBe(false));
+ expect(result.current.assignments).toEqual(firstAssignments);
+
+ act(() => {
+ result.current.refresh();
+ });
+
+ await waitFor(() => expect(result.current.loading).toBe(false));
+ expect(result.current.assignments).toEqual(refreshedAssignments);
+ expect(mockListNamespaceRoleAssignments).toHaveBeenCalledTimes(2);
+ });
+
+ test('properly surfaces errors from listNamespaceRoleAssignments', async () => {
+ const project = createProject('error');
+
+ mockListNamespaceRoleAssignments.mockResolvedValue({
+ success: false,
+ assignments: [],
+ error: 'role assignment lookup failed',
+ });
+
+ const { result } = renderHook(() => useAccessTab(project));
+
+ await waitFor(() => expect(result.current.loading).toBe(false));
+
+ expect(result.current.assignments).toEqual([]);
+ expect(result.current.error).toBe('role assignment lookup failed');
+ });
+});
diff --git a/plugins/aks-desktop/src/components/AccessTab/hooks/useAccessTab.ts b/plugins/aks-desktop/src/components/AccessTab/hooks/useAccessTab.ts
new file mode 100644
index 000000000..6f2da679c
--- /dev/null
+++ b/plugins/aks-desktop/src/components/AccessTab/hooks/useAccessTab.ts
@@ -0,0 +1,94 @@
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache 2.0.
+
+import { K8s, useTranslation } from '@kinvolk/headlamp-plugin/lib';
+import { useCallback, useEffect, useState } from 'react';
+import {
+ listNamespaceRoleAssignments,
+ type NamespaceRoleAssignment,
+} from '../../../utils/azure/az-namespace-access';
+import { RESOURCE_GROUP_LABEL, SUBSCRIPTION_LABEL } from '../../../utils/constants/projectLabels';
+import { ACCESS_TAB_CACHE_TTL_MS } from '../../../utils/constants/timing';
+
+/** 1 minute cache scoped to (cluster/namespace) */
+const cache = new Map();
+
+export interface UseAccessTabResult {
+ loading: boolean;
+ error: string | null;
+ assignments: NamespaceRoleAssignment[];
+ // Used to bypass cache
+ refresh: () => void;
+}
+
+/**
+ *
+ * Fetches Azure Role Assignments for the given project (if applicable)
+ * @param clusters - List of clusters in the project (only first is used)
+ * @param namespaces - List of namespaces in the project (only first is used)
+ */
+export function useAccessTab(project: {
+ clusters: string[];
+ namespaces: string[];
+}): UseAccessTabResult {
+ const { t } = useTranslation();
+ const clusterName = project.clusters[0];
+ const namespaceName = project.namespaces[0];
+
+ const [namespaceInstance] = K8s.ResourceClasses.Namespace.useGet(namespaceName, undefined, {
+ cluster: clusterName,
+ });
+ const subscription = namespaceInstance?.jsonData?.metadata?.labels?.[SUBSCRIPTION_LABEL];
+ const resourceGroup = namespaceInstance?.jsonData?.metadata?.labels?.[RESOURCE_GROUP_LABEL];
+
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+ const [assignments, setAssignments] = useState([]);
+ const [fetchKey, setFetchKey] = useState(0);
+
+ const cacheKey = `${clusterName}/${namespaceName}`;
+
+ useEffect(() => {
+ if (!clusterName || !resourceGroup || !namespaceName) return;
+
+ // Load cache if fresh
+ const cached = cache.get(cacheKey);
+ if (cached && Date.now() - cached.ts < ACCESS_TAB_CACHE_TTL_MS && fetchKey === 0) {
+ setAssignments(cached.assignments);
+ setError(null);
+ setLoading(false);
+ return;
+ }
+
+ let cancelled = false;
+ setLoading(true);
+ setError(null);
+
+ listNamespaceRoleAssignments({
+ clusterName,
+ resourceGroup,
+ namespaceName,
+ subscriptionId: subscription,
+ }).then(result => {
+ if (cancelled) return;
+ if (result.success) {
+ setAssignments(result.assignments);
+ cache.set(cacheKey, { assignments: result.assignments, ts: Date.now() });
+ } else {
+ setError(result.error ?? t('Failed to load role assignments'));
+ }
+ setLoading(false);
+ });
+
+ return () => {
+ cancelled = true;
+ };
+ }, [clusterName, resourceGroup, namespaceName, subscription, fetchKey, cacheKey]);
+
+ const refresh = useCallback(() => {
+ cache.delete(cacheKey);
+ setFetchKey(key => key + 1);
+ }, [cacheKey]);
+
+ return { loading, error, assignments, refresh };
+}
diff --git a/plugins/aks-desktop/src/index.tsx b/plugins/aks-desktop/src/index.tsx
index 5601e35ac..78c242e62 100644
--- a/plugins/aks-desktop/src/index.tsx
+++ b/plugins/aks-desktop/src/index.tsx
@@ -18,6 +18,7 @@ import {
} from '@kinvolk/headlamp-plugin/lib';
import React from 'react';
import { Redirect } from 'react-router-dom';
+import AccessTab from './components/AccessTab/AccessTab';
import RegisterAKSClusterPage from './components/AKS/RegisterAKSClusterPage';
import AzureLoginPage from './components/AzureAuth/AzureLoginPage';
import AzureProfilePage from './components/AzureAuth/AzureProfilePage';
@@ -44,7 +45,7 @@ import ScalingTab from './components/Scaling/ScalingTab';
import type { ProjectDefinition } from './types/project';
import { getLoginStatus } from './utils/azure/az-auth';
import { AZURE_ACCOUNT_POLL_INTERVAL_MS } from './utils/constants/timing';
-import { isAksProject } from './utils/shared/isAksProject';
+import { isAksProject, isArmManagedProject } from './utils/shared/isAksProject';
import { azureTheme } from './utils/shared/theme';
Headlamp.setAppMenu(menus => {
@@ -404,6 +405,15 @@ registerProjectHeaderAction({
),
});
+// Override built-in Access tab with Azure role assignments for ARM-managed projects
+registerProjectDetailsTab({
+ id: 'headlamp-projects.tabs.access',
+ label: 'Access',
+ icon: 'mdi:account-lock',
+ isEnabled: isArmManagedProject,
+ component: ({ project }) => ,
+});
+
// Register custom delete button for AKS projects only
registerProjectDeleteButton({
isEnabled: isAksProject,
diff --git a/plugins/aks-desktop/src/utils/azure/az-namespace-access.ts b/plugins/aks-desktop/src/utils/azure/az-namespace-access.ts
index 98641fdc4..6038cd641 100644
--- a/plugins/aks-desktop/src/utils/azure/az-namespace-access.ts
+++ b/plugins/aks-desktop/src/utils/azure/az-namespace-access.ts
@@ -314,3 +314,112 @@ export async function verifyNamespaceAccess(options: {
};
}
}
+
+/** Interface for a single Azure role assignment on a managed namespace. */
+export interface NamespaceRoleAssignment {
+ principalName: string;
+ principalType: string;
+ roleDefinitionName: string;
+ scope: string;
+}
+
+/** Lists Azure role assignments on a provided managed namespace. */
+export async function listNamespaceRoleAssignments(options: {
+ clusterName: string;
+ resourceGroup: string;
+ namespaceName: string;
+ subscriptionId?: string;
+}): Promise<{ success: boolean; assignments: NamespaceRoleAssignment[]; error?: string }> {
+ const { clusterName, resourceGroup, namespaceName, subscriptionId } = options;
+
+ try {
+ /** Fetch ARM ID of managed namespace */
+ const nsArgs = [
+ 'aks',
+ 'namespace',
+ 'show',
+ '--cluster-name',
+ clusterName,
+ '--resource-group',
+ resourceGroup,
+ '--name',
+ namespaceName,
+ '--query',
+ 'id',
+ '--output',
+ 'tsv',
+ ];
+ if (subscriptionId) {
+ nsArgs.push('--subscription', subscriptionId);
+ }
+
+ debugLog('Getting namespace resource ID for role list:', 'az', nsArgs.join(' '));
+ const { stdout: nsStdout, stderr: nsStderr } = await runCommandAsync('az', nsArgs);
+
+ if (nsStderr && needsRelogin(nsStderr)) {
+ return {
+ success: false,
+ assignments: [],
+ error: 'Authentication required. Please log in to Azure CLI: az login',
+ };
+ }
+
+ if (nsStderr && isAzError(nsStderr)) {
+ return {
+ success: false,
+ assignments: [],
+ error: `Failed to get namespace resource ID: ${nsStderr}`,
+ };
+ }
+
+ const namespaceResourceId = nsStdout.trim();
+ if (!namespaceResourceId) {
+ return {
+ success: false,
+ assignments: [],
+ error: `Failed to get namespace resource ID: ${nsStderr}`,
+ };
+ }
+
+ /** Fetch role assignments */
+ const roleArgs = [
+ 'role',
+ 'assignment',
+ 'list',
+ '--scope',
+ namespaceResourceId,
+ '--query',
+ '[].{principalName:principalName,principalType:principalType,roleDefinitionName:roleDefinitionName,scope:scope}',
+ '--output',
+ 'json',
+ ];
+ if (subscriptionId) {
+ roleArgs.push('--subscription', subscriptionId);
+ }
+
+ debugLog('Listing role assignments:', 'az', roleArgs.join(' '));
+ const { stdout, stderr } = await runCommandAsync('az', roleArgs);
+
+ if (stderr && needsRelogin(stderr)) {
+ return {
+ success: false,
+ assignments: [],
+ error: 'Authentication required. Please log in to Azure CLI: az login',
+ };
+ }
+
+ if (stderr && isAzError(stderr)) {
+ return {
+ success: false,
+ assignments: [],
+ error: `Failed to list role assignments: ${stderr}`,
+ };
+ }
+
+ const assignments: NamespaceRoleAssignment[] = stdout ? JSON.parse(stdout) : [];
+ return { success: true, assignments };
+ } catch (error) {
+ const msg = error instanceof Error ? error.message : 'Unknown error';
+ return { success: false, assignments: [], error: `Failed to list role assignments: ${msg}` };
+ }
+}
diff --git a/plugins/aks-desktop/src/utils/constants/projectLabels.ts b/plugins/aks-desktop/src/utils/constants/projectLabels.ts
index c7c6278d7..0f32a0867 100644
--- a/plugins/aks-desktop/src/utils/constants/projectLabels.ts
+++ b/plugins/aks-desktop/src/utils/constants/projectLabels.ts
@@ -15,3 +15,6 @@ export const SUBSCRIPTION_LABEL = 'aks-desktop/project-subscription';
/** Kubernetes label key: the Azure resource group associated with the project. */
export const RESOURCE_GROUP_LABEL = 'aks-desktop/project-resource-group';
+
+/** Kubernetes label key: whether the namespace is managed by ARM. */
+export const MANAGED_BY_ARM_LABEL = 'kubernetes.azure.com/managedByArm';
diff --git a/plugins/aks-desktop/src/utils/constants/timing.ts b/plugins/aks-desktop/src/utils/constants/timing.ts
index ac2ca5747..20771bd36 100644
--- a/plugins/aks-desktop/src/utils/constants/timing.ts
+++ b/plugins/aks-desktop/src/utils/constants/timing.ts
@@ -19,6 +19,9 @@ export const LOGIN_POLL_INTERVAL_MS = 5_000;
/** Delay before redirecting after successful login (ms). */
export const LOGIN_REDIRECT_DELAY_MS = 1_000;
+/** TTL for access-tab role-assignment cache (ms). */
+export const ACCESS_TAB_CACHE_TTL_MS = 60_000;
+
/** Delay before redirecting after profile load (ms). */
export const PROFILE_REDIRECT_DELAY_MS = 500;
diff --git a/plugins/aks-desktop/src/utils/shared/isAksProject.ts b/plugins/aks-desktop/src/utils/shared/isAksProject.ts
index 28dc64a00..b8cb3f9ca 100644
--- a/plugins/aks-desktop/src/utils/shared/isAksProject.ts
+++ b/plugins/aks-desktop/src/utils/shared/isAksProject.ts
@@ -4,9 +4,13 @@
import { K8s } from '@kinvolk/headlamp-plugin/lib';
import type { ApiClient } from '@kinvolk/headlamp-plugin/lib/lib/k8s/api/v1/factories';
import type { KubeNamespace } from '@kinvolk/headlamp-plugin/lib/lib/k8s/namespace';
-import { PROJECT_MANAGED_BY_LABEL, PROJECT_MANAGED_BY_VALUE } from '../constants/projectLabels';
+import {
+ MANAGED_BY_ARM_LABEL,
+ PROJECT_MANAGED_BY_LABEL,
+ PROJECT_MANAGED_BY_VALUE,
+} from '../constants/projectLabels';
-/** Checks if the given project is an AKS desktop managed namespace project */
+/** Checks if the given project is an AKS Desktop project (managed-by: aks-desktop). */
export const isAksProject = ({
project,
}: {
@@ -27,3 +31,28 @@ export const isAksProject = ({
project.clusters[0]
);
});
+
+/** Checks if the given project is an AKS Desktop + ARM-managed namespace. */
+export const isArmManagedProject = ({
+ project,
+}: {
+ project: { namespaces: string[]; clusters: string[] };
+}): Promise =>
+ new Promise(resolve => {
+ const cancelFn = (K8s.ResourceClasses.Namespace.apiEndpoint as ApiClient).get(
+ project.namespaces[0],
+ ns => {
+ resolve(
+ ns.metadata?.labels?.[PROJECT_MANAGED_BY_LABEL] === PROJECT_MANAGED_BY_VALUE &&
+ ns.metadata?.labels?.[MANAGED_BY_ARM_LABEL] === 'true'
+ );
+ cancelFn.then(it => it());
+ },
+ () => {
+ cancelFn.then(it => it());
+ resolve(false);
+ },
+ {},
+ project.clusters[0]
+ );
+ });
diff --git a/plugins/aks-desktop/src/utils/test/listNamespaceRoleAssignments.test.ts b/plugins/aks-desktop/src/utils/test/listNamespaceRoleAssignments.test.ts
new file mode 100644
index 000000000..f23398cf0
--- /dev/null
+++ b/plugins/aks-desktop/src/utils/test/listNamespaceRoleAssignments.test.ts
@@ -0,0 +1,144 @@
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache 2.0.
+
+import { beforeEach, describe, expect, test, vi } from 'vitest';
+
+const mockExecCommand = vi.hoisted(() => vi.fn());
+
+vi.mock('../shared/runCommandAsync', () => ({
+ runCommandAsync: mockExecCommand,
+}));
+
+vi.mock('../azure/az-cli-path', () => ({
+ getAzCommand: () => 'az',
+ getInstallationInstructions: () => 'Install Azure CLI',
+}));
+
+vi.mock('../shared/quoteForPlatform', () => ({
+ quoteForPlatform: (value: string) => value,
+}));
+
+import { listNamespaceRoleAssignments } from '../azure/az-namespace-access';
+
+const defaultOptions = {
+ clusterName: 'test-cluster',
+ resourceGroup: 'test-rg',
+ namespaceName: 'test-namespace',
+ subscriptionId: '12345678-1234-1234-1234-123456789abc',
+};
+
+describe('listNamespaceRoleAssignments', () => {
+ beforeEach(() => {
+ mockExecCommand.mockReset();
+ });
+
+ test('returns parsed role assignments on success', async () => {
+ const assignments = [
+ {
+ principalName: 'alice@example.com',
+ principalType: 'User',
+ roleDefinitionName: 'Azure Kubernetes Service RBAC Writer',
+ scope:
+ '/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.ContainerService/managedClusters/test-cluster/providers/Microsoft.KubernetesConfiguration/namespaces/test-namespace',
+ },
+ ];
+
+ mockExecCommand
+ .mockResolvedValueOnce({
+ stdout:
+ '/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.ContainerService/managedClusters/test-cluster/providers/Microsoft.KubernetesConfiguration/namespaces/test-namespace\n',
+ stderr: '',
+ })
+ .mockResolvedValueOnce({
+ stdout: JSON.stringify(assignments),
+ stderr: '',
+ });
+
+ const result = await listNamespaceRoleAssignments(defaultOptions);
+
+ // Checking that the ARM ID lookup was first called, followed by role assignment query
+ expect(result).toEqual({ success: true, assignments });
+ expect(mockExecCommand).toHaveBeenNthCalledWith(1, 'az', [
+ 'aks',
+ 'namespace',
+ 'show',
+ '--cluster-name',
+ 'test-cluster',
+ '--resource-group',
+ 'test-rg',
+ '--name',
+ 'test-namespace',
+ '--query',
+ 'id',
+ '--output',
+ 'tsv',
+ '--subscription',
+ '12345678-1234-1234-1234-123456789abc',
+ ]);
+ expect(mockExecCommand).toHaveBeenNthCalledWith(2, 'az', [
+ 'role',
+ 'assignment',
+ 'list',
+ '--scope',
+ '/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.ContainerService/managedClusters/test-cluster/providers/Microsoft.KubernetesConfiguration/namespaces/test-namespace',
+ '--query',
+ '[].{principalName:principalName,principalType:principalType,roleDefinitionName:roleDefinitionName,scope:scope}',
+ '--output',
+ 'json',
+ '--subscription',
+ '12345678-1234-1234-1234-123456789abc',
+ ]);
+ });
+
+ test('returns error when namespace lookup requires a relogin', async () => {
+ mockExecCommand.mockResolvedValueOnce({
+ stdout: '',
+ stderr: 'Interactive authentication is needed. Please run: az login',
+ });
+
+ const result = await listNamespaceRoleAssignments(defaultOptions);
+
+ expect(result.success).toBe(false);
+ expect(result.assignments).toEqual([]);
+ expect(result.error).toContain('Authentication required');
+ expect(mockExecCommand).toHaveBeenCalledTimes(1);
+ });
+
+ test('returns error when role assignment list command writes error to stderr', async () => {
+ mockExecCommand
+ .mockResolvedValueOnce({
+ stdout:
+ '/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.ContainerService/managedClusters/test-cluster/providers/Microsoft.KubernetesConfiguration/namespaces/test-namespace\n',
+ stderr: '',
+ })
+ .mockResolvedValueOnce({
+ stdout: '',
+ stderr: 'ERROR: role assignment list failed',
+ });
+
+ const result = await listNamespaceRoleAssignments(defaultOptions);
+
+ expect(result.success).toBe(false);
+ expect(result.assignments).toEqual([]);
+ expect(result.error).toContain('Failed to list role assignments');
+ });
+
+ test('returns error when role assignment response is invalid JSON', async () => {
+ mockExecCommand
+ .mockResolvedValueOnce({
+ stdout:
+ '/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.ContainerService/managedClusters/test-cluster/providers/Microsoft.KubernetesConfiguration/namespaces/test-namespace\n',
+ stderr: '',
+ })
+ .mockResolvedValueOnce({
+ stdout: 'not valid json',
+ stderr: '',
+ });
+
+ const result = await listNamespaceRoleAssignments(defaultOptions);
+
+ expect(result.success).toBe(false);
+ expect(result.assignments).toEqual([]);
+ expect(result.error).toContain('Failed to list role assignments');
+ });
+});