Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions argocd/applications/configs/component-status.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# SPDX-FileCopyrightText: 2025 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0

# Component status service configuration
# This will be populated by the installer based on which features are enabled

resources: null
149 changes: 149 additions & 0 deletions argocd/applications/custom/component-status.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
# SPDX-FileCopyrightText: 2025 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0

image:
registry: {{.Values.argo.containerRegistryURL }}
repository: common/component-status
imagePullSecrets:
{{- with .Values.argo.imagePullSecrets }}
{{- toYaml . | nindent 2 }}
{{- end }}

{{- with .Values.argo.resources.componentStatus }}
resources:
{{- toYaml . | nindent 2 }}
{{- end }}

# Traefik IngressRoute configuration
# Priority must be > 30 to override nexus-api-gw's generic /v route (priority 30)
traefikRoute:
enabled: true
matchHost: "Host(`api.{{ .Values.argo.clusterDomain }}`)"
matchPath: "PathPrefix(`/v1/orchestrator`)"
priority: 40
namespace: orch-gateway
secretName: tls-orch
middlewares:
- validate-jwt
- secure-headers
{{- if .Values.argo.traefik }}
tlsOption: {{ .Values.argo.traefik.tlsOption | default "" | quote }}
{{- end }}

# Component status configuration
# This configuration reflects which features are ACTUALLY installed in the orchestrator
# Detection method - Checks which profile files are loaded in root-app
componentStatus:
schema-version: "1.0"
orchestrator:
version: {{ .Values.argo.orchestratorVersion | default .Chart.Version | quote }}
features:
# Application Orchestration - Enabled when app-orch profile is loaded
# Detection - enable-app-orch.yaml in root-app valueFiles
application-orchestration:
installed: {{ index .Values.argo.enabled "app-orch-catalog" | default false }}

# Cluster Orchestration - Enabled when cluster-orch profile is loaded
# Detection - enable-cluster-orch.yaml in root-app valueFiles
cluster-orchestration:
installed: {{ index .Values.argo.enabled "cluster-manager" | default false }}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This plus the cluster-management check are on the same setting but if only capi is installed then the status service will say that cluster-orchestration is disabled. Shouldn't the check here be to see if any cluster-management, capi or intel-provider are installed and, if at least one is enabled, then cluster-orchestration is considered enabled?


# Cluster management core API and lifecycle operations
cluster-management:
installed: {{ index .Values.argo.enabled "cluster-manager" | default false }}

# CAPI (Cluster API) integration for declarative cluster management
capi:
installed: {{ index .Values.argo.enabled "capi-operator" | default false }}

# Infrastructure provider for Intel platforms
intel-provider:
installed: {{ index .Values.argo.enabled "intel-infra-provider" | default false }}

# Edge Infrastructure Manager - Enabled when edge-infra profile is loaded
# Detection - enable-edgeinfra.yaml in root-app valueFiles
# EIM is NOT broken down at app level (all workflows need core+managers+onboarding)
# Instead, different APIs/managers/configs enable different workflow-level capabilities
# Hierarchical fallback - CLI checks sub-feature first, falls back to parent if not found
edge-infrastructure-manager:
installed: {{ or (index .Values.argo.enabled "infra-core") (index .Values.argo.enabled "infra-managers") (index .Values.argo.enabled "infra-onboarding") (index .Values.argo.enabled "infra-external") | default false }}

# Day2 - Day 2 operations (maintenance, updates, troubleshooting)
# Detection - maintenance-manager is configured in infra-managers
day2:
installed: {{ if hasKey .Values.argo "infra-managers" }}{{ $infraManagers := index .Values.argo "infra-managers" }}{{ if hasKey $infraManagers "maintenance-manager" }}true{{ else }}false{{ end }}{{ else }}false{{ end }}

# Onboarding - Device discovery, registration, and enrollment workflow
# Detection - onboarding-manager is configured and enabled in infra-onboarding
onboarding:
installed: {{ if hasKey .Values.argo "infra-onboarding" }}{{ $infraOnboarding := index .Values.argo "infra-onboarding" }}{{ if hasKey $infraOnboarding "onboarding-manager" }}{{ $onboardingMgr := index $infraOnboarding "onboarding-manager" }}{{ $onboardingMgr.enabled | default false }}{{ else }}false{{ end }}{{ else }}false{{ end }}

# OOB (Out-of-Band) - vPRO/AMT management capabilities
# Detection - AMT is configured in infra-external (vPRO/AMT managers deployed)
oob:
installed: {{ if and (index .Values.argo.enabled "infra-external" | default false) (hasKey .Values.argo "infra-external") }}{{ $infraExternal := index .Values.argo "infra-external" }}{{ if hasKey $infraExternal "import" }}{{ if hasKey $infraExternal.import "amt" }}{{ $infraExternal.import.amt.enabled | default false }}{{ else }}false{{ end }}{{ else }}false{{ end }}{{ else }}false{{ end }}

# Provisioning - Automatic OS provisioning workflow
# Detection - autoProvision is enabled in infra-managers (os-resource-manager handles automatic provisioning)
provisioning:
installed: {{ if and (index .Values.argo.enabled "infra-managers" | default false) (hasKey .Values.argo "infra-managers") }}{{ $infraManagers := index .Values.argo "infra-managers" }}{{ if hasKey $infraManagers "autoProvision" }}{{ $infraManagers.autoProvision.enabled | default false }}{{ else }}false{{ end }}{{ else }}false{{ end }}

