Ctrl K
ComunidadGuías…

api/controller/cleanup_node_inventory.go

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

Archivo original ↗Preguntar a KiBot
package controller

import (
	"encoding/json"
	"net/http"
	"os"

	guard "github.com/goodrain/rainbond/pkg/cleanup"
	"github.com/goodrain/rainbond/pkg/cleanup/kubeidentity"
	httputil "github.com/goodrain/rainbond/util/http"
	batchv1 "k8s.io/api/batch/v1"
	"k8s.io/apimachinery/pkg/util/validation"
)

func systemNodeInventorySettings() kubeidentity.NodeInventorySettings {
	return kubeidentity.NodeInventorySettings{Region: os.Getenv("REGION_NAME"), Image: os.Getenv("CLEANUP_NODE_EXECUTOR_IMAGE"), IncludePackages: os.Getenv("CLEANUP_NODE_PACKAGE_INVENTORY") == "true"}
}

// CollectManagedCache starts an authenticated, manually requested inventory job.
// Paths, images and storage names come from trusted installation configuration.
func (h *CleanupCoordinationHandler) CollectManagedCache(w http.ResponseWriter, r *http.Request) {
	var body struct {
		Pod    string `json:"pod"`
		PodUID string `json:"pod_uid"`
		ScanID string `json:"scan_id"`
	}
	if !coordinationDecode(w, r, &body) {
		return
	}
	if len(validation.IsDNS1123Subdomain(body.Pod)) != 0 || !registryPodUID.MatchString(body.PodUID) || !registryPodUID.MatchString(body.ScanID) {
		httputil.ReturnError(r, w, 400, "INVALID_MANAGED_CACHE_SCAN")
		return
	}
	if h.gcTarget == nil || h.inventorySettings == nil {
		coordinationError(w, r, guard.ErrCoordinationUnavailable)
		return
	}
	client, namespace, _, err := h.gcTarget()
	if err != nil || client == nil {
		coordinationError(w, r, guard.ErrCoordinationUnavailable)
		return
	}
	observed, err := kubeidentity.InspectManagedBuildCacheSource(r.Context(), client, namespace, body.Pod, body.PodUID)
	if err != nil {
		coordinationError(w, r, guard.ErrCoordinationChanged)
		return
	}
	binding, err := guard.ProvisionManagedCacheStorage(h.database(), observed.Mount.VolumeUID, observed.Root)
	if err != nil {
		coordinationError(w, r, err)
		return
	}
	settings := h.inventorySettings()
	settings.ScanID = body.ScanID
	fresh := func() (*batchv1.Job, error) {
		return kubeidentity.BuildManagedCacheInventoryJob(r.Context(), client, namespace, body.Pod, body.PodUID, binding, settings)
	}
	template, err := fresh()
	if err != nil {
		coordinationError(w, r, guard.ErrCoordinationChanged)
		return
	}
	job, err := guard.RunNodeInventoryJob(r.Context(), client.BatchV1().Jobs(namespace), body.ScanID, template, fresh)
	if err != nil {
		coordinationError(w, r, err)
		return
	}
	state := "submitted"
	var report json.RawMessage
	if job.Status.Succeeded > 0 {
		state = "succeeded"
		report, err = kubeidentity.ReadNodeInventoryReport(r.Context(), client, job, binding, settings)
		if err != nil {
			coordinationError(w, r, guard.ErrCoordinationUnavailable)
			return
		}
	} else if job.Status.Failed > 0 {
		state = "failed"
	}
	httputil.ReturnSuccess(r, w, struct {
		Protocol   int             `json:"protocol"`
		State      string          `json:"state"`
		JobName    string          `json:"job_name"`
		JobUID     string          `json:"job_uid"`
		StorageID  string          `json:"storage_id"`
		NodeUID    string          `json:"node_uid"`
		Generation string          `json:"generation"`
		Report     json.RawMessage `json:"report,omitempty"`
	}{1, state, job.Name, string(job.UID), binding.StorageID, observed.NodeUID, binding.Generation, report})
}