{"type":"object","properties":{"apiVersion":{"type":"string","const":"v1.2"},"arguments":{"type":"object","description":"A set of arguments that can be referenced in a template using '${args.argumentName}'.","properties":{},"additionalProperties":true},"spec":{"$ref":"#/$defs/V1PreviewEnvTemplateNodeSchema"}},"required":["apiVersion","spec"],"additionalProperties":false,"$defs":{"V1PreviewEnvTemplateWorkflowSchema":{"type":"object","description":"The specification for the workflow node.","properties":{"type":{"type":"string","examples":["sequential"],"description":"The type of workflow. If set to `sequential`, nodes in the workflow will run in order. If set to `parallel`, nodes will run simultaneously.","enum":["sequential","parallel"]},"steps":{"type":"array","description":"An array of nodes belonging to the workflow.","items":{"$ref":"#/$defs/V1PreviewEnvTemplateNodeSchema"}}},"required":["type","steps"],"additionalProperties":false},"V1PreviewEnvTemplateLoopWorkflowSchema":{"type":"object","description":"The specification for the loop workflow node.","properties":{"iterations":{"oneOf":[{"type":"array","items":{"oneOf":[{"type":"object","properties":{},"additionalProperties":true},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"steps":{"type":"array","description":"An array of nodes that will be run multiple times.","items":{"$ref":"#/$defs/V1PreviewEnvTemplateNodeSchema"}}},"required":["iterations","steps"],"additionalProperties":false},"V1PreviewEnvTemplateNodeSchema":{"description":"A node representing an action to be performed as part of the PreviewEnvTemplate.","oneOf":[{"type":"object","description":"Workflow node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["Workflow"],"description":"The kind of node.","const":"Workflow"},"spec":{"description":"The specification for the Workflow node.","$ref":"#/$defs/V1PreviewEnvTemplateWorkflowSchema"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Subdomain node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["Subdomain"],"description":"The kind of node.","const":"Subdomain"},"spec":{"type":"object","description":"The specification for the Subdomain node.","properties":{"domain":{"description":"The domain the path should be created for.","oneOf":[{"type":"string","examples":["example.com"],"description":"The domain the path should be created for.","pattern":"^((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"name":{"description":"Subdomain prepended to the domain name","oneOf":[{"type":"string","examples":["site"],"description":"Subdomain prepended to the domain name"},{"type":"string","pattern":".*\\${.*}.*"}]},"options":{"type":"object","description":"Optional advanced configuration for the subdomain.","properties":{"tlsMode":{"type":"string","description":"Desired TLS mode for the subdomain.","default":"default","enum":["default","passthrough"]},"minTlsProtocolVersion":{"type":"string","description":"Minimum TLS protocol version for the subdomain. Only applicable for non-wildcard subdomains.","enum":["TLSV1_2","TLSV1_3"]},"autoVerify":{"type":"boolean","description":"The domain will be automatically verified on creation. Only configurable if the relevant feature flag is enabled for you account."},"aliasDomains":{"type":"array","description":"Alias domains which should be routable. Only configurable if the relevant feature flag is enabled for you account.","default":[],"items":{"type":"string"}}},"additionalProperties":false},"cdn":{"type":"object","properties":{"northflank":{"type":"object","properties":{"enabled":{"type":"boolean"},"options":{"type":"object","properties":{"service":{"type":"object","properties":{"forceTlsEnableHsts":{"type":"boolean","default":true},"hstsDuration":{"oneOf":[{"type":"number","default":31557600,"minimum":300},{"type":"number","default":31557600,"minimum":300}]},"staleIfError":{"type":"boolean","default":true},"staleIfErrorTtl":{"type":"number","default":43200,"minimum":0},"defaultTtl":{"type":"number","default":3600,"minimum":0}},"additionalProperties":false},"logging":{"type":"object","properties":{"enabled":{"type":"boolean","default":true}},"additionalProperties":false},"http3":{"type":"object","properties":{"enabled":{"type":"boolean","default":false}},"additionalProperties":false},"websockets":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"compression":{"type":"object","properties":{"enabled":{"type":"boolean"},"mode":{"oneOf":[{"type":"string","enum":["gzip","brotli"]},{"type":"string","enum":["gzip","brotli"]}]}},"additionalProperties":false},"vclSnippets":{"type":"array","uniqueItems":true,"items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},"type":{"type":"string","enum":["init","recv","hash","hit","miss","pass","fetch","error","deliver","log","none"]},"dynamic":{"type":"string","enum":["0","1"]},"priority":{"type":"number","minimum":0,"maximum":100},"content":{"type":"string"}},"required":["name","type","dynamic","priority","content"],"additionalProperties":false}},"cacheSettings":{"type":"array","uniqueItems":true,"items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},"action":{"type":"string","enum":["pass","cache","restart"]},"cacheCondition":{"type":"string"},"staleTtl":{"type":"number","minimum":0},"ttl":{"type":"number","minimum":0}},"required":["name","staleTtl","ttl"],"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false}},"required":["domain","name"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"SubdomainPath node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["SubdomainPath"],"description":"The kind of node.","const":"SubdomainPath"},"spec":{"type":"object","description":"The specification for the SubdomainPath node.","properties":{"subdomain":{"description":"The domain the path should be created for.","oneOf":[{"type":"string","examples":["site.example.com"],"description":"The domain the path should be created for.","pattern":"^\\*|^@$|^([0-9a-z]([0-9a-z\\-]*[0-9a-z])?\\.)*[0-9a-z]([0-9a-z\\-]*[0-9a-z])?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"mode":{"description":"Mode of the path, determining how the URI will be interpreted.","oneOf":[{"type":"string","examples":["prefix"],"description":"Mode of the path, determining how the URI will be interpreted.","enum":["prefix","exact","regex"]},{"type":"string","pattern":".*\\${.*}.*"}]},"uri":{"oneOf":[{"oneOf":[{"type":"string","pattern":"^\\/([_a-zA-Z0-9-&?=.]*)((\\/[_a-zA-Z0-9-&?=.]+)*(\\/)?)?$"},{"type":"string","pattern":"^\\/([_a-zA-Z0-9-&?=.]*)((\\/[_a-zA-Z0-9-&?=.]+)*(\\/)?)?$"},{"type":"regex"}]},{"type":"string","pattern":".*\\${.*}.*"}]},"options":{"type":"object","properties":{"priority":{"description":"In case of uri conflicts, the route with the higher priority will take precedence","oneOf":[{"type":"integer","examples":[0],"description":"In case of uri conflicts, the route with the higher priority will take precedence","minimum":0,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]},"ignoreUriCase":{"description":"Allows case insensitive matching for 'prefix' and 'exact' modes","oneOf":[{"type":"boolean","description":"Allows case insensitive matching for 'prefix' and 'exact' modes"},{"type":"string","pattern":".*\\${.*}.*"}]},"rewrite":{"type":"object","description":"Settings determining if a path should be rewritten. Either a uri or regex have to be specified.","properties":{"uri":{"oneOf":[{"type":"string","pattern":"^\\/([_a-zA-Z0-9-&?=.]*)((\\/[_a-zA-Z0-9-&?=.]+)*(\\/)?)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"regex":{"type":"object","properties":{"match":{"description":"Regex match for the given path","oneOf":[{"type":"regex","description":"Regex match for the given path"},{"type":"string","pattern":".*\\${.*}.*"}]},"rewrite":{"description":"Regex rewrite for the given matched path","oneOf":[{"type":"regex","description":"Regex rewrite for the given matched path"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["match","rewrite"],"additionalProperties":false}},"additionalProperties":false},"timeout":{"description":"Customised request timeout for the given path. By default no timeout is set.","oneOf":[{"type":"string","description":"Customised request timeout for the given path. By default no timeout is set.","pattern":"^[1-9][0-9]*(s|ms)$"},{"type":"string","pattern":".*\\${.*}.*"}]},"headers":{"type":"object","description":"Settings allowing addition, re-write and removal of request as well as response headers.","properties":{"request":{"type":"object","properties":{"set":{"type":"object","properties":{"/^[a-zA-Z0-9_\\-%$+]+$/":{"type":"string","properties":{},"required":[],"additionalProperties":false}},"additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_\\-%$+]+$":{"type":"string","properties":{},"required":[],"additionalProperties":false}}},"add":{"type":"object","properties":{"/^[a-zA-Z0-9_\\-%$+]+$/":{"type":"string","properties":{},"required":[],"additionalProperties":false}},"additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_\\-%$+]+$":{"type":"string","properties":{},"required":[],"additionalProperties":false}}},"remove":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9_\\-%$+]+$"}}},"additionalProperties":false},"response":{"type":"object","properties":{"set":{"type":"object","properties":{"/^[a-zA-Z0-9_\\-%$+]+$/":{"type":"string","properties":{},"required":[],"additionalProperties":false}},"additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_\\-%$+]+$":{"type":"string","properties":{},"required":[],"additionalProperties":false}}},"add":{"type":"object","properties":{"/^[a-zA-Z0-9_\\-%$+]+$/":{"type":"string","properties":{},"required":[],"additionalProperties":false}},"additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_\\-%$+]+$":{"type":"string","properties":{},"required":[],"additionalProperties":false}}},"remove":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9_\\-%$+]+$"}}},"additionalProperties":false}},"additionalProperties":false},"corsPolicy":{"type":"object","description":"Settings allowing for customization of CORS policies.","properties":{"enabled":{"type":"boolean"},"allowOrigins":{"type":"array","items":{"type":"object","properties":{"mode":{"description":"Mode of the path, determining how the URI will be interpreted.","oneOf":[{"type":"string","examples":["prefix"],"description":"Mode of the path, determining how the URI will be interpreted.","enum":["prefix","exact","regex"]},{"type":"string","pattern":".*\\${.*}.*"}]},"origin":{"oneOf":[{"oneOf":[{"type":"string","format":"uri"},{"type":"string","format":"uri"},{"type":"regex"}]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["mode"],"additionalProperties":false}},"allowMethods":{"type":"array","items":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE","OPTIONS","TRACE","CONNECT","HEAD"]}},"allowCredentials":{"type":"boolean"},"allowHeaders":{"type":"array","items":{"type":"string"}},"maxAge":{"type":"string","pattern":"^[1-9][0-9]*(s|m|h)$"}},"required":["enabled"],"additionalProperties":false},"retries":{"type":"object","description":"Settings allowing for customization of retries.","properties":{"enabled":{"type":"boolean"},"attempts":{"type":"integer","minimum":1,"maximum":3},"perTryTimeout":{"type":"string","description":"Timeout per attempt. By default uses the path level timeout.","pattern":"^[1-9][0-9]*(s|ms)$"},"retryOn":{"type":"array","description":"Configure the cases in which the retry should be triggered.","uniqueItems":true,"items":{"type":"string","enum":["5xx","gateway-error","reset","connect-failure","envoy-ratelimited","retriable-4xx","refused-stream","retriable-status-codes","retriable-headers","cancelled","deadline-exceeded","internal","resource-exhausted","unavailable"]}}},"required":["enabled","attempts"],"additionalProperties":false}},"additionalProperties":false}},"required":["subdomain","mode","uri"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"ResourceTag node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["ResourceTag"],"description":"The kind of node.","const":"ResourceTag"},"spec":{"type":"object","description":"The specification for the ResourceTag node.","properties":{"useSpotNodes":{"type":"boolean","examples":[false],"description":"Schedule workloads to spot nodes"},"useOnDemandNodes":{"type":"boolean","examples":[false],"description":"Also allow workloads to schedule to on demand nodes. Only relevant if you want workloads to schedule across both spot and on demand nodes"},"nodeAffinities":{"type":"array","items":{"type":"object","properties":{"preference":{"type":"boolean","default":false},"weight":{"oneOf":[{"type":"number","minimum":1,"maximum":100}]},"matchExpressions":{"type":"array","minItems":1,"items":{"type":"object","properties":{"key":{"type":"string"},"operator":{"type":"string","enum":["In","NotIn"]},"values":{"type":"array","items":{"type":"string"}}},"required":["key","operator","values"],"additionalProperties":false}}},"required":["matchExpressions"],"additionalProperties":false}},"color":{"type":"string","examples":["#57637A"],"pattern":"^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},"description":{"type":"string","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},"name":{"oneOf":[{"type":"string","examples":["Example Tag"],"minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["name"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"RolloutStrategy node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["RolloutStrategy"],"description":"The kind of node.","const":"RolloutStrategy"},"spec":{"type":"object","description":"The specification for the RolloutStrategy node.","properties":{"name":{"description":"Display name for the gradual rollout strategy","oneOf":[{"type":"string","examples":["my-canary-rollout"],"description":"Display name for the gradual rollout strategy"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"Type of the gradual rollout strategy","oneOf":[{"type":"string","examples":["canary"],"description":"Type of the gradual rollout strategy","const":"canary"},{"type":"string","pattern":".*\\${.*}.*"}]},"options":{"oneOf":[{"type":"object","properties":{"triggers":{"description":"Conditions under which a new release will automatically initiate as a gradual rollout","oneOf":[{"type":"object","description":"Conditions under which a new release will automatically initiate as a gradual rollout","properties":{"releaseFromTemplate":{"description":"Automatically trigger the rollout strategy when a release is initiated from a template","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"Automatically trigger the rollout strategy when a release is initiated from a template"},{"type":"string","pattern":".*\\${.*}.*"}]},"releaseFromReleaseFlow":{"description":"Automatically trigger the rollout strategy when a release is initiated from a release flow","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"Automatically trigger the rollout strategy when a release is initiated from a release flow"},{"type":"string","pattern":".*\\${.*}.*"}]},"releaseFromCD":{"description":"Automatically trigger the rollout strategy when a release is initiated from a CD pipeline","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"Automatically trigger the rollout strategy when a release is initiated from a CD pipeline"},{"type":"string","pattern":".*\\${.*}.*"}]},"releaseFromUI":{"description":"Automatically trigger the rollout strategy when a release is initiated from the UI","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"Automatically trigger the rollout strategy when a release is initiated from the UI"},{"type":"string","pattern":".*\\${.*}.*"}]},"releaseFromApi":{"description":"Automatically trigger the rollout strategy when a release is initiated via the API","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"Automatically trigger the rollout strategy when a release is initiated via the API"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"blockDeploymentOnActiveRollout":{"description":"When enabled, new deployments are blocked while a rollout is in progress","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"When enabled, new deployments are blocked while a rollout is in progress"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"details":{"description":"Strategy-specific configuration details","oneOf":[{"description":"Strategy-specific configuration details","oneOf":[{"type":"object","description":"Strategy-specific configuration details","properties":{"canaryStrategy":{"description":"Strategy used to split traffic between stable and canary deployments","oneOf":[{"type":"string","examples":["percentage"],"description":"Strategy used to split traffic between stable and canary deployments","enum":["percentage","header"]},{"type":"string","pattern":".*\\${.*}.*"}]},"config":{"description":"Configuration for the selected canary strategy","oneOf":[{"description":"Configuration for the selected canary strategy","oneOf":[{"type":"object","description":"Configuration for the selected canary strategy","properties":{"canaryPercentage":{"description":"Percentage of traffic to route to the canary deployment","oneOf":[{"type":"integer","examples":[20],"description":"Percentage of traffic to route to the canary deployment","minimum":0,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]},"stablePercentage":{"description":"Percentage of traffic to route to the stable deployment","oneOf":[{"type":"integer","examples":[80],"description":"Percentage of traffic to route to the stable deployment","minimum":0,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["canaryPercentage","stablePercentage"],"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},{"description":"Configuration for the selected canary strategy","oneOf":[{"type":"object","description":"Configuration for the selected canary strategy","properties":{"headerName":{"description":"HTTP header name used to identify requests that should be routed to the canary deployment","oneOf":[{"type":"string","examples":["x-canary"],"description":"HTTP header name used to identify requests that should be routed to the canary deployment","minLength":1},{"type":"string","pattern":".*\\${.*}.*"}]},"headerValue":{"description":"HTTP header value that routes matching requests to the canary deployment","oneOf":[{"type":"string","examples":["true"],"description":"HTTP header value that routes matching requests to the canary deployment","minLength":1},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["headerName","headerValue"],"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]}]}},"required":["canaryStrategy","config"],"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},{"not":{}}]}},"required":["type","details"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"BuildService node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["BuildService"],"description":"The kind of node.","const":"BuildService"},"spec":{"type":"object","description":"The specification for the BuildService node.","properties":{"name":{"description":"The name of the service.","oneOf":[{"type":"string","examples":["Example Service"],"description":"The name of the service.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"A description of the service.","oneOf":[{"type":"string","examples":["A service description"],"description":"A description of the service.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"stageId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"billing":{"type":"object","properties":{"deploymentPlan":{"description":"The ID of the deployment plan to use. (Deprecated - use buildPlan for build resources instead.).","oneOf":[{"type":"string","examples":["nf-compute-20"],"description":"The ID of the deployment plan to use. (Deprecated - use buildPlan for build resources instead.).","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildPlan":{"description":"The ID of the build plan to use.","oneOf":[{"type":"string","examples":["nf-compute-200-8"],"description":"The ID of the build plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"infrastructure":{"type":"object","properties":{"architecture":{"type":"string","enum":["x86","arm"]}},"additionalProperties":false},"disabledCI":{"type":"boolean","description":"Whether CI (continuous integration) should be disabled.","default":false},"buildSource":{"type":"string","examples":["git"],"description":"Defines the build source for this resource","enum":["git","bundle"]},"vcsData":{"type":"object","properties":{"projectUrl":{"description":"URL of the Git repo to build.","oneOf":[{"type":"string","examples":["https://github.com/northflank/gatsby-with-northflank"],"description":"URL of the Git repo to build.","pattern":"^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectType":{"description":"The VCS provider to use.","oneOf":[{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"description":"If projectType is self-hosted, the ID of the self-hosted vcs to use.","oneOf":[{"type":"string","description":"If projectType is self-hosted, the ID of the self-hosted vcs to use."},{"type":"string","pattern":".*\\${.*}.*"}]},"accountLogin":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name.","oneOf":[{"type":"string","examples":["github-user"],"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name."},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsLinkId":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `vcsLinkId` is provided, Northflank will instead use your linked account with that ID.","oneOf":[{"type":"string","description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `vcsLinkId` is provided, Northflank will instead use your linked account with that ID."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["projectUrl","projectType"],"additionalProperties":false},"buildSettings":{"type":"object","properties":{"storage":{"type":"object","properties":{"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per build in MB","oneOf":[{"type":"integer","examples":[16384],"description":"Ephemeral storage per build in MB","enum":[16384,32768,65536,131072,262144,524288],"minimum":16384,"maximum":65536},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"dockerfile":{"type":"object","properties":{"useCache":{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future and currently has no effect."},"buildEngine":{"description":"Build engine to use. Defaults to recommended build engine `buildkit`","oneOf":[{"type":"string","examples":["buildkit"],"description":"Build engine to use. Defaults to recommended build engine `buildkit`","default":"buildkit","enum":["buildkit","kaniko"]},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerFilePath":{"description":"The file path of the Dockerfile.","oneOf":[{"type":"string","examples":["/Dockerfile"],"description":"The file path of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerWorkDir":{"description":"The working directory of the Dockerfile.","oneOf":[{"type":"string","examples":["/"],"description":"The working directory of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildkit":{"type":"object","properties":{"useCache":{"description":"Use persistent storage to cache build layers.","oneOf":[{"type":"boolean","examples":[true],"description":"Use persistent storage to cache build layers.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"cacheStorageSize":{"description":"The amount of persistent storage available to each build in MB.","oneOf":[{"type":"integer","examples":[32768],"description":"The amount of persistent storage available to each build in MB."},{"type":"string","pattern":".*\\${.*}.*"}]},"useInternalCache":{"description":"DEPRECATED: This field will be removed in the near future.","oneOf":[{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"internalCacheStorage":{"description":"DEPRECATED: This field will be removed in the near future.","oneOf":[{"type":"number","description":"DEPRECATED: This field will be removed in the near future."},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"required":["dockerFilePath","dockerWorkDir"],"additionalProperties":false},"buildpack":{"type":"object","properties":{"builder":{"description":"Buildpack stack to use. Defaults to recommended stack `HEROKU_24`.","oneOf":[{"type":"string","examples":["HEROKU_24"],"description":"Buildpack stack to use. Defaults to recommended stack `HEROKU_24`.","default":"HEROKU_24","enum":["HEROKU_24","HEROKU_22","HEROKU_22_CLASSIC","HEROKU_20","HEROKU_18","GOOGLE_22","GOOGLE_V1","CNB_ALPINE","CNB_BIONIC","PAKETO_JAMMY_TINY","PAKETO_JAMMY_BASE","PAKETO_JAMMY_FULL","PAKETO_TINY","PAKETO_BASE","PAKETO_FULL"]},{"type":"string","pattern":".*\\${.*}.*"}]},"buildpackLocators":{"type":"array","description":"Array of custom Buildpacks to use.","default":[],"items":{"description":"Url or registry identifier of custom Buildpack.","oneOf":[{"type":"string","examples":["https://buildpack-registry.heroku.com/cnb/mars/create-react-app"],"description":"Url or registry identifier of custom Buildpack."},{"type":"string","pattern":".*\\${.*}.*"}]}},"buildContext":{"description":"The working directory to build in.","oneOf":[{"type":"string","examples":["/"],"description":"The working directory to build in.","default":"/","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"useCache":{"description":"Should build dependencies be cached?","oneOf":[{"type":"boolean","examples":[false],"description":"Should build dependencies be cached?","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"buildConfiguration":{"type":"object","properties":{"prRestrictions":{"type":"array","description":"An array of pull request build rules. Only supported for build services. Each commit belonging to a pull request on a branch that matches one of the provided build rules will be built automatically.","items":{"description":"A pull request build rule. Can contain `*` as a wildcard to match multiple branch names. For example, `feature/*` will build all commits from pull requests from branches that start with `feature/`.","oneOf":[{"type":"string","examples":["feature/*"],"description":"A pull request build rule. Can contain `*` as a wildcard to match multiple branch names. For example, `feature/*` will build all commits from pull requests from branches that start with `feature/`.","pattern":"^[^?:@$~ [\\]{}]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"branchRestrictions":{"type":"array","description":"An array of branch build rules. Only supported for build services. Each commit belonging to a branch that matches one of the provided build rules will be built automatically.","items":{"description":"A branch build rule. Can contain `*` as a wildcard to match multiple branch names. For example, `feature/*` will build all commits from branches that start with `feature/`.","oneOf":[{"type":"string","examples":["feature/*"],"description":"A branch build rule. Can contain `*` as a wildcard to match multiple branch names. For example, `feature/*` will build all commits from branches that start with `feature/`.","pattern":"^[^?:@$~ [\\]{}]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"pathIgnoreRules":{"type":"array","description":"An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.","maxItems":200,"items":{"description":"A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.","oneOf":[{"type":"string","examples":["README.md"],"description":"A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.","maxLength":260},{"type":"string","pattern":".*\\${.*}.*"}]}},"isAllowList":{"description":"If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`.","oneOf":[{"type":"boolean","examples":[false],"description":"If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`."},{"type":"string","pattern":".*\\${.*}.*"}]},"ciIgnoreFlagsEnabled":{"description":"If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built.","oneOf":[{"type":"boolean","description":"If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built."},{"type":"string","pattern":".*\\${.*}.*"}]},"ciIgnoreFlags":{"type":"array","examples":[["[skip ci]","[ci skip]","[no ci]","[skip nf]","[nf skip]","[northflank skip]","[skip northflank]"]],"description":"An array of commit ignore flags. If a commit message contains one or more of these flags, that commit will not be built. Defaults to `[\"[skip ci]\", \"[ci skip]\", \"[no ci]\", \"[skip nf]\", \"[nf skip]\", \"[northflank skip]\", \"[skip northflank]\"]`","maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}},"dockerfileTarget":{"description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here.","oneOf":[{"type":"string","description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here."},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerCredentials":{"type":"array","items":{"description":"The ID of the docker credentials to use.","oneOf":[{"type":"string","examples":["example-docker-credential"],"description":"The ID of the docker credentials to use.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"includeGitFolder":{"type":"boolean","description":"Include .git folder inside the build context"},"fullGitClone":{"type":"boolean","description":"Include the entire git history as part of the .git folder. Only relevant if \"includeGitFolder\" is set."},"enableGitLfs":{"type":"boolean","description":"Enable Git LFS support for the build"},"storage":{"type":"object","properties":{"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per build in MB","oneOf":[{"type":"integer","examples":[16384],"description":"Ephemeral storage per build in MB","enum":[16384,32768,65536,131072,262144,524288],"minimum":16384,"maximum":65536},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"buildArguments":{"examples":[{"ARGUMENT_1":"abcdef","ARGUMENT_2":"12345"}],"description":"An object containing the build arguments to set for the service","default":{},"oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"buildFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"additionalProperties":false}},"required":["name","billing","vcsData","buildSettings"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"CombinedService node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["CombinedService"],"description":"The kind of node.","const":"CombinedService"},"spec":{"type":"object","description":"The specification for the CombinedService node.","properties":{"name":{"description":"The name of the service.","oneOf":[{"type":"string","examples":["Example Service"],"description":"The name of the service.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"A description of the service.","oneOf":[{"type":"string","examples":["A service description"],"description":"A description of the service.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"stageId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"billing":{"type":"object","properties":{"deploymentPlan":{"description":"The ID of the deployment plan to use.","oneOf":[{"type":"string","examples":["nf-compute-20"],"description":"The ID of the deployment plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildPlan":{"description":"The ID of the build plan to use.","oneOf":[{"type":"string","examples":["nf-compute-200-8"],"description":"The ID of the build plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false}},"required":["deploymentPlan"],"additionalProperties":false},"infrastructure":{"type":"object","properties":{"architecture":{"type":"string","enum":["x86","arm"]}},"additionalProperties":false},"deployment":{"type":"object","properties":{"type":{"description":"The way the service should be deployed. Either as a deployment (default), or as a stateful set.","oneOf":[{"type":"string","description":"The way the service should be deployed. Either as a deployment (default), or as a stateful set.","enum":["deployment","statefulSet"]},{"type":"string","pattern":".*\\${.*}.*"}]},"instances":{"description":"The number of instances to run the service on.","oneOf":[{"type":"integer","examples":[1],"description":"The number of instances to run the service on.","minimum":0},{"type":"string","pattern":".*\\${.*}.*"}]},"buildpack":{"type":"object","properties":{"configType":{"type":"string","examples":["default"],"enum":["default","customProcess","customCommand","customEntrypointCustomCommand","originalEntrypointCustomCommand"]},"customProcess":{"type":["string","null"]},"customEntrypoint":{"type":["string","null"]},"customCommand":{"type":["string","null"]}},"required":["configType"],"additionalProperties":false},"docker":{"type":"object","properties":{"configType":{"type":"string","enum":["default","customEntrypoint","customCommand","customEntrypointCustomCommand"]},"customEntrypoint":{"type":["string","null"]},"customCommand":{"type":["string","null"]}},"required":["configType"],"additionalProperties":false},"storage":{"type":"object","properties":{"useHdbStorage":{"type":"boolean"},"usePdSsdStorage":{"type":"boolean"},"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per container in MB","oneOf":[{"type":"integer","examples":[1024],"description":"Ephemeral storage per container in MB","minimum":1024},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"shmSize":{"description":"Configures the amount of available memory-backed disk space available to /dev/shm","oneOf":[{"type":"integer","description":"Configures the amount of available memory-backed disk space available to /dev/shm","minimum":64},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"strategy":{"type":"object","description":"Roll out strategy of the service","properties":{"type":{"description":"Configures the instance roll out strategy of your service. Currently only available via feature flag.","oneOf":[{"type":"string","description":"Configures the instance roll out strategy of your service. Currently only available via feature flag.","enum":["recreate","rollout-steady","rollout-balanced","rollout-fast","custom"]},{"type":"string","pattern":".*\\${.*}.*"}]},"settings":{"type":"object","properties":{},"additionalProperties":false}},"additionalProperties":false},"zonalRedundancy":{"type":"object","properties":{"type":{"description":"Defines scheduling behaviour across different zones within the same region.","oneOf":[{"type":"string","description":"Defines scheduling behaviour across different zones within the same region.","enum":["disabled","preferred","required"]},{"type":"string","pattern":".*\\${.*}.*"}]},"minZones":{"oneOf":[{"description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","oneOf":[{"type":"integer","description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]},{"description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","oneOf":[{"type":"integer","description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]}]}},"additionalProperties":false},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false},"gracePeriodSeconds":{"description":"The maximum amount of time the process has to shut down after receiving a SIGTERM signal before it is forcefully shut down SIGKILL by the system.","oneOf":[{"type":"integer","description":"The maximum amount of time the process has to shut down after receiving a SIGTERM signal before it is forcefully shut down SIGKILL by the system.","minimum":15,"maximum":600},{"type":"string","pattern":".*\\${.*}.*"}]},"gradualRolloutStrategyId":{"examples":["strategy-id"],"description":"The id of the strategy to be attached to service.","oneOf":[{"type":"string","examples":["strategy-id"],"description":"The id of the strategy to be attached to service.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"ssh":{"type":"object","description":"Controls related to SSH access within the resource.","properties":{"enabled":{"description":"Enables SSH access if the resource matches an SSH identity selector.","oneOf":[{"type":"boolean","description":"Enables SSH access if the resource matches an SSH identity selector."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["enabled"],"additionalProperties":false},"metadata":{"type":"object","description":"Allow setting custom labels and annotations for workloads.","properties":{"labels":{"type":"object","description":"Specify custom labels for the workload.","properties":{},"additionalProperties":false},"annotations":{"type":"object","description":"Specify custom annotations for the workload as string or object.","properties":{},"additionalProperties":false}},"additionalProperties":false}},"required":["instances"],"additionalProperties":false},"ports":{"type":"array","default":[],"items":{"type":"object","properties":{"name":{"description":"The name used to identify the port.","oneOf":[{"type":"string","examples":["p01"],"description":"The name used to identify the port.","pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$","minLength":1,"maxLength":8},{"type":"string","pattern":".*\\${.*}.*"}]},"internalPort":{"description":"The port number.","oneOf":[{"type":"integer","examples":[8080],"description":"The port number.","minimum":1,"maximum":65535},{"type":"string","pattern":".*\\${.*}.*"}]},"public":{"description":"If true, the port will be exposed publicly.","oneOf":[{"type":"boolean","examples":[true],"description":"If true, the port will be exposed publicly.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"security":{"type":"object","default":{"credentials":[],"policies":[],"sso":{}},"properties":{"credentials":{"type":"array","description":"An array of credentials to access the service.","items":{"type":"object","properties":{"username":{"description":"The username to access the service","oneOf":[{"type":"string","examples":["admin"],"description":"The username to access the service","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"password":{"description":"The password to access the service with this username.","oneOf":[{"type":"string","examples":["password123"],"description":"The password to access the service with this username."},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of authentication used","oneOf":[{"type":"string","examples":["basic-auth"],"description":"The type of authentication used","const":"basic-auth"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["username","password","type"],"additionalProperties":false}},"ip":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"policies":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"sso":{"type":"object","description":"Configure port authentication via SSO","properties":{"organizationId":{"description":"ID of the SSO organization that the user will have to be a member of","oneOf":[{"type":"string","description":"ID of the SSO organization that the user will have to be a member of"},{"type":"string","pattern":".*\\${.*}.*"}]},"directoryGroupIds":{"description":"Array of directory groups that will have access","oneOf":[{"type":"array","description":"Array of directory groups that will have access","items":{"type":"string"}},{"type":"string","pattern":".*\\${.*}.*"}]},"allowAnyOrgUsers":{"description":"Allow entire organization to access this service","oneOf":[{"type":"boolean","description":"Allow entire organization to access this service"},{"type":"string","pattern":".*\\${.*}.*"}]},"validateInternalTraffic":{"description":"Enforce internal traffic through SSO authentication flow","oneOf":[{"type":"boolean","description":"Enforce internal traffic through SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]},"setCookieOnRootDomain":{"description":"Set SSO authentication cookie on root domain","oneOf":[{"type":"boolean","description":"Set SSO authentication cookie on root domain"},{"type":"string","pattern":".*\\${.*}.*"}]},"allowInternalTrafficViaPublicDns":{"description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow","oneOf":[{"type":"boolean","description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"headers":{"type":"array","description":"List of header authentication settings, it checks the presence of all headers and compares it against the expected value. Wildcard (*) is supported.","items":{"type":"object","properties":{"regexMode":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"name":{"oneOf":[{"oneOf":[{"type":"regex"},{"type":"string","pattern":".*\\${.*}.*"}]},{"oneOf":[{"type":"string","pattern":"^[a-zA-Z0-9_\\-%$+]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"value":{"examples":["headerValue"],"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["value"],"additionalProperties":false}},"verificationMode":{"type":"string","description":"Mode used to verify multiple security features like ip policies and SSO authentication","enum":["or","and"]},"securePathConfiguration":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Enable security policies on a path-level style"},"skipSecurityPoliciesForInternalTrafficViaPublicDns":{"type":"boolean","description":"Allow internal traffic from same or shared projects via public DNS to skip all security policies"},"rules":{"type":"array","default":[],"items":{"type":"object","properties":{"paths":{"type":"array","description":"Array of path objects which represent the paths and their priority for which the security policies will be enforced","items":{"type":"object","properties":{"routingMode":{"description":"Mode of the path, determining how the URI will be interpreted.","oneOf":[{"type":"string","examples":["prefix"],"description":"Mode of the path, determining how the URI will be interpreted.","enum":["prefix","exact","regex"]},{"type":"string","pattern":".*\\${.*}.*"}]},"path":{"examples":["/path"],"oneOf":[{"oneOf":[{"type":"string","pattern":"^\\/([_a-zA-Z0-9-&?=.]*)((\\/[_a-zA-Z0-9-&?=.]+)*(\\/)?)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},{"oneOf":[{"type":"string","pattern":"^\\/([_a-zA-Z0-9-&?=.]*)((\\/[_a-zA-Z0-9-&?=.]+)*(\\/)?)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},{"oneOf":[{"type":"regex"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"priority":{"examples":[80],"oneOf":[{"type":"integer","minimum":0,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["routingMode","priority"],"additionalProperties":false}},"accessMode":{"examples":["protected"],"description":"Specify the way the path rule will behave when processing policies. This enables an allow-list/deny-list approach for access control on each path","oneOf":[{"type":"string","description":"Specify the way the path rule will behave when processing policies. This enables an allow-list/deny-list approach for access control on each path","enum":["protected","unprotected"]},{"type":"string","pattern":".*\\${.*}.*"}]},"securityPolicies":{"oneOf":[{"type":"object","properties":{"orPolicies":{"type":"object","properties":{"credentials":{"type":"array","description":"An array of credentials to access the service.","items":{"type":"object","properties":{"username":{"description":"The username to access the service","oneOf":[{"type":"string","examples":["admin"],"description":"The username to access the service","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"password":{"description":"The password to access the service with this username.","oneOf":[{"type":"string","examples":["password123"],"description":"The password to access the service with this username."},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of authentication used","oneOf":[{"type":"string","examples":["basic-auth"],"description":"The type of authentication used","const":"basic-auth"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["username","password","type"],"additionalProperties":false}},"ip":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"policies":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"sso":{"type":"object","description":"Configure port authentication via SSO","properties":{"organizationId":{"description":"ID of the SSO organization that the user will have to be a member of","oneOf":[{"type":"string","description":"ID of the SSO organization that the user will have to be a member of"},{"type":"string","pattern":".*\\${.*}.*"}]},"directoryGroupIds":{"description":"Array of directory groups that will have access","oneOf":[{"type":"array","description":"Array of directory groups that will have access","items":{"type":"string"}},{"type":"string","pattern":".*\\${.*}.*"}]},"allowAnyOrgUsers":{"description":"Allow entire organization to access this service","oneOf":[{"type":"boolean","description":"Allow entire organization to access this service"},{"type":"string","pattern":".*\\${.*}.*"}]},"validateInternalTraffic":{"description":"Enforce internal traffic through SSO authentication flow","oneOf":[{"type":"boolean","description":"Enforce internal traffic through SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]},"setCookieOnRootDomain":{"description":"Set SSO authentication cookie on root domain","oneOf":[{"type":"boolean","description":"Set SSO authentication cookie on root domain"},{"type":"string","pattern":".*\\${.*}.*"}]},"allowInternalTrafficViaPublicDns":{"description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow","oneOf":[{"type":"boolean","description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"headers":{"type":"array","description":"List of header authentication settings, it checks the presence of all headers and compares it against the expected value. Wildcard (*) is supported.","items":{"type":"object","properties":{"regexMode":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"name":{"oneOf":[{"oneOf":[{"type":"regex"},{"type":"string","pattern":".*\\${.*}.*"}]},{"oneOf":[{"type":"string","pattern":"^[a-zA-Z0-9_\\-%$+]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"value":{"examples":["headerValue"],"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["value"],"additionalProperties":false}}},"additionalProperties":false},"requiredPolicies":{"type":"object","properties":{"credentials":{"type":"array","description":"An array of credentials to access the service.","items":{"type":"object","properties":{"username":{"description":"The username to access the service","oneOf":[{"type":"string","examples":["admin"],"description":"The username to access the service","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"password":{"description":"The password to access the service with this username.","oneOf":[{"type":"string","examples":["password123"],"description":"The password to access the service with this username."},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of authentication used","oneOf":[{"type":"string","examples":["basic-auth"],"description":"The type of authentication used","const":"basic-auth"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["username","password","type"],"additionalProperties":false}},"ip":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"policies":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"sso":{"type":"object","description":"Configure port authentication via SSO","properties":{"organizationId":{"description":"ID of the SSO organization that the user will have to be a member of","oneOf":[{"type":"string","description":"ID of the SSO organization that the user will have to be a member of"},{"type":"string","pattern":".*\\${.*}.*"}]},"directoryGroupIds":{"description":"Array of directory groups that will have access","oneOf":[{"type":"array","description":"Array of directory groups that will have access","items":{"type":"string"}},{"type":"string","pattern":".*\\${.*}.*"}]},"allowAnyOrgUsers":{"description":"Allow entire organization to access this service","oneOf":[{"type":"boolean","description":"Allow entire organization to access this service"},{"type":"string","pattern":".*\\${.*}.*"}]},"validateInternalTraffic":{"description":"Enforce internal traffic through SSO authentication flow","oneOf":[{"type":"boolean","description":"Enforce internal traffic through SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]},"setCookieOnRootDomain":{"description":"Set SSO authentication cookie on root domain","oneOf":[{"type":"boolean","description":"Set SSO authentication cookie on root domain"},{"type":"string","pattern":".*\\${.*}.*"}]},"allowInternalTrafficViaPublicDns":{"description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow","oneOf":[{"type":"boolean","description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"headers":{"type":"array","description":"List of header authentication settings, it checks the presence of all headers and compares it against the expected value. Wildcard (*) is supported.","items":{"type":"object","properties":{"regexMode":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"name":{"oneOf":[{"oneOf":[{"type":"regex"},{"type":"string","pattern":".*\\${.*}.*"}]},{"oneOf":[{"type":"string","pattern":"^[a-zA-Z0-9_\\-%$+]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"value":{"examples":["headerValue"],"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["value"],"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["paths","accessMode"],"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"domains":{"description":"An array of domains to redirect to this port. Each domain must first be verified and registered to your account.","oneOf":[{"type":"array","description":"An array of domains to redirect to this port. Each domain must first be verified and registered to your account.","default":[],"items":{"description":"A domain to redirect to this port.","oneOf":[{"type":"string","examples":["app.example.com"],"description":"A domain to redirect to this port."},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"disableNfDomain":{"description":"Disable routing on the default code.run domain for public HTTP ports with custom domains.","oneOf":[{"type":"boolean","description":"Disable routing on the default code.run domain for public HTTP ports with custom domains.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"advancedOptions":{"type":"object","properties":{"enableTlsPassthrough":{"description":"Whether this port should use pass through mode for TLS","oneOf":[{"type":"boolean","description":"Whether this port should use pass through mode for TLS"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"protocol":{"type":"string","examples":["HTTP"],"description":"The protocol to use for the port."}},"required":["name","internalPort","protocol"],"additionalProperties":false}},"disabledCI":{"type":"boolean","description":"Whether CI (continuous integration) should be disabled.","default":false},"buildSource":{"type":"string","examples":["git"],"description":"Defines the build source for this resource","enum":["git","bundle"]},"vcsData":{"type":"object","properties":{"projectUrl":{"description":"URL of the Git repo to build.","oneOf":[{"type":"string","examples":["https://github.com/northflank/gatsby-with-northflank"],"description":"URL of the Git repo to build.","pattern":"^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectType":{"description":"The VCS provider to use.","oneOf":[{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"description":"If projectType is self-hosted, the ID of the self-hosted vcs to use.","oneOf":[{"type":"string","description":"If projectType is self-hosted, the ID of the self-hosted vcs to use."},{"type":"string","pattern":".*\\${.*}.*"}]},"accountLogin":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name.","oneOf":[{"type":"string","examples":["github-user"],"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name."},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsLinkId":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `vcsLinkId` is provided, Northflank will instead use your linked account with that ID.","oneOf":[{"type":"string","description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `vcsLinkId` is provided, Northflank will instead use your linked account with that ID."},{"type":"string","pattern":".*\\${.*}.*"}]},"projectBranch":{"description":"The name of the branch to use.","oneOf":[{"type":"string","examples":["master"],"description":"The name of the branch to use."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["projectUrl","projectType","projectBranch"],"additionalProperties":false},"bundleData":{"type":"object","properties":{"bundleUrl":{"description":"URL of the bundle to be built","oneOf":[{"type":"string","examples":["https://example.com/archive.tar"],"description":"URL of the bundle to be built","format":"uri"},{"type":"string","pattern":".*\\${.*}.*"}]},"branch":{"description":"Branch identifier for the bundle.","oneOf":[{"type":"string","examples":["main"],"description":"Branch identifier for the bundle.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["bundleUrl","branch"],"additionalProperties":false},"buildSettings":{"type":"object","properties":{"storage":{"type":"object","properties":{"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per build in MB","oneOf":[{"type":"integer","examples":[16384],"description":"Ephemeral storage per build in MB","enum":[16384,32768,65536,131072,262144,524288],"minimum":16384,"maximum":65536},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"dockerfile":{"type":"object","properties":{"useCache":{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future and currently has no effect."},"buildEngine":{"description":"Build engine to use. Defaults to recommended build engine `buildkit`","oneOf":[{"type":"string","examples":["buildkit"],"description":"Build engine to use. Defaults to recommended build engine `buildkit`","default":"buildkit","enum":["buildkit","kaniko"]},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerFilePath":{"description":"The file path of the Dockerfile.","oneOf":[{"type":"string","examples":["/Dockerfile"],"description":"The file path of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerWorkDir":{"description":"The working directory of the Dockerfile.","oneOf":[{"type":"string","examples":["/"],"description":"The working directory of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildkit":{"type":"object","properties":{"useCache":{"description":"Use persistent storage to cache build layers.","oneOf":[{"type":"boolean","examples":[true],"description":"Use persistent storage to cache build layers.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"cacheStorageSize":{"description":"The amount of persistent storage available to each build in MB.","oneOf":[{"type":"integer","examples":[32768],"description":"The amount of persistent storage available to each build in MB."},{"type":"string","pattern":".*\\${.*}.*"}]},"useInternalCache":{"description":"DEPRECATED: This field will be removed in the near future.","oneOf":[{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"internalCacheStorage":{"description":"DEPRECATED: This field will be removed in the near future.","oneOf":[{"type":"number","description":"DEPRECATED: This field will be removed in the near future."},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"required":["dockerFilePath","dockerWorkDir"],"additionalProperties":false},"buildpack":{"type":"object","properties":{"builder":{"description":"Buildpack stack to use. Defaults to recommended stack `HEROKU_24`.","oneOf":[{"type":"string","examples":["HEROKU_24"],"description":"Buildpack stack to use. Defaults to recommended stack `HEROKU_24`.","default":"HEROKU_24","enum":["HEROKU_24","HEROKU_22","HEROKU_22_CLASSIC","HEROKU_20","HEROKU_18","GOOGLE_22","GOOGLE_V1","CNB_ALPINE","CNB_BIONIC","PAKETO_JAMMY_TINY","PAKETO_JAMMY_BASE","PAKETO_JAMMY_FULL","PAKETO_TINY","PAKETO_BASE","PAKETO_FULL"]},{"type":"string","pattern":".*\\${.*}.*"}]},"buildpackLocators":{"type":"array","description":"Array of custom Buildpacks to use.","default":[],"items":{"description":"Url or registry identifier of custom Buildpack.","oneOf":[{"type":"string","examples":["https://buildpack-registry.heroku.com/cnb/mars/create-react-app"],"description":"Url or registry identifier of custom Buildpack."},{"type":"string","pattern":".*\\${.*}.*"}]}},"buildContext":{"description":"The working directory to build in.","oneOf":[{"type":"string","examples":["/"],"description":"The working directory to build in.","default":"/","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"useCache":{"description":"Should build dependencies be cached?","oneOf":[{"type":"boolean","examples":[false],"description":"Should build dependencies be cached?","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"buildConfiguration":{"type":"object","default":{"pathIgnoreRules":[],"isAllowList":false,"ciIgnoreFlagsEnabled":false},"properties":{"pathIgnoreRules":{"type":"array","description":"An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.","maxItems":200,"items":{"description":"A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.","oneOf":[{"type":"string","examples":["README.md"],"description":"A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.","maxLength":260},{"type":"string","pattern":".*\\${.*}.*"}]}},"isAllowList":{"description":"If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`.","oneOf":[{"type":"boolean","examples":[false],"description":"If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`."},{"type":"string","pattern":".*\\${.*}.*"}]},"ciIgnoreFlagsEnabled":{"description":"If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built.","oneOf":[{"type":"boolean","description":"If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built."},{"type":"string","pattern":".*\\${.*}.*"}]},"ciIgnoreFlags":{"type":"array","examples":[["[skip ci]","[ci skip]","[no ci]","[skip nf]","[nf skip]","[northflank skip]","[skip northflank]"]],"description":"An array of commit ignore flags. If a commit message contains one or more of these flags, that commit will not be built. Defaults to `[\"[skip ci]\", \"[ci skip]\", \"[no ci]\", \"[skip nf]\", \"[nf skip]\", \"[northflank skip]\", \"[skip northflank]\"]`","maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}},"dockerfileTarget":{"description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here.","oneOf":[{"type":"string","description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here."},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerCredentials":{"type":"array","items":{"description":"The ID of the docker credentials to use.","oneOf":[{"type":"string","examples":["example-docker-credential"],"description":"The ID of the docker credentials to use.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"includeGitFolder":{"type":"boolean","description":"Include .git folder inside the build context"},"fullGitClone":{"type":"boolean","description":"Include the entire git history as part of the .git folder. Only relevant if \"includeGitFolder\" is set."},"enableGitLfs":{"type":"boolean","description":"Enable Git LFS support for the build"},"storage":{"type":"object","properties":{"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per build in MB","oneOf":[{"type":"integer","examples":[16384],"description":"Ephemeral storage per build in MB","enum":[16384,32768,65536,131072,262144,524288],"minimum":16384,"maximum":65536},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"runtimeEnvironment":{"examples":[{"VARIABLE_1":"abcdef","VARIABLE_2":"12345"}],"description":"An object containing the runtime environment to set for the service. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","default":{},"oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"runtimeFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"buildArguments":{"examples":[{"ARGUMENT_1":"abcdef","ARGUMENT_2":"12345"}],"description":"An object containing the build arguments to set for the service. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","default":{},"oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"buildFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"additionalProperties":false},"healthChecks":{"type":"array","description":"An array of health checks.","items":{"type":"object","description":"A health check object.","properties":{"protocol":{"description":"The protocol to access the health check with.","oneOf":[{"type":"string","examples":["HTTP"],"description":"The protocol to access the health check with.","enum":["HTTP","CMD","TCP"]},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of health check.","oneOf":[{"type":"string","examples":["readinessProbe"],"description":"The type of health check.","enum":["livenessProbe","readinessProbe","startupProbe"]},{"type":"string","pattern":".*\\${.*}.*"}]},"path":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"cmd":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"port":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"initialDelaySeconds":{"description":"Initial delay, in seconds, before the health check is first run.","oneOf":[{"type":"integer","examples":[10],"description":"Initial delay, in seconds, before the health check is first run.","minimum":1,"maximum":180},{"type":"string","pattern":".*\\${.*}.*"}]},"periodSeconds":{"description":"The time between each check, in seconds.","oneOf":[{"type":"integer","examples":[60],"description":"The time between each check, in seconds.","minimum":10,"maximum":600},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutSeconds":{"description":"The time to wait for a response before marking the health check as a failure.","oneOf":[{"type":"integer","examples":[1],"description":"The time to wait for a response before marking the health check as a failure.","minimum":1,"maximum":60},{"type":"string","pattern":".*\\${.*}.*"}]},"failureThreshold":{"description":"The maximum number of allowed failures.","oneOf":[{"type":"integer","examples":[3],"description":"The maximum number of allowed failures.","minimum":1,"maximum":255},{"type":"string","pattern":".*\\${.*}.*"}]},"successThreshold":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["protocol","type","initialDelaySeconds","periodSeconds","timeoutSeconds","failureThreshold"],"additionalProperties":false}},"loadBalancing":{"type":"object","properties":{"mode":{"type":"string","enum":["leastConnection","consistentHash","roundRobin","consistentReplicaRouting"]},"consistentHash":{"type":"object","properties":{"mode":{"type":"string","enum":["ip","customHeader"]},"header":{"type":"string"}},"required":["mode"],"additionalProperties":false},"consistentReplicaRouting":{"type":"object","properties":{"mode":{"type":"string","enum":["path","header"]}},"required":["mode"],"additionalProperties":false}},"required":["mode"],"additionalProperties":false},"autoscaling":{"type":"object","description":"Describes all autoscaling configurations","properties":{"horizontal":{"type":"object","description":"Describes the horizontal autoscaling configuration","properties":{"enabled":{"description":"Whether horizontal autoscaling should be enabled","oneOf":[{"type":"boolean","examples":[true],"description":"Whether horizontal autoscaling should be enabled"},{"type":"string","pattern":".*\\${.*}.*"}]},"minReplicas":{"description":"Minimum number of replicas which should be running at any time","oneOf":[{"type":"number","examples":[1],"description":"Minimum number of replicas which should be running at any time","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]},"maxReplicas":{"description":"Maximum number of replicas which can be running at any time","oneOf":[{"type":"number","examples":[3],"description":"Maximum number of replicas which can be running at any time"},{"type":"string","pattern":".*\\${.*}.*"}]},"cpu":{"type":"object","properties":{"enabled":{"description":"Whether autoscaling should take into account cpu usage","oneOf":[{"type":"boolean","description":"Whether autoscaling should take into account cpu usage"},{"type":"string","pattern":".*\\${.*}.*"}]},"thresholdPercentage":{"description":"Threshold CPU usage percentage at which the workload will be scaled","oneOf":[{"type":"integer","description":"Threshold CPU usage percentage at which the workload will be scaled","minimum":10,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["enabled","thresholdPercentage"],"additionalProperties":false},"memory":{"type":"object","properties":{"enabled":{"description":"Whether autoscaling should take into account memory usage","oneOf":[{"type":"boolean","description":"Whether autoscaling should take into account memory usage"},{"type":"string","pattern":".*\\${.*}.*"}]},"thresholdPercentage":{"description":"Threshold memory usage percentage at which the workload will be scaled","oneOf":[{"type":"integer","description":"Threshold memory usage percentage at which the workload will be scaled","minimum":10,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["enabled","thresholdPercentage"],"additionalProperties":false},"rps":{"type":"object","properties":{"enabled":{"description":"Whether autoscaling should take into requests-per-second","oneOf":[{"type":"boolean","description":"Whether autoscaling should take into requests-per-second"},{"type":"string","pattern":".*\\${.*}.*"}]},"thresholdValue":{"description":"Threshold rps value on which the workload will be scaled","oneOf":[{"type":"integer","description":"Threshold rps value on which the workload will be scaled","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["enabled","thresholdValue"],"additionalProperties":false},"userMetrics":{"type":"object","properties":{"enabled":{"description":"Whether to enable handling for custom metrics in the autoscaling configuration","oneOf":[{"type":"boolean","examples":[true],"description":"Whether to enable handling for custom metrics in the autoscaling configuration"},{"type":"string","pattern":".*\\${.*}.*"}]},"exposedMetricsPath":{"description":"Path on which the metrics will be exposed by the service..","oneOf":[{"type":"string","examples":["/metrics"],"description":"Path on which the metrics will be exposed by the service..","pattern":"^\\/([_a-zA-Z0-9-&?=.]*)((\\/[_a-zA-Z0-9-&?=.]+)*(\\/)?)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"exposedMetricsPort":{"description":"Port on which the metrics will be exposed by the service.","oneOf":[{"type":"integer","examples":[8080],"description":"Port on which the metrics will be exposed by the service."},{"type":"string","pattern":".*\\${.*}.*"}]},"metrics":{"type":"array","description":"Array of custom metrics exposed by the service that will be used by the autoscaling configuration. At least one metric is required.","items":{"type":"object","properties":{"metricName":{"examples":["example-metric"],"description":"Name of the custom metric","oneOf":[{"type":"string","description":"Name of the custom metric","pattern":"[a-zA-Z_:][a-zA-Z0-9_:]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"metricType":{"examples":["gauge"],"description":"Type of metric exposed, this will affect how it'll be queried by the autoscaler component: Gauge will be used as is, Counter will be used with rate()","oneOf":[{"type":"string","description":"Type of metric exposed, this will affect how it'll be queried by the autoscaler component: Gauge will be used as is, Counter will be used with rate()","enum":["gauge","counter"]},{"type":"string","pattern":".*\\${.*}.*"}]},"thresholdValue":{"examples":[2],"description":"Threshold value on which the workload will be scaled. Represents the average value across all running pods.","oneOf":[{"type":"number","description":"Threshold value on which the workload will be scaled. Represents the average value across all running pods."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["metricName","metricType","thresholdValue"],"additionalProperties":false}}},"required":["enabled","exposedMetricsPath","exposedMetricsPort","metrics"],"additionalProperties":false}},"required":["enabled","minReplicas","maxReplicas"],"additionalProperties":false}},"additionalProperties":false},"createOptions":{"type":"object","properties":{"volumesToAttach":{"type":"array","items":{"type":"string","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}}},"additionalProperties":false}},"required":["name","billing","deployment","buildSettings"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"DeploymentService node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["DeploymentService"],"description":"The kind of node.","const":"DeploymentService"},"spec":{"type":"object","description":"The specification for the DeploymentService node.","properties":{"name":{"description":"The name of the service.","oneOf":[{"type":"string","examples":["Example Service"],"description":"The name of the service.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"A description of the service.","oneOf":[{"type":"string","examples":["A service description"],"description":"A description of the service.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"stageId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"billing":{"type":"object","properties":{"deploymentPlan":{"description":"The ID of the deployment plan to use.","oneOf":[{"type":"string","examples":["nf-compute-20"],"description":"The ID of the deployment plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false}},"required":["deploymentPlan"],"additionalProperties":false},"infrastructure":{"type":"object","properties":{"architecture":{"type":"string","enum":["x86","arm"]}},"additionalProperties":false},"deployment":{"type":"object","properties":{"type":{"description":"The way the service should be deployed. Either as a deployment (default), or as a stateful set.","oneOf":[{"type":"string","description":"The way the service should be deployed. Either as a deployment (default), or as a stateful set.","enum":["deployment","statefulSet"]},{"type":"string","pattern":".*\\${.*}.*"}]},"instances":{"description":"The number of instances to run the service on.","oneOf":[{"type":"integer","examples":[1],"description":"The number of instances to run the service on.","minimum":0},{"type":"string","pattern":".*\\${.*}.*"}]},"buildpack":{"type":"object","properties":{"configType":{"type":"string","examples":["default"],"enum":["default","customProcess","customCommand","customEntrypointCustomCommand","originalEntrypointCustomCommand"]},"customProcess":{"type":["string","null"]},"customEntrypoint":{"type":["string","null"]},"customCommand":{"type":["string","null"]}},"required":["configType"],"additionalProperties":false},"docker":{"type":"object","properties":{"configType":{"type":"string","enum":["default","customEntrypoint","customCommand","customEntrypointCustomCommand"]},"customEntrypoint":{"type":["string","null"]},"customCommand":{"type":["string","null"]}},"required":["configType"],"additionalProperties":false},"storage":{"type":"object","properties":{"useHdbStorage":{"type":"boolean"},"usePdSsdStorage":{"type":"boolean"},"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per container in MB","oneOf":[{"type":"integer","examples":[1024],"description":"Ephemeral storage per container in MB","minimum":1024},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"shmSize":{"description":"Configures the amount of available memory-backed disk space available to /dev/shm","oneOf":[{"type":"integer","description":"Configures the amount of available memory-backed disk space available to /dev/shm","minimum":64},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"strategy":{"type":"object","description":"Roll out strategy of the service","properties":{"type":{"description":"Configures the instance roll out strategy of your service. Currently only available via feature flag.","oneOf":[{"type":"string","description":"Configures the instance roll out strategy of your service. Currently only available via feature flag.","enum":["recreate","rollout-steady","rollout-balanced","rollout-fast","custom"]},{"type":"string","pattern":".*\\${.*}.*"}]},"settings":{"type":"object","properties":{},"additionalProperties":false}},"additionalProperties":false},"zonalRedundancy":{"type":"object","properties":{"type":{"description":"Defines scheduling behaviour across different zones within the same region.","oneOf":[{"type":"string","description":"Defines scheduling behaviour across different zones within the same region.","enum":["disabled","preferred","required"]},{"type":"string","pattern":".*\\${.*}.*"}]},"minZones":{"oneOf":[{"description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","oneOf":[{"type":"integer","description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]},{"description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","oneOf":[{"type":"integer","description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]}]}},"additionalProperties":false},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false},"gracePeriodSeconds":{"description":"The maximum amount of time the process has to shut down after receiving a SIGTERM signal before it is forcefully shut down SIGKILL by the system.","oneOf":[{"type":"integer","description":"The maximum amount of time the process has to shut down after receiving a SIGTERM signal before it is forcefully shut down SIGKILL by the system.","minimum":15,"maximum":600},{"type":"string","pattern":".*\\${.*}.*"}]},"gradualRolloutStrategyId":{"examples":["strategy-id"],"description":"The id of the strategy to be attached to service.","oneOf":[{"type":"string","examples":["strategy-id"],"description":"The id of the strategy to be attached to service.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"ssh":{"type":"object","description":"Controls related to SSH access within the resource.","properties":{"enabled":{"description":"Enables SSH access if the resource matches an SSH identity selector.","oneOf":[{"type":"boolean","description":"Enables SSH access if the resource matches an SSH identity selector."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["enabled"],"additionalProperties":false},"metadata":{"type":"object","description":"Allow setting custom labels and annotations for workloads.","properties":{"labels":{"type":"object","description":"Specify custom labels for the workload.","properties":{},"additionalProperties":false},"annotations":{"type":"object","description":"Specify custom annotations for the workload as string or object.","properties":{},"additionalProperties":false}},"additionalProperties":false},"internal":{"type":"object","properties":{"id":{"description":"ID of the build service to deploy","oneOf":[{"type":"string","examples":["example-build-service"],"description":"ID of the build service to deploy","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"branch":{"description":"Branch to deploy","oneOf":[{"type":"string","examples":["master"],"description":"Branch to deploy"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildSHA":{"description":"Commit SHA to deploy, or 'latest' to deploy the most recent commit","oneOf":[{"examples":["latest"],"description":"Commit SHA to deploy, or 'latest' to deploy the most recent commit","oneOf":[{"type":"string","description":"A commit sha."},{"type":"string","description":"Latest commit.","const":"latest"}]},{"type":"string","pattern":".*\\${.*}.*"}]},"buildId":{"description":"ID of the build that should be deployed","oneOf":[{"type":"string","examples":["premium-guide-6393"],"description":"ID of the build that should be deployed"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"external":{"type":"object","properties":{"imagePath":{"description":"Image to be deployed. When not deploying from Dockerhub the URL must be specified.","oneOf":[{"type":"string","examples":["nginx:latest"],"description":"Image to be deployed. When not deploying from Dockerhub the URL must be specified.","pattern":"^(?:(?:https?:\\/\\/)?([a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\.\\-]+)(\\/v1)?)?(?:\\/)?([a-zA-Z/-9\\.\\-_]+)(?:\\:([a-zA-Z/-9\\.\\-_\\:]+)|\\@([a-zA-Z/-9\\.\\-_\\:]+))$"},{"type":"string","pattern":".*\\${.*}.*"}]},"credentials":{"description":"ID of the saved credentials to use to access this external image.","oneOf":[{"type":"string","examples":["example-credentials"],"description":"ID of the saved credentials to use to access this external image.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["imagePath"],"additionalProperties":false},"releaseFlowControlled":{"type":"boolean","description":"When enabled the deployment source will only be set on creation. All changes to the deployment source must be done via a release flow or manually."}},"required":["instances"],"additionalProperties":false},"ports":{"type":"array","default":[],"items":{"type":"object","properties":{"name":{"description":"The name used to identify the port.","oneOf":[{"type":"string","examples":["p01"],"description":"The name used to identify the port.","pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$","minLength":1,"maxLength":8},{"type":"string","pattern":".*\\${.*}.*"}]},"internalPort":{"description":"The port number.","oneOf":[{"type":"integer","examples":[8080],"description":"The port number.","minimum":1,"maximum":65535},{"type":"string","pattern":".*\\${.*}.*"}]},"public":{"description":"If true, the port will be exposed publicly.","oneOf":[{"type":"boolean","examples":[true],"description":"If true, the port will be exposed publicly.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"security":{"type":"object","default":{"credentials":[],"policies":[],"sso":{}},"properties":{"credentials":{"type":"array","description":"An array of credentials to access the service.","items":{"type":"object","properties":{"username":{"description":"The username to access the service","oneOf":[{"type":"string","examples":["admin"],"description":"The username to access the service","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"password":{"description":"The password to access the service with this username.","oneOf":[{"type":"string","examples":["password123"],"description":"The password to access the service with this username."},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of authentication used","oneOf":[{"type":"string","examples":["basic-auth"],"description":"The type of authentication used","const":"basic-auth"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["username","password","type"],"additionalProperties":false}},"ip":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"policies":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"sso":{"type":"object","description":"Configure port authentication via SSO","properties":{"organizationId":{"description":"ID of the SSO organization that the user will have to be a member of","oneOf":[{"type":"string","description":"ID of the SSO organization that the user will have to be a member of"},{"type":"string","pattern":".*\\${.*}.*"}]},"directoryGroupIds":{"description":"Array of directory groups that will have access","oneOf":[{"type":"array","description":"Array of directory groups that will have access","items":{"type":"string"}},{"type":"string","pattern":".*\\${.*}.*"}]},"allowAnyOrgUsers":{"description":"Allow entire organization to access this service","oneOf":[{"type":"boolean","description":"Allow entire organization to access this service"},{"type":"string","pattern":".*\\${.*}.*"}]},"validateInternalTraffic":{"description":"Enforce internal traffic through SSO authentication flow","oneOf":[{"type":"boolean","description":"Enforce internal traffic through SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]},"setCookieOnRootDomain":{"description":"Set SSO authentication cookie on root domain","oneOf":[{"type":"boolean","description":"Set SSO authentication cookie on root domain"},{"type":"string","pattern":".*\\${.*}.*"}]},"allowInternalTrafficViaPublicDns":{"description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow","oneOf":[{"type":"boolean","description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"headers":{"type":"array","description":"List of header authentication settings, it checks the presence of all headers and compares it against the expected value. Wildcard (*) is supported.","items":{"type":"object","properties":{"regexMode":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"name":{"oneOf":[{"oneOf":[{"type":"regex"},{"type":"string","pattern":".*\\${.*}.*"}]},{"oneOf":[{"type":"string","pattern":"^[a-zA-Z0-9_\\-%$+]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"value":{"examples":["headerValue"],"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["value"],"additionalProperties":false}},"verificationMode":{"type":"string","description":"Mode used to verify multiple security features like ip policies and SSO authentication","enum":["or","and"]},"securePathConfiguration":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Enable security policies on a path-level style"},"skipSecurityPoliciesForInternalTrafficViaPublicDns":{"type":"boolean","description":"Allow internal traffic from same or shared projects via public DNS to skip all security policies"},"rules":{"type":"array","default":[],"items":{"type":"object","properties":{"paths":{"type":"array","description":"Array of path objects which represent the paths and their priority for which the security policies will be enforced","items":{"type":"object","properties":{"routingMode":{"description":"Mode of the path, determining how the URI will be interpreted.","oneOf":[{"type":"string","examples":["prefix"],"description":"Mode of the path, determining how the URI will be interpreted.","enum":["prefix","exact","regex"]},{"type":"string","pattern":".*\\${.*}.*"}]},"path":{"examples":["/path"],"oneOf":[{"oneOf":[{"type":"string","pattern":"^\\/([_a-zA-Z0-9-&?=.]*)((\\/[_a-zA-Z0-9-&?=.]+)*(\\/)?)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},{"oneOf":[{"type":"string","pattern":"^\\/([_a-zA-Z0-9-&?=.]*)((\\/[_a-zA-Z0-9-&?=.]+)*(\\/)?)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},{"oneOf":[{"type":"regex"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"priority":{"examples":[80],"oneOf":[{"type":"integer","minimum":0,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["routingMode","priority"],"additionalProperties":false}},"accessMode":{"examples":["protected"],"description":"Specify the way the path rule will behave when processing policies. This enables an allow-list/deny-list approach for access control on each path","oneOf":[{"type":"string","description":"Specify the way the path rule will behave when processing policies. This enables an allow-list/deny-list approach for access control on each path","enum":["protected","unprotected"]},{"type":"string","pattern":".*\\${.*}.*"}]},"securityPolicies":{"oneOf":[{"type":"object","properties":{"orPolicies":{"type":"object","properties":{"credentials":{"type":"array","description":"An array of credentials to access the service.","items":{"type":"object","properties":{"username":{"description":"The username to access the service","oneOf":[{"type":"string","examples":["admin"],"description":"The username to access the service","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"password":{"description":"The password to access the service with this username.","oneOf":[{"type":"string","examples":["password123"],"description":"The password to access the service with this username."},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of authentication used","oneOf":[{"type":"string","examples":["basic-auth"],"description":"The type of authentication used","const":"basic-auth"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["username","password","type"],"additionalProperties":false}},"ip":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"policies":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"sso":{"type":"object","description":"Configure port authentication via SSO","properties":{"organizationId":{"description":"ID of the SSO organization that the user will have to be a member of","oneOf":[{"type":"string","description":"ID of the SSO organization that the user will have to be a member of"},{"type":"string","pattern":".*\\${.*}.*"}]},"directoryGroupIds":{"description":"Array of directory groups that will have access","oneOf":[{"type":"array","description":"Array of directory groups that will have access","items":{"type":"string"}},{"type":"string","pattern":".*\\${.*}.*"}]},"allowAnyOrgUsers":{"description":"Allow entire organization to access this service","oneOf":[{"type":"boolean","description":"Allow entire organization to access this service"},{"type":"string","pattern":".*\\${.*}.*"}]},"validateInternalTraffic":{"description":"Enforce internal traffic through SSO authentication flow","oneOf":[{"type":"boolean","description":"Enforce internal traffic through SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]},"setCookieOnRootDomain":{"description":"Set SSO authentication cookie on root domain","oneOf":[{"type":"boolean","description":"Set SSO authentication cookie on root domain"},{"type":"string","pattern":".*\\${.*}.*"}]},"allowInternalTrafficViaPublicDns":{"description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow","oneOf":[{"type":"boolean","description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"headers":{"type":"array","description":"List of header authentication settings, it checks the presence of all headers and compares it against the expected value. Wildcard (*) is supported.","items":{"type":"object","properties":{"regexMode":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"name":{"oneOf":[{"oneOf":[{"type":"regex"},{"type":"string","pattern":".*\\${.*}.*"}]},{"oneOf":[{"type":"string","pattern":"^[a-zA-Z0-9_\\-%$+]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"value":{"examples":["headerValue"],"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["value"],"additionalProperties":false}}},"additionalProperties":false},"requiredPolicies":{"type":"object","properties":{"credentials":{"type":"array","description":"An array of credentials to access the service.","items":{"type":"object","properties":{"username":{"description":"The username to access the service","oneOf":[{"type":"string","examples":["admin"],"description":"The username to access the service","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"password":{"description":"The password to access the service with this username.","oneOf":[{"type":"string","examples":["password123"],"description":"The password to access the service with this username."},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of authentication used","oneOf":[{"type":"string","examples":["basic-auth"],"description":"The type of authentication used","const":"basic-auth"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["username","password","type"],"additionalProperties":false}},"ip":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"policies":{"description":"An array of IP address policies.","oneOf":[{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"description":"An array of IP addresses used for this rule","oneOf":[{"type":"array","description":"An array of IP addresses used for this rule","items":{"description":"An IP address used by this rule","oneOf":[{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","pattern":"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"action":{"description":"The action for this rule.","oneOf":[{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addresses","action"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]},"sso":{"type":"object","description":"Configure port authentication via SSO","properties":{"organizationId":{"description":"ID of the SSO organization that the user will have to be a member of","oneOf":[{"type":"string","description":"ID of the SSO organization that the user will have to be a member of"},{"type":"string","pattern":".*\\${.*}.*"}]},"directoryGroupIds":{"description":"Array of directory groups that will have access","oneOf":[{"type":"array","description":"Array of directory groups that will have access","items":{"type":"string"}},{"type":"string","pattern":".*\\${.*}.*"}]},"allowAnyOrgUsers":{"description":"Allow entire organization to access this service","oneOf":[{"type":"boolean","description":"Allow entire organization to access this service"},{"type":"string","pattern":".*\\${.*}.*"}]},"validateInternalTraffic":{"description":"Enforce internal traffic through SSO authentication flow","oneOf":[{"type":"boolean","description":"Enforce internal traffic through SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]},"setCookieOnRootDomain":{"description":"Set SSO authentication cookie on root domain","oneOf":[{"type":"boolean","description":"Set SSO authentication cookie on root domain"},{"type":"string","pattern":".*\\${.*}.*"}]},"allowInternalTrafficViaPublicDns":{"description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow","oneOf":[{"type":"boolean","description":"Allow internal traffic from same or shared projects via public DNS to skip SSO authentication flow"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"headers":{"type":"array","description":"List of header authentication settings, it checks the presence of all headers and compares it against the expected value. Wildcard (*) is supported.","items":{"type":"object","properties":{"regexMode":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"name":{"oneOf":[{"oneOf":[{"type":"regex"},{"type":"string","pattern":".*\\${.*}.*"}]},{"oneOf":[{"type":"string","pattern":"^[a-zA-Z0-9_\\-%$+]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"value":{"examples":["headerValue"],"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["value"],"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["paths","accessMode"],"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"domains":{"description":"An array of domains to redirect to this port. Each domain must first be verified and registered to your account.","oneOf":[{"type":"array","description":"An array of domains to redirect to this port. Each domain must first be verified and registered to your account.","default":[],"items":{"description":"A domain to redirect to this port.","oneOf":[{"type":"string","examples":["app.example.com"],"description":"A domain to redirect to this port."},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"disableNfDomain":{"description":"Disable routing on the default code.run domain for public HTTP ports with custom domains.","oneOf":[{"type":"boolean","description":"Disable routing on the default code.run domain for public HTTP ports with custom domains.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"advancedOptions":{"type":"object","properties":{"enableTlsPassthrough":{"description":"Whether this port should use pass through mode for TLS","oneOf":[{"type":"boolean","description":"Whether this port should use pass through mode for TLS"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"protocol":{"type":"string","examples":["HTTP"],"description":"The protocol to use for the port."}},"required":["name","internalPort","protocol"],"additionalProperties":false}},"runtimeEnvironment":{"examples":[{"VARIABLE_1":"abcdef","VARIABLE_2":"12345"}],"description":"An object containing the runtime environment to set for the service","default":{},"oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"runtimeFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"healthChecks":{"type":"array","description":"An array of health checks.","items":{"type":"object","description":"A health check object.","properties":{"protocol":{"description":"The protocol to access the health check with.","oneOf":[{"type":"string","examples":["HTTP"],"description":"The protocol to access the health check with.","enum":["HTTP","CMD","TCP"]},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of health check.","oneOf":[{"type":"string","examples":["readinessProbe"],"description":"The type of health check.","enum":["livenessProbe","readinessProbe","startupProbe"]},{"type":"string","pattern":".*\\${.*}.*"}]},"path":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"cmd":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"port":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"initialDelaySeconds":{"description":"Initial delay, in seconds, before the health check is first run.","oneOf":[{"type":"integer","examples":[10],"description":"Initial delay, in seconds, before the health check is first run.","minimum":1,"maximum":180},{"type":"string","pattern":".*\\${.*}.*"}]},"periodSeconds":{"description":"The time between each check, in seconds.","oneOf":[{"type":"integer","examples":[60],"description":"The time between each check, in seconds.","minimum":10,"maximum":600},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutSeconds":{"description":"The time to wait for a response before marking the health check as a failure.","oneOf":[{"type":"integer","examples":[1],"description":"The time to wait for a response before marking the health check as a failure.","minimum":1,"maximum":60},{"type":"string","pattern":".*\\${.*}.*"}]},"failureThreshold":{"description":"The maximum number of allowed failures.","oneOf":[{"type":"integer","examples":[3],"description":"The maximum number of allowed failures.","minimum":1,"maximum":255},{"type":"string","pattern":".*\\${.*}.*"}]},"successThreshold":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["protocol","type","initialDelaySeconds","periodSeconds","timeoutSeconds","failureThreshold"],"additionalProperties":false}},"loadBalancing":{"type":"object","properties":{"mode":{"type":"string","enum":["leastConnection","consistentHash","roundRobin","consistentReplicaRouting"]},"consistentHash":{"type":"object","properties":{"mode":{"type":"string","enum":["ip","customHeader"]},"header":{"type":"string"}},"required":["mode"],"additionalProperties":false},"consistentReplicaRouting":{"type":"object","properties":{"mode":{"type":"string","enum":["path","header"]}},"required":["mode"],"additionalProperties":false}},"required":["mode"],"additionalProperties":false},"autoscaling":{"type":"object","description":"Describes all autoscaling configurations","properties":{"horizontal":{"type":"object","description":"Describes the horizontal autoscaling configuration","properties":{"enabled":{"description":"Whether horizontal autoscaling should be enabled","oneOf":[{"type":"boolean","examples":[true],"description":"Whether horizontal autoscaling should be enabled"},{"type":"string","pattern":".*\\${.*}.*"}]},"minReplicas":{"description":"Minimum number of replicas which should be running at any time","oneOf":[{"type":"number","examples":[1],"description":"Minimum number of replicas which should be running at any time","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]},"maxReplicas":{"description":"Maximum number of replicas which can be running at any time","oneOf":[{"type":"number","examples":[3],"description":"Maximum number of replicas which can be running at any time"},{"type":"string","pattern":".*\\${.*}.*"}]},"cpu":{"type":"object","properties":{"enabled":{"description":"Whether autoscaling should take into account cpu usage","oneOf":[{"type":"boolean","description":"Whether autoscaling should take into account cpu usage"},{"type":"string","pattern":".*\\${.*}.*"}]},"thresholdPercentage":{"description":"Threshold CPU usage percentage at which the workload will be scaled","oneOf":[{"type":"integer","description":"Threshold CPU usage percentage at which the workload will be scaled","minimum":10,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["enabled","thresholdPercentage"],"additionalProperties":false},"memory":{"type":"object","properties":{"enabled":{"description":"Whether autoscaling should take into account memory usage","oneOf":[{"type":"boolean","description":"Whether autoscaling should take into account memory usage"},{"type":"string","pattern":".*\\${.*}.*"}]},"thresholdPercentage":{"description":"Threshold memory usage percentage at which the workload will be scaled","oneOf":[{"type":"integer","description":"Threshold memory usage percentage at which the workload will be scaled","minimum":10,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["enabled","thresholdPercentage"],"additionalProperties":false},"rps":{"type":"object","properties":{"enabled":{"description":"Whether autoscaling should take into requests-per-second","oneOf":[{"type":"boolean","description":"Whether autoscaling should take into requests-per-second"},{"type":"string","pattern":".*\\${.*}.*"}]},"thresholdValue":{"description":"Threshold rps value on which the workload will be scaled","oneOf":[{"type":"integer","description":"Threshold rps value on which the workload will be scaled","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["enabled","thresholdValue"],"additionalProperties":false},"userMetrics":{"type":"object","properties":{"enabled":{"description":"Whether to enable handling for custom metrics in the autoscaling configuration","oneOf":[{"type":"boolean","examples":[true],"description":"Whether to enable handling for custom metrics in the autoscaling configuration"},{"type":"string","pattern":".*\\${.*}.*"}]},"exposedMetricsPath":{"description":"Path on which the metrics will be exposed by the service..","oneOf":[{"type":"string","examples":["/metrics"],"description":"Path on which the metrics will be exposed by the service..","pattern":"^\\/([_a-zA-Z0-9-&?=.]*)((\\/[_a-zA-Z0-9-&?=.]+)*(\\/)?)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"exposedMetricsPort":{"description":"Port on which the metrics will be exposed by the service.","oneOf":[{"type":"integer","examples":[8080],"description":"Port on which the metrics will be exposed by the service."},{"type":"string","pattern":".*\\${.*}.*"}]},"metrics":{"type":"array","description":"Array of custom metrics exposed by the service that will be used by the autoscaling configuration. At least one metric is required.","items":{"type":"object","properties":{"metricName":{"examples":["example-metric"],"description":"Name of the custom metric","oneOf":[{"type":"string","description":"Name of the custom metric","pattern":"[a-zA-Z_:][a-zA-Z0-9_:]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"metricType":{"examples":["gauge"],"description":"Type of metric exposed, this will affect how it'll be queried by the autoscaler component: Gauge will be used as is, Counter will be used with rate()","oneOf":[{"type":"string","description":"Type of metric exposed, this will affect how it'll be queried by the autoscaler component: Gauge will be used as is, Counter will be used with rate()","enum":["gauge","counter"]},{"type":"string","pattern":".*\\${.*}.*"}]},"thresholdValue":{"examples":[2],"description":"Threshold value on which the workload will be scaled. Represents the average value across all running pods.","oneOf":[{"type":"number","description":"Threshold value on which the workload will be scaled. Represents the average value across all running pods."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["metricName","metricType","thresholdValue"],"additionalProperties":false}}},"required":["enabled","exposedMetricsPath","exposedMetricsPort","metrics"],"additionalProperties":false}},"required":["enabled","minReplicas","maxReplicas"],"additionalProperties":false}},"additionalProperties":false},"createOptions":{"type":"object","properties":{"volumesToAttach":{"type":"array","items":{"type":"string","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}}},"additionalProperties":false}},"required":["name","billing","deployment"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"LLMModelDeployment node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["LLMModelDeployment"],"description":"The kind of node.","const":"LLMModelDeployment"},"spec":{"type":"object","description":"The specification for the LLMModelDeployment node.","properties":{"name":{"description":"The name of the AI model.","oneOf":[{"type":"string","examples":["deepseek-v3-deployment"],"description":"The name of the AI model.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"A description of the AI model.","oneOf":[{"type":"string","examples":["A deployment for DeepSeek V3 model"],"description":"A description of the AI model.","maxLength":1024,"pattern":"^[\\s\\S]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"ports":{"type":"array","items":{"type":"object","properties":{"name":{"description":"The name used to identify the port.","oneOf":[{"type":"string","description":"The name used to identify the port.","pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$","minLength":1,"maxLength":8},{"type":"string","pattern":".*\\${.*}.*"}]},"internalPort":{"description":"The port number.","oneOf":[{"type":"integer","description":"The port number.","minimum":1,"maximum":65535},{"type":"string","pattern":".*\\${.*}.*"}]},"public":{"description":"If true, the port will be exposed publicly.","oneOf":[{"type":"boolean","description":"If true, the port will be exposed publicly.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"domains":{"description":"An array of domains to redirect to this port. Each domain must first be verified and registered to your account.","oneOf":[{"type":"array","description":"An array of domains to redirect to this port. Each domain must first be verified and registered to your account.","default":[],"items":{"description":"A domain to redirect to this port.","oneOf":[{"type":"string","description":"A domain to redirect to this port."},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"disableNfDomain":{"description":"Disable routing on the default code.run domain for public HTTP ports with custom domains.","oneOf":[{"type":"boolean","description":"Disable routing on the default code.run domain for public HTTP ports with custom domains.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"protocol":{"type":"string","description":"The protocol to use for the port.","enum":["HTTP","HTTP/2","TCP","UDP"]}},"required":["name","internalPort","protocol"],"additionalProperties":false}},"spec":{"type":"object","properties":{"type":{"type":"string","description":"Type of model spec - custom for user-defined configuration","const":"custom"},"configuration":{"type":"object","description":"LLM model configuration including engine, architecture, and compute settings","properties":{"name":{"type":"string"},"engine":{"type":"string","const":"vllm"},"revision":{"type":"string"},"nodeConfiguration":{"type":"object","properties":{"gpu":{"type":"object","properties":{"enabled":{"type":"boolean"},"configuration":{"type":"object","properties":{"gpuType":{"type":"string"},"gpuCount":{"type":"integer","minimum":1},"timesliced":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"storage":{"type":"object","properties":{"accessMode":{"type":"string","const":"ReadWriteMany"},"storageClass":{"type":"string","examples":["nvme"],"description":"The type of the storage.","default":"nvme","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},"storageSize":{"type":"number","examples":[6144],"description":"The size of the storage, in megabytes. Configurable sizes depend on the storage class."},"shmSize":{"type":["integer","null"],"minimum":0}},"required":["storageSize"],"additionalProperties":false}},"additionalProperties":false},"architecture":{"type":"object","properties":{"type":{"type":"string","const":"aggregated"},"workerConfig":{"type":"object","properties":{"replicas":{"type":"integer","minimum":0,"maximum":5},"parallelismConfig":{"type":"object","properties":{"tensorParallelism":{"type":"integer"},"pipelineParallelism":{"type":"integer"},"expertParallelism":{"type":"integer"}},"additionalProperties":false},"sequenceLengthConfig":{"type":"object","properties":{"maxModelLength":{"oneOf":[{"type":"integer","minimum":1},{"type":"string","const":"auto"}]},"maxInputLength":{"type":"integer","minimum":1},"maxOutputLength":{"type":"integer","minimum":1}},"additionalProperties":false},"batchingConfig":{"type":"object","properties":{"maxNumSeqs":{"type":"integer","minimum":1},"maxNumBatchedTokens":{"type":"integer","minimum":1}},"additionalProperties":false},"enableChunkedPrefill":{"type":"boolean"},"enablePrefixCaching":{"type":"boolean"},"enforceEager":{"type":"boolean"},"enableAsyncScheduling":{"type":"boolean"},"gpuMemoryUtilization":{"type":"number","minimum":0.1,"maximum":1},"trustRemoteCode":{"type":"boolean"},"dataType":{"type":"string","enum":["auto","float16","bfloat16"]},"kvCacheDataType":{"type":"string","enum":["fp8","fp8_e5m2","fp8_e4m3"]},"quantization":{"type":"string","enum":["fp8","awq","gptq","int4"]}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false}},"required":["type","configuration"],"additionalProperties":false},"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["name","spec"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"CronJob node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["CronJob"],"description":"The kind of node.","const":"CronJob"},"spec":{"type":"object","description":"The specification for the CronJob node.","properties":{"name":{"description":"The name of the job.","oneOf":[{"type":"string","examples":["Example Job"],"description":"The name of the job.","minLength":3,"maxLength":52,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"A description of the job.","oneOf":[{"type":"string","examples":["A job description"],"description":"A description of the job.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"stageId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"infrastructure":{"type":"object","properties":{"architecture":{"type":"string","enum":["x86","arm"]}},"additionalProperties":false},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"billing":{"type":"object","properties":{"buildPlan":{"description":"The ID of the build plan to use.","oneOf":[{"type":"string","examples":["nf-compute-200-8"],"description":"The ID of the build plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"deploymentPlan":{"description":"The ID of the deployment plan to use.","oneOf":[{"type":"string","examples":["nf-compute-20"],"description":"The ID of the deployment plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false}},"required":["deploymentPlan"],"additionalProperties":false},"deployment":{"type":"object","default":{},"properties":{"buildpack":{"type":"object","properties":{"configType":{"oneOf":[{"type":"string","examples":["default"],"enum":["default","customProcess","customCommand","customEntrypointCustomCommand","originalEntrypointCustomCommand"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customProcess":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customEntrypoint":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customCommand":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["configType"],"additionalProperties":false},"docker":{"type":"object","properties":{"configType":{"oneOf":[{"type":"string","enum":["default","customEntrypoint","customCommand","customEntrypointCustomCommand"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customEntrypoint":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customCommand":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["configType"],"additionalProperties":false},"storage":{"type":"object","properties":{"useHdbStorage":{"type":"boolean"},"usePdSsdStorage":{"type":"boolean"},"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per container in MB","oneOf":[{"type":"integer","examples":[1024],"description":"Ephemeral storage per container in MB","minimum":1024},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"shmSize":{"description":"Configures the amount of available memory-backed disk space available to /dev/shm","oneOf":[{"type":"integer","description":"Configures the amount of available memory-backed disk space available to /dev/shm","minimum":64},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false},"gracePeriodSeconds":{"description":"The maximum amount of time the process has to shut down after receiving a SIGTERM signal before it is forcefully shut down SIGKILL by the system.","oneOf":[{"type":"integer","description":"The maximum amount of time the process has to shut down after receiving a SIGTERM signal before it is forcefully shut down SIGKILL by the system.","minimum":15,"maximum":600},{"type":"string","pattern":".*\\${.*}.*"}]},"metadata":{"type":"object","description":"Allow setting custom labels and annotations for workloads.","properties":{"labels":{"type":"object","description":"Specify custom labels for the workload.","properties":{},"additionalProperties":false},"annotations":{"type":"object","description":"Specify custom annotations for the workload as string or object.","properties":{},"additionalProperties":false}},"additionalProperties":false},"vcs":{"type":"object","properties":{"projectUrl":{"description":"URL of the Git repo to build.","oneOf":[{"type":"string","examples":["https://github.com/northflank/gatsby-with-northflank"],"description":"URL of the Git repo to build.","pattern":"^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectType":{"description":"The VCS provider to use.","oneOf":[{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"oneOf":[{"oneOf":[{"type":"string","pattern":"^([A-Za-z0-9-]+)|([0-9a-f]{24})$"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"accountLogin":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name.","oneOf":[{"type":"string","examples":["github-user"],"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name."},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsLinkId":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `vcsLinkId` is provided, Northflank will instead use your linked account with that ID.","oneOf":[{"type":"string","description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `vcsLinkId` is provided, Northflank will instead use your linked account with that ID."},{"type":"string","pattern":".*\\${.*}.*"}]},"projectBranch":{"description":"The name of the branch to use.","oneOf":[{"type":"string","examples":["master"],"description":"The name of the branch to use."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["projectUrl","projectType","projectBranch"],"additionalProperties":false},"external":{"type":"object","properties":{"imagePath":{"description":"Image to be deployed. When not deploying from Dockerhub the URL must be specified.","oneOf":[{"type":"string","examples":["nginx:latest"],"description":"Image to be deployed. When not deploying from Dockerhub the URL must be specified.","pattern":"^(?:(?:https?:\\/\\/)?([a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\.\\-]+)(\\/v1)?)?(?:\\/)?([a-zA-Z/-9\\.\\-_]+)(?:\\:([a-zA-Z/-9\\.\\-_\\:]+)|\\@([a-zA-Z/-9\\.\\-_\\:]+))$"},{"type":"string","pattern":".*\\${.*}.*"}]},"credentials":{"description":"ID of the saved credentials to use to access this external image.","oneOf":[{"type":"string","examples":["example-credentials"],"description":"ID of the saved credentials to use to access this external image.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["imagePath"],"additionalProperties":false},"internal":{"type":"object","properties":{"id":{"description":"ID of the build service to deploy","oneOf":[{"type":"string","examples":["example-build-service"],"description":"ID of the build service to deploy","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"branch":{"description":"Branch to deploy","oneOf":[{"type":"string","examples":["master"],"description":"Branch to deploy"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildSHA":{"description":"Commit SHA to deploy, or 'latest' to deploy the most recent commit","oneOf":[{"examples":["latest"],"description":"Commit SHA to deploy, or 'latest' to deploy the most recent commit","oneOf":[{"type":"string","description":"A commit sha."},{"type":"string","description":"Latest commit.","const":"latest"}]},{"type":"string","pattern":".*\\${.*}.*"}]},"buildId":{"description":"ID of the build that should be deployed","oneOf":[{"type":"string","examples":["premium-guide-6393"],"description":"ID of the build that should be deployed"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"releaseFlowControlled":{"type":"boolean","description":"When enabled the deployment source will only be set on creation. All changes to the deployment source must be done via a release flow or manually."}},"additionalProperties":false},"disabledCI":{"description":"Whether CI should be disabled. Only relevant for jobs deploying directly from version control.","oneOf":[{"type":"boolean","description":"Whether CI should be disabled. Only relevant for jobs deploying directly from version control.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"buildConfiguration":{"type":"object","default":{"pathIgnoreRules":[],"isAllowList":false,"ciIgnoreFlagsEnabled":false},"properties":{"pathIgnoreRules":{"type":"array","description":"An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.","maxItems":200,"items":{"description":"A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.","oneOf":[{"type":"string","examples":["README.md"],"description":"A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.","maxLength":260},{"type":"string","pattern":".*\\${.*}.*"}]}},"isAllowList":{"description":"If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`.","oneOf":[{"type":"boolean","examples":[false],"description":"If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`."},{"type":"string","pattern":".*\\${.*}.*"}]},"ciIgnoreFlagsEnabled":{"description":"If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built.","oneOf":[{"type":"boolean","description":"If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built."},{"type":"string","pattern":".*\\${.*}.*"}]},"ciIgnoreFlags":{"type":"array","examples":[["[skip ci]","[ci skip]","[no ci]","[skip nf]","[nf skip]","[northflank skip]","[skip northflank]"]],"description":"An array of commit ignore flags. If a commit message contains one or more of these flags, that commit will not be built. Defaults to `[\"[skip ci]\", \"[ci skip]\", \"[no ci]\", \"[skip nf]\", \"[nf skip]\", \"[northflank skip]\", \"[skip northflank]\"]`","maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}},"dockerfileTarget":{"description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here.","oneOf":[{"type":"string","description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here."},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerCredentials":{"type":"array","items":{"description":"The ID of the docker credentials to use.","oneOf":[{"type":"string","examples":["example-docker-credential"],"description":"The ID of the docker credentials to use.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"includeGitFolder":{"type":"boolean","description":"Include .git folder inside the build context"},"fullGitClone":{"type":"boolean","description":"Include the entire git history as part of the .git folder. Only relevant if \"includeGitFolder\" is set."},"enableGitLfs":{"type":"boolean","description":"Enable Git LFS support for the build"},"storage":{"type":"object","properties":{"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per build in MB","oneOf":[{"type":"integer","examples":[16384],"description":"Ephemeral storage per build in MB","enum":[16384,32768,65536,131072,262144,524288],"minimum":16384,"maximum":65536},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"buildSettings":{"type":"object","properties":{"storage":{"type":"object","properties":{"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per build in MB","oneOf":[{"type":"integer","examples":[16384],"description":"Ephemeral storage per build in MB","enum":[16384,32768,65536,131072,262144,524288],"minimum":16384,"maximum":65536},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"dockerfile":{"type":"object","properties":{"useCache":{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future and currently has no effect."},"buildEngine":{"description":"Build engine to use. Defaults to recommended build engine `buildkit`","oneOf":[{"type":"string","examples":["buildkit"],"description":"Build engine to use. Defaults to recommended build engine `buildkit`","default":"buildkit","enum":["buildkit","kaniko"]},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerFilePath":{"description":"The file path of the Dockerfile.","oneOf":[{"type":"string","examples":["/Dockerfile"],"description":"The file path of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerWorkDir":{"description":"The working directory of the Dockerfile.","oneOf":[{"type":"string","examples":["/"],"description":"The working directory of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildkit":{"type":"object","properties":{"useCache":{"description":"Use persistent storage to cache build layers.","oneOf":[{"type":"boolean","examples":[true],"description":"Use persistent storage to cache build layers.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"cacheStorageSize":{"description":"The amount of persistent storage available to each build in MB.","oneOf":[{"type":"integer","examples":[32768],"description":"The amount of persistent storage available to each build in MB."},{"type":"string","pattern":".*\\${.*}.*"}]},"useInternalCache":{"description":"DEPRECATED: This field will be removed in the near future.","oneOf":[{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"internalCacheStorage":{"description":"DEPRECATED: This field will be removed in the near future.","oneOf":[{"type":"number","description":"DEPRECATED: This field will be removed in the near future."},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"required":["dockerFilePath","dockerWorkDir"],"additionalProperties":false},"buildpack":{"type":"object","properties":{"builder":{"description":"Buildpack stack to use. Defaults to recommended stack `HEROKU_24`.","oneOf":[{"type":"string","examples":["HEROKU_24"],"description":"Buildpack stack to use. Defaults to recommended stack `HEROKU_24`.","default":"HEROKU_24","enum":["HEROKU_24","HEROKU_22","HEROKU_22_CLASSIC","HEROKU_20","HEROKU_18","GOOGLE_22","GOOGLE_V1","CNB_ALPINE","CNB_BIONIC","PAKETO_JAMMY_TINY","PAKETO_JAMMY_BASE","PAKETO_JAMMY_FULL","PAKETO_TINY","PAKETO_BASE","PAKETO_FULL"]},{"type":"string","pattern":".*\\${.*}.*"}]},"buildpackLocators":{"type":"array","description":"Array of custom Buildpacks to use.","default":[],"items":{"description":"Url or registry identifier of custom Buildpack.","oneOf":[{"type":"string","examples":["https://buildpack-registry.heroku.com/cnb/mars/create-react-app"],"description":"Url or registry identifier of custom Buildpack."},{"type":"string","pattern":".*\\${.*}.*"}]}},"buildContext":{"description":"The working directory to build in.","oneOf":[{"type":"string","examples":["/"],"description":"The working directory to build in.","default":"/","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"useCache":{"description":"Should build dependencies be cached?","oneOf":[{"type":"boolean","examples":[false],"description":"Should build dependencies be cached?","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"runtimeEnvironment":{"examples":[{"variable1":"abcdef","variable2":"12345"}],"description":"An object containing the runtime environment to set for the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","default":{},"oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"runtimeFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"buildArguments":{"examples":[{"variable1":"abcdef","variable2":"12345"}],"description":"An object containing the build arguments to set for the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","default":{},"oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"buildFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"additionalProperties":false},"healthChecks":{"type":"array","description":"An array of health checks.","items":{"type":"object","description":"A health check object.","properties":{"protocol":{"description":"The protocol to access the health check with.","oneOf":[{"type":"string","examples":["HTTP"],"description":"The protocol to access the health check with.","enum":["HTTP","CMD","TCP"]},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of health check.","oneOf":[{"type":"string","examples":["readinessProbe"],"description":"The type of health check.","enum":["livenessProbe","readinessProbe","startupProbe"]},{"type":"string","pattern":".*\\${.*}.*"}]},"path":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"cmd":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"port":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"initialDelaySeconds":{"description":"Initial delay, in seconds, before the health check is first run.","oneOf":[{"type":"integer","examples":[10],"description":"Initial delay, in seconds, before the health check is first run.","minimum":1,"maximum":180},{"type":"string","pattern":".*\\${.*}.*"}]},"periodSeconds":{"description":"The time between each check, in seconds.","oneOf":[{"type":"integer","examples":[60],"description":"The time between each check, in seconds.","minimum":10,"maximum":600},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutSeconds":{"description":"The time to wait for a response before marking the health check as a failure.","oneOf":[{"type":"integer","examples":[1],"description":"The time to wait for a response before marking the health check as a failure.","minimum":1,"maximum":60},{"type":"string","pattern":".*\\${.*}.*"}]},"failureThreshold":{"description":"The maximum number of allowed failures.","oneOf":[{"type":"integer","examples":[3],"description":"The maximum number of allowed failures.","minimum":1,"maximum":255},{"type":"string","pattern":".*\\${.*}.*"}]},"successThreshold":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["protocol","type","initialDelaySeconds","periodSeconds","timeoutSeconds","failureThreshold"],"additionalProperties":false}},"backoffLimit":{"description":"The number of attempts to rerun a job before it is marked as failed.","oneOf":[{"type":"integer","examples":[0],"description":"The number of attempts to rerun a job before it is marked as failed.","minimum":0},{"type":"string","pattern":".*\\${.*}.*"}]},"runOnSourceChange":{"description":"Configure when the job should be run if the source image changes.","oneOf":[{"type":"string","examples":["never"],"description":"Configure when the job should be run if the source image changes.","default":"never","enum":["never","cd-promote","always"]},{"type":"string","pattern":".*\\${.*}.*"}]},"activeDeadlineSeconds":{"description":"The maximum amount of time, in seconds, for a job to run before it is marked as failed.","oneOf":[{"type":["integer","null"],"examples":[600],"description":"The maximum amount of time, in seconds, for a job to run before it is marked as failed."},{"type":"string","pattern":".*\\${.*}.*"}]},"schedule":{"description":"The cron timer scheduling when to run the job.","oneOf":[{"type":["string","null"],"examples":["30 8 * * *"],"description":"The cron timer scheduling when to run the job."},{"type":"string","pattern":".*\\${.*}.*"}]},"suspended":{"description":"Whether the cron's automatic scheduling is suspended","oneOf":[{"type":"boolean","examples":[false],"description":"Whether the cron's automatic scheduling is suspended","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"concurrencyPolicy":{"description":"Whether this job should run when another instance of the job is already running. `allow` will enable multiple instances of this job to run. `forbid` will keep the current instance of the job running and stop a new instance from being run. `replace` will terminate any currently running instance of the job and start a new one.","oneOf":[{"type":"string","examples":["forbid"],"description":"Whether this job should run when another instance of the job is already running. `allow` will enable multiple instances of this job to run. `forbid` will keep the current instance of the job running and stop a new instance from being run. `replace` will terminate any currently running instance of the job and start a new one.","default":"forbid","enum":["allow","forbid","replace"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["name","billing","backoffLimit"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"ManualJob node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["ManualJob"],"description":"The kind of node.","const":"ManualJob"},"spec":{"type":"object","description":"The specification for the ManualJob node.","properties":{"name":{"description":"The name of the job.","oneOf":[{"type":"string","examples":["Example Job"],"description":"The name of the job.","minLength":3,"maxLength":52,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"A description of the job.","oneOf":[{"type":"string","examples":["A job description"],"description":"A description of the job.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"stageId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"infrastructure":{"type":"object","properties":{"architecture":{"type":"string","enum":["x86","arm"]}},"additionalProperties":false},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"billing":{"type":"object","properties":{"buildPlan":{"description":"The ID of the build plan to use.","oneOf":[{"type":"string","examples":["nf-compute-200-8"],"description":"The ID of the build plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"deploymentPlan":{"description":"The ID of the deployment plan to use.","oneOf":[{"type":"string","examples":["nf-compute-20"],"description":"The ID of the deployment plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false}},"required":["deploymentPlan"],"additionalProperties":false},"deployment":{"type":"object","default":{},"properties":{"buildpack":{"type":"object","properties":{"configType":{"oneOf":[{"type":"string","examples":["default"],"enum":["default","customProcess","customCommand","customEntrypointCustomCommand","originalEntrypointCustomCommand"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customProcess":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customEntrypoint":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customCommand":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["configType"],"additionalProperties":false},"docker":{"type":"object","properties":{"configType":{"oneOf":[{"type":"string","enum":["default","customEntrypoint","customCommand","customEntrypointCustomCommand"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customEntrypoint":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customCommand":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["configType"],"additionalProperties":false},"storage":{"type":"object","properties":{"useHdbStorage":{"type":"boolean"},"usePdSsdStorage":{"type":"boolean"},"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per container in MB","oneOf":[{"type":"integer","examples":[1024],"description":"Ephemeral storage per container in MB","minimum":1024},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"shmSize":{"description":"Configures the amount of available memory-backed disk space available to /dev/shm","oneOf":[{"type":"integer","description":"Configures the amount of available memory-backed disk space available to /dev/shm","minimum":64},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false},"gracePeriodSeconds":{"description":"The maximum amount of time the process has to shut down after receiving a SIGTERM signal before it is forcefully shut down SIGKILL by the system.","oneOf":[{"type":"integer","description":"The maximum amount of time the process has to shut down after receiving a SIGTERM signal before it is forcefully shut down SIGKILL by the system.","minimum":15,"maximum":600},{"type":"string","pattern":".*\\${.*}.*"}]},"metadata":{"type":"object","description":"Allow setting custom labels and annotations for workloads.","properties":{"labels":{"type":"object","description":"Specify custom labels for the workload.","properties":{},"additionalProperties":false},"annotations":{"type":"object","description":"Specify custom annotations for the workload as string or object.","properties":{},"additionalProperties":false}},"additionalProperties":false},"vcs":{"type":"object","properties":{"projectUrl":{"description":"URL of the Git repo to build.","oneOf":[{"type":"string","examples":["https://github.com/northflank/gatsby-with-northflank"],"description":"URL of the Git repo to build.","pattern":"^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectType":{"description":"The VCS provider to use.","oneOf":[{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"oneOf":[{"oneOf":[{"type":"string","pattern":"^([A-Za-z0-9-]+)|([0-9a-f]{24})$"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"accountLogin":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name.","oneOf":[{"type":"string","examples":["github-user"],"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name."},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsLinkId":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `vcsLinkId` is provided, Northflank will instead use your linked account with that ID.","oneOf":[{"type":"string","description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `vcsLinkId` is provided, Northflank will instead use your linked account with that ID."},{"type":"string","pattern":".*\\${.*}.*"}]},"projectBranch":{"description":"The name of the branch to use.","oneOf":[{"type":"string","examples":["master"],"description":"The name of the branch to use."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["projectUrl","projectType","projectBranch"],"additionalProperties":false},"external":{"type":"object","properties":{"imagePath":{"description":"Image to be deployed. When not deploying from Dockerhub the URL must be specified.","oneOf":[{"type":"string","examples":["nginx:latest"],"description":"Image to be deployed. When not deploying from Dockerhub the URL must be specified.","pattern":"^(?:(?:https?:\\/\\/)?([a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\.\\-]+)(\\/v1)?)?(?:\\/)?([a-zA-Z/-9\\.\\-_]+)(?:\\:([a-zA-Z/-9\\.\\-_\\:]+)|\\@([a-zA-Z/-9\\.\\-_\\:]+))$"},{"type":"string","pattern":".*\\${.*}.*"}]},"credentials":{"description":"ID of the saved credentials to use to access this external image.","oneOf":[{"type":"string","examples":["example-credentials"],"description":"ID of the saved credentials to use to access this external image.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["imagePath"],"additionalProperties":false},"internal":{"type":"object","properties":{"id":{"description":"ID of the build service to deploy","oneOf":[{"type":"string","examples":["example-build-service"],"description":"ID of the build service to deploy","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"branch":{"description":"Branch to deploy","oneOf":[{"type":"string","examples":["master"],"description":"Branch to deploy"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildSHA":{"description":"Commit SHA to deploy, or 'latest' to deploy the most recent commit","oneOf":[{"examples":["latest"],"description":"Commit SHA to deploy, or 'latest' to deploy the most recent commit","oneOf":[{"type":"string","description":"A commit sha."},{"type":"string","description":"Latest commit.","const":"latest"}]},{"type":"string","pattern":".*\\${.*}.*"}]},"buildId":{"description":"ID of the build that should be deployed","oneOf":[{"type":"string","examples":["premium-guide-6393"],"description":"ID of the build that should be deployed"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"releaseFlowControlled":{"type":"boolean","description":"When enabled the deployment source will only be set on creation. All changes to the deployment source must be done via a release flow or manually."}},"additionalProperties":false},"disabledCI":{"description":"Whether CI should be disabled. Only relevant for jobs deploying directly from version control.","oneOf":[{"type":"boolean","description":"Whether CI should be disabled. Only relevant for jobs deploying directly from version control.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"buildConfiguration":{"type":"object","default":{"pathIgnoreRules":[],"isAllowList":false,"ciIgnoreFlagsEnabled":false},"properties":{"pathIgnoreRules":{"type":"array","description":"An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.","maxItems":200,"items":{"description":"A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.","oneOf":[{"type":"string","examples":["README.md"],"description":"A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.","maxLength":260},{"type":"string","pattern":".*\\${.*}.*"}]}},"isAllowList":{"description":"If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`.","oneOf":[{"type":"boolean","examples":[false],"description":"If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`."},{"type":"string","pattern":".*\\${.*}.*"}]},"ciIgnoreFlagsEnabled":{"description":"If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built.","oneOf":[{"type":"boolean","description":"If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built."},{"type":"string","pattern":".*\\${.*}.*"}]},"ciIgnoreFlags":{"type":"array","examples":[["[skip ci]","[ci skip]","[no ci]","[skip nf]","[nf skip]","[northflank skip]","[skip northflank]"]],"description":"An array of commit ignore flags. If a commit message contains one or more of these flags, that commit will not be built. Defaults to `[\"[skip ci]\", \"[ci skip]\", \"[no ci]\", \"[skip nf]\", \"[nf skip]\", \"[northflank skip]\", \"[skip northflank]\"]`","maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}},"dockerfileTarget":{"description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here.","oneOf":[{"type":"string","description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here."},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerCredentials":{"type":"array","items":{"description":"The ID of the docker credentials to use.","oneOf":[{"type":"string","examples":["example-docker-credential"],"description":"The ID of the docker credentials to use.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"includeGitFolder":{"type":"boolean","description":"Include .git folder inside the build context"},"fullGitClone":{"type":"boolean","description":"Include the entire git history as part of the .git folder. Only relevant if \"includeGitFolder\" is set."},"enableGitLfs":{"type":"boolean","description":"Enable Git LFS support for the build"},"storage":{"type":"object","properties":{"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per build in MB","oneOf":[{"type":"integer","examples":[16384],"description":"Ephemeral storage per build in MB","enum":[16384,32768,65536,131072,262144,524288],"minimum":16384,"maximum":65536},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"buildSettings":{"type":"object","properties":{"storage":{"type":"object","properties":{"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per build in MB","oneOf":[{"type":"integer","examples":[16384],"description":"Ephemeral storage per build in MB","enum":[16384,32768,65536,131072,262144,524288],"minimum":16384,"maximum":65536},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"dockerfile":{"type":"object","properties":{"useCache":{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future and currently has no effect."},"buildEngine":{"description":"Build engine to use. Defaults to recommended build engine `buildkit`","oneOf":[{"type":"string","examples":["buildkit"],"description":"Build engine to use. Defaults to recommended build engine `buildkit`","default":"buildkit","enum":["buildkit","kaniko"]},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerFilePath":{"description":"The file path of the Dockerfile.","oneOf":[{"type":"string","examples":["/Dockerfile"],"description":"The file path of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerWorkDir":{"description":"The working directory of the Dockerfile.","oneOf":[{"type":"string","examples":["/"],"description":"The working directory of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildkit":{"type":"object","properties":{"useCache":{"description":"Use persistent storage to cache build layers.","oneOf":[{"type":"boolean","examples":[true],"description":"Use persistent storage to cache build layers.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"cacheStorageSize":{"description":"The amount of persistent storage available to each build in MB.","oneOf":[{"type":"integer","examples":[32768],"description":"The amount of persistent storage available to each build in MB."},{"type":"string","pattern":".*\\${.*}.*"}]},"useInternalCache":{"description":"DEPRECATED: This field will be removed in the near future.","oneOf":[{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"internalCacheStorage":{"description":"DEPRECATED: This field will be removed in the near future.","oneOf":[{"type":"number","description":"DEPRECATED: This field will be removed in the near future."},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"required":["dockerFilePath","dockerWorkDir"],"additionalProperties":false},"buildpack":{"type":"object","properties":{"builder":{"description":"Buildpack stack to use. Defaults to recommended stack `HEROKU_24`.","oneOf":[{"type":"string","examples":["HEROKU_24"],"description":"Buildpack stack to use. Defaults to recommended stack `HEROKU_24`.","default":"HEROKU_24","enum":["HEROKU_24","HEROKU_22","HEROKU_22_CLASSIC","HEROKU_20","HEROKU_18","GOOGLE_22","GOOGLE_V1","CNB_ALPINE","CNB_BIONIC","PAKETO_JAMMY_TINY","PAKETO_JAMMY_BASE","PAKETO_JAMMY_FULL","PAKETO_TINY","PAKETO_BASE","PAKETO_FULL"]},{"type":"string","pattern":".*\\${.*}.*"}]},"buildpackLocators":{"type":"array","description":"Array of custom Buildpacks to use.","default":[],"items":{"description":"Url or registry identifier of custom Buildpack.","oneOf":[{"type":"string","examples":["https://buildpack-registry.heroku.com/cnb/mars/create-react-app"],"description":"Url or registry identifier of custom Buildpack."},{"type":"string","pattern":".*\\${.*}.*"}]}},"buildContext":{"description":"The working directory to build in.","oneOf":[{"type":"string","examples":["/"],"description":"The working directory to build in.","default":"/","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"useCache":{"description":"Should build dependencies be cached?","oneOf":[{"type":"boolean","examples":[false],"description":"Should build dependencies be cached?","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"runtimeEnvironment":{"examples":[{"variable1":"abcdef","variable2":"12345"}],"description":"An object containing the runtime environment to set for the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","default":{},"oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"runtimeFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"buildArguments":{"examples":[{"variable1":"abcdef","variable2":"12345"}],"description":"An object containing the build arguments to set for the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","default":{},"oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"buildFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"additionalProperties":false},"healthChecks":{"type":"array","description":"An array of health checks.","items":{"type":"object","description":"A health check object.","properties":{"protocol":{"description":"The protocol to access the health check with.","oneOf":[{"type":"string","examples":["HTTP"],"description":"The protocol to access the health check with.","enum":["HTTP","CMD","TCP"]},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of health check.","oneOf":[{"type":"string","examples":["readinessProbe"],"description":"The type of health check.","enum":["livenessProbe","readinessProbe","startupProbe"]},{"type":"string","pattern":".*\\${.*}.*"}]},"path":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"cmd":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"port":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"initialDelaySeconds":{"description":"Initial delay, in seconds, before the health check is first run.","oneOf":[{"type":"integer","examples":[10],"description":"Initial delay, in seconds, before the health check is first run.","minimum":1,"maximum":180},{"type":"string","pattern":".*\\${.*}.*"}]},"periodSeconds":{"description":"The time between each check, in seconds.","oneOf":[{"type":"integer","examples":[60],"description":"The time between each check, in seconds.","minimum":10,"maximum":600},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutSeconds":{"description":"The time to wait for a response before marking the health check as a failure.","oneOf":[{"type":"integer","examples":[1],"description":"The time to wait for a response before marking the health check as a failure.","minimum":1,"maximum":60},{"type":"string","pattern":".*\\${.*}.*"}]},"failureThreshold":{"description":"The maximum number of allowed failures.","oneOf":[{"type":"integer","examples":[3],"description":"The maximum number of allowed failures.","minimum":1,"maximum":255},{"type":"string","pattern":".*\\${.*}.*"}]},"successThreshold":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["protocol","type","initialDelaySeconds","periodSeconds","timeoutSeconds","failureThreshold"],"additionalProperties":false}},"backoffLimit":{"description":"The number of attempts to rerun a job before it is marked as failed.","oneOf":[{"type":"integer","examples":[0],"description":"The number of attempts to rerun a job before it is marked as failed.","minimum":0},{"type":"string","pattern":".*\\${.*}.*"}]},"runOnSourceChange":{"description":"Configure when the job should be run if the source image changes.","oneOf":[{"type":"string","examples":["never"],"description":"Configure when the job should be run if the source image changes.","default":"never","enum":["never","cd-promote","always"]},{"type":"string","pattern":".*\\${.*}.*"}]},"activeDeadlineSeconds":{"description":"The maximum amount of time, in seconds, for a job to run before it is marked as failed.","oneOf":[{"type":["integer","null"],"examples":[600],"description":"The maximum amount of time, in seconds, for a job to run before it is marked as failed."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["name","billing","backoffLimit"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Job node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["Job"],"description":"The kind of node.","const":"Job"},"spec":{"type":"object","description":"The specification for the Job node.","properties":{"name":{"description":"The name of the job.","oneOf":[{"type":"string","examples":["Example Job"],"description":"The name of the job.","minLength":3,"maxLength":52,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"A description of the job.","oneOf":[{"type":"string","examples":["A job description"],"description":"A description of the job.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"stageId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"infrastructure":{"type":"object","properties":{"architecture":{"type":"string","enum":["x86","arm"]}},"additionalProperties":false},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"billing":{"type":"object","properties":{"buildPlan":{"description":"The ID of the build plan to use.","oneOf":[{"type":"string","examples":["nf-compute-200-8"],"description":"The ID of the build plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"deploymentPlan":{"description":"The ID of the deployment plan to use.","oneOf":[{"type":"string","examples":["nf-compute-20"],"description":"The ID of the deployment plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false}},"required":["deploymentPlan"],"additionalProperties":false},"deployment":{"type":"object","default":{},"properties":{"buildpack":{"type":"object","properties":{"configType":{"oneOf":[{"type":"string","examples":["default"],"enum":["default","customProcess","customCommand","customEntrypointCustomCommand","originalEntrypointCustomCommand"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customProcess":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customEntrypoint":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customCommand":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["configType"],"additionalProperties":false},"docker":{"type":"object","properties":{"configType":{"oneOf":[{"type":"string","enum":["default","customEntrypoint","customCommand","customEntrypointCustomCommand"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customEntrypoint":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customCommand":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["configType"],"additionalProperties":false},"storage":{"type":"object","properties":{"useHdbStorage":{"type":"boolean"},"usePdSsdStorage":{"type":"boolean"},"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per container in MB","oneOf":[{"type":"integer","examples":[1024],"description":"Ephemeral storage per container in MB","minimum":1024},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"shmSize":{"description":"Configures the amount of available memory-backed disk space available to /dev/shm","oneOf":[{"type":"integer","description":"Configures the amount of available memory-backed disk space available to /dev/shm","minimum":64},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"gpu":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"configuration":{"type":"object","properties":{"gpuType":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"gpuCount":{"oneOf":[{"type":"integer"},{"type":"string","pattern":".*\\${.*}.*"}]},"timesliced":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["gpuType"],"additionalProperties":false}},"additionalProperties":false},"gracePeriodSeconds":{"description":"The maximum amount of time the process has to shut down after receiving a SIGTERM signal before it is forcefully shut down SIGKILL by the system.","oneOf":[{"type":"integer","description":"The maximum amount of time the process has to shut down after receiving a SIGTERM signal before it is forcefully shut down SIGKILL by the system.","minimum":15,"maximum":600},{"type":"string","pattern":".*\\${.*}.*"}]},"metadata":{"type":"object","description":"Allow setting custom labels and annotations for workloads.","properties":{"labels":{"type":"object","description":"Specify custom labels for the workload.","properties":{},"additionalProperties":false},"annotations":{"type":"object","description":"Specify custom annotations for the workload as string or object.","properties":{},"additionalProperties":false}},"additionalProperties":false},"vcs":{"type":"object","properties":{"projectUrl":{"description":"URL of the Git repo to build.","oneOf":[{"type":"string","examples":["https://github.com/northflank/gatsby-with-northflank"],"description":"URL of the Git repo to build.","pattern":"^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectType":{"description":"The VCS provider to use.","oneOf":[{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"oneOf":[{"oneOf":[{"type":"string","pattern":"^([A-Za-z0-9-]+)|([0-9a-f]{24})$"},{"type":"string","pattern":".*\\${.*}.*"}]}]},"accountLogin":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name.","oneOf":[{"type":"string","examples":["github-user"],"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name."},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsLinkId":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `vcsLinkId` is provided, Northflank will instead use your linked account with that ID.","oneOf":[{"type":"string","description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `vcsLinkId` is provided, Northflank will instead use your linked account with that ID."},{"type":"string","pattern":".*\\${.*}.*"}]},"projectBranch":{"description":"The name of the branch to use.","oneOf":[{"type":"string","examples":["master"],"description":"The name of the branch to use."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["projectUrl","projectType","projectBranch"],"additionalProperties":false},"external":{"type":"object","properties":{"imagePath":{"description":"Image to be deployed. When not deploying from Dockerhub the URL must be specified.","oneOf":[{"type":"string","examples":["nginx:latest"],"description":"Image to be deployed. When not deploying from Dockerhub the URL must be specified.","pattern":"^(?:(?:https?:\\/\\/)?([a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\.\\-]+)(\\/v1)?)?(?:\\/)?([a-zA-Z/-9\\.\\-_]+)(?:\\:([a-zA-Z/-9\\.\\-_\\:]+)|\\@([a-zA-Z/-9\\.\\-_\\:]+))$"},{"type":"string","pattern":".*\\${.*}.*"}]},"credentials":{"description":"ID of the saved credentials to use to access this external image.","oneOf":[{"type":"string","examples":["example-credentials"],"description":"ID of the saved credentials to use to access this external image.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["imagePath"],"additionalProperties":false},"internal":{"type":"object","properties":{"id":{"description":"ID of the build service to deploy","oneOf":[{"type":"string","examples":["example-build-service"],"description":"ID of the build service to deploy","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"branch":{"description":"Branch to deploy","oneOf":[{"type":"string","examples":["master"],"description":"Branch to deploy"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildSHA":{"description":"Commit SHA to deploy, or 'latest' to deploy the most recent commit","oneOf":[{"examples":["latest"],"description":"Commit SHA to deploy, or 'latest' to deploy the most recent commit","oneOf":[{"type":"string","description":"A commit sha."},{"type":"string","description":"Latest commit.","const":"latest"}]},{"type":"string","pattern":".*\\${.*}.*"}]},"buildId":{"description":"ID of the build that should be deployed","oneOf":[{"type":"string","examples":["premium-guide-6393"],"description":"ID of the build that should be deployed"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"releaseFlowControlled":{"type":"boolean","description":"When enabled the deployment source will only be set on creation. All changes to the deployment source must be done via a release flow or manually."}},"additionalProperties":false},"disabledCI":{"description":"Whether CI should be disabled. Only relevant for jobs deploying directly from version control.","oneOf":[{"type":"boolean","description":"Whether CI should be disabled. Only relevant for jobs deploying directly from version control.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"buildConfiguration":{"type":"object","default":{"pathIgnoreRules":[],"isAllowList":false,"ciIgnoreFlagsEnabled":false},"properties":{"pathIgnoreRules":{"type":"array","description":"An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.","maxItems":200,"items":{"description":"A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.","oneOf":[{"type":"string","examples":["README.md"],"description":"A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.","maxLength":260},{"type":"string","pattern":".*\\${.*}.*"}]}},"isAllowList":{"description":"If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`.","oneOf":[{"type":"boolean","examples":[false],"description":"If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`."},{"type":"string","pattern":".*\\${.*}.*"}]},"ciIgnoreFlagsEnabled":{"description":"If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built.","oneOf":[{"type":"boolean","description":"If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built."},{"type":"string","pattern":".*\\${.*}.*"}]},"ciIgnoreFlags":{"type":"array","examples":[["[skip ci]","[ci skip]","[no ci]","[skip nf]","[nf skip]","[northflank skip]","[skip northflank]"]],"description":"An array of commit ignore flags. If a commit message contains one or more of these flags, that commit will not be built. Defaults to `[\"[skip ci]\", \"[ci skip]\", \"[no ci]\", \"[skip nf]\", \"[nf skip]\", \"[northflank skip]\", \"[skip northflank]\"]`","maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}},"dockerfileTarget":{"description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here.","oneOf":[{"type":"string","description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here."},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerCredentials":{"type":"array","items":{"description":"The ID of the docker credentials to use.","oneOf":[{"type":"string","examples":["example-docker-credential"],"description":"The ID of the docker credentials to use.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"includeGitFolder":{"type":"boolean","description":"Include .git folder inside the build context"},"fullGitClone":{"type":"boolean","description":"Include the entire git history as part of the .git folder. Only relevant if \"includeGitFolder\" is set."},"enableGitLfs":{"type":"boolean","description":"Enable Git LFS support for the build"},"storage":{"type":"object","properties":{"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per build in MB","oneOf":[{"type":"integer","examples":[16384],"description":"Ephemeral storage per build in MB","enum":[16384,32768,65536,131072,262144,524288],"minimum":16384,"maximum":65536},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"buildSettings":{"type":"object","properties":{"storage":{"type":"object","properties":{"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per build in MB","oneOf":[{"type":"integer","examples":[16384],"description":"Ephemeral storage per build in MB","enum":[16384,32768,65536,131072,262144,524288],"minimum":16384,"maximum":65536},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"dockerfile":{"type":"object","properties":{"useCache":{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future and currently has no effect."},"buildEngine":{"description":"Build engine to use. Defaults to recommended build engine `buildkit`","oneOf":[{"type":"string","examples":["buildkit"],"description":"Build engine to use. Defaults to recommended build engine `buildkit`","default":"buildkit","enum":["buildkit","kaniko"]},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerFilePath":{"description":"The file path of the Dockerfile.","oneOf":[{"type":"string","examples":["/Dockerfile"],"description":"The file path of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"dockerWorkDir":{"description":"The working directory of the Dockerfile.","oneOf":[{"type":"string","examples":["/"],"description":"The working directory of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildkit":{"type":"object","properties":{"useCache":{"description":"Use persistent storage to cache build layers.","oneOf":[{"type":"boolean","examples":[true],"description":"Use persistent storage to cache build layers.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"cacheStorageSize":{"description":"The amount of persistent storage available to each build in MB.","oneOf":[{"type":"integer","examples":[32768],"description":"The amount of persistent storage available to each build in MB."},{"type":"string","pattern":".*\\${.*}.*"}]},"useInternalCache":{"description":"DEPRECATED: This field will be removed in the near future.","oneOf":[{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"internalCacheStorage":{"description":"DEPRECATED: This field will be removed in the near future.","oneOf":[{"type":"number","description":"DEPRECATED: This field will be removed in the near future."},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"required":["dockerFilePath","dockerWorkDir"],"additionalProperties":false},"buildpack":{"type":"object","properties":{"builder":{"description":"Buildpack stack to use. Defaults to recommended stack `HEROKU_24`.","oneOf":[{"type":"string","examples":["HEROKU_24"],"description":"Buildpack stack to use. Defaults to recommended stack `HEROKU_24`.","default":"HEROKU_24","enum":["HEROKU_24","HEROKU_22","HEROKU_22_CLASSIC","HEROKU_20","HEROKU_18","GOOGLE_22","GOOGLE_V1","CNB_ALPINE","CNB_BIONIC","PAKETO_JAMMY_TINY","PAKETO_JAMMY_BASE","PAKETO_JAMMY_FULL","PAKETO_TINY","PAKETO_BASE","PAKETO_FULL"]},{"type":"string","pattern":".*\\${.*}.*"}]},"buildpackLocators":{"type":"array","description":"Array of custom Buildpacks to use.","default":[],"items":{"description":"Url or registry identifier of custom Buildpack.","oneOf":[{"type":"string","examples":["https://buildpack-registry.heroku.com/cnb/mars/create-react-app"],"description":"Url or registry identifier of custom Buildpack."},{"type":"string","pattern":".*\\${.*}.*"}]}},"buildContext":{"description":"The working directory to build in.","oneOf":[{"type":"string","examples":["/"],"description":"The working directory to build in.","default":"/","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"useCache":{"description":"Should build dependencies be cached?","oneOf":[{"type":"boolean","examples":[false],"description":"Should build dependencies be cached?","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"runtimeEnvironment":{"examples":[{"variable1":"abcdef","variable2":"12345"}],"description":"An object containing the runtime environment to set for the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","default":{},"oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"runtimeFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"buildArguments":{"examples":[{"variable1":"abcdef","variable2":"12345"}],"description":"An object containing the build arguments to set for the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","default":{},"oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"buildFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"additionalProperties":false},"healthChecks":{"type":"array","description":"An array of health checks.","items":{"type":"object","description":"A health check object.","properties":{"protocol":{"description":"The protocol to access the health check with.","oneOf":[{"type":"string","examples":["HTTP"],"description":"The protocol to access the health check with.","enum":["HTTP","CMD","TCP"]},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"The type of health check.","oneOf":[{"type":"string","examples":["readinessProbe"],"description":"The type of health check.","enum":["livenessProbe","readinessProbe","startupProbe"]},{"type":"string","pattern":".*\\${.*}.*"}]},"path":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"cmd":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"port":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]},"initialDelaySeconds":{"description":"Initial delay, in seconds, before the health check is first run.","oneOf":[{"type":"integer","examples":[10],"description":"Initial delay, in seconds, before the health check is first run.","minimum":1,"maximum":180},{"type":"string","pattern":".*\\${.*}.*"}]},"periodSeconds":{"description":"The time between each check, in seconds.","oneOf":[{"type":"integer","examples":[60],"description":"The time between each check, in seconds.","minimum":10,"maximum":600},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutSeconds":{"description":"The time to wait for a response before marking the health check as a failure.","oneOf":[{"type":"integer","examples":[1],"description":"The time to wait for a response before marking the health check as a failure.","minimum":1,"maximum":60},{"type":"string","pattern":".*\\${.*}.*"}]},"failureThreshold":{"description":"The maximum number of allowed failures.","oneOf":[{"type":"integer","examples":[3],"description":"The maximum number of allowed failures.","minimum":1,"maximum":255},{"type":"string","pattern":".*\\${.*}.*"}]},"successThreshold":{"oneOf":[{"not":{}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["protocol","type","initialDelaySeconds","periodSeconds","timeoutSeconds","failureThreshold"],"additionalProperties":false}},"settings":{"type":"object","properties":{"backoffLimit":{"description":"The number of attempts to rerun a job before it is marked as failed.","oneOf":[{"type":"integer","examples":[0],"description":"The number of attempts to rerun a job before it is marked as failed.","minimum":0},{"type":"string","pattern":".*\\${.*}.*"}]},"runOnSourceChange":{"description":"Configure when the job should be run if the source image changes.","oneOf":[{"type":"string","examples":["never"],"description":"Configure when the job should be run if the source image changes.","default":"never","enum":["never","cd-promote","always"]},{"type":"string","pattern":".*\\${.*}.*"}]},"activeDeadlineSeconds":{"description":"The maximum amount of time, in seconds, for a job to run before it is marked as failed.","oneOf":[{"type":["integer","null"],"examples":[600],"description":"The maximum amount of time, in seconds, for a job to run before it is marked as failed."},{"type":"string","pattern":".*\\${.*}.*"}]},"cron":{"type":"object","properties":{"schedule":{"description":"The cron timer scheduling when to run the job.","oneOf":[{"type":["string","null"],"examples":["30 8 * * *"],"description":"The cron timer scheduling when to run the job."},{"type":"string","pattern":".*\\${.*}.*"}]},"suspended":{"description":"Whether the cron's automatic scheduling is suspended","oneOf":[{"type":"boolean","examples":[false],"description":"Whether the cron's automatic scheduling is suspended","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"concurrencyPolicy":{"description":"Whether this job should run when another instance of the job is already running. `allow` will enable multiple instances of this job to run. `forbid` will keep the current instance of the job running and stop a new instance from being run. `replace` will terminate any currently running instance of the job and start a new one.","oneOf":[{"type":"string","examples":["forbid"],"description":"Whether this job should run when another instance of the job is already running. `allow` will enable multiple instances of this job to run. `forbid` will keep the current instance of the job running and stop a new instance from being run. `replace` will terminate any currently running instance of the job and start a new one.","default":"forbid","enum":["allow","forbid","replace"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"required":["backoffLimit"],"additionalProperties":false}},"required":["name","billing"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Addon node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["Addon"],"description":"The kind of node.","const":"Addon"},"spec":{"type":"object","description":"The specification for the Addon node.","properties":{"name":{"description":"The name of the addon.","oneOf":[{"type":"string","examples":["Example Addon"],"description":"The name of the addon.","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"A description of the addon.","oneOf":[{"type":"string","examples":["An addon description"],"description":"A description of the addon.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"stageId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"type":{"type":"string","examples":["postgresql"],"description":"The identifier for the type of addon. Addon types can be found at the Get Addon Types endpoint."},"infrastructure":{"type":"object","properties":{"architecture":{"type":"string","enum":["x86","arm"]}},"additionalProperties":false},"version":{"type":"string","examples":["latest"],"description":"The version of the addon type to use. If set to `latest`, the addon will be created with the most recent addon version. If set to a major version appended with `-latest`, e.g. e.g. `14-latest` or `14.5-latest`, the addon will be created with the most recent minor/patch version belonging to that major version."},"billing":{"type":"object","properties":{"deploymentPlan":{"description":"The ID of the deployment plan to use.","oneOf":[{"type":"string","examples":["nf-compute-20"],"description":"The ID of the deployment plan to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"storageClass":{"description":"The type of storage. Only configurable if the relevant feature flag is enabled for you account","oneOf":[{"type":"string","examples":["nvme"],"description":"The type of storage. Only configurable if the relevant feature flag is enabled for you account","default":"nvme","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"storage":{"description":"The size of the addon storage, in megabytes.","oneOf":[{"type":"number","examples":[6144],"description":"The size of the addon storage, in megabytes."},{"type":"string","pattern":".*\\${.*}.*"}]},"replicas":{"description":"The number of addon replicas to run.","oneOf":[{"type":"integer","examples":[1],"description":"The number of addon replicas to run.","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]},"zonalRedundancy":{"type":"object","properties":{"type":{"description":"Defines scheduling behaviour across different zones within the same region.","oneOf":[{"type":"string","description":"Defines scheduling behaviour across different zones within the same region.","enum":["required","disabled"]},{"type":"string","pattern":".*\\${.*}.*"}]},"minZones":{"oneOf":[{"description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","oneOf":[{"type":"integer","description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]},{"description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","oneOf":[{"type":"integer","description":"Defines how many zones are required and will prevent containers from additional scheduling into existing zones. (Only relevant if type is set to \"required\")","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]}]}},"additionalProperties":false}},"required":["deploymentPlan","storage","replicas"],"additionalProperties":false},"source":{"description":"Fork source backup for the addon","oneOf":[{"type":"object","description":"Optional object containing data about an existing addon to fork. If provided, the addon will be created from that existing addon backup.","properties":{"projectId":{"description":"ID of the project of the source addon. Only required if not the same as target addon","oneOf":[{"type":"string","examples":["existing-project"],"description":"ID of the project of the source addon. Only required if not the same as target addon","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"addonId":{"description":"ID of the addon to fork.","oneOf":[{"type":"string","examples":["existing-addon"],"description":"ID of the addon to fork.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"backupId":{"description":"ID of a backup belonging to that addon to use for the fork.","oneOf":[{"type":"string","examples":["existing-backup"],"description":"ID of a backup belonging to that addon to use for the fork.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addonId","backupId"],"additionalProperties":false},{"type":"object","description":"Optional object containing the reference to a backup addressed by its UUID","properties":{"backupUid":{"description":"Uid of the backup","oneOf":[{"type":"string","examples":["6d542e24-5d9f-4ecf-80a5-e80724b9133e"],"description":"Uid of the backup","format":"uuid"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["backupUid"],"additionalProperties":false}]},"tlsEnabled":{"type":"boolean","description":"Enables access to the addon via TLS (if supported by the addon type)."},"externalAccessEnabled":{"type":"boolean","description":"Enables external access to the addon via TLS (if supported by the addon type)."},"ipPolicies":{"type":"array","description":"An array of IP address policies.","items":{"type":"object","properties":{"addresses":{"type":"array","description":"An array of IP addresses used for this rule","items":{"type":"string","examples":["127.0.0.1"],"description":"An IP address used by this rule","format":"ipv4"}},"action":{"type":"string","examples":["DENY"],"description":"The action for this rule.","enum":["ALLOW","DENY"]}},"required":["addresses","action"],"additionalProperties":false}},"typeSpecificSettings":{"type":"object","properties":{"redisMaxMemoryPolicy":{"type":"string","description":"Redis only: Key eviction policy at memory pressure.","enum":["noeviction","allkeys-lru","allkeys-lfu","volatile-lru","volatile-lfu","allkeys-random","volatile-random","volatile-ttl","volatile-lrm","allkeys-lrm"]},"redisSentinelEnabled":{"type":"boolean","description":"Redis only: Deploy Redis with Sentinel high availability. Default: false"},"postgresqlWalLevel":{"type":"string","description":"PostgreSQL only: Configure wal_level setting.","enum":["replica","logical"]},"postgresqlSupabaseMode":{"type":"boolean","description":"PostgreSQL only: Enable Supabase mode."},"postgresqlConnectionPoolerEnabled":{"type":"boolean","description":"PostgreSQL only: Run connection pooler in front of postgres instance."},"postgresqlConnectionPoolerReplicas":{"type":"number","description":"PostgreSQL only: Number of connection pooler instances in case connection pooler is enabled.","minimum":1,"maximum":3},"postgresqlReadConnectionPoolerEnabled":{"type":"boolean","description":"PostgreSQL only: Run connection pooler in front of read-only postgres instance."},"postgresqlReadConnectionPoolerReplicas":{"type":"number","description":"PostgreSQL only: Number of read-only connection pooler replicas in case read-only connection pooler is enabled.","minimum":1,"maximum":3},"postgresqlImportMode":{"type":"boolean","description":"PostgreSQL only: Configure PostgreSQL for higher import speed. Not recommended for production workloads."},"mysqlHaModeEnabled":{"type":"boolean","description":"MySQL only: Run MySQL in HA configuration with auto-failover and connection poolers."},"mysqlRouterReplicas":{"description":"MysqlHA only: Number of connection router replicas in case connection router is enabled.","oneOf":[{"type":"number","description":"MysqlHA only: Number of connection router replicas in case connection router is enabled.","minimum":1,"maximum":8},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"customCredentials":{"type":"object","properties":{"dbName":{"description":"Custom database name. Not supported for all addon types.","oneOf":[{"type":"string","description":"Custom database name. Not supported for all addon types."},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"backupSchedules":{"type":"array","items":{"type":"object","properties":{"scheduling":{"description":"Schedule for the backup.","oneOf":[{"type":"object","description":"Schedule for the backup.","properties":{"interval":{"description":"The interval between backups. Each addon can only have one backup schedule of each interval for each backup type.","oneOf":[{"type":"string","examples":["weekly"],"description":"The interval between backups. Each addon can only have one backup schedule of each interval for each backup type.","enum":["hourly","daily","weekly"]},{"type":"string","pattern":".*\\${.*}.*"}]},"minute":{"description":"An array of minutes when the backup should be performed.","oneOf":[{"type":"array","description":"An array of minutes when the backup should be performed.","uniqueItems":true,"items":{"type":"integer","examples":[30],"description":"A minute when the backup should be performed.","minimum":0,"maximum":59}},{"type":"string","pattern":".*\\${.*}.*"}]},"hour":{"description":"An array of hours in 24 hour format when the backup should be performed. At these hours, a backup will be performed at each of the minutes provided in the `minute` field. Required for `daily` and `weekly` intervals and unavailable for `hourly` intervals.","oneOf":[{"type":"array","description":"An array of hours in 24 hour format when the backup should be performed. At these hours, a backup will be performed at each of the minutes provided in the `minute` field. Required for `daily` and `weekly` intervals and unavailable for `hourly` intervals.","uniqueItems":true,"items":{"type":"integer","examples":[18],"description":"An hour when the backup should be performed, in 24 hour format.","minimum":0,"maximum":23}},{"type":"string","pattern":".*\\${.*}.*"}]},"day":{"description":"An array of days of the week when the backup should be performed, where `0` represents Monday and `6` represents Sunday. On these days, a backup will be performed at each of the minutes provided in the `minute` field whenever it is an hour from the `hour` field. Required for `weekly` intervals and unavailable for `hourly` and `daily` intervals.","oneOf":[{"type":"array","description":"An array of days of the week when the backup should be performed, where `0` represents Monday and `6` represents Sunday. On these days, a backup will be performed at each of the minutes provided in the `minute` field whenever it is an hour from the `hour` field. Required for `weekly` intervals and unavailable for `hourly` and `daily` intervals.","uniqueItems":true,"items":{"type":"integer","examples":[4],"description":"A day of the week when the backup should be performed, where `0` represents Monday and `6` represents Sunday.","minimum":0,"maximum":6}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["interval","minute"],"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"backupType":{"description":"The type of the backup to be performed.","oneOf":[{"type":"string","examples":["snapshot"],"description":"The type of the backup to be performed.","enum":["dump","snapshot"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customDestinationId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"additionalDestinations":{"type":"array","description":"List of destinations for which a backup should be created of this backup. Only applicable for snapshot backups.","items":{"type":"object","properties":{"destinationId":{"description":"Additional custom back up destination that should be used to store the snapshot.","oneOf":[{"type":"string","examples":["example-backup-destination"],"description":"Additional custom back up destination that should be used to store the snapshot.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"retentionTime":{"description":"Retention time of the additional back up in days.","oneOf":[{"type":"integer","examples":[7,7],"description":"Retention time of the additional back up in days.","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"type":"string","examples":["custom"],"description":"The type of backup destination to use","const":"custom"}},"required":["destinationId","type"],"additionalProperties":false}},"compressionType":{"description":"The compression algorithm of the backup. Only applicable for dump backups. Defaults to `gz`.","oneOf":[{"type":"string","examples":["gz"],"description":"The compression algorithm of the backup. Only applicable for dump backups. Defaults to `gz`.","enum":["gz","zstd"]},{"type":"string","pattern":".*\\${.*}.*"}]},"retentionTime":{"description":"The time the backup is retained for, in days.","oneOf":[{"type":"integer","examples":[7],"description":"The time the backup is retained for, in days.","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["scheduling","backupType","retentionTime"],"additionalProperties":false}},"metadata":{"type":"object","description":"Allow setting custom labels and annotations for workloads.","properties":{"labels":{"type":"object","description":"Specify custom labels for the workload.","properties":{},"additionalProperties":false},"annotations":{"type":"object","description":"Specify custom annotations for the workload as string or object.","properties":{},"additionalProperties":false}},"additionalProperties":false},"templateValues":{"type":"object","examples":["{\"replicas\": 2}"],"description":"The template values to be passed to the templating engine.","properties":{},"additionalProperties":false}},"required":["name","type"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"ExternalAddon node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["ExternalAddon"],"description":"The kind of node.","const":"ExternalAddon"},"spec":{"type":"object","description":"The specification for the ExternalAddon node.","properties":{"description":{"oneOf":[{"type":"string","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"environmentId":{"oneOf":[{"type":"objectId"},{"type":"string","pattern":".*\\${.*}.*"}]},"spec":{"type":"object","properties":{"resourceType":{"type":"string","enum":["s3","rds"]},"provider":{"type":"object","properties":{"aws":{"type":"object","properties":{"region":{"type":"string","examples":["eu-west-1"]},"integrationId":{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}},"required":["region","integrationId"],"additionalProperties":false},"google":{"type":"object","properties":{"project":{"type":"string"},"region":{"type":"string","examples":["us-central1"]},"zone":{"type":"string","examples":["us-central1-c"]},"integrationId":{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}},"required":["project","integrationId"],"additionalProperties":false},"cloudflare":{"type":"object","properties":{"integrationId":{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}},"required":["integrationId"],"additionalProperties":false},"aiven":{"type":"object","properties":{"integrationId":{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}},"required":["integrationId"],"additionalProperties":false},"backblaze":{"type":"object","properties":{"integrationId":{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}},"required":["integrationId"],"additionalProperties":false},"azure":{"type":"object","properties":{"integrationId":{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}},"required":["integrationId"],"additionalProperties":false},"akamai":{"type":"object","properties":{"integrationId":{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}},"required":["integrationId"],"additionalProperties":false}},"additionalProperties":false},"config":{"type":"object","properties":{},"additionalProperties":false}},"required":["resourceType","config"],"additionalProperties":false},"name":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"usePlan":{"type":"boolean","description":"Require approval of a plan before applying"}},"required":["name"],"additionalProperties":false},"condition":{"type":"string","const":"success"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"AddonBackup node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["AddonBackup"],"description":"The kind of node.","const":"AddonBackup"},"spec":{"type":"object","description":"The specification for the AddonBackup node.","properties":{"projectId":{"description":"The ID of the addon to backup.","oneOf":[{"type":"string","description":"The ID of the addon to backup.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"addonId":{"description":"The ID of the addon to backup.","oneOf":[{"type":"string","description":"The ID of the addon to backup.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"backupType":{"type":"string","examples":["snapshot"],"description":"The type of backup to perform. Defaults to `snapshot`.","default":"snapshot","enum":["dump","snapshot"]},"compressionType":{"oneOf":[{"type":"string","enum":["zstd","gz","none"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customDestinationId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"additionalDestinations":{"type":"array","description":"List of destinations for which a backup should be created of this backup. Only applicable for snapshot backups.","items":{"type":"object","properties":{"destinationId":{"description":"Additional custom back up destination that should be used to store the snapshot.","oneOf":[{"type":"string","examples":["example-backup-destination"],"description":"Additional custom back up destination that should be used to store the snapshot.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"retentionTime":{"description":"Retention time of the additional back up in days.","oneOf":[{"type":"integer","examples":[7,7],"description":"Retention time of the additional back up in days.","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"type":"string","examples":["custom"],"description":"The type of backup destination to use","const":"custom"}},"required":["destinationId","type"],"additionalProperties":false}}},"required":["addonId"],"additionalProperties":false},"condition":{"type":"string","const":"success"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"SecretGroup node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["SecretGroup"],"description":"The kind of node.","const":"SecretGroup"},"spec":{"type":"object","description":"The specification for the SecretGroup node.","properties":{"name":{"description":"The name of the secret.","oneOf":[{"type":"string","examples":["Example Secret"],"description":"The name of the secret.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"A description of the secret.","oneOf":[{"type":"string","examples":["A description"],"description":"A description of the secret.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"stageId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"type":{"type":"string","examples":["secret"],"description":"The hierarchy type of the created secret.","enum":["secret","config"]},"secretType":{"type":"string","examples":["environment"],"description":"The injection scope of the created secret","enum":["environment-arguments","environment","arguments"]},"priority":{"description":"The priority with which different secrets will be merged.","oneOf":[{"type":"integer","examples":[10],"description":"The priority with which different secrets will be merged.","minimum":0,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]},"restrictions":{"type":"object","description":"Restriction settings of the secret","default":{"special":"deep"},"properties":{"restricted":{"type":"boolean","examples":[true],"description":"Whether the secret is restricted to specific resources. If this is `true`, only resources listed in `nfObjects` or with a tag listed in `tags` will have access to these secrets. Otherwise, all resources in the project will be able to access it.","default":false},"nfObjects":{"type":"array","description":"List of Northflank services & jobs the secret is restricted to","default":[],"uniqueItems":true,"items":{"type":"object","properties":{"id":{"description":"ID of the entity the secret is restricted to.","oneOf":[{"type":"string","examples":["example-service"],"description":"ID of the entity the secret is restricted to.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"type":"string","examples":["service"],"description":"Type of the entity the secret is restricted to.","enum":["service","job"]}},"required":["id","type"],"additionalProperties":false}},"tags":{"type":"array","description":"List of tags the secret is restricted to.","default":[],"uniqueItems":true,"items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"tagMatchCondition":{"description":"If all or any of the tags must be present on the target for it to match the condition.","oneOf":[{"type":"string","examples":["or"],"description":"If all or any of the tags must be present on the target for it to match the condition.","enum":["and","or"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"addonDependencies":{"type":"array","description":"An array of addons to link to this secret group.","uniqueItems":true,"items":{"type":"object","description":"An object containing data about the addon to link.","properties":{"addonId":{"description":"The id of the addon to link.","oneOf":[{"type":"string","examples":["example-addon"],"description":"The id of the addon to link.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"keys":{"type":"array","description":"An array of objects containing details about the keys to link to this secret group.","default":[],"uniqueItems":true,"items":{"type":"object","description":"Details about the key to link to this secret group.","properties":{"keyName":{"type":"string","examples":["USERNAME"],"description":"The name of the key to link.","pattern":"[a-zA-Z]+"},"aliases":{"type":"array","description":"An array of aliases for the key.","default":[],"uniqueItems":true,"items":{"description":"The name of the alias. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","oneOf":[{"type":"string","examples":["MONGO_USERNAME"],"description":"The name of the alias. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","pattern":"^[a-zA-Z0-9_./-]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}}},"required":["keyName"],"additionalProperties":false}}},"required":["addonId","keys"],"additionalProperties":false}},"externalAddonDependencies":{"type":"array","description":"An array of external addons to link to this secret group.","uniqueItems":true,"items":{"type":"object","description":"An object containing data about the external addon to link.","properties":{"addonId":{"description":"The id of the external addon to link.","oneOf":[{"type":"string","examples":["example-addon"],"description":"The id of the external addon to link.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"keys":{"type":"array","description":"An array of objects containing details about the keys to link to this secret group.","default":[],"uniqueItems":true,"items":{"type":"object","description":"Details about the key to link to this secret group.","properties":{"keyName":{"type":"string","examples":["USERNAME"],"description":"The name of the key to link.","pattern":"[a-zA-Z]+"},"aliases":{"type":"array","description":"An array of aliases for the key.","default":[],"uniqueItems":true,"items":{"description":"The name of the alias. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","oneOf":[{"type":"string","examples":["MONGO_USERNAME"],"description":"The name of the alias. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","pattern":"^[a-zA-Z0-9_./-]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}}},"required":["keyName"],"additionalProperties":false}}},"required":["addonId","keys"],"additionalProperties":false}},"secrets":{"type":"object","properties":{"variables":{"examples":[{"NODE_ENV":"production","MONGO_DB":"some_connection_string"}],"description":"Secret variables as JSON object, encrypted at rest. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"files":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"additionalProperties":false}},"additionalProperties":false}},"required":["name","secretType","priority"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Volume node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["Volume"],"description":"The kind of node.","const":"Volume"},"spec":{"type":"object","description":"The specification for the Volume node.","properties":{"name":{"description":"The name of the volume.","oneOf":[{"type":"string","examples":["Example Volume"],"description":"The name of the volume.","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"stageId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"tags":{"type":"array","description":"An array of previously defined tags to help identify and group the resource.","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"mounts":{"type":"array","description":"Array of mounts, containerMountPaths must be unique","uniqueItems":true,"items":{"type":"object","properties":{"volumeMountPath":{"type":"string","examples":[""],"description":"Optionally specify the path inside this volume that should be mounted","default":"","pattern":"^((?!\\/)).+$"},"containerMountPath":{"type":"string","examples":["/container"],"description":"Specify the path into which the volume should be mounted","pattern":"^((?!:).)*$"}},"required":["containerMountPath"],"additionalProperties":false}},"spec":{"type":"object","description":"Information about the desired size and type of the volume. Storage class is only configurable with the relevant feature flag enabled for your account.","properties":{"accessMode":{"description":"Access mode of the volume. Only `ReadWriteOnce` is generally available.","oneOf":[{"type":"string","description":"Access mode of the volume. Only `ReadWriteOnce` is generally available.","default":"ReadWriteOnce","enum":["ReadWriteOnce","ReadWriteMany"]},{"type":"string","pattern":".*\\${.*}.*"}]},"storageSize":{"description":"The size of the storage, in megabytes. Configurable sizes depend on the storage class.","oneOf":[{"type":"number","examples":[6144],"description":"The size of the storage, in megabytes. Configurable sizes depend on the storage class."},{"type":"string","pattern":".*\\${.*}.*"}]},"storageClassName":{"description":"The type of the storage.","oneOf":[{"type":"string","examples":["nvme"],"description":"The type of the storage.","default":"nvme","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["storageSize"],"additionalProperties":false},"source":{"type":"object","properties":{"type":{"oneOf":[{"type":"string","enum":["volume","backup"]},{"type":"string","pattern":".*\\${.*}.*"}]},"sourceId":{"description":"The ID of the source object","oneOf":[{"type":"string","description":"The ID of the source object","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["type","sourceId"],"additionalProperties":false},"owningObject":{"type":"object","description":"DEPRECATED: The object to attach this volume to.","properties":{"id":{"description":"The id of object to attach this volume to.","oneOf":[{"type":"string","description":"The id of object to attach this volume to.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"type":"string","description":"The type of the object to attach this volume to.","enum":["service","job"]}},"required":["id","type"],"additionalProperties":false},"attachedObjects":{"type":"array","description":"Array of objects this volume is attached to.","uniqueItems":true,"maxItems":100,"items":{"type":"object","description":"The object to attach this volume to.","properties":{"id":{"description":"The id of object to attach this volume to.","oneOf":[{"type":"string","examples":["example-service"],"description":"The id of object to attach this volume to.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"type":"string","examples":["service"],"description":"The type of the object to attach this volume to.","enum":["service","job"]}},"required":["id","type"],"additionalProperties":false}}},"required":["name","mounts","spec"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Build node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["Build"],"description":"The kind of node.","const":"Build"},"spec":{"type":"object","description":"The specification for the Build node.","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildRules":{"type":"object","properties":{"pathIgnoreRules":{"type":"array","maxItems":200,"items":{"type":"string","maxLength":260}},"isAllowList":{"type":"boolean"},"ciIgnoreFlagsEnabled":{"type":"boolean"},"ciIgnoreFlags":{"type":"array","maxItems":200,"items":{"type":"string","maxLength":72}}},"additionalProperties":false},"buildOverrides":{"type":"object","description":"An optional object that may specify several different overrides on the build level.","properties":{"buildArguments":{"examples":[{"ARGUMENT_1":"abcdef","ARGUMENT_2":"12345"}],"description":"Build arguments that will be set on this build only. In case of conflicts these values take precedence.","oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"buildFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"additionalProperties":false},"docker":{"type":"object","description":"Overrides for docker build settings.","properties":{"dockerFilePath":{"type":"string","examples":["/Dockerfile"],"description":"The file path of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"},"dockerWorkDir":{"type":"string","examples":["/"],"description":"The working directory of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},"dockerfileTarget":{"type":"string","description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here.","pattern":"^[a-zA-Z0-9-_]+$"}},"additionalProperties":false}},"additionalProperties":false},"id":{"description":"The id of object to build.","oneOf":[{"type":"string","examples":["example-service"],"description":"The id of object to build.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"type":"string","examples":["service"],"description":"The type of the object to build.","enum":["service","job"]},"sha":{"description":"Commit sha to build. If not provided, builds the most recent relevant commit.","oneOf":[{"type":"string","examples":["262ed9817b3cad5142fbceabe0c9e371e390d616"],"description":"Commit sha to build. If not provided, builds the most recent relevant commit."},{"type":"string","pattern":".*\\${.*}.*"}]},"branch":{"description":"Branch to build from. If `sha` is not provided, the latest commit of this branch will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both.","oneOf":[{"type":"string","description":"Branch to build from. If `sha` is not provided, the latest commit of this branch will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both."},{"type":"string","pattern":".*\\${.*}.*"}]},"pullRequestId":{"description":"ID of a pull request to build from. If `sha` is not provided, the latest commit of this pull request will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both.","oneOf":[{"type":"integer","description":"ID of a pull request to build from. If `sha` is not provided, the latest commit of this pull request will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both."},{"type":"string","pattern":".*\\${.*}.*"}]},"reuseExistingBuilds":{"type":"boolean","examples":[true],"description":"If true, the build node will return an existing build if one is available for that commit. Otherwise, a new build will be created with every new preview environment. Defaults to `true`.","default":true},"buildRuleFallThroughHandling":{"type":"string","examples":["fail"],"description":"Define handling if build rules do not match the specified commit","enum":["fail","skip","useLastBuild"]}},"required":["id","type"],"additionalProperties":false},"condition":{"type":"string","const":"success"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"JobRun node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["JobRun"],"description":"The kind of node.","const":"JobRun"},"spec":{"type":"object","description":"The specification for the JobRun node.","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"runtimeEnvironment":{"examples":[{"VARIABLE_1":"abcdef","VARIABLE_2":"12345"}],"description":"An object containing the environment variables overrides to use when running the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.","oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"runtimeFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"additionalProperties":false},"billing":{"type":"object","properties":{"deploymentPlan":{"description":"The ID of the deployment plan override to use.","oneOf":[{"type":"string","examples":["nf-compute-20"],"description":"The ID of the deployment plan override to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"deployment":{"type":"object","description":"Details about the job run deployment overrides.","properties":{"internal":{"type":"object","properties":{"id":{"description":"ID of the build service to deploy","oneOf":[{"type":"string","examples":["example-build-service"],"description":"ID of the build service to deploy","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"branch":{"description":"Branch to deploy","oneOf":[{"type":"string","examples":["master"],"description":"Branch to deploy"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildSHA":{"description":"Commit SHA to deploy, or 'latest' to deploy the most recent commit","oneOf":[{"examples":["latest"],"description":"Commit SHA to deploy, or 'latest' to deploy the most recent commit","oneOf":[{"type":"string","description":"A commit sha."},{"type":"string","description":"Latest commit.","const":"latest"}]},{"type":"string","pattern":".*\\${.*}.*"}]},"buildId":{"description":"ID of the build that should be deployed","oneOf":[{"type":"string","examples":["premium-guide-6393"],"description":"ID of the build that should be deployed"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"external":{"type":"object","properties":{"imagePath":{"description":"Image to be deployed. When not deploying from Dockerhub the URL must be specified.","oneOf":[{"type":"string","examples":["nginx:latest"],"description":"Image to be deployed. When not deploying from Dockerhub the URL must be specified.","pattern":"^(?:(?:https?:\\/\\/)?([a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\.\\-]+)(\\/v1)?)?(?:\\/)?([a-zA-Z/-9\\.\\-_]+)(?:\\:([a-zA-Z/-9\\.\\-_\\:]+)|\\@([a-zA-Z/-9\\.\\-_\\:]+))$"},{"type":"string","pattern":".*\\${.*}.*"}]},"credentials":{"description":"ID of the saved credentials to use to access this external image.","oneOf":[{"type":"string","examples":["example-credentials"],"description":"ID of the saved credentials to use to access this external image.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["imagePath"],"additionalProperties":false},"docker":{"type":"object","properties":{"configType":{"oneOf":[{"type":"string","enum":["default","customEntrypoint","customCommand","customEntrypointCustomCommand"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customEntrypoint":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customCommand":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["configType"],"additionalProperties":false},"buildpack":{"type":"object","properties":{"configType":{"oneOf":[{"type":"string","examples":["default"],"enum":["default","customProcess","customCommand","customEntrypointCustomCommand","originalEntrypointCustomCommand"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customProcess":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customEntrypoint":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customCommand":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["configType"],"additionalProperties":false},"storage":{"type":"object","properties":{"useHdbStorage":{"type":"boolean"},"usePdSsdStorage":{"type":"boolean"},"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per container in MB","oneOf":[{"type":"integer","examples":[1024],"description":"Ephemeral storage per container in MB","minimum":1024},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"shmSize":{"description":"Configures the amount of available memory-backed disk space available to /dev/shm","oneOf":[{"type":"integer","description":"Configures the amount of available memory-backed disk space available to /dev/shm","minimum":64},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"jobId":{"description":"The ID of the job to run.","oneOf":[{"type":"string","examples":["example-job"],"description":"The ID of the job to run.","minLength":3,"maxLength":52,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["jobId"],"additionalProperties":false},"condition":{"type":"string","const":"success"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"LoopWorkflow node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["LoopWorkflow"],"description":"The kind of node.","const":"LoopWorkflow"},"spec":{"description":"The specification for the LoopWorkflow node.","$ref":"#/$defs/V1PreviewEnvTemplateLoopWorkflowSchema"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Action node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["Action"],"description":"The kind of node.","const":"Action"},"spec":{"description":"The specification for the Action node.","oneOf":[{"type":"object","description":"Addon action","properties":{"kind":{"type":"string","examples":["Addon"],"description":"The kind of action.","const":"Addon"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"restart"},"data":{"oneOf":[{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"addonId":{"description":"The id of the addon to restart.","oneOf":[{"type":"string","examples":["example-addon"],"description":"The id of the addon to restart.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"required":["addonId"],"additionalProperties":false}]},"condition":{"oneOf":[{"type":"string","const":"running"}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"AddonBackup action","properties":{"kind":{"type":"string","examples":["AddonBackup"],"description":"The kind of action.","const":"AddonBackup"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"restore"},"data":{"oneOf":[{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"addonId":{"description":"The id of the addon to restore a backup to.","oneOf":[{"type":"string","examples":["example-addon"],"description":"The id of the addon to restore a backup to.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"backupId":{"description":"The id of the backup to restore.","oneOf":[{"type":"string","examples":["example-backup"],"description":"The id of the backup to restore.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"required":["addonId","backupId"],"additionalProperties":false}]},"condition":{"oneOf":[{"type":"string","const":"success"}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Job action","properties":{"kind":{"type":"string","examples":["Job"],"description":"The kind of action.","const":"Job"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"execute"},"data":{"oneOf":[{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"jobId":{"description":"The id of the job to run the command in.","oneOf":[{"type":"string","examples":["example-job"],"description":"The id of the job to run the command in.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"command":{"type":"string"},"shell":{"type":"string"},"user":{"type":"string"},"group":{"type":"string"}},"required":["jobId","command"],"additionalProperties":false}]},"condition":{"oneOf":[]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Service action","properties":{"kind":{"type":"string","examples":["Service"],"description":"The kind of action.","const":"Service"},"spec":{"type":"object","properties":{"type":{"type":"string","enum":["restart","execute"]},"data":{"oneOf":[{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"serviceId":{"description":"The id of the service to restart.","oneOf":[{"type":"string","examples":["example-service"],"description":"The id of the service to restart.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"required":["serviceId"],"additionalProperties":false},{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"serviceId":{"description":"The id of the service to run the command in.","oneOf":[{"type":"string","examples":["example-service"],"description":"The id of the service to run the command in.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"options":{"type":"object","properties":{"dispatchOnly":{"type":"boolean","examples":[true],"description":"Specify whether the command output should be awaited the node should succeed after having sent the command."}},"additionalProperties":false},"command":{"type":"string"},"shell":{"type":"string"},"user":{"type":"string"},"group":{"type":"string"}},"required":["serviceId","command"],"additionalProperties":false}]},"condition":{"oneOf":[{"type":"string","const":"running"}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"VCS action","properties":{"kind":{"type":"string","examples":["VCS"],"description":"The kind of action.","const":"VCS"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"createRepoFromSource"},"data":{"oneOf":[{"type":"object","properties":{"sourceData":{"type":"object","properties":{"publicRepo":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsService":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"oauthProvider":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"repoUrl":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"accountLogin":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsLinkId":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["repoUrl"],"additionalProperties":false},"targetData":{"type":"object","properties":{"name":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"privateRepo":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"context":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"folder":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"accountLogin":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsLinkId":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"oauthProvider":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsService":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["name","privateRepo"],"additionalProperties":false}},"required":["sourceData","targetData"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false}]},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Condition node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["Condition"],"description":"The kind of node.","const":"Condition"},"spec":{"description":"The specification for the Condition node.","oneOf":[{"type":"object","description":"Addon condition","properties":{"kind":{"type":"string","examples":["Addon"],"description":"The kind of condition.","const":"Addon"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"running"},"data":{"oneOf":[{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"addonId":{"description":"The id of the addon to monitor.","oneOf":[{"type":"string","examples":["example-addon"],"description":"The id of the addon to monitor.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"required":["addonId"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"AddonBackup condition","properties":{"kind":{"type":"string","examples":["AddonBackup"],"description":"The kind of condition.","const":"AddonBackup"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"success"},"data":{"oneOf":[{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"addonId":{"description":"The id of the addon to monitor.","oneOf":[{"type":"string","examples":["example-addon"],"description":"The id of the addon to monitor.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"backupId":{"description":"The id of the backup to monitor.","oneOf":[{"type":"string","examples":["example-backup"],"description":"The id of the backup to monitor.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addonId","backupId"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Build condition","properties":{"kind":{"type":"string","examples":["Build"],"description":"The kind of condition.","const":"Build"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"success"},"data":{"oneOf":[{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildId":{"description":"The id of the build to monitor.","oneOf":[{"type":"string","examples":["joyous-view-6290"],"description":"The id of the build to monitor.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["buildId"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"BYOCCluster condition","properties":{"kind":{"type":"string","examples":["BYOCCluster"],"description":"The kind of condition.","const":"BYOCCluster"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"running"},"data":{"oneOf":[{"type":"object","properties":{"clusterId":{"description":"The id of the cluster to monitor.","oneOf":[{"type":"string","examples":["cluster-1"],"description":"The id of the cluster to monitor.","minLength":3,"maxLength":20,"pattern":"^[a-z]-?[a-z0-9]+(-[a-z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"required":["clusterId"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"JobRun condition","properties":{"kind":{"type":"string","examples":["JobRun"],"description":"The kind of condition.","const":"JobRun"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"success"},"data":{"oneOf":[{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"jobId":{"description":"The id of the job to monitor.","oneOf":[{"type":"string","examples":["example-job"],"description":"The id of the job to monitor.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"runId":{"description":"The id of the job run to monitor.","oneOf":[{"type":"string","examples":["d34582a4-35bd-4c71-8e7c-e36999b88723"],"description":"The id of the job run to monitor."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["jobId","runId"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Service condition","properties":{"kind":{"type":"string","examples":["Service"],"description":"The kind of condition.","const":"Service"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"running"},"data":{"oneOf":[{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"serviceId":{"description":"The id of the service to monitor.","oneOf":[{"type":"string","examples":["example-service"],"description":"The id of the service to monitor.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"required":["serviceId"],"additionalProperties":false}]}},"required":["type","data"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"VCS condition","properties":{"kind":{"type":"string","examples":["VCS"],"description":"The kind of condition.","const":"VCS"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"createRepoFromSourceSuccess"},"data":{"oneOf":[{"type":"object","properties":{"trackerId":{"description":"The tracker id outputted from the 'createRepoFromSource' action to monitor.","oneOf":[{"type":"objectId","examples":["507f1f77bcf86cd799439011"],"description":"The tracker id outputted from the 'createRepoFromSource' action to monitor."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["trackerId"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false}]},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"BuildSource node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["BuildSource"],"description":"The kind of node.","const":"BuildSource"},"spec":{"type":"object","description":"The specification for the BuildSource node.","properties":{"id":{"description":"The ID of object to build.","oneOf":[{"type":"string","examples":["example-service"],"description":"The ID of object to build.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"type":"string","examples":["service"],"description":"The type of the object to build.","enum":["service","job"]},"sha":{"description":"Commit sha to build. If not provided, builds the most recent relevant commit.","oneOf":[{"type":"string","examples":["262ed9817b3cad5142fbceabe0c9e371e390d616"],"description":"Commit sha to build. If not provided, builds the most recent relevant commit."},{"type":"string","pattern":".*\\${.*}.*"}]},"branch":{"description":"Branch to build from. If `sha` is not provided, the latest commit of this branch will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both.","oneOf":[{"type":"string","description":"Branch to build from. If `sha` is not provided, the latest commit of this branch will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both."},{"type":"string","pattern":".*\\${.*}.*"}]},"pullRequestId":{"description":"ID of a pull request to build from. If `sha` is not provided, the latest commit of this pull request will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both.","oneOf":[{"type":"integer","description":"ID of a pull request to build from. If `sha` is not provided, the latest commit of this pull request will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both."},{"type":"string","pattern":".*\\${.*}.*"}]},"buildRules":{"type":"object","properties":{"pathIgnoreRules":{"type":"array","maxItems":200,"items":{"type":"string","maxLength":260}},"isAllowList":{"type":"boolean"},"ciIgnoreFlagsEnabled":{"type":"boolean"},"ciIgnoreFlags":{"type":"array","maxItems":200,"items":{"type":"string","maxLength":72}}},"additionalProperties":false},"buildOverrides":{"type":"object","description":"An optional object that may specify several different overrides on the build level.","properties":{"buildArguments":{"examples":[{"ARGUMENT_1":"abcdef","ARGUMENT_2":"12345"}],"description":"Build arguments that will be set on this build only. In case of conflicts these values take precedence.","oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"buildFiles":{"type":"object","examples":[{"/dir/fileName":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Secret files as JSON object, encrypted at rest. File path must be absolute","properties":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"additionalProperties":false},"docker":{"type":"object","description":"Overrides for docker build settings.","properties":{"dockerFilePath":{"type":"string","examples":["/Dockerfile"],"description":"The file path of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"},"dockerWorkDir":{"type":"string","examples":["/"],"description":"The working directory of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},"dockerfileTarget":{"type":"string","description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here.","pattern":"^[a-zA-Z0-9-_]+$"}},"additionalProperties":false}},"additionalProperties":false},"defaults":{"type":"object","description":"Default build to use when not initiated by its matching trigger.","properties":{"sha":{"description":"Commit sha to build. If not provided, builds the most recent relevant commit.","oneOf":[{"type":"string","examples":["262ed9817b3cad5142fbceabe0c9e371e390d616"],"description":"Commit sha to build. If not provided, builds the most recent relevant commit."},{"type":"string","pattern":".*\\${.*}.*"}]},"branch":{"description":"Branch to build from. If `sha` is not provided, the latest commit of this branch will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both.","oneOf":[{"type":"string","description":"Branch to build from. If `sha` is not provided, the latest commit of this branch will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both."},{"type":"string","pattern":".*\\${.*}.*"}]},"pullRequestId":{"description":"ID of a pull request to build from. If `sha` is not provided, the latest commit of this pull request will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both.","oneOf":[{"type":"integer","description":"ID of a pull request to build from. If `sha` is not provided, the latest commit of this pull request will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both."},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"reuseExistingBuilds":{"type":"boolean","examples":[true],"description":"If true, the preview environment will use an existing build if one is available for that commit. Otherwise, a new build will be created with every new preview environment. Defaults to `true`.","default":true},"buildRuleFallThroughHandling":{"type":"string","examples":["fail"],"description":"Define handling if build rules do not match the specified commit","enum":["fail","skip","useLastBuild"]}},"required":["id","type","defaults"],"additionalProperties":false},"condition":{"type":"string","const":"success"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Message node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["Message"],"description":"The kind of node.","const":"Message"},"spec":{"description":"The specification for the Message node.","oneOf":[{"type":"object","description":"VCS message","properties":{"kind":{"type":"string","examples":["VCS"],"description":"The kind of message to send.","const":"VCS"},"spec":{"type":"object","properties":{"vcsService":{"description":"The VCS provider to use.","oneOf":[{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"oneOf":[{"oneOf":[{"type":"string","pattern":"^([A-Za-z0-9-]+)|([0-9a-f]{24})$"},{"type":"string","pattern":".*\\${.*}.*"}]},{"type":"string"}]},"accountLogin":{"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name.","oneOf":[{"type":"string","examples":["github-user"],"description":"By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name."},{"type":"string","pattern":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo to send this message to.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo to send this message to.","pattern":"^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"pullRequestId":{"description":"The ID of the pull request to comment on.","oneOf":[{"type":"string","description":"The ID of the pull request to comment on."},{"type":"string","pattern":".*\\${.*}.*"}]},"message":{"description":"The rich text message to comment.","oneOf":[{"type":"string","examples":["Template run complete."],"description":"The rich text message to comment."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl","pullRequestId","message"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"SLACK message","properties":{"kind":{"type":"string","examples":["SLACK"],"description":"The kind of message to send.","const":"SLACK"},"spec":{"type":"object","properties":{"webhookUrl":{"description":"The Slack webhook URL to send messages to.","oneOf":[{"type":"string","examples":["https://hooks.slack.com/services/XXX/YYY/ZZZ"],"description":"The Slack webhook URL to send messages to.","format":"uri"},{"type":"string","pattern":".*\\${.*}.*"}]},"integrationInternalId":{"description":"The ID of an existing Slack integration to use.","oneOf":[{"type":"string","examples":["slack-integration-id"],"description":"The ID of an existing Slack integration to use.","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"message":{"description":"The message content to send to Slack. Supports markdown formatting.","oneOf":[{"type":"string","examples":["Preview environment *${args.name}* is ready at ${args.url}"],"description":"The message content to send to Slack. Supports markdown formatting."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["message"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"RAW_WEBHOOK message","properties":{"kind":{"type":"string","examples":["RAW_WEBHOOK"],"description":"The kind of message to send.","const":"RAW_WEBHOOK"},"spec":{"type":"object","properties":{"webhookUrl":{"description":"The webhook URL to send messages to.","oneOf":[{"type":"string","description":"The webhook URL to send messages to.","format":"uri"},{"type":"string","pattern":".*\\${.*}.*"}]},"message":{"description":"The message content to send to the webhook.","oneOf":[{"type":"string","examples":["Preview environment *${args.name}* is ready at ${args.url}"],"description":"The message content to send to the webhook."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["webhookUrl","message"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false}]},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"LoopData node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["LoopData"],"description":"The kind of node.","const":"LoopData"},"spec":{"type":"object","description":"The specification for the LoopData node.","properties":{},"additionalProperties":true},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"SecretInheritance node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["SecretInheritance"],"description":"The kind of node.","const":"SecretInheritance"},"spec":{"type":"object","description":"The specification for the SecretInheritance node.","properties":{"configs":{"oneOf":[{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"secrets":{"oneOf":[{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"requiredKeys":{"oneOf":[{"type":"array","default":[],"items":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"requiredFiles":{"oneOf":[{"type":"array","default":[],"items":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"OpenTofu node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["OpenTofu"],"description":"The kind of node.","const":"OpenTofu"},"spec":{"type":"object","description":"The specification for the OpenTofu node.","properties":{"stateKey":{"type":"string","description":"Key to track state, must not be changed after first run."},"isolateResourcesPerEnvironment":{"type":"boolean","description":"Each preview environment will have its own isolated OpenTofu state."},"usePlan":{"type":"boolean","description":"Require approval of a plan before applying"},"spec":{"type":"object","properties":{"provider":{"type":"object","properties":{"aws":{"type":"object","properties":{"region":{"type":"string","examples":["eu-west-1"]},"integrationId":{"description":"Integration to use for this job.","oneOf":[{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["region","integrationId"],"additionalProperties":false},"google":{"type":"object","properties":{"project":{"type":"string"},"region":{"type":"string","examples":["us-central1"]},"zone":{"type":"string","examples":["us-central1-c"]},"integrationId":{"description":"Integration to use for this job.","oneOf":[{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["project","integrationId"],"additionalProperties":false},"cloudflare":{"type":"object","properties":{"integrationId":{"description":"Integration to use for this job.","oneOf":[{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["integrationId"],"additionalProperties":false},"aiven":{"type":"object","properties":{"integrationId":{"description":"Integration to use for this job.","oneOf":[{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["integrationId"],"additionalProperties":false},"backblaze":{"type":"object","properties":{"integrationId":{"description":"Integration to use for this job.","oneOf":[{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["integrationId"],"additionalProperties":false},"azure":{"type":"object","properties":{"integrationId":{"description":"Integration to use for this job.","oneOf":[{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["integrationId"],"additionalProperties":false},"akamai":{"type":"object","properties":{"integrationId":{"description":"Integration to use for this job.","oneOf":[{"type":"string","description":"Integration to use for this job.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["integrationId"],"additionalProperties":false}},"additionalProperties":false},"resource":{"type":"object","properties":{},"additionalProperties":false},"output":{"type":"object","properties":{"/^(?:[a-zA-Z]|_)(?:[a-zA-Z]|\\d|_|-)*$/":{"type":"object","properties":{"value":{"type":"string"},"sensitive":{"type":"boolean"},"depends_on":{"type":"array","items":{"type":"string"}},"description":{"type":"string"},"precondition":{"type":"object","properties":{"condition":{"type":"string"},"error_message":{"type":"string"}},"required":["condition","error_message"],"additionalProperties":false}},"required":["value"],"additionalProperties":false}},"additionalProperties":false,"patternProperties":{"^(?:[a-zA-Z]|_)(?:[a-zA-Z]|\\d|_|-)*$":{"type":"object","properties":{"value":{"type":"string"},"sensitive":{"type":"boolean"},"depends_on":{"type":"array","items":{"type":"string"}},"description":{"type":"string"},"precondition":{"type":"object","properties":{"condition":{"type":"string"},"error_message":{"type":"string"}},"required":["condition","error_message"],"additionalProperties":false}},"required":["value"],"additionalProperties":false}}}},"additionalProperties":false}},"required":["stateKey","spec"],"additionalProperties":false},"condition":{"type":"string","const":"success"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Approval node","properties":{"ref":{"type":"string","description":"An identifier that can used to reference the output of this node later in the template."},"kind":{"type":"string","examples":["Approval"],"description":"The kind of node.","const":"Approval"},"spec":{"type":"object","description":"The specification for the Approval node.","properties":{"amount":{"type":"integer"}},"required":["amount"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false}]}}}