~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
138 lines · 3.9 KB Raw History
package controller

import (
	"bytes"
	"encoding/json"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	policyv1alpha1 "github.com/johnandersen777/socialweb-computer-kcp/api/policy/v1alpha1"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/policyengine/models"
	policyengine "github.com/johnandersen777/socialweb-computer-kcp/internal/policyengine/status"
)

func CacheFromAPI(value policyv1alpha1.PolicyCache) models.Cache {
	if value == nil {
		return models.Cache{}
	}
	out := make(models.Cache, len(value))
	for key, entry := range value {
		files := make(models.CacheEntry, len(entry))
		for path, file := range entry {
			encoding := models.CacheEncodingText
			if file.Encoding == policyv1alpha1.PolicyCacheEncodingBase64 {
				encoding = models.CacheEncodingBase64
			}
			files[path] = models.CacheFile{Data: file.Data, Encoding: encoding}
		}
		out[key] = files
	}
	return out
}

func CacheToAPI(value models.Cache) policyv1alpha1.PolicyCache {
	if value == nil {
		return nil
	}
	out := make(policyv1alpha1.PolicyCache, len(value))
	for key, entry := range value {
		files := make(policyv1alpha1.PolicyCacheEntry, len(entry))
		for path, file := range entry {
			encoding := policyv1alpha1.PolicyCacheEncodingText
			if file.Encoding == models.CacheEncodingBase64 {
				encoding = policyv1alpha1.PolicyCacheEncodingBase64
			}
			files[path] = policyv1alpha1.PolicyCacheFile{Data: file.Data, Encoding: encoding}
		}
		out[key] = files
	}
	return out
}

func RunStatusFromOutcome(outcome Outcome) policyv1alpha1.PolicyWorkflowRunStatus {
	value := policyv1alpha1.PolicyWorkflowRunStatus{
		Phase:          runPhase(outcome.Status.Phase),
		RunID:          outcome.Status.RunID,
		ExitStatus:     exitStatus(outcome.Status.ExitStatus),
		Cache:          CacheToAPI(outcome.Status.Cache),
		ConsoleOutput:  outcome.Status.ConsoleOutput,
		Restarts:       outcome.Status.Restarts,
		StartTime:      outcome.Status.StartedAt,
		CompletionTime: outcome.Status.CompletedAt,
		Conditions:     append([]metav1.Condition(nil), outcome.Status.Conditions...),
	}
	if len(outcome.Status.Outputs) > 0 {
		value.Outputs = make(map[string]json.RawMessage, len(outcome.Status.Outputs))
		for key, item := range outcome.Status.Outputs {
			if data, err := json.Marshal(item); err == nil {
				value.Outputs[key] = data
			}
		}
	}
	if len(outcome.Status.Annotations) > 0 {
		value.Annotations = annotationsToAPI(outcome.Status.Annotations)
	}
	return value
}

func annotationsToAPI(value models.Annotations) map[string]json.RawMessage {
	if len(value) == 0 {
		return nil
	}
	out := make(map[string]json.RawMessage, len(value))
	for key, item := range value {
		data, err := json.Marshal(item)
		if err != nil {
			continue
		}
		trimmed := bytes.TrimSpace(data)
		if len(trimmed) == 0 {
			continue
		}
		switch trimmed[0] {
		case '[':
			wrapped, err := json.Marshal(map[string]json.RawMessage{"items": json.RawMessage(trimmed)})
			if err != nil {
				continue
			}
			out[key] = wrapped
		case '{':
			out[key] = append(json.RawMessage(nil), trimmed...)
		default:
			wrapped, err := json.Marshal(map[string]json.RawMessage{"value": json.RawMessage(trimmed)})
			if err != nil {
				continue
			}
			out[key] = wrapped
		}
	}
	if len(out) == 0 {
		return nil
	}
	return out
}

func runPhase(value policyengine.Phase) policyv1alpha1.PolicyWorkflowRunPhase {
	switch value {
	case policyengine.PhaseSucceeded:
		return policyv1alpha1.PolicyWorkflowRunSucceeded
	case policyengine.PhaseFailed:
		return policyv1alpha1.PolicyWorkflowRunFailed
	case policyengine.PhaseCancelled:
		return policyv1alpha1.PolicyWorkflowRunCancelled
	case policyengine.PhaseRunning:
		return policyv1alpha1.PolicyWorkflowRunRunning
	default:
		return policyv1alpha1.PolicyWorkflowRunPending
	}
}

func exitStatus(value models.ExitStatus) policyv1alpha1.PolicyExitStatus {
	if value == models.ExitSuccess {
		return policyv1alpha1.PolicyExitStatusSuccess
	}
	if value == models.ExitFailure {
		return policyv1alpha1.PolicyExitStatusFailure
	}
	return ""
}