Ctrl K
ComunidadGuías…

api/controller/cleanup_registry_readiness_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package controller

import (
	"bytes"
	"context"
	"encoding/json"
	"net/http/httptest"
	"path/filepath"
	"strings"
	"testing"

	"github.com/go-chi/chi"
	"github.com/goodrain/rainbond/db/model"
	guard "github.com/goodrain/rainbond/pkg/cleanup"
	"github.com/jinzhu/gorm"
)

// The observed fixtures exercise SQL/HTTP contracts, not production deployment proof.
func installRegistryCoverageFixture(t *testing.T, h *CleanupCoordinationHandler, binding guard.StorageRegistration) *[]guard.ReferenceWriter {
	t.Helper()
	database := h.database()
	if err := database.AutoMigrate(&model.CleanupParticipant{}, &model.CleanupReferenceWriter{}, &model.VersionInfo{}, &model.TenantPluginBuildVersion{}, &model.K8sResource{}, &model.KeyValue{}).Error; err != nil {
		t.Fatal(err)
	}
	fingerprint, _ := binding.Fingerprint()
	ingress := guard.ParticipantRegistration{StorageID: binding.StorageID, Generation: binding.Generation, Owner: "proxy:owned", Role: "registry-ingress", PodUID: "proxy-pod", ContainerID: "containerd://proxy", ImageID: "proxy-image", BindingFingerprint: fingerprint}
	if err := guard.RegisterParticipant(database, ingress); err != nil {
		t.Fatal(err)
	}
	writers := []guard.ReferenceWriter{}
	for role, name := range map[string]string{"api": "rbd-api", "worker": "rbd-worker", "builder": "rbd-chaos", "console": "rbd-app-ui"} {
		writer := guard.ReferenceWriter{Namespace: "system", PodName: name, PodUID: "pod-" + role, ContainerName: name, ContainerID: "containerd://" + role, ImageID: "image-" + role, Role: role, Protocol: guard.ReferenceWriterProtocol}
		if err := guard.RegisterReferenceWriter(database, writer); err != nil {
			t.Fatal(err)
		}
		writers = append(writers, writer)
	}
	h.inspectRegistryCoverage = func(context.Context, guard.StorageRegistration, []guard.ParticipantRegistration) (guard.RegistryCoverage, error) {
		return guard.RegistryCoverage{Ingress: []guard.ParticipantRegistration{ingress}, Writers: writers, References: guard.RegionReferenceInventory{Complete: true}}, nil
	}
	if _, ready, err := h.certifyRegistry(context.Background(), binding, nil); err != nil || !ready {
		t.Fatal("fixture not certified", ready, err)
	}
	return &writers
}

// capability_id: rainbond.cleanup.registry-permit-fresh-coverage
func TestRegistryPermitRevalidatesCurrentCoverage(t *testing.T) {
	database, err := gorm.Open("sqlite3", filepath.Join(t.TempDir(), "permit.db"))
	if err != nil {
		t.Fatal(err)
	}
	defer database.Close()
	database.LogMode(false)
	if err := database.AutoMigrate(&model.CleanupStorage{}, &model.CleanupOperation{}).Error; err != nil {
		t.Fatal(err)
	}
	binding, err := guard.ProvisionRegistryStorage(database, "owned-volume", "/owned/registry")
	if err != nil {
		t.Fatal(err)
	}
	h := &CleanupCoordinationHandler{database: func() *gorm.DB { return database }, permitKey: func() []byte { return []byte(strings.Repeat("owned-fixture-", 4)) }}
	writers := installRegistryCoverageFixture(t, h, binding)
	request := guard.CoordinationRequest{StorageID: binding.StorageID, Generation: binding.Generation, OperationID: "selected", Owner: "plugin", Kind: "delete", Scope: "app", Target: "sha256:" + strings.Repeat("a", 64), Fingerprint: "selection"}
	if _, err := guard.AcquireOperation(database, request); err != nil {
		t.Fatal(err)
	}
	router := chi.NewRouter()
	router.Post("/stores/{storage_id}/operations/{operation_id}/registry-permit", h.RegistryPermit)
	invoke := func() *httptest.ResponseRecorder {
		raw, _ := json.Marshal(request)
		result := httptest.NewRecorder()
		router.ServeHTTP(result, httptest.NewRequest("POST", "/stores/"+binding.StorageID+"/operations/selected/registry-permit", bytes.NewReader(raw)))
		return result
	}
	if result := invoke(); result.Code != 200 {
		t.Fatal("valid original selection denied", result.Code)
	}
	(*writers)[0].ContainerID = "containerd://replacement"
	if result := invoke(); result.Code == 200 || strings.Contains(result.Body.String(), "\"permit\"") {
		t.Fatal("stale scan received permit", result.Code)
	}
}