import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, } from 'typeorm'; import { ClusterStatus } from '../../common/enums'; export type ClusterHealthStatus = 'unknown' | 'healthy' | 'degraded' | 'unhealthy'; @Entity('clusters') export class Cluster { @PrimaryGeneratedColumn('uuid') id: string; @Column() name: string; @Column({ nullable: true }) description: string; @Column({ type: 'enum', enum: ClusterStatus, default: ClusterStatus.ACTIVE }) status: ClusterStatus; @Column({ type: 'text' }) kubeconfig: string; // Encrypted kubeconfig content @Column() apiServer: string; @Column({ nullable: true }) region: string; @Column({ default: 1 }) weight: number; @Column({ type: 'jsonb', default: [] }) tags: string[]; @Column({ default: 'unknown' }) healthStatus: ClusterHealthStatus; @Column({ type: 'timestamptz', nullable: true }) lastHealthCheckedAt: Date; @Column({ nullable: true }) healthMessage: string; @Column({ type: 'jsonb', nullable: true }) availableResources: Record; @Column({ nullable: true }) provider: string; // e.g., 'aws', 'gcp', 'azure', 'bare-metal' @Column({ default: false }) isDefault: boolean; // Resource quotas (cluster-level defaults for new namespaces) @Column({ default: '4' }) defaultCpuLimit: string; @Column({ default: '8Gi' }) defaultMemoryLimit: string; @Column({ default: 10 }) maxAppsPerUser: number; @Column({ type: 'jsonb', nullable: true }) metadata: Record; @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; }