import {z} from 'zod' export type DbaasServiceName = string; export type GetApiDbaasKafkaNameArgs = {name: DbaasServiceName}; export type GetApiDbaasKafkaNameOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const dbaasIntegration = z.object({description: z.string().optional(), settings: z.object({}).optional(), type: z.string().optional(), "is-enabled": z.boolean().optional(), source: z.string().optional(), "is-active": z.boolean().optional(), status: z.string().optional(), id: z.string().optional(), dest: z.string().optional()}); export const dbaasNodeStateProgressUpdate = z.object({completed: z.boolean(), current: z.number().int().gte(0).optional(), max: z.number().int().gte(0).optional(), min: z.number().int().gte(0).optional(), phase: z.enum(["stream", "basebackup", "prepare", "finalize"]), unit: z.string().optional()}); export const dbaasNodeState = z.object({name: z.string(), "progress-updates": z.array(dbaasNodeStateProgressUpdate).optional(), role: z.enum(["standby", "master", "read-replica"]).optional(), state: z.enum(["leaving", "running", "syncing_data", "setting_up_vm", "unknown"])}); export const dbaasServiceName = z.string().max(63); export const dbaasServiceTypeName = z.string().max(64); export const enumServiceState = z.enum(["running", "rebuilding", "rebalancing", "poweroff"]); export const jsonSchemaSchemaRegistry = z.object({leader_eligibility: z.boolean().optional(), topic_name: z.string().min(1).max(249).optional()}); export const dbaasServiceBackup = z.object({"backup-name": z.string(), "backup-time": z.string(), "data-size": z.number().int().gte(0)}); export const jsonSchemaKafkaRest = z.object({producer_compression_type: z.enum(["gzip", "snappy", "lz4", "zstd", "none"]).optional(), name_strategy_validation: z.boolean().optional(), name_strategy: z.enum(["topic_name", "record_name", "topic_record_name"]).optional(), consumer_enable_auto_commit: z.boolean().optional(), producer_acks: z.enum(["all", "-1", "0", "1"]).optional(), consumer_request_max_bytes: z.number().int().gte(0).lte(671088640).optional(), producer_max_request_size: z.number().int().gte(0).lte(2147483647).optional(), simpleconsumer_pool_size_max: z.number().int().gte(10).lte(250).optional(), producer_linger_ms: z.number().int().gte(0).lte(5000).optional(), consumer_request_timeout_ms: z.union([z.literal(1000), z.literal(15000), z.literal(30000)]).optional()}); export const dbaasServiceNotification = z.object({level: z.enum(["warning", "notice"]), message: z.string().min(1).max(1024), type: z.enum(["service_powered_off_removal", "service_end_of_life"]), metadata: z.object({})}); export const jsonSchemaKafkaConnect = z.object({producer_buffer_memory: z.number().int().gte(5242880).lte(134217728).optional(), consumer_max_poll_interval_ms: z.number().int().gte(1).lte(2147483647).optional(), producer_compression_type: z.enum(["gzip", "snappy", "lz4", "zstd", "none"]).optional(), connector_client_config_override_policy: z.enum(["None", "All"]).optional(), offset_flush_interval_ms: z.number().int().gte(1).lte(100000000).optional(), scheduled_rebalance_max_delay_ms: z.number().int().gte(0).lte(600000).optional(), consumer_fetch_max_bytes: z.number().int().gte(1048576).lte(104857600).optional(), consumer_max_partition_fetch_bytes: z.number().int().gte(1048576).lte(104857600).optional(), offset_flush_timeout_ms: z.number().int().gte(1).lte(2147483647).optional(), consumer_auto_offset_reset: z.enum(["earliest", "latest"]).optional(), producer_max_request_size: z.number().int().gte(131072).lte(67108864).optional(), producer_batch_size: z.number().int().gte(0).lte(5242880).optional(), session_timeout_ms: z.number().int().gte(1).lte(2147483647).optional(), producer_linger_ms: z.number().int().gte(0).lte(5000).optional(), consumer_isolation_level: z.enum(["read_uncommitted", "read_committed"]).optional(), consumer_max_poll_records: z.number().int().gte(1).lte(10000).optional()}); export const enumKafkaAuthMethod = z.enum(["certificate", "sasl"]); export const enumComponentRoute = z.enum(["dynamic", "private", "public", "privatelink"]); export const enumComponentUsage = z.enum(["primary", "replica"]); export const dbaasServiceUpdate = z.object({description: z.string().optional(), deadline: z.string().optional(), "start-after": z.string().optional(), "start-at": z.string().optional()}); export const dbaasServiceMaintenance = z.object({dow: z.enum(["saturday", "tuesday", "never", "wednesday", "sunday", "friday", "monday", "thursday"]), time: z.string().min(8).max(8), updates: z.array(dbaasServiceUpdate)}); export const jsonSchemaKafka = z.object({sasl_oauthbearer_expected_audience: z.string().max(128).optional(), group_max_session_timeout_ms: z.number().int().gte(0).lte(1800000).optional(), log_flush_interval_messages: z.number().int().gte(1).lte(9223372036854776000).optional(), sasl_oauthbearer_jwks_endpoint_url: z.string().max(2048).optional(), max_connections_per_ip: z.number().int().gte(256).lte(2147483647).optional(), sasl_oauthbearer_expected_issuer: z.string().max(128).optional(), log_index_size_max_bytes: z.number().int().gte(1048576).lte(104857600).optional(), auto_create_topics_enable: z.boolean().optional(), log_index_interval_bytes: z.number().int().gte(0).lte(104857600).optional(), replica_fetch_max_bytes: z.number().int().gte(1048576).lte(104857600).optional(), num_partitions: z.number().int().gte(1).lte(1000).optional(), transaction_state_log_segment_bytes: z.number().int().gte(1048576).lte(2147483647).optional(), replica_fetch_response_max_bytes: z.number().int().gte(10485760).lte(1048576000).optional(), log_message_timestamp_type: z.enum(["CreateTime", "LogAppendTime"]).optional(), connections_max_idle_ms: z.number().int().gte(1000).lte(3600000).optional(), log_flush_interval_ms: z.number().int().gte(0).lte(9223372036854776000).optional(), log_preallocate: z.boolean().optional(), log_segment_delete_delay_ms: z.number().int().gte(0).lte(3600000).optional(), message_max_bytes: z.number().int().gte(0).lte(100001200).optional(), group_initial_rebalance_delay_ms: z.number().int().gte(0).lte(300000).optional(), log_local_retention_bytes: z.number().int().gte(-2).lte(9223372036854776000).optional(), log_roll_jitter_ms: z.number().int().gte(0).lte(9223372036854776000).optional(), transaction_remove_expired_transaction_cleanup_interval_ms: z.number().int().gte(600000).lte(3600000).optional(), transaction_partition_verification_enable: z.boolean().optional(), default_replication_factor: z.number().int().gte(1).lte(10).optional(), log_roll_ms: z.number().int().gte(1).lte(9223372036854776000).optional(), producer_purgatory_purge_interval_requests: z.number().int().gte(10).lte(10000).optional(), log_retention_bytes: z.number().int().gte(-1).lte(9223372036854776000).optional(), min_insync_replicas: z.number().int().gte(1).lte(7).optional(), compression_type: z.enum(["gzip", "snappy", "lz4", "zstd", "uncompressed", "producer"]).optional(), log_message_timestamp_difference_max_ms: z.number().int().gte(0).lte(9223372036854776000).optional(), log_local_retention_ms: z.number().int().gte(-2).lte(9223372036854776000).optional(), log_message_downconversion_enable: z.boolean().optional(), sasl_oauthbearer_sub_claim_name: z.string().max(128).optional(), max_incremental_fetch_session_cache_slots: z.number().int().gte(1000).lte(10000).optional(), log_retention_hours: z.number().int().gte(-1).lte(2147483647).optional(), group_min_session_timeout_ms: z.number().int().gte(0).lte(60000).optional(), socket_request_max_bytes: z.number().int().gte(10485760).lte(209715200).optional(), log_segment_bytes: z.number().int().gte(10485760).lte(1073741824).optional(), "log-cleanup-and-compaction": z.object({log_cleaner_delete_retention_ms: z.number().int().gte(0).lte(315569260000).optional(), log_cleaner_max_compaction_lag_ms: z.number().int().gte(30000).lte(9223372036854776000).optional(), log_cleaner_min_cleanable_ratio: z.number().gte(0.2).lte(0.9).optional(), log_cleaner_min_compaction_lag_ms: z.number().int().gte(0).lte(9223372036854776000).optional(), log_cleanup_policy: z.enum(["delete", "compact", "compact,delete"]).optional()}).optional(), offsets_retention_minutes: z.number().int().gte(1).lte(2147483647).optional(), log_retention_ms: z.number().int().gte(-1).lte(9223372036854776000).optional()}); export const dbaasServiceKafka = z.object({"updated-at": z.string().optional(), "authentication-methods": z.object({certificate: z.boolean().optional(), sasl: z.boolean().optional()}).optional(), "node-count": z.number().int().gte(0).optional(), "connection-info": z.object({nodes: z.array(z.string()).optional(), "access-cert": z.string().optional(), "access-key": z.string().optional(), "connect-uri": z.string().optional(), "rest-uri": z.string().optional(), "registry-uri": z.string().optional()}).optional(), "node-cpu-count": z.number().int().gte(0).optional(), "kafka-rest-enabled": z.boolean().optional(), "prometheus-uri": z.object({host: z.string().optional(), port: z.number().int().gte(0).lte(65535).optional()}), integrations: z.array(dbaasIntegration).optional(), zone: z.string().optional(), "node-states": z.array(dbaasNodeState).optional(), name: dbaasServiceName, "kafka-connect-enabled": z.boolean().optional(), type: dbaasServiceTypeName, state: enumServiceState.optional(), "ip-filter": z.array(z.string()).optional(), "schema-registry-settings": jsonSchemaSchemaRegistry.optional(), backups: z.array(dbaasServiceBackup).optional(), "kafka-rest-settings": jsonSchemaKafkaRest.optional(), "termination-protection": z.boolean().optional(), notifications: z.array(dbaasServiceNotification).optional(), "kafka-connect-settings": jsonSchemaKafkaConnect.optional(), components: z.array(z.object({component: z.string(), host: z.string(), "kafka-authentication-method": enumKafkaAuthMethod.optional(), port: z.number().int().gte(0).lte(65535), route: enumComponentRoute, usage: enumComponentUsage})).optional(), maintenance: dbaasServiceMaintenance.optional(), "kafka-settings": jsonSchemaKafka.optional(), "disk-size": z.number().int().gte(0).optional(), "node-memory": z.number().int().gte(0).optional(), uri: z.string().optional(), "uri-params": z.object({}).optional(), "schema-registry-enabled": z.boolean().optional(), version: z.string().optional(), "created-at": z.string().optional(), plan: z.string(), users: z.array(z.object({type: z.string().optional(), username: z.string().optional(), password: z.string().optional(), "access-cert": z.string().optional(), "access-cert-expiry": z.string().optional(), "access-key": z.string().optional()})).optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get a DBaaS Kafka service * * GET /dbaas-kafka/{name} */ export const getApiDbaasKafkaName = async (args: GetApiDbaasKafkaNameArgs, options?: GetApiDbaasKafkaNameOptions) => { const {baseUrl = "https://api-ch-gva-2.exoscale.com/v2", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/dbaas-kafka/${encodeURIComponent(String(args.name))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(dbaasServiceKafka, await res.json()) };