feat: kubedog integration with unified resource handling (#2383)

* feat: add kubedog-based resource tracking integration

Add kubedog tracking as an alternative to Helm's --wait flag with:
- Real-time deployment progress tracking
- Container log streaming
- Fine-grained resource filtering (trackKinds/skipKinds/trackResources)

Features:
- New pkg/resource package for unified manifest parsing and filtering
- New pkg/kubedog package wrapping kubedog library
- CLI flags: --track-mode, --track-timeout, --track-logs
- Helmfile YAML support for trackMode, trackTimeout, trackLogs, trackKinds, skipKinds, trackResources
- Case-insensitive kind matching for filtering
- Multi-context support with proper kubeconfig/kubeContext handling

Tracking supports: Deployment, StatefulSet, DaemonSet, Job

Resource filtering priority (highest to lowest):
1. trackResources - explicit resource whitelist
2. skipKinds - blacklist specific kinds
3. trackKinds - whitelist specific kinds

Integration:
- Disable Helm --wait when using kubedog tracking
- Track after successful Helm sync/apply
- Respect release.Namespace as fallback for resources without namespace
- Use getKubeContext() for correct cluster targeting

Tests:
- Unit tests for resource filtering and kubedog options
- Integration test with httpbin chart
- E2E snapshot tests for YAML serialization
- Documentation in docs/advanced-features.md

Signed-off-by: yxxhero <aiopsclub@163.com>

* fix: address PR #2383 review comments (round 4)

1. resource/filter.go: Skip empty whitelist entries in matchWhitelist
   - At least one field (kind/name/namespace) must be specified
   - Prevents matching all resources with empty TrackResources entries

2. config/apply.go: Add ValidateConfig for track-mode validation
   - Validate --track-mode must be 'helm' or 'kubedog'
   - Reject invalid values like --track-mode foo

3. config/sync.go: Add ValidateConfig for track-mode validation
   - Same validation as apply command
   - Ensures consistent behavior across commands

Signed-off-by: yxxhero <aiopsclub@163.com>

---------

Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
yxxhero
2026-03-02 17:15:12 +08:00
committed by GitHub
parent c70bd04f3a
commit 6e21671228
29 changed files with 1550 additions and 17 deletions
@@ -0,0 +1,90 @@
---
# Source: __workingdir__/testdata/snapshot/kubedog_tracking/input.yaml.gotmpl
filepath: input.yaml.gotmpl
helmBinary: helm
kustomizeBinary: kustomize
releases:
- chart: ../../charts/raw-0.1.0
name: kubedog-baseline
labels:
chart: raw-0.1.0
name: kubedog-baseline
namespace: ""
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-baseline
namespace: {{ .Release.Namespace }}
data:
baseline: value
trackMode: kubedog
- chart: ../../charts/raw-0.1.0
name: kubedog-with-timeout
labels:
chart: raw-0.1.0
name: kubedog-with-timeout
namespace: ""
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-timeout
namespace: {{ .Release.Namespace }}
data:
timeout: value
trackMode: kubedog
trackTimeout: 300
- chart: ../../charts/raw-0.1.0
name: kubedog-with-logs
labels:
chart: raw-0.1.0
name: kubedog-with-logs
namespace: ""
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-logs
namespace: {{ .Release.Namespace }}
data:
logs: value
trackMode: kubedog
trackLogs: true
- chart: ../../charts/raw-0.1.0
name: kubedog-with-whitelist
labels:
chart: raw-0.1.0
name: kubedog-with-whitelist
namespace: ""
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-tracked
namespace: {{ .Release.Namespace }}
data:
tracked: value
- |
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-secret
namespace: {{ .Release.Namespace }}
type: Opaque
data:
secret: dmFsdWU=
trackMode: kubedog
trackKinds:
- ConfigMap
templates: {}
renderedvalues: {}
@@ -0,0 +1,90 @@
---
# Source: __workingdir__/testdata/snapshot/kubedog_tracking/input.yaml.gotmpl
filepath: input.yaml.gotmpl
helmBinary: helm
kustomizeBinary: kustomize
releases:
- chart: ../../charts/raw-0.1.0
name: kubedog-baseline
labels:
chart: raw-0.1.0
name: kubedog-baseline
namespace: ""
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-baseline
namespace: {{ .Release.Namespace }}
data:
baseline: value
trackMode: kubedog
- chart: ../../charts/raw-0.1.0
name: kubedog-with-timeout
labels:
chart: raw-0.1.0
name: kubedog-with-timeout
namespace: ""
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-timeout
namespace: {{ .Release.Namespace }}
data:
timeout: value
trackMode: kubedog
trackTimeout: 300
- chart: ../../charts/raw-0.1.0
name: kubedog-with-logs
labels:
chart: raw-0.1.0
name: kubedog-with-logs
namespace: ""
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-logs
namespace: {{ .Release.Namespace }}
data:
logs: value
trackMode: kubedog
trackLogs: true
- chart: ../../charts/raw-0.1.0
name: kubedog-with-whitelist
labels:
chart: raw-0.1.0
name: kubedog-with-whitelist
namespace: ""
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-tracked
namespace: {{ .Release.Namespace }}
data:
tracked: value
- |
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-secret
namespace: {{ .Release.Namespace }}
type: Opaque
data:
secret: dmFsdWU=
trackMode: kubedog
trackKinds:
- ConfigMap
templates: {}
renderedvalues: {}
@@ -0,0 +1,69 @@
releases:
- name: kubedog-baseline
chart: ../../charts/raw-0.1.0
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{`{{ .Release.Name }}`}}-baseline
namespace: {{`{{ .Release.Namespace }}`}}
data:
baseline: value
trackMode: kubedog
- name: kubedog-with-timeout
chart: ../../charts/raw-0.1.0
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{`{{ .Release.Name }}`}}-timeout
namespace: {{`{{ .Release.Namespace }}`}}
data:
timeout: value
trackMode: kubedog
trackTimeout: 300
- name: kubedog-with-logs
chart: ../../charts/raw-0.1.0
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{`{{ .Release.Name }}`}}-logs
namespace: {{`{{ .Release.Namespace }}`}}
data:
logs: value
trackMode: kubedog
trackLogs: true
- name: kubedog-with-whitelist
chart: ../../charts/raw-0.1.0
values:
- templates:
- |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{`{{ .Release.Name }}`}}-tracked
namespace: {{`{{ .Release.Namespace }}`}}
data:
tracked: value
- |
apiVersion: v1
kind: Secret
metadata:
name: {{`{{ .Release.Name }}`}}-secret
namespace: {{`{{ .Release.Namespace }}`}}
type: Opaque
data:
secret: dmFsdWU=
trackMode: kubedog
trackKinds:
- ConfigMap