import {z} from 'zod' export type CustomGenericKeyValuePair = {[key: string]: string}; export type GuestCustomization = {cloud_init?: ({meta_data?: string | undefined, user_data?: string | undefined, custom_key_values?: CustomGenericKeyValuePair | undefined}) | undefined, is_overridable?: boolean | undefined, sysprep?: ({install_type?: string | undefined, unattend_xml?: string | undefined, custom_key_values?: CustomGenericKeyValuePair | undefined}) | undefined} | {[key: string]: string}; export type VmReference = {kind: string, name?: string | undefined, uuid: unknown}; export type VmReferenceWithCustomization = {vm_customization: GuestCustomization, vm_reference: VmReference}; export type AppBlueprintRenderInfoInput = {input_type: string, input_spec: {vm_reference_with_customization?: VmReferenceWithCustomization | undefined, vm_reference?: VmReference | undefined}, name: string, description?: string | undefined}; export type CreateApiAppBlueprintsRenderInfoArgs = {body: AppBlueprintRenderInfoInput}; export type CreateApiAppBlueprintsRenderInfoOptions = {baseUrl: string, basicAuth?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const appServicePort = z.object({target_port: z.string(), protocol: z.string(), endpoint_name: z.string().optional()}); export const entityReference = z.object({kind: z.string().optional(), type: z.string().optional(), uuid: z.string().optional(), categories: z.record(z.string(), z.string()).optional(), name: z.string().max(64).optional()}); export const appTaskReferenceUpload = z.object({kind: z.string(), name: z.string(), uuid: z.string().optional()}); export const appVariableInputUpload = z.object({val_type: z.string().optional(), description: z.string().max(1000).optional(), uuid: z.string().optional(), value: z.string().optional(), label: z.string().optional(), attrs: z.record(z.string(), z.unknown()).optional(), editables: z.record(z.string(), z.unknown()).optional(), type: z.string().optional(), name: z.string().max(64)}); export const appTaskInputUpload = z.object({target_any_local_reference: entityReference.optional(), retries: z.string().optional(), description: z.string().max(1000).optional(), uuid: z.string().optional(), child_tasks_local_reference_list: z.array(appTaskReferenceUpload).optional(), attrs: z.record(z.string(), z.unknown()).optional(), timeout_secs: z.string().optional(), type: z.string(), variable_list: z.array(appVariableInputUpload).optional(), name: z.string().max(128)}); export const appRunbookInputUpload = z.object({task_definition_list: z.array(appTaskInputUpload).optional(), description: z.string().max(1000).optional(), variable_list: z.array(appVariableInputUpload).optional(), uuid: z.string().optional(), main_task_local_reference: appTaskReferenceUpload.optional(), name: z.string().max(128)}); export const appActionInputUpload = z.object({is_critical: z.boolean().optional(), description: z.string().max(1000).optional(), type: z.string().max(64).optional(), runbook: appRunbookInputUpload.optional(), attrs: z.record(z.string(), z.unknown()).optional(), uuid: z.string().optional(), name: z.string().max(128).optional()}); export const appServiceReferenceUpload = z.object({kind: z.string(), name: z.string(), uuid: z.string().optional()}); export const appServiceInputUpload = z.object({port_list: z.array(appServicePort).optional(), description: z.string().max(1000).optional(), action_list: z.array(appActionInputUpload), is_singleton: z.boolean().optional(), uuid: z.string().optional(), tier: z.string().optional(), depends_on_list: z.array(entityReference).optional(), editables: z.record(z.string(), z.unknown()).optional(), config_reference: appServiceReferenceUpload.optional(), variable_list: z.array(appVariableInputUpload), name: z.string().max(64)}); export const appCredentialReferenceUpload = z.object({kind: z.string(), name: z.string(), uuid: z.string().optional()}); export const appSubstrateReadinessProbeUpload = z.object({connection_type: z.string().optional(), timeout_secs: z.string().optional(), address: z.string().optional(), login_credential_local_reference: appCredentialReferenceUpload.optional(), connection_port: z.number().int().optional(), disable_readiness_probe: z.boolean().optional()}); export const appSubstrateReferenceUpload = z.object({kind: z.string(), name: z.string(), uuid: z.string().optional()}); export const appSubstrateInputUpload = z.object({instance_name: z.string().max(64).optional(), description: z.string().max(1000).optional(), action_list: z.array(appActionInputUpload), readiness_probe: appSubstrateReadinessProbeUpload.optional(), config_reference: appSubstrateReferenceUpload.optional(), create_spec: z.record(z.string(), z.unknown()).optional(), instance_power_state: z.string().optional(), platform_data: z.string().optional(), instance_address: z.string().optional(), name: z.string().max(64), uuid: z.string().optional(), instance_id: z.string().max(64).optional(), editables: z.record(z.string(), z.unknown()).optional(), os_type: z.string().optional(), type: z.string(), variable_list: z.array(appVariableInputUpload)}); export const appCredentialInputUpload = z.object({username: z.string(), secret: z.record(z.string(), z.unknown()), description: z.string().max(1000).optional(), editables: z.record(z.string(), z.unknown()).optional(), type: z.string(), uuid: z.string().optional(), name: z.string().max(64)}); export const appPackageReferenceUpload = z.object({kind: z.string(), name: z.string(), uuid: z.string().optional()}); export const brownfieldInstanceInput = z.object({instance_id: z.string().max(64), instance_name: z.string().max(64).optional(), address: z.array(z.string()).optional(), platform_data: z.unknown()}); export const blueprintDeploymentInputUpload = z.object({percent_fault_tolerance: z.number().int().optional(), fault_domain_scope: z.string().optional(), description: z.string().max(1000).optional(), action_list: z.array(appActionInputUpload).optional(), package_local_reference_list: z.array(appPackageReferenceUpload).optional(), uuid: z.string().optional(), min_replicas: z.string(), max_replicas: z.string(), num_fault_tolerance: z.number().int().optional(), editables: z.record(z.string(), z.unknown()).optional(), brownfield_instance_list: z.array(brownfieldInstanceInput).optional(), substrate_local_reference: appSubstrateReferenceUpload, type: z.string().optional(), variable_list: z.array(appVariableInputUpload).optional(), name: z.string().max(64)}); export const appProfileInputUpload = z.object({deployment_create_list: z.array(blueprintDeploymentInputUpload).optional(), uuid: z.string().optional(), description: z.string().max(1000).optional(), action_list: z.array(appActionInputUpload).optional(), editables: z.record(z.string(), z.unknown()).optional(), variable_list: z.array(appVariableInputUpload).optional(), name: z.string().max(64)}); export const appPackageInputUpload = z.object({description: z.string().max(1000).optional(), action_list: z.array(appActionInputUpload).optional(), service_local_reference_list: z.array(appServiceReferenceUpload).optional(), uuid: z.string().optional(), version: z.string().optional(), editables: z.record(z.string(), z.unknown()).optional(), config_reference: appPackageReferenceUpload.optional(), type: z.string(), options: z.record(z.string(), z.unknown()).optional(), variable_list: z.array(appVariableInputUpload).optional(), name: z.string().max(128)}); export const blueprintUploadResources = z.object({service_definition_list: z.array(appServiceInputUpload).optional(), substrate_definition_list: z.array(appSubstrateInputUpload).optional(), credential_definition_list: z.array(appCredentialInputUpload).optional(), type: z.string().max(64).optional(), app_profile_list: z.array(appProfileInputUpload).optional(), default_credential_local_reference: appCredentialReferenceUpload.optional(), package_definition_list: z.array(appPackageInputUpload).optional(), client_attrs: z.record(z.string(), z.unknown()).optional()}); export const clusterReference = z.object({kind: z.string(), name: z.string().optional(), uuid: z.string()}); export const availabilityZoneReference = z.object({kind: z.string(), name: z.string().optional(), uuid: z.string()}); export const blueprintUpload = z.object({description: z.string().max(1000).optional(), resources: blueprintUploadResources, cluster_reference: clusterReference.optional(), name: z.string().max(64), availability_zone_reference: availabilityZoneReference.optional()}); export const appBlueprintRenderInfoOutput = z.object({blueprint_spec: blueprintUpload.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 }; /** * Render an AppBlueprint from the given input * * POST /app_blueprints/render_info */ export const createApiAppBlueprintsRenderInfo = async (args: CreateApiAppBlueprintsRenderInfoArgs, options: CreateApiAppBlueprintsRenderInfoOptions) => { const {baseUrl, fetch: fetchFn = fetch, basicAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (basicAuth !== undefined) headers.set('authorization', `Basic ${btoa(`${basicAuth.username}:${basicAuth.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/app_blueprints/render_info${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(appBlueprintRenderInfoOutput, await res.json()) };