Skip to content

Remove legacy API, rename component CRDs to v1alpha1 and prepare 3.0.0 - #22

Merged
borislitv merged 3 commits into
mainfrom
NOCDEV-22322-single-v1-api
Sep 26, 2026
Merged

borislitv merged 3 commits into
mainfrom
NOCDEV-22322-single-v1-api

Conversation

@borislitv

Copy link
Copy Markdown
Collaborator

Summary

  • Remove the legacy single-node API/controller, AutoDiscovery, manifest builders, metrics and their tests/fixtures.
  • Expose the existing component-based implementation as the sole yanet.yanet-platform.io/v1alpha1 API: namespaced Yanet and cluster-scoped YanetConfig/config. Remove V2-qualified Go symbols/files, resource names, admission paths and Helm values; no compatibility aliases or conversion.
  • Preserve the surviving component-model tests and behavior (sidecars, NUMA, typed networking, ownership and cleanup). No new transition-specific tests are added.
  • Regenerate DeepCopy/CRDs/RBAC/admission manifests, keep runtime RBAC when removing the old controller, and update examples, dashboard and documentation.
  • Prepare operator 3.0.0 / chart 0.2.0 with breaking release notes. Stable chart/image publication belongs only to release.yml, avoiding premature PR chart publication and competing single-/multi-platform tag writers.

Compatibility and release

This requires a coordinated clean CRD installation and recreated resources. Helm does not upgrade/delete CRDs from crds/, and the old namespaced YanetConfig cannot change scope in place. See release-notes/v3.0.0.md. The YANET2 runtime paths/images retain their names.

The release tag and stable artifacts are to be published after review/merge. Target-cluster replacement/runtime qualification remains a separate step.

Verification

  • Make/Docker: generate, manifests, helm-crds, fmt, full test-docker-race (all packages, 33/33 manager-backed envtest specs), lint, vet and docker-build passed.
  • Helm 3.19.0 lint/template passed; rendered CRDs expose only v1alpha1 with the intended scopes, and both admission routes match.
  • Existing webhook shell harness passes bash syntax validation; full Helm installation/admission smoke runs in existing GitHub CI.
  • git diff --check passed. Local Make used an external Docker host-network/cache override because bridge DNS was unavailable; no host Go tests/builds.
  • No live cluster changes or forwarding qualification in this PR.

Refs: NOCDEV-22322

Expose the component-based controller through v1alpha1 Yanet/YanetConfig, remove legacy code and tests, and align chart, admission, metrics and documentation. Prepare chart 0.2.0 and make release.yml the sole stable-artifact publisher.

Refs: NOCDEV-22322
@github-actions

Copy link
Copy Markdown

🤖 AI Code Review

