- Config loader with env var expansion and validation - SQLite database with tasks and toolchain_versions tables - Gitea REST API client for repository and branch operations - K8s client for Job lifecycle management (with noop fallback for local dev) - REST API: tasks CRUD, retry, plugins, version management - Worker/scheduler with polling, concurrency control, and job tracking - Static frontend: generate, tasks, settings pages - Toolchain images: Go and Node.js Dockerfiles with entrypoint scripts - Helm chart with deployment, service, configmap, ingress, PVC - Multi-stage Dockerfile for service - Unit tests for config, database, gitclient, k8s, api, worker - E2E tests for idempotency, version switch, failure recovery
81 lines
2.0 KiB
Go
81 lines
2.0 KiB
Go
package k8s
|
|
|
|
import (
|
|
"testing"
|
|
|
|
batchv1 "k8s.io/api/batch/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/client-go/kubernetes/fake"
|
|
)
|
|
|
|
func TestCreateJob(t *testing.T) {
|
|
clientset := fake.NewSimpleClientset()
|
|
client := NewClientFromInterface(clientset)
|
|
|
|
job, err := client.CreateJob(&JobSpec{
|
|
Name: "test-job",
|
|
Namespace: "default",
|
|
Image: "test-image:v1",
|
|
EnvVars: map[string]string{"KEY": "value"},
|
|
TimeoutSecond: 300,
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("CreateJob: %v", err)
|
|
}
|
|
if job.Name != "test-job" {
|
|
t.Errorf("Name = %q, want %q", job.Name, "test-job")
|
|
}
|
|
if job.Status != JobPending {
|
|
t.Errorf("Status = %q, want %q", job.Status, JobPending)
|
|
}
|
|
}
|
|
|
|
func TestGetJob(t *testing.T) {
|
|
clientset := fake.NewSimpleClientset(&batchv1.Job{
|
|
ObjectMeta: metav1.ObjectMeta{Name: "done-job", Namespace: "default"},
|
|
Status: batchv1.JobStatus{Succeeded: 1},
|
|
})
|
|
client := NewClientFromInterface(clientset)
|
|
|
|
job, err := client.GetJob("done-job", "default")
|
|
if err != nil {
|
|
t.Fatalf("GetJob: %v", err)
|
|
}
|
|
if job.Status != JobSucceeded {
|
|
t.Errorf("Status = %q, want %q", job.Status, JobSucceeded)
|
|
}
|
|
}
|
|
|
|
func TestGetJob_Running(t *testing.T) {
|
|
clientset := fake.NewSimpleClientset(&batchv1.Job{
|
|
ObjectMeta: metav1.ObjectMeta{Name: "run-job", Namespace: "default"},
|
|
Status: batchv1.JobStatus{Active: 1},
|
|
})
|
|
client := NewClientFromInterface(clientset)
|
|
|
|
job, err := client.GetJob("run-job", "default")
|
|
if err != nil {
|
|
t.Fatalf("GetJob: %v", err)
|
|
}
|
|
if job.Status != JobRunning {
|
|
t.Errorf("Status = %q, want %q", job.Status, JobRunning)
|
|
}
|
|
}
|
|
|
|
func TestDeleteJob(t *testing.T) {
|
|
clientset := fake.NewSimpleClientset(&batchv1.Job{
|
|
ObjectMeta: metav1.ObjectMeta{Name: "del-job", Namespace: "default"},
|
|
})
|
|
client := NewClientFromInterface(clientset)
|
|
|
|
err := client.DeleteJob("del-job", "default")
|
|
if err != nil {
|
|
t.Fatalf("DeleteJob: %v", err)
|
|
}
|
|
|
|
_, err = clientset.BatchV1().Jobs("default").Get(nil, "del-job", metav1.GetOptions{})
|
|
if err == nil {
|
|
t.Error("expected error getting deleted job")
|
|
}
|
|
}
|