# schemas/lib/storage_config.ncl — StorageConfig contracts # # Library file — import only, not directly exportable. # # Usage (component contracts.ncl): # let sc = import "schemas/lib/storage_config.ncl" in # requires | { storage | sc.StorageRequires | optional, ... } # # Usage (provider metadata.ncl or capabilities.ncl): # let sc = import "schemas/lib/storage_config.ncl" in # storage_policy | sc.ProviderStoragePolicy = sc.HetznerCSIPolicy { VolumeMode = [| 'block, 'nfs, 'object |], ExpansionPolicy = [| 'static, 'expand_only, 'full |], # Contract for component requires.storage — what a component declares it needs. StorageRequires = { size | String, persistent | Bool | default = true, volume_mode | VolumeMode | default = 'block, access_mode | String | default = "ReadWriteOnce", storage_class | String | optional, }, # Abstract contract for provider storage policies. # Concrete policies (HetznerCSIPolicy, etc.) must supply all fields. ProviderStoragePolicy = { provider | String, min_size | String | default = "1Gi", max_size | String | optional, expansion_policy | ExpansionPolicy | default = 'static, volume_modes | Array VolumeMode | default = ['block], }, # Hetzner hcloud-volumes: minimum 10Gi, expand-only (no shrink via CSI). HetznerCSIPolicy | ProviderStoragePolicy = { provider = "hcloud-volumes", min_size = "10Gi", expansion_policy = 'expand_only, volume_modes = ['block], }, # democratic-csi NFS: fine-grained sizing, full expand/shrink, RWX capable. DemocraticCSINFSPolicy | ProviderStoragePolicy = { provider = "democratic-csi-nfs", min_size = "1Gi", expansion_policy = 'full, volume_modes = ['nfs], }, }