From 8f4e3190e50412e21a7695b5bfe874f81eed2255 Mon Sep 17 00:00:00 2001 From: Blai Peidro Date: Mon, 19 Oct 2026 02:53:52 +0200 Subject: [PATCH] feat: say when Argo CD manages an AnsibleForms found on Kubernetes Workloads an Argo CD Application manages (its tracking annotation or instance label, or the chart's labels without a Helm release) are listed as managed by Argo CD, with the Application's name. The installer leaves them alone and offers a new installation or to stop. --- internal/cli/adopt.go | 4 ++-- internal/detect/detect.go | 4 ++++ internal/detect/detect_test.go | 28 ++++++++++++++++++++++ internal/detect/kube.go | 43 ++++++++++++++++++++++++++++++---- internal/i18n/locales/ca.json | 2 ++ internal/i18n/locales/de.json | 2 ++ internal/i18n/locales/en.json | 2 ++ internal/i18n/locales/es.json | 2 ++ internal/i18n/locales/fr.json | 2 ++ internal/i18n/locales/it.json | 2 ++ internal/i18n/locales/ja.json | 2 ++ internal/i18n/locales/nl.json | 2 ++ internal/i18n/locales/pl.json | 2 ++ internal/i18n/locales/pt.json | 2 ++ internal/i18n/locales/zh.json | 2 ++ 15 files changed, 95 insertions(+), 6 deletions(-) diff --git a/internal/cli/adopt.go b/internal/cli/adopt.go index de23c31..e46a5cf 100644 --- a/internal/cli/adopt.go +++ b/internal/cli/adopt.go @@ -80,7 +80,7 @@ func reason(i detect.Install) string { // an RTE tells its version only with its token key = "detect.why_unmanagedRunner" } - return i18n.T(key, "dir", i.Dir, "port", i.Port, "version", orStr(i.Version, i18n.T("detect.versionUnknown"))) + return i18n.T(key, "dir", i.Dir, "port", i.Port, "version", orStr(i.Version, i18n.T("detect.versionUnknown")), "app", orStr(i.ArgoApp, "?")) } // foundLine is an installation found on one line: what and where, and why it cannot be @@ -98,7 +98,7 @@ func foundLine(i detect.Install) string { if i.Adoptable() || i.Problem == detect.Unmanaged { return describe(i) } - return describe(i) + ": " + i18n.T("detect.short_"+i.Problem) + return describe(i) + ": " + i18n.T("detect.short_"+i.Problem, "app", orStr(i.ArgoApp, "?")) } // foundAdvice is what to do about the installations that cannot be taken over: the advice diff --git a/internal/detect/detect.go b/internal/detect/detect.go index bfab62c..20c6f3a 100644 --- a/internal/detect/detect.go +++ b/internal/detect/detect.go @@ -58,6 +58,8 @@ const ( NativeLayout = "nativeLayout" // on Kubernetes, not a release of the ansibleforms chart (or helm is missing here) NoHelm = "noHelm" + // on Kubernetes, managed by an Argo CD Application : upgraded there, never from here + ArgoCD = "argoCD" // its version could not be read UnknownVersion = "unknownVersion" // it answers on a port, and no engine manages it @@ -96,6 +98,8 @@ type Install struct { Namespace string Release string Chart string + // ArgoApp is the Argo CD Application that manages it (its Problem ArgoCD), when known + ArgoApp string Workloads []string // Database: a Runner of 7.2 in the deprecated database mode (an RTE alone in its compose diff --git a/internal/detect/detect_test.go b/internal/detect/detect_test.go index 593d92d..24801b0 100644 --- a/internal/detect/detect_test.go +++ b/internal/detect/detect_test.go @@ -560,3 +560,31 @@ func TestProbePort(t *testing.T) { t.Errorf("nothing listening: %+v", a) } } + +// workloads Argo CD manages are found, named after their Application, and never taken over: +// by its tracking annotation, and by the chart's labels without a Helm release (label tracking) +func TestFindArgoCD(t *testing.T) { + f := &fake{t: t, has: map[string]bool{"kubectl": true}, out: map[string]string{ + "kubectl get deployments,statefulsets": `{"items":[ + {"kind":"Deployment","metadata":{"name":"forms-server","namespace":"forms","labels":{"app.kubernetes.io/instance":"forms"}, + "annotations":{"argocd.argoproj.io/tracking-id":"ansibleforms-prod:apps/Deployment:forms/forms-server"}}, + "spec":{"template":{"spec":{"containers":[{"image":"ghcr.io/ansibleforms/ansibleforms:7.3.0"}]}}},"status":{"readyReplicas":1}}, + {"kind":"Deployment","metadata":{"name":"lab-server","namespace":"lab","labels":{"app.kubernetes.io/instance":"lab-forms","app.kubernetes.io/managed-by":"Helm"}}, + "spec":{"template":{"spec":{"containers":[{"image":"ghcr.io/ansibleforms/ansibleforms:7.2.0"}]}}},"status":{"readyReplicas":1}} +]}`, + }} + got := find(context.Background(), f.env()) + if len(got) != 2 { + t.Fatalf("found %+v, want 2", got) + } + apps := map[string]string{} + for _, i := range got { + if i.Problem != ArgoCD || i.Adoptable() { + t.Errorf("%s: problem %q, want argoCD and not taken over", i.Namespace, i.Problem) + } + apps[i.Namespace] = i.ArgoApp + } + if apps["forms"] != "ansibleforms-prod" || apps["lab"] != "lab-forms" { + t.Errorf("applications %v", apps) + } +} diff --git a/internal/detect/kube.go b/internal/detect/kube.go index 4dc5f12..b6a770e 100644 --- a/internal/detect/kube.go +++ b/internal/detect/kube.go @@ -5,6 +5,7 @@ import ( "encoding/json" "regexp" "sort" + "strings" ) // ─── Kubernetes ─────────────────────────────────────────────────────────────── @@ -23,9 +24,10 @@ type workloads struct { Items []struct { Kind string `json:"kind"` Metadata struct { - Name string `json:"name"` - Namespace string `json:"namespace"` - Labels map[string]string `json:"labels"` + Name string `json:"name"` + Namespace string `json:"namespace"` + Labels map[string]string `json:"labels"` + Annotations map[string]string `json:"annotations"` } `json:"metadata"` Spec struct { Template struct { @@ -42,6 +44,31 @@ type workloads struct { } `json:"items"` } +// argoApp tells whether Argo CD manages a workload, and its Application's name when it says. +// Argo CD marks what it applies with the tracking-id annotation (app:group/kind:ns/name) or +// the argocd.argoproj.io/instance label ; with its default label tracking it leaves only the +// chart's app.kubernetes.io/instance and managed-by Helm, without a Helm release in the +// cluster (it renders the chart itself) : the caller decides that case, knowing the releases. +// +// Args: +// +// labels: the workload's labels. +// annotations: its annotations. +// +// Returns: +// +// The Application's name ("" when unknown), and whether Argo CD marks it. +func argoApp(labels, annotations map[string]string) (string, bool) { + if id := annotations["argocd.argoproj.io/tracking-id"]; id != "" { + name, _, _ := strings.Cut(id, ":") + return name, true + } + if name := labels["argocd.argoproj.io/instance"]; name != "" { + return name, true + } + return "", false +} + // chartRe cuts helm's chart column (ansibleforms-7.2.0) into its name and its version var chartRe = regexp.MustCompile(`^(.+)-v?(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)$`) @@ -132,9 +159,17 @@ func kubernetes(ctx context.Context, env Env) []Install { if kind != "app" { role = RoleRunner } + // rendered from the chart (managed-by Helm) with no Helm release : Argo CD, which + // renders the chart itself and tracks it by its instance label + problem, app := NoHelm, "" + if name, ok := argoApp(md.Labels, md.Annotations); ok { + problem, app = ArgoCD, name + } else if md.Labels["app.kubernetes.io/managed-by"] == "Helm" && instance != "" { + problem, app = ArgoCD, instance + } byRelease[key] = len(found) found = append(found, Install{Engine: Kubernetes, Role: role, Version: version, Running: item.Status.ReadyReplicas > 0, - Namespace: md.Namespace, Release: group, Workloads: []string{name}, Problem: NoHelm, key: key}) + Namespace: md.Namespace, Release: group, Workloads: []string{name}, Problem: problem, ArgoApp: app, key: key}) } } } diff --git a/internal/i18n/locales/ca.json b/internal/i18n/locales/ca.json index fb685e4..b8aba24 100644 --- a/internal/i18n/locales/ca.json +++ b/internal/i18n/locales/ca.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "Aquest Runner no el va configurar l'instal·lador.\nActualitzeu-lo a mà, o instal·leu un nou Runner amb l'instal·lador i aproveu-lo a AnsibleForms.", "detect.why_nativeLayout": "La seva carpeta no segueix l'estructura de l'instal·lador (releases/, current, app.env i rte.env).\nActualitzeu-lo a mà, de la mateixa manera que es va instal·lar.", "detect.why_noHelm": "S'executa a Kubernetes, però no com a release del chart Helm ansibleforms (o aquí falta helm).\nActualitzeu-lo amb l'eina que el va desplegar.", + "detect.why_argoCD": "S'executa a Kubernetes, gestionat per l'Application d'Argo CD {app}.\nL'instal·lador no hi toca: actualitza'l a Argo CD, canviant la versió del chart de l'Application.", "detect.why_unknownVersion": "No s'ha pogut llegir la seva versió.\nInicieu-lo perquè respongui al seu port i torneu a executar l'instal·lador.", "detect.why_unmanaged": "AnsibleForms {version} respon al port {port}, però cap motor no el gestiona (executat des del codi o a mà).\nL'instal·lador no el pot actualitzar. Una nova instal·lació podria xocar amb els seus ports o la seva base de dades.", "detect.why_unmanagedRunner": "Un RTE d'AnsibleForms respon al port {port}, però cap motor no el gestiona (executat des del codi o a mà).\nL'instal·lador no el pot actualitzar. Una nova instal·lació podria xocar amb el seu port.", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "aquest Runner no el va instal·lar l'instal·lador", "detect.short_nativeLayout": "la seva carpeta no segueix l'estructura de l'instal·lador", "detect.short_noHelm": "no és una release del chart Helm d’ansibleforms", + "detect.short_argoCD": "gestionat per Argo CD (Application {app})", "detect.short_unknownVersion": "no se’n pot llegir la versió", "detect.short_unmanaged": "cap motor no el gestiona", "migrate.gone": "El contenidor RTE del Runner de {dir} ja no hi és, així que no es poden llegir el nom ni el testimoni del seu runner.\nTorneu-lo a iniciar, o instal·leu un Runner nou i aproveu-lo a AnsibleForms.", diff --git a/internal/i18n/locales/de.json b/internal/i18n/locales/de.json index 15edc4f..86c1f7d 100644 --- a/internal/i18n/locales/de.json +++ b/internal/i18n/locales/de.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "Dieser Runner wurde nicht vom Installer eingerichtet.\nAktualisieren Sie ihn von Hand, oder installieren Sie mit dem Installer einen neuen Runner und genehmigen Sie ihn in AnsibleForms.", "detect.why_nativeLayout": "Sein Ordner folgt nicht dem Aufbau des Installers (releases/, current, app.env und rte.env).\nAktualisieren Sie es von Hand, so wie es installiert wurde.", "detect.why_noHelm": "Es läuft auf Kubernetes, aber nicht als Release des Helm-Charts ansibleforms (oder helm fehlt hier).\nAktualisieren Sie es mit dem Werkzeug, das es bereitgestellt hat.", + "detect.why_argoCD": "Es läuft auf Kubernetes, verwaltet von der Argo-CD-Application {app}.\nDer Installer lässt es unverändert: Aktualisiere es in Argo CD, indem du die Chart-Version der Application änderst.", "detect.why_unknownVersion": "Seine Version konnte nicht gelesen werden.\nStarten Sie es, damit es auf seinem Port antwortet, und führen Sie den Installer erneut aus.", "detect.why_unmanaged": "AnsibleForms {version} antwortet auf Port {port}, aber keine Engine verwaltet es (aus dem Quellcode oder von Hand gestartet).\nDer Installer kann es nicht aktualisieren. Eine neue Installation könnte mit seinen Ports oder seiner Datenbank kollidieren.", "detect.why_unmanagedRunner": "Ein AnsibleForms-RTE antwortet auf Port {port}, aber keine Engine verwaltet es (aus dem Quellcode oder von Hand gestartet).\nDer Installer kann es nicht aktualisieren. Eine neue Installation könnte mit seinem Port kollidieren.", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "dieser Runner wurde nicht vom Installer eingerichtet", "detect.short_nativeLayout": "sein Ordner hat nicht den Aufbau des Installers", "detect.short_noHelm": "kein Release des ansibleforms-Helm-Charts", + "detect.short_argoCD": "verwaltet von Argo CD (Application {app})", "detect.short_unknownVersion": "seine Version ist nicht lesbar", "detect.short_unmanaged": "keine Engine verwaltet es", "migrate.gone": "Der RTE-Container des Runners in {dir} ist weg, daher können Name und Token seines Runners nicht gelesen werden.\nStarten Sie ihn wieder, oder installieren Sie einen neuen Runner und geben Sie ihn in AnsibleForms frei.", diff --git a/internal/i18n/locales/en.json b/internal/i18n/locales/en.json index 73f65ed..d16cafd 100644 --- a/internal/i18n/locales/en.json +++ b/internal/i18n/locales/en.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "This Runner was not set up by the installer.\nUpgrade it by hand, or install a new Runner with the installer and approve it in AnsibleForms.", "detect.why_nativeLayout": "Its folder is not the installer's layout (releases/, current, app.env and rte.env).\nUpgrade it by hand, the way it was installed.", "detect.why_noHelm": "It runs on Kubernetes, but not as a release of the ansibleforms Helm chart (or helm is missing here).\nUpgrade it with the tool that deployed it.", + "detect.why_argoCD": "It runs on Kubernetes, managed by the Argo CD Application {app}.\nThe installer leaves it alone: upgrade it in Argo CD, by changing the chart version of the Application.", "detect.why_unknownVersion": "Its version could not be read.\nStart it so it answers on its port, then run the installer again.", "detect.why_unmanaged": "AnsibleForms {version} answers on port {port}, but no engine manages it (run from source or by hand).\nThe installer cannot upgrade it. A new installation could clash with its ports or its database.", "detect.why_unmanagedRunner": "An AnsibleForms RTE answers on port {port}, but no engine manages it (run from source or by hand).\nThe installer cannot upgrade it. A new installation could clash with its port.", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "this Runner was not set up by the installer", "detect.short_nativeLayout": "its folder is not in the installer's layout", "detect.short_noHelm": "not a release of the ansibleforms Helm chart", + "detect.short_argoCD": "managed by Argo CD (Application {app})", "detect.short_unknownVersion": "its version cannot be read", "detect.short_unmanaged": "no engine manages it", "migrate.gone": "The RTE container of the Runner in {dir} is gone, so its runner's name and token cannot be read.\nStart it again, or install a new Runner and approve it in AnsibleForms.", diff --git a/internal/i18n/locales/es.json b/internal/i18n/locales/es.json index 46d977e..b7596ee 100644 --- a/internal/i18n/locales/es.json +++ b/internal/i18n/locales/es.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "Este Runner no lo configuró el instalador.\nActualícelo a mano, o instale un nuevo Runner con el instalador y apruébelo en AnsibleForms.", "detect.why_nativeLayout": "Su carpeta no sigue la estructura del instalador (releases/, current, app.env y rte.env).\nActualícelo a mano, del mismo modo en que se instaló.", "detect.why_noHelm": "Se ejecuta en Kubernetes, pero no como release del chart Helm ansibleforms (o falta helm aquí).\nActualícelo con la herramienta que lo desplegó.", + "detect.why_argoCD": "Se ejecuta en Kubernetes, gestionado por la Application de Argo CD {app}.\nEl instalador no lo toca: actualízalo en Argo CD, cambiando la versión del chart de la Application.", "detect.why_unknownVersion": "No se pudo leer su versión.\nInícielo para que responda en su puerto y vuelva a ejecutar el instalador.", "detect.why_unmanaged": "AnsibleForms {version} responde en el puerto {port}, pero ningún motor lo gestiona (ejecutado desde el código o a mano).\nEl instalador no puede actualizarlo. Una nueva instalación podría chocar con sus puertos o su base de datos.", "detect.why_unmanagedRunner": "Un RTE de AnsibleForms responde en el puerto {port}, pero ningún motor lo gestiona (ejecutado desde el código o a mano).\nEl instalador no puede actualizarlo. Una nueva instalación podría chocar con su puerto.", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "este Runner no lo instaló el instalador", "detect.short_nativeLayout": "su carpeta no sigue la estructura del instalador", "detect.short_noHelm": "no es una release del chart Helm de ansibleforms", + "detect.short_argoCD": "gestionado por Argo CD (Application {app})", "detect.short_unknownVersion": "no se puede leer su versión", "detect.short_unmanaged": "ningún motor lo gestiona", "migrate.gone": "El contenedor RTE del Runner de {dir} ya no existe, así que no se pueden leer el nombre ni el token de su runner.\nVuelve a iniciarlo, o instala un Runner nuevo y apruébalo en AnsibleForms.", diff --git a/internal/i18n/locales/fr.json b/internal/i18n/locales/fr.json index ffd195c..f0b1e2f 100644 --- a/internal/i18n/locales/fr.json +++ b/internal/i18n/locales/fr.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "Ce Runner n'a pas été mis en place par l'installateur.\nMettez-le à jour à la main, ou installez un nouveau Runner avec l'installateur et approuvez-le dans AnsibleForms.", "detect.why_nativeLayout": "Son dossier ne suit pas la structure de l'installateur (releases/, current, app.env et rte.env).\nMettez-le à jour à la main, comme il a été installé.", "detect.why_noHelm": "Il tourne sur Kubernetes, mais pas comme release du chart Helm ansibleforms (ou helm manque ici).\nMettez-le à jour avec l'outil qui l'a déployé.", + "detect.why_argoCD": "Il tourne sur Kubernetes, géré par l'Application Argo CD {app}.\nL'installateur n'y touche pas : mets-le à jour dans Argo CD, en changeant la version du chart de l'Application.", "detect.why_unknownVersion": "Sa version n'a pas pu être lue.\nDémarrez-le pour qu'il réponde sur son port, puis relancez l'installateur.", "detect.why_unmanaged": "AnsibleForms {version} répond sur le port {port}, mais aucun moteur ne le gère (lancé depuis les sources ou à la main).\nL'installateur ne peut pas le mettre à jour. Une nouvelle installation pourrait entrer en conflit avec ses ports ou sa base.", "detect.why_unmanagedRunner": "Un RTE AnsibleForms répond sur le port {port}, mais aucun moteur ne le gère (lancé depuis les sources ou à la main).\nL'installateur ne peut pas le mettre à jour. Une nouvelle installation pourrait entrer en conflit avec son port.", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "ce Runner n'a pas été installé par l'installateur", "detect.short_nativeLayout": "son dossier ne suit pas l'organisation de l'installateur", "detect.short_noHelm": "pas une release du chart Helm ansibleforms", + "detect.short_argoCD": "géré par Argo CD (Application {app})", "detect.short_unknownVersion": "sa version est illisible", "detect.short_unmanaged": "aucun moteur ne le gère", "migrate.gone": "Le conteneur RTE du Runner dans {dir} n'existe plus : le nom et le jeton de son runner ne peuvent pas être lus.\nRedémarrez-le, ou installez un nouveau Runner et approuvez-le dans AnsibleForms.", diff --git a/internal/i18n/locales/it.json b/internal/i18n/locales/it.json index ac5ecab..0e591f3 100644 --- a/internal/i18n/locales/it.json +++ b/internal/i18n/locales/it.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "Questo Runner non è stato configurato dall'installer.\nAggiornalo a mano, oppure installa un nuovo Runner con l'installer e approvalo in AnsibleForms.", "detect.why_nativeLayout": "La sua cartella non segue la struttura dell'installer (releases/, current, app.env e rte.env).\nAggiornalo a mano, come è stato installato.", "detect.why_noHelm": "Gira su Kubernetes, ma non come release del chart Helm ansibleforms (o qui manca helm).\nAggiornalo con lo strumento che lo ha distribuito.", + "detect.why_argoCD": "Gira su Kubernetes, gestito dall'Application di Argo CD {app}.\nL'installer non lo tocca: aggiornalo in Argo CD, cambiando la versione del chart dell'Application.", "detect.why_unknownVersion": "Non è stato possibile leggere la sua versione.\nAvvialo perché risponda sulla sua porta, poi esegui di nuovo l'installer.", "detect.why_unmanaged": "AnsibleForms {version} risponde sulla porta {port}, ma nessun motore lo gestisce (avviato dai sorgenti o a mano).\nL'installer non può aggiornarlo. Una nuova installazione potrebbe entrare in conflitto con le sue porte o il suo database.", "detect.why_unmanagedRunner": "Un RTE di AnsibleForms risponde sulla porta {port}, ma nessun motore lo gestisce (avviato dai sorgenti o a mano).\nL'installer non può aggiornarlo. Una nuova installazione potrebbe entrare in conflitto con la sua porta.", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "questo Runner non è stato installato dall'installer", "detect.short_nativeLayout": "la sua cartella non segue la struttura dell'installer", "detect.short_noHelm": "non è una release del chart Helm di ansibleforms", + "detect.short_argoCD": "gestito da Argo CD (Application {app})", "detect.short_unknownVersion": "la sua versione non è leggibile", "detect.short_unmanaged": "nessun motore lo gestisce", "migrate.gone": "Il container RTE del Runner in {dir} non c'è più, quindi nome e token del suo runner non si possono leggere.\nAvvialo di nuovo, oppure installa un nuovo Runner e approvalo in AnsibleForms.", diff --git a/internal/i18n/locales/ja.json b/internal/i18n/locales/ja.json index 2061d6f..b273073 100644 --- a/internal/i18n/locales/ja.json +++ b/internal/i18n/locales/ja.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "このランナーはインストーラーで設定されたものではありません。\n手動でアップグレードするか、インストーラーで新しいランナーを入れて AnsibleForms で承認してください。", "detect.why_nativeLayout": "フォルダーがインストーラーの構成 (releases/、current、app.env、rte.env) ではありません。\nインストールしたときと同じ方法で手動でアップグレードしてください。", "detect.why_noHelm": "Kubernetes 上で動いていますが、ansibleforms Helm チャートのリリースではありません (またはここに helm がありません)。\nデプロイしたツールでアップグレードしてください。", + "detect.why_argoCD": "Kubernetes 上で Argo CD の Application {app} により管理されています。\nインストーラーは変更しません。Argo CD で Application の chart のバージョンを変更して更新してください。", "detect.why_unknownVersion": "バージョンを読み取れませんでした。\nポートで応答するよう起動してから、インストーラーを再実行してください。", "detect.why_unmanaged": "AnsibleForms {version} がポート {port} で応答していますが、どのエンジンも管理していません (ソースから、または手動で起動)。\nインストーラーはアップグレードできません。新しいインストールはそのポートやデータベースと衝突するおそれがあります。", "detect.why_unmanagedRunner": "AnsibleForms の RTE がポート {port} で応答していますが、どのエンジンも管理していません (ソースから、または手動で起動)。\nインストーラーはアップグレードできません。新しいインストールはそのポートと衝突するおそれがあります。", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "この Runner はインストーラーで設定されていません", "detect.short_nativeLayout": "フォルダーがインストーラーの構成ではありません", "detect.short_noHelm": "ansibleforms Helm チャートのリリースではありません", + "detect.short_argoCD": "Argo CD が管理 (Application {app})", "detect.short_unknownVersion": "バージョンを読み取れません", "detect.short_unmanaged": "どのエンジンも管理していません", "migrate.gone": "{dir} の Runner の RTE コンテナーがないため、ランナーの名前とトークンを読めません。\nもう一度起動するか、新しい Runner をインストールして AnsibleForms で承認してください。", diff --git a/internal/i18n/locales/nl.json b/internal/i18n/locales/nl.json index af8d43a..d9dc49b 100644 --- a/internal/i18n/locales/nl.json +++ b/internal/i18n/locales/nl.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "Deze Runner is niet door de installer ingericht.\nUpgrade hem met de hand, of installeer met de installer een nieuwe Runner en keur hem goed in AnsibleForms.", "detect.why_nativeLayout": "De map volgt de indeling van de installer niet (releases/, current, app.env en rte.env).\nUpgrade het met de hand, zoals het geïnstalleerd is.", "detect.why_noHelm": "Het draait op Kubernetes, maar niet als release van de Helm-chart ansibleforms (of helm ontbreekt hier).\nUpgrade het met de tool die het heeft uitgerold.", + "detect.why_argoCD": "Het draait op Kubernetes, beheerd door de Argo CD-Application {app}.\nDe installer laat het met rust: werk het bij in Argo CD door de chartversie van de Application te wijzigen.", "detect.why_unknownVersion": "De versie kon niet worden gelezen.\nStart het zodat het op zijn poort antwoordt en voer de installer opnieuw uit.", "detect.why_unmanaged": "AnsibleForms {version} antwoordt op poort {port}, maar geen engine beheert het (vanuit de broncode of met de hand gestart).\nDe installer kan het niet upgraden. Een nieuwe installatie kan botsen met zijn poorten of zijn database.", "detect.why_unmanagedRunner": "Een AnsibleForms-RTE antwoordt op poort {port}, maar geen engine beheert het (vanuit de broncode of met de hand gestart).\nDe installer kan het niet upgraden. Een nieuwe installatie kan botsen met zijn poort.", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "deze Runner is niet door de installer opgezet", "detect.short_nativeLayout": "de map volgt de indeling van de installer niet", "detect.short_noHelm": "geen release van de ansibleforms-Helm-chart", + "detect.short_argoCD": "beheerd door Argo CD (Application {app})", "detect.short_unknownVersion": "de versie is niet leesbaar", "detect.short_unmanaged": "geen engine beheert het", "migrate.gone": "De RTE-container van de Runner in {dir} is weg, dus de naam en het token van zijn runner kunnen niet worden gelezen.\nStart hem opnieuw, of installeer een nieuwe Runner en keur hem goed in AnsibleForms.", diff --git a/internal/i18n/locales/pl.json b/internal/i18n/locales/pl.json index 27768e8..278d014 100644 --- a/internal/i18n/locales/pl.json +++ b/internal/i18n/locales/pl.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "Ten Runner nie został skonfigurowany przez instalator.\nZaktualizuj go ręcznie albo zainstaluj nowy Runner instalatorem i zatwierdź go w AnsibleForms.", "detect.why_nativeLayout": "Jego folder nie ma układu instalatora (releases/, current, app.env i rte.env).\nZaktualizuj go ręcznie, tak jak został zainstalowany.", "detect.why_noHelm": "Działa na Kubernetes, ale nie jako release chartu Helm ansibleforms (lub brakuje tu helm).\nZaktualizuj go narzędziem, które go wdrożyło.", + "detect.why_argoCD": "Działa w Kubernetes, zarządzane przez Application Argo CD {app}.\nInstalator go nie zmienia: zaktualizuj je w Argo CD, zmieniając wersję chartu w Application.", "detect.why_unknownVersion": "Nie udało się odczytać jego wersji.\nUruchom go, aby odpowiadał na swoim porcie, i uruchom instalator ponownie.", "detect.why_unmanaged": "AnsibleForms {version} odpowiada na porcie {port}, ale żaden silnik nim nie zarządza (uruchomiony ze źródeł lub ręcznie).\nInstalator nie może go zaktualizować. Nowa instalacja mogłaby kolidować z jego portami lub bazą danych.", "detect.why_unmanagedRunner": "RTE AnsibleForms odpowiada na porcie {port}, ale żaden silnik nim nie zarządza (uruchomiony ze źródeł lub ręcznie).\nInstalator nie może go zaktualizować. Nowa instalacja mogłaby kolidować z jego portem.", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "tego Runnera nie zainstalował instalator", "detect.short_nativeLayout": "folder nie ma układu instalatora", "detect.short_noHelm": "to nie jest wydanie chartu Helm ansibleforms", + "detect.short_argoCD": "zarządzane przez Argo CD (Application {app})", "detect.short_unknownVersion": "nie można odczytać wersji", "detect.short_unmanaged": "nie zarządza nim żaden silnik", "migrate.gone": "Kontenera RTE Runnera w {dir} już nie ma, więc nie można odczytać nazwy ani tokenu jego runnera.\nUruchom go ponownie albo zainstaluj nowego Runnera i zatwierdź go w AnsibleForms.", diff --git a/internal/i18n/locales/pt.json b/internal/i18n/locales/pt.json index b82fda9..22f0897 100644 --- a/internal/i18n/locales/pt.json +++ b/internal/i18n/locales/pt.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "Este Runner não foi configurado pelo instalador.\nAtualize-o à mão, ou instale um novo Runner com o instalador e aprove-o no AnsibleForms.", "detect.why_nativeLayout": "A sua pasta não segue a estrutura do instalador (releases/, current, app.env e rte.env).\nAtualize-o à mão, da forma como foi instalado.", "detect.why_noHelm": "Corre em Kubernetes, mas não como release do chart Helm ansibleforms (ou falta o helm aqui).\nAtualize-o com a ferramenta que o implementou.", + "detect.why_argoCD": "Corre em Kubernetes, gerido pela Application do Argo CD {app}.\nO instalador não lhe toca: atualiza-o no Argo CD, mudando a versão do chart da Application.", "detect.why_unknownVersion": "Não foi possível ler a sua versão.\nInicie-o para que responda na sua porta e execute o instalador de novo.", "detect.why_unmanaged": "O AnsibleForms {version} responde na porta {port}, mas nenhum motor o gere (iniciado a partir do código ou à mão).\nO instalador não o pode atualizar. Uma nova instalação pode entrar em conflito com as suas portas ou a sua base de dados.", "detect.why_unmanagedRunner": "Um RTE do AnsibleForms responde na porta {port}, mas nenhum motor o gere (iniciado a partir do código ou à mão).\nO instalador não o pode atualizar. Uma nova instalação pode entrar em conflito com a sua porta.", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "este Runner não foi instalado pelo instalador", "detect.short_nativeLayout": "a pasta não segue a estrutura do instalador", "detect.short_noHelm": "não é uma release do chart Helm do ansibleforms", + "detect.short_argoCD": "gerido pelo Argo CD (Application {app})", "detect.short_unknownVersion": "não é possível ler a versão", "detect.short_unmanaged": "nenhum motor o gere", "migrate.gone": "O contentor RTE do Runner em {dir} já não existe, por isso o nome e o token do seu runner não podem ser lidos.\nInicie-o de novo, ou instale um Runner novo e aprove-o no AnsibleForms.", diff --git a/internal/i18n/locales/zh.json b/internal/i18n/locales/zh.json index 63f6116..632e8fc 100644 --- a/internal/i18n/locales/zh.json +++ b/internal/i18n/locales/zh.json @@ -312,6 +312,7 @@ "detect.why_runnerLayout": "此运行器不是由安装程序设置的。\n请手动升级,或用安装程序安装新的运行器并在 AnsibleForms 中批准它。", "detect.why_nativeLayout": "它的文件夹不是安装程序的结构(releases/、current、app.env 和 rte.env)。\n请按安装时的方式手动升级。", "detect.why_noHelm": "它运行在 Kubernetes 上,但不是 ansibleforms Helm chart 的 release(或此处缺少 helm)。\n请用部署它的工具升级。", + "detect.why_argoCD": "它运行在 Kubernetes 上,由 Argo CD 的 Application {app} 管理。\n安装程序不会改动它:请在 Argo CD 中修改 Application 的 chart 版本来升级。", "detect.why_unknownVersion": "无法读取它的版本。\n请启动它,使其在端口上响应,然后重新运行安装程序。", "detect.why_unmanaged": "AnsibleForms {version} 在端口 {port} 上响应,但没有引擎管理它(从源码或手动运行)。\n安装程序无法升级它。新的安装可能与它的端口或数据库冲突。", "detect.why_unmanagedRunner": "一个 AnsibleForms RTE 在端口 {port} 上响应,但没有引擎管理它(从源码或手动运行)。\n安装程序无法升级它。新的安装可能与它的端口冲突。", @@ -322,6 +323,7 @@ "detect.short_runnerLayout": "此 Runner 不是由安装程序部署的", "detect.short_nativeLayout": "其文件夹不是安装程序的结构", "detect.short_noHelm": "不是 ansibleforms Helm chart 的发布", + "detect.short_argoCD": "由 Argo CD 管理(Application {app})", "detect.short_unknownVersion": "无法读取其版本", "detect.short_unmanaged": "没有引擎管理它", "migrate.gone": "{dir} 中 Runner 的 RTE 容器已不存在,因此无法读取其运行器的名称和令牌。\n请重新启动它,或安装一个新的 Runner 并在 AnsibleForms 中批准它。",