Add Gitea, Cloudflare DNS, and Kubernetes deployer adapters following hexagonal architecture. These enable automated project provisioning: - Git repository creation/management via Gitea - DNS record management via Cloudflare - Container deployment to Kubernetes Includes domain models, ports, handlers, and Woodpecker CI webhook integration for automated deployments on push. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
45 lines
1.7 KiB
Go
45 lines
1.7 KiB
Go
// Package domain contains pure domain models with no external dependencies.
|
|
package domain
|
|
|
|
import "time"
|
|
|
|
// DeploySpec defines a deployment request.
|
|
type DeploySpec struct {
|
|
ProjectName string // Project identifier
|
|
Image string // Container image (e.g., zot.threesix.svc:5000/myapp:latest)
|
|
Domain string // Domain for ingress (e.g., myapp.threesix.ai)
|
|
Port int // Container port to expose
|
|
Replicas int // Number of replicas
|
|
EnvVars map[string]string // Plain environment variables
|
|
Secrets map[string]string // Secret environment variables (stored in K8s Secret)
|
|
}
|
|
|
|
// DeployStatus represents the current state of a deployment.
|
|
type DeployStatus struct {
|
|
ProjectName string
|
|
Image string
|
|
Replicas int
|
|
ReadyReplicas int
|
|
URL string
|
|
Status DeploymentStatus
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
}
|
|
|
|
// DeploymentStatus represents the state of a deployment.
|
|
type DeploymentStatus string
|
|
|
|
const (
|
|
DeploymentStatusNone DeploymentStatus = "none" // No deployment exists
|
|
DeploymentStatusPending DeploymentStatus = "pending" // Deployment created, waiting for pods
|
|
DeploymentStatusRunning DeploymentStatus = "running" // All pods are ready
|
|
DeploymentStatusFailed DeploymentStatus = "failed" // Pods failed to start
|
|
DeploymentStatusUpdating DeploymentStatus = "updating" // Rolling update in progress
|
|
DeploymentStatusUnknown DeploymentStatus = "unknown" // Status could not be determined
|
|
)
|
|
|
|
// IsReady returns true if the deployment is fully available.
|
|
func (s DeploymentStatus) IsReady() bool {
|
|
return s == DeploymentStatusRunning
|
|
}
|