Changed files: api/v1alpha1/yanet_types.go,api/v1alpha1/yanet_webhook.go,api/v1alpha1/yanet_webhook_test.go,api/v1alpha1/yanetconfig_types.go,api/v1alpha1/yanetconfig_webhook.go,api/v1alpha1/yanetconfig_webhook_test.go,api/v1alpha1/zz_generated.deepcopy.go,cmd/main.go,internal/controller/cleanup_regression_test.go,internal/controller/dataplane_networks_envtest_test.go,internal/controller/e2e_helpers_test.go,internal/controller/metrics.go,internal/controller/operator_placement_envtest_test.go,internal/controller/suite_test.go,internal/controller/webhook_test.go,internal/controller/yanet_autosync_e2e_test.go,internal/controller/yanet_conditions.go,internal/controller/yanet_controller.go,internal/controller/yanet_reconciler.go,internal/controller/yanet_reconciler_test.go,internal/controller/yanet_status_e2e_test.go,internal/controller/yanet_webhook_e2e_test.go,internal/controller/yanetconfig_controller.go,internal/helpers/operator_placement_test.go,internal/helpers/ptr.go,internal/manifests/builder.go,internal/manifests/dataplane_networks.go,internal/manifests/dataplane_networks_test.go,internal/manifests/operator_placement.go,internal/manifests/operator_placement_probes_test.go,internal/manifests/operator_placement_test.go,internal/manifests/patcher.go,internal/manifests/patcher_test.go,api/v1alpha1/config_source.go,api/v1alpha1/network_attachments.go,api/v1alpha1/network_attachments_test.go,api/v1alpha1/operator_placement_test.go,api/v1alpha1/operator_validation.go,internal/controller/defaulting_envtest_test.go,internal/controller/operator_examples_test.go,internal/controller/operator_placement.go,internal/controller/operator_placement_services_test.go,internal/controller/operator_placement_test.go,internal/controller/private_network_test.go,internal/controller/prune.go,internal/controller/shared_services.go,internal/controller/shared_services_review_test.go,internal/controller/shared_services_test.go,internal/controller/yanet_controller_review_test.go,internal/controller/yanet_reconciler_deletion_test.go,internal/controller/yanet_reconciler_extended_test.go,internal/controller/yanet_reconciler_h9_test.go,internal/controller/yanet_reconciler_hardening_test.go,internal/controller/yanet_reconciler_review_test.go,internal/controller/yanet_reconciler_sidecars_test.go,internal/controller/yanetconfig_controller_review_test.go,internal/controller/yanetconfig_controller_test.go,internal/helpers/resolve.go,internal/helpers/resolve_test.go,internal/manifests/builder_test.go,internal/manifests/labels.go,internal/manifests/labels_test.go,internal/manifests/listeners.go,internal/manifests/listeners_test.go,internal/manifests/pod_ports.go,internal/manifests/pod_ports_test.go,internal/manifests/runtime_network.go,internal/manifests/runtime_network_test.go,internal/manifests/service.go,internal/manifests/service_test.go

This automated review checks for:

  • 🔒 Race conditions and concurrency issues
  • 🔗 Potential deadlocks
  • ⚠️ Error handling patterns
  • 🚀 Goroutine lifecycle management
  • 📋 Context usage
  • 🎯 Nil safety

🔍 Static Analysis Results

📊 Staticcheck

✅ No issues found

🔒 Security Analysis (gosec)

✅ No security issues found

🔧 Go Vet

✅ No issues found

🏁 Race Detector

✅ No race conditions detected

🚀 Concurrency Patterns Analysis

Goroutines found:

