// File: api/v1alpha1/kat.proto syntax = "proto3"; package v1alpha1; option go_package = "git.dws.rip/dubey/kat"; // Adjust to your actual go module path import "google/protobuf/timestamp.proto"; // Common Metadata (RFC 3.2, Phase 0 Docs) message ObjectMeta { string name = 1; string namespace = 2; string uid = 3; int64 generation = 4; string resource_version = 5; // e.g., etcd ModRevision google.protobuf.Timestamp creation_timestamp = 6; map labels = 7; map annotations = 8; } // Workload (RFC 3.2) enum WorkloadType { WORKLOAD_TYPE_UNSPECIFIED = 0; SERVICE = 1; JOB = 2; DAEMON_SERVICE = 3; } message GitSource { string repository = 1; string branch = 2; string tag = 3; string commit = 4; } message WorkloadSource { oneof source_type { string image = 1; // Direct image reference GitSource git = 2; // Build from Git } string cache_image = 3; // Optional: Registry path for build cache layers (used with git source) } enum UpdateStrategyType { UPDATE_STRATEGY_TYPE_UNSPECIFIED = 0; ROLLING = 1; SIMULTANEOUS = 2; } message RollingUpdateStrategy { string max_surge = 1; // Can be int or percentage string e.g., "1" or "10%" } message UpdateStrategy { UpdateStrategyType type = 1; RollingUpdateStrategy rolling = 2; // Relevant if type is ROLLING } enum RestartCondition { RESTART_CONDITION_UNSPECIFIED = 0; NEVER = 1; MAX_COUNT = 2; ALWAYS = 3; } message RestartPolicy { RestartCondition condition = 1; int32 max_restarts = 2; // Used if condition=MAX_COUNT int32 reset_seconds = 3; // Used if condition=MAX_COUNT } message Toleration { string key = 1; enum Operator { OPERATOR_UNSPECIFIED = 0; EXISTS = 1; EQUAL = 2; } Operator operator = 2; string value = 3; // Needed if operator=EQUAL enum Effect { EFFECT_UNSPECIFIED = 0; NO_SCHEDULE = 1; PREFER_NO_SCHEDULE = 2; // NO_EXECUTE (not in RFC v1 scope for tolerations, but common) } Effect effect = 4; } message EnvVar { string name = 1; string value = 2; } message VolumeMount { string name = 1; // Volume name from spec.volumes string mount_path = 2; // Path inside container string sub_path = 3; // Optional: Mount sub-directory bool read_only = 4; // Optional: Default false } message ResourceRequests { string cpu = 1; // e.g., "100m" string memory = 2; // e.g., "64Mi" } message ResourceLimits { string cpu = 1; // e.g., "1" string memory = 2; // e.g., "256Mi" } enum GPUDriver { GPU_DRIVER_UNSPECIFIED = 0; ANY = 1; NVIDIA = 2; AMD = 3; } message GPUSpec { GPUDriver driver = 1; int32 min_vram_mb = 2; // Minimum GPU memory required } message ContainerResources { ResourceRequests requests = 1; ResourceLimits limits = 2; GPUSpec gpu = 3; } message Container { string name = 1; // Optional: Informational name repeated string command = 2; repeated string args = 3; repeated EnvVar env = 4; repeated VolumeMount volume_mounts = 5; ContainerResources resources = 6; } message SimpleClusterStorageVolumeSource { // Empty, implies agent creates dir under volumeBasePath } enum HostPathType { HOST_PATH_TYPE_UNSPECIFIED = 0; // No check, mount whatever is there or fail DIRECTORY_OR_CREATE = 1; DIRECTORY = 2; FILE_OR_CREATE = 3; FILE = 4; SOCKET = 5; } message HostMountVolumeSource { string host_path = 1; // Absolute path on host HostPathType ensure_type = 2; // Optional: Type to ensure/check } message Volume { string name = 1; // Name referenced by volumeMounts oneof volume_source { SimpleClusterStorageVolumeSource simple_cluster_storage = 2; HostMountVolumeSource host_mount = 3; } } message WorkloadSpec { WorkloadType type = 1; WorkloadSource source = 2; int32 replicas = 3; // Required for SERVICE UpdateStrategy update_strategy = 4; RestartPolicy restart_policy = 5; map node_selector = 6; repeated Toleration tolerations = 7; Container container = 8; repeated Volume volumes = 9; } message WorkloadStatus { // Placeholder for Phase 0. Will be expanded later. // Example fields: // int32 observed_generation = 1; // int32 ready_replicas = 2; // string condition = 3; // e.g., "Available", "Progressing", "Failed" } message Workload { ObjectMeta metadata = 1; WorkloadSpec spec = 2; WorkloadStatus status = 3; } // VirtualLoadBalancer (RFC 3.3) message PortSpec { string name = 1; // Optional: e.g., "web", "grpc" int32 container_port = 2; // Port app listens on in container string protocol = 3; // Optional: TCP | UDP. Default TCP. } message ExecHealthCheck { repeated string command = 1; // Exit 0 = healthy } message HealthCheck { ExecHealthCheck exec = 1; int32 initial_delay_seconds = 2; int32 period_seconds = 3; int32 timeout_seconds = 4; int32 success_threshold = 5; int32 failure_threshold = 6; } message IngressRule { string host = 1; string path = 2; string service_port_name = 3; // Name of port from PortSpec int32 service_port = 4; // Port number from PortSpec (overrides name) bool tls = 5; // Signal for ACME } message VirtualLoadBalancerSpec { repeated PortSpec ports = 1; HealthCheck health_check = 2; repeated IngressRule ingress = 3; } message VirtualLoadBalancer { ObjectMeta metadata = 1; // Name likely matches Workload name VirtualLoadBalancerSpec spec = 2; // VirtualLoadBalancerStatus status = 3; // Placeholder } // JobDefinition (RFC 3.4) message JobDefinitionSpec { string schedule = 1; // Optional: Cron schedule int32 completions = 2; // Optional: Default 1 int32 parallelism = 3; // Optional: Default 1 int32 active_deadline_seconds = 4; // Optional int32 backoff_limit = 5; // Optional: Default 3 } message JobDefinition { ObjectMeta metadata = 1; // Name likely matches Workload name JobDefinitionSpec spec = 2; // JobDefinitionStatus status = 3; // Placeholder } // BuildDefinition (RFC 3.5) message BuildCache { string registry_path = 1; // e.g., "myreg.com/cache/myapp" } message BuildDefinitionSpec { string build_context = 1; // Optional: Path relative to repo root. Defaults to "." string dockerfile_path = 2; // Optional: Path relative to buildContext. Defaults to "./Dockerfile" map build_args = 3; // Optional string target_stage = 4; // Optional string platform = 5; // Optional: e.g., "linux/arm64" BuildCache cache = 6; // Optional } message BuildDefinition { ObjectMeta metadata = 1; // Name likely matches Workload name BuildDefinitionSpec spec = 2; // BuildDefinitionStatus status = 3; // Placeholder } // Namespace (RFC 3.7) message NamespaceSpec { // Potentially finalizers or other future spec fields } message NamespaceStatus { // string phase = 1; // e.g., "Active", "Terminating" } message Namespace { ObjectMeta metadata = 1; NamespaceSpec spec = 2; NamespaceStatus status = 3; } // Node (Internal Representation - RFC 3.8) message NodeResources { string cpu = 1; // e.g., "2000m" string memory = 2; // e.g., "4096Mi" map custom_resources = 3; // e.g., for GPUs "nvidia.com/gpu: 2" } message NodeStatusDetails { NodeResources capacity = 1; NodeResources allocatable = 2; // repeated WorkloadInstanceStatus workload_instances = 3; // Define later // OverlayNetworkStatus overlay_network = 4; // Define later string condition = 5; // e.g., "Ready", "NotReady", "Draining" google.protobuf.Timestamp last_heartbeat_time = 6; } message Taint { // From RFC 1.5, used in NodeSpec string key = 1; string value = 2; enum Effect { EFFECT_UNSPECIFIED = 0; NO_SCHEDULE = 1; PREFER_NO_SCHEDULE = 2; // NO_EXECUTE (not in RFC v1 scope for taints, but common) } Effect effect = 3; } message NodeSpec { repeated Taint taints = 1; string overlay_subnet = 2; // Assigned by leader // string provider_id = 3; // Cloud provider specific ID // map labels = 4; // Node labels, distinct from metadata.labels // map annotations = 5; // Node annotations } message Node { ObjectMeta metadata = 1; // Name is the unique node name/ID NodeSpec spec = 2; NodeStatusDetails status = 3; } // ClusterConfiguration (RFC 3.9) message ClusterConfigurationSpec { string cluster_cidr = 1; string service_cidr = 2; int32 node_subnet_bits = 3; string cluster_domain = 4; int32 agent_port = 5; int32 api_port = 6; int32 etcd_peer_port = 7; int32 etcd_client_port = 8; string volume_base_path = 9; string backup_path = 10; int32 backup_interval_minutes = 11; int32 agent_tick_seconds = 12; int32 node_loss_timeout_seconds = 13; } message ClusterConfiguration { ObjectMeta metadata = 1; // e.g., name of the cluster ClusterConfigurationSpec spec = 2; // ClusterConfigurationStatus status = 3; // Placeholder }