# Observability - Enabled when o11y profile is loaded
# Detection - enable-o11y.yaml in root-app valueFiles
observability:
installed: {{ index .Values.argo.enabled "orchestrator-observability" | default false }}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since orchestrator and edge node observability pipelines are separate and can be deployed independently of each other, instead of having observability shown as installed if one pipeline is enabled, we should have separate status checks for each pipelines, e.g.

      orchestrator-observability:
        installed: {{ index .Values.argo.enabled "orchestrator-observability" | default false }}
...
      edgenode-observability:
        installed: {{ index .Values.argo.enabled "edgenode-observability" | default false }}

Using a single status to cover both pipeline statuses will cause confusion on which pipeline is enabled if only the observability: installed value is checked


# Metrics collection and monitoring for orchestrator components
orchestrator-monitoring:
installed: {{ index .Values.argo.enabled "orchestrator-observability" | default false }}

# Metrics collection and monitoring for edge nodes
edge-node-monitoring:
installed: {{ index .Values.argo.enabled "edgenode-observability" | default false }}

# Pre-built dashboards for orchestrator metrics
orchestrator-dashboards:
installed: {{ index .Values.argo.enabled "orchestrator-dashboards" | default false }}

# Pre-built dashboards for edge node metrics
edge-node-dashboards:
installed: {{ index .Values.argo.enabled "edgenode-dashboards" | default false }}

# Alerting and monitoring rules
alerting:
installed: {{ index .Values.argo.enabled "alerting-monitor" | default false }}

# Web UI - Enabled when full-ui profile is loaded
# Detection - enable-full-ui.yaml in root-app valueFiles
web-ui:
installed: {{ or (index .Values.argo.enabled "web-ui-root") (index .Values.argo.enabled "web-ui-app-orch") (index .Values.argo.enabled "web-ui-cluster-orch") (index .Values.argo.enabled "web-ui-infra") | default false }}
orchestrator-ui-root:
installed: {{ index .Values.argo.enabled "web-ui-root" | default false }}
application-orchestration-ui:
installed: {{ index .Values.argo.enabled "web-ui-app-orch" | default false }}
cluster-orchestration-ui:
installed: {{ index .Values.argo.enabled "web-ui-cluster-orch" | default false }}
infrastructure-ui:
installed: {{ index .Values.argo.enabled "web-ui-infra" | default false }}

# Multitenancy - Tenancy services (tenancy-manager, tenancy-api-mapping, tenancy-datamodel)
# are always deployed as part of root-app, so multitenancy is always enabled
# The default-tenant-only sub-feature indicates single-tenant mode (when defaultTenancy profile is loaded)
multitenancy:
installed: true
default-tenant-only:
installed: {{ index .Values.argo.enabled "defaultTenancy" | default false }}

# Kyverno - Policy engine for Kubernetes admission control and governance
# Detection - enable-kyverno.yaml in root-app valueFiles
kyverno:
installed: {{ index .Values.argo.enabled "kyverno" | default false }}

# Kyverno policy engine core
policy-engine:
installed: {{ index .Values.argo.enabled "kyverno" | default false }}

# Pre-defined security and governance policies
policies:
installed: {{ index .Values.argo.enabled "kyverno-policy" | default false }}
52 changes: 52 additions & 0 deletions argocd/applications/templates/component-status.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# SPDX-FileCopyrightText: 2025 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0

{{- $appName := "component-status" }}
{{- $namespace := "orch-platform" }}
{{- $syncWave := "2000" }}
---
{{- if (index .Values.argo.enabled $appName) }}
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
annotations:
argocd.argoproj.io/sync-wave: "{{ $syncWave }}"
name: {{$appName}}
namespace: {{ required "A valid namespace entry required!" .Values.argo.namespace }}
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: {{ required "A valid projectName entry required!" .Values.argo.project }}
sources:
- repoURL: {{ required "A valid chartRepoURL entry required!" .Values.argo.chartRepoURL }}
chart: common/charts/{{$appName}}
targetRevision: 26.0.3
helm:
releaseName: {{$appName}}
valuesObject:
{{- $customFile := printf "custom/%s.tpl" $appName }}
{{- $customConfig := tpl (.Files.Get $customFile) . | fromYaml }}
{{- $baseFile := printf "configs/%s.yaml" $appName }}
{{- $baseConfig := .Files.Get $baseFile|fromYaml}}
{{- $overwrite := (get .Values.postCustomTemplateOverwrite $appName ) | default dict }}
{{- mergeOverwrite $baseConfig $customConfig $overwrite | toYaml | nindent 10 }}
destination:
namespace: {{$namespace}}
server: {{ required "A valid targetServer entry required!" .Values.argo.targetServer }}
syncPolicy:
{{- if .Values.argo.autosync }}
automated:
prune: true
selfHeal: true
retry:
limit: 5
backoff:
duration: 5s
maxDuration: 3m0s
factor: 2
{{- end }}
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
{{- end }}
Loading
Loading