./api/v1alpha1/groupversion_info.go:31:	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
./internal/controller/suite_test.go:130:	go func() {
./internal/controller/yanetconfig_controller_review_test.go:70:	go func() {
./internal/controller/yanetconfig_controller_review_test.go:92:	go func() {

Mutex usage:

./api/v1alpha1/yanetconfig_types.go:428:	Lock   sync.Mutex      `json:"-"`
./internal/controller/yanet_controller.go:50:	lock           sync.Mutex

Context usage:

./api/v1alpha1/operator_placement_test.go:30:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/operator_placement_test.go:56:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/operator_placement_test.go:103:			_, createErr := validator.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/operator_placement_test.go:104:			_, updateErr := validator.ValidateUpdate(context.Background(), validConfig(), cfg)
./api/v1alpha1/network_attachments_test.go:32:			if _, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), config); err == nil {
./api/v1alpha1/yanetconfig_webhook_test.go:61:	if _, err := v.ValidateCreate(context.Background(), validConfig()); err != nil {
./api/v1alpha1/yanetconfig_webhook_test.go:69:	_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:96:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:133:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:156:	_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:166:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:179:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:197:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:215:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:228:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:238:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:248:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:258:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:268:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:279:	_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:289:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:311:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:325:	_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:335:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:345:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:357:	if _, err := v.ValidateCreate(context.Background(), cfg); err != nil {
./api/v1alpha1/yanetconfig_webhook_test.go:367:	if _, err := v.ValidateUpdate(context.Background(), cfg, bad); err == nil {
./api/v1alpha1/yanetconfig_webhook_test.go:374:	if _, err := v.ValidateDelete(context.Background(), validConfig()); err != nil {
./api/v1alpha1/yanetconfig_webhook_test.go:383:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:393:	if _, err := v.ValidateCreate(context.Background(), cfg); err != nil {
./api/v1alpha1/yanetconfig_webhook_test.go:402:		_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:417:	if _, err := v.ValidateCreate(context.Background(), cfg); err != nil {
./api/v1alpha1/yanetconfig_webhook_test.go:426:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:439:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:458:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:501:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:530:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:541:	if _, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg); err == nil {
./api/v1alpha1/yanetconfig_webhook_test.go:567:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanet_webhook_test.go:107:				context.Background(),
./api/v1alpha1/yanet_webhook_test.go:131:		context.Background(),
./api/v1alpha1/yanet_webhook_test.go:226:			_, err := validator.ValidateCreate(context.Background(), yanet)
./api/v1alpha1/yanet_webhook_test.go:249:	_, err := validator.ValidateCreate(context.Background(), yanet)
./api/v1alpha1/yanet_webhook_test.go:265:	_, err := validator.ValidateCreate(context.Background(), yanet)
./api/v1alpha1/yanet_webhook_test.go:279:	_, err := validator.ValidateCreate(context.Background(), yanet)
./api/v1alpha1/yanet_webhook_test.go:319:	if _, err := validator.ValidateCreate(context.Background(), yanet); err != nil {
./api/v1alpha1/yanet_webhook_test.go:326:	_, err := validator.ValidateCreate(context.Background(), yanet)
./api/v1alpha1/yanet_webhook_test.go:341:	if _, err := validator.ValidateUpdate(context.Background(), oldYanet, newYanet); err == nil ||
./api/v1alpha1/yanet_webhook_test.go:349:	if _, err := validator.ValidateDelete(context.Background(), makeYanet("edge", "yanet", "release")); err != nil {
./api/v1alpha1/yanet_webhook_test.go:369:			_, err := validator.ValidateCreate(context.Background(), makeYanet(tt.yanetName, "yanet", tt.boxType))

Defer patterns:

./internal/controller/yanetconfig_controller.go:94:	defer snapshot.Lock.Unlock()
./internal/controller/yanetconfig_controller_review_test.go:37:	defer cancel()
./internal/controller/yanetconfig_controller_review_test.go:119:	defer snapshot.Lock.Unlock()
./internal/controller/yanetconfig_controller_review_test.go:151:	defer snapshot.Lock.Unlock()
./internal/controller/yanetconfig_controller_review_test.go:196:			defer snapshot.Lock.Unlock()
./internal/controller/yanetconfig_controller_review_test.go:242:	defer snapshot.Lock.Unlock()
./internal/controller/yanet_controller.go:63:	defer r.lock.Unlock()
./internal/controller/yanet_reconciler.go:666:	defer r.GlobalConfig.Lock.Unlock()
./internal/controller/yanet_reconciler.go:685:	defer r.GlobalConfig.Lock.Unlock()
./internal/controller/shared_services_review_test.go:312:				defer snapshot.Lock.Unlock()
./internal/controller/defaulting_envtest_test.go:90:	defer cancelTest()
./internal/controller/shared_services.go:284:	defer r.GlobalConfig.Lock.Unlock()

⚠️ Error Handling Patterns

Potential unchecked errors:

./api/v1alpha1/operator_placement_test.go:30:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/operator_placement_test.go:56:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/operator_placement_test.go:105:			for _, err := range []error{createErr, updateErr} {
./api/v1alpha1/network_attachments_test.go:32:			if _, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), config); err == nil {
./api/v1alpha1/yanetconfig_webhook_test.go:61:	if _, err := v.ValidateCreate(context.Background(), validConfig()); err != nil {
./api/v1alpha1/yanetconfig_webhook_test.go:69:	_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:96:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:133:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:156:	_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:166:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:179:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:197:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:215:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:228:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:238:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:248:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:258:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:268:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:279:	_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:289:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:311:			_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:325:	_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:335:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:345:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:357:	if _, err := v.ValidateCreate(context.Background(), cfg); err != nil {
./api/v1alpha1/yanetconfig_webhook_test.go:367:	if _, err := v.ValidateUpdate(context.Background(), cfg, bad); err == nil {
./api/v1alpha1/yanetconfig_webhook_test.go:374:	if _, err := v.ValidateDelete(context.Background(), validConfig()); err != nil {
./api/v1alpha1/yanetconfig_webhook_test.go:383:	_, err := v.ValidateCreate(context.Background(), cfg)
./api/v1alpha1/yanetconfig_webhook_test.go:393:	if _, err := v.ValidateCreate(context.Background(), cfg); err != nil {
./api/v1alpha1/yanetconfig_webhook_test.go:402:		_, err := (&YanetConfigCustomValidator{}).ValidateCreate(context.Background(), cfg)

Nil checks:

./api/v1alpha1/yanetconfig_types.go:271:	if err != nil {
./api/v1alpha1/config_source.go:67:	if c == nil {
./api/v1alpha1/config_source.go:76:	if c == nil {
./api/v1alpha1/operator_placement_test.go:26:			if err := json.Unmarshal([]byte(fmt.Sprintf(`[{"name":"monalive","image":{"name":"monalive"},"listeners":%s}]`, tt.listeners)), &cfg.Spec.Components.Dataplane.Sidecars); err != nil {
./api/v1alpha1/operator_placement_test.go:31:			if (err != nil) != tt.wantErr {
./api/v1alpha1/operator_placement_test.go:57:			if (err != nil) != tt.wantErr {
./api/v1alpha1/operator_placement_test.go:66:	if err := json.Unmarshal([]byte(`{"name":"client","containers":[{"name":"worker","image":{"name":"client"}}],"listeners":[]}`), &operator); err != nil {
./api/v1alpha1/operator_placement_test.go:70:	if err != nil {
./api/v1alpha1/operator_placement_test.go:74:	if err := json.Unmarshal(raw, &encoded); err != nil {
./api/v1alpha1/operator_placement_test.go:107:					if err == nil || !strings.Contains(err.Error(), "private network namespace") {
./api/v1alpha1/operator_placement_test.go:110:				} else if err != nil {
./api/v1alpha1/operator_validation.go:25:	if listeners == nil {
./api/v1alpha1/operator_validation.go:43:	if err := json.Unmarshal(raw, &object); err != nil {
./api/v1alpha1/operator_validation.go:55:		if err := json.Unmarshal(child, &object); err != nil {
./api/v1alpha1/operator_validation.go:63:			if err := json.Unmarshal(value, &items); err != nil {
./api/v1alpha1/operator_validation.go:69:				if err := json.Unmarshal(item["name"], &name); err != nil || name == "" || seen[name] {
./api/v1alpha1/yanet_webhook.go:69:	if y.DeletionTimestamp != nil {
./api/v1alpha1/yanet_webhook.go:107:	if err := validateYanetComponentOverrideShape(y.Spec.Components); err != nil {
./api/v1alpha1/yanet_webhook.go:112:	if err := v.Client.Get(ctx, client.ObjectKey{Name: YanetConfigName}, config); err != nil {
./api/v1alpha1/yanet_webhook.go:122:			if err := ValidateYanetComponentOverrides(y.Spec.Components, &spec.Components, box); err != nil {
./api/v1alpha1/yanet_webhook.go:146:	if err := validateYanetComponentOverrideShape(overrides); err != nil {
./api/v1alpha1/yanet_webhook.go:149:	if overrides == nil {
./api/v1alpha1/yanet_webhook.go:152:	if declared == nil {
./api/v1alpha1/yanet_webhook.go:155:	if box == nil {
./api/v1alpha1/yanet_webhook.go:158:	if err := validateDataplaneOverride(overrides.Dataplane, &declared.Dataplane, box.Components.Dataplane); err != nil {
./api/v1alpha1/yanet_webhook.go:161:	if overrides.BirdAdapter != nil {
./api/v1alpha1/yanet_webhook.go:162:		if declared.BirdAdapter == nil {
./api/v1alpha1/yanet_webhook.go:165:		if box.Components.BirdAdapter == nil {
./api/v1alpha1/yanet_webhook.go:207:	if overrides == nil {
./api/v1alpha1/yanet_webhook.go:210:	if declared == nil {

Automated analysis using static analysis tools and pattern matching

Preserve ownership-safe cleanup under node conflicts, report read-only drift accurately, and retain patched init containers and NAD namespace identity. Wire admission TLS, custom ports and ServiceAccounts across deployment artifacts; propagate CI failures. Limit controlplane fan-out to four NUMA domains and add regression coverage with failure-sensitivity checks.

Refs: NOCDEV-22322
@github-actions

Copy link
Copy Markdown

🤖 AI Code Review

This workflow runs:

  • Staticcheck
  • gosec
  • go vet
  • The full test suite with the Go race detector and envtest

🔍 Static Analysis Results

📊 Staticcheck

internal/controller/shared_services.go:76:32: error strings should not be capitalized (ST1005)
internal/controller/shared_services.go:127:34: error strings should not be capitalized (ST1005)
internal/controller/yanet_reconciler.go:151:22: (sigs.k8s.io/controller-runtime.Result).Requeue is deprecated: Use `RequeueAfter` instead.  (SA1019)
internal/controller/yanet_reconciler.go:1043:10: error strings should not be capitalized (ST1005)
internal/controller/yanet_reconciler.go:1046:10: error strings should not be capitalized (ST1005)
internal/controller/yanet_reconciler.go:1050:10: error strings should not be capitalized (ST1005)
internal/controller/yanet_reconciler.go:1062:10: error strings should not be capitalized (ST1005)
internal/controller/yanet_reconciler.go:1065:10: error strings should not be capitalized (ST1005)
internal/controller/yanet_reconciler.go:1069:10: error strings should not be capitalized (ST1005)
internal/manifests/service.go:57:10: error strings should not be capitalized (ST1005)
internal/manifests/service.go:60:10: error strings should not be capitalized (ST1005)
internal/manifests/service.go:63:10: error strings should not be capitalized (ST1005)
internal/manifests/service.go:66:10: error strings should not be capitalized (ST1005)
internal/manifests/service.go:73:11: error strings should not be capitalized (ST1005)
internal/manifests/service.go:76:11: error strings should not be capitalized (ST1005)
internal/manifests/service.go:80:11: error strings should not be capitalized (ST1005)
internal/manifests/service.go:83:11: error strings should not be capitalized (ST1005)
internal/manifests/service.go:87:11: error strings should not be capitalized (ST1005)

🔒 Security Analysis (gosec)

✅ No security issues found

🔧 Go Vet

✅ No issues found

🏁 Race Detector

✅ Full test suite passed with the race detector


Passing checks do not prove the absence of races or deadlocks, or correctness of context and goroutine lifecycles.

Use explicit RequeueAfter for finalizer initialization and actionable lowercase error prefixes without suppressing checks. Verify the public finalizer follow-up creates owned, synced workloads.

Refs: NOCDEV-22322
@github-actions

Copy link
Copy Markdown

🤖 AI Code Review

This workflow runs:

  • Staticcheck
  • gosec
  • go vet
  • The full test suite with the Go race detector and envtest

🔍 Static Analysis Results

📊 Staticcheck

✅ No issues found

🔒 Security Analysis (gosec)

✅ No security issues found

🔧 Go Vet

✅ No issues found

🏁 Race Detector

✅ Full test suite passed with the race detector


Passing checks do not prove the absence of races or deadlocks, or correctness of context and goroutine lifecycles.

@borislitv
borislitv marked this pull request as ready for review September 26, 2026 06:04
@borislitv
borislitv merged commit 0453843 into main Sep 26, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant