From caa4ce75bb9ad5dce0ec77c17a915090241d9f53 Mon Sep 17 00:00:00 2001 From: Toan Nguyen Date: Sun, 23 Aug 2026 20:06:28 +0700 Subject: [PATCH] feat: support more cloud providers and distributions in footer --- GEMINI.md | 1 + src/components/layout/AppFooter.vue | 39 +------------------ src/utils/cloudProvider.ts | 59 +++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 37 deletions(-) create mode 100644 src/utils/cloudProvider.ts diff --git a/GEMINI.md b/GEMINI.md index eee7e22..90234b2 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -171,6 +171,7 @@ Before generating code: 7. Explain trade-offs when multiple implementations are reasonable. 8. Always check-out to another branch for features implementing or bugs fixing, never work on main/master. 9. Keep code small and well-organized by business logic boundaries. +10. Design for extensibility from the start: if a pattern or logic could be extended (such as rule evaluations, parsers, or handler registries), make it extensible upfront (e.g. table-driven or strategy patterns) instead of keeping it overly simplistic (e.g. long if-else chains). Never invent APIs that do not exist. diff --git a/src/components/layout/AppFooter.vue b/src/components/layout/AppFooter.vue index e8b981e..61ac8da 100644 --- a/src/components/layout/AppFooter.vue +++ b/src/components/layout/AppFooter.vue @@ -1,6 +1,7 @@ diff --git a/src/utils/cloudProvider.ts b/src/utils/cloudProvider.ts new file mode 100644 index 0000000..e03229a --- /dev/null +++ b/src/utils/cloudProvider.ts @@ -0,0 +1,59 @@ +export interface CloudProviderInfo { + provider: string + platform: string +} + +interface ProviderRule { + patterns: string[] + provider: string + platform: string +} + +const PROVIDER_RULES: readonly ProviderRule[] = [ + { patterns: ['eks.amazonaws.com', 'aws'], provider: 'AWS', platform: 'EKS' }, + { patterns: ['google.com', 'gke'], provider: 'GCP', platform: 'GKE' }, + { patterns: ['azure', 'aks'], provider: 'Azure', platform: 'AKS' }, + { patterns: ['doks.digitalocean.com'], provider: 'DigitalOcean', platform: 'DOKS' }, + { patterns: ['k8s.scaleway.com'], provider: 'Scaleway', platform: 'Kapsule' }, + { patterns: ['lke.linode.com', 'linode'], provider: 'Linode', platform: 'LKE' }, + { patterns: ['vke.vultr.com', 'vultr'], provider: 'Vultr', platform: 'VKE' }, + { patterns: ['civo.com', 'civo'], provider: 'Civo', platform: 'Civo' }, + { patterns: ['oke.oraclecloud.com', 'oraclecloud'], provider: 'Oracle', platform: 'OKE' }, + { patterns: ['minikube'], provider: 'Minikube', platform: 'Local' }, + { patterns: ['k3d'], provider: 'K3d', platform: 'Local' }, + { patterns: ['k3s'], provider: 'K3s', platform: 'Local' }, + { patterns: ['k0s'], provider: 'k0s', platform: 'Local' }, + { patterns: ['microk8s'], provider: 'MicroK8s', platform: 'Local' }, + { patterns: ['docker-desktop'], provider: 'Docker', platform: 'Docker Desktop' }, + { patterns: ['kind.x-k8s.io', 'kind'], provider: 'Kind', platform: 'Local' }, + { patterns: ['talos.dev'], provider: 'Talos', platform: 'Custom' }, + { patterns: ['rancher-desktop'], provider: 'Rancher', platform: 'Rancher Desktop' }, + { patterns: ['colima'], provider: 'Colima', platform: 'Local' }, + { patterns: ['openshift'], provider: 'Red Hat', platform: 'OpenShift' } +] + +export const DEFAULT_CLOUD_PROVIDER: CloudProviderInfo = { + provider: 'Local', + platform: 'Custom' +} + +/** + * Detects cloud provider and platform based on Kubernetes node labels. + */ +export function detectCloudProvider(labels: string[] | undefined | null): CloudProviderInfo { + if (!labels || labels.length === 0) { + return DEFAULT_CLOUD_PROVIDER + } + + for (const label of labels) { + const l = label.toLowerCase() + const match = PROVIDER_RULES.find((rule) => + rule.patterns.some((pattern) => l.includes(pattern)) + ) + if (match) { + return { provider: match.provider, platform: match.platform } + } + } + + return DEFAULT_CLOUD_PROVIDER +}