{"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_1","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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_\\-%$+]+$":{"type":"string"}}},"add":{"type":"object","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_\\-%$+]+$":{"type":"string"}}},"remove":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9_\\-%$+]+$"}}},"additionalProperties":false},"response":{"type":"object","properties":{"set":{"type":"object","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_\\-%$+]+$":{"type":"string"}}},"add":{"type":"object","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_\\-%$+]+$":{"type":"string"}}},"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}},"sandboxing":{"type":"object","properties":{"builds":{"type":"object","description":"Build sandboxing runtime configurations","properties":{"enabled":{"type":"boolean","examples":[false],"description":"Enables runtime scheduling constraints for builds"},"runtimeClass":{"oneOf":[{"type":"string","examples":["gvisor"],"description":"Defines which runtime scheduling constraints apply for builds","enum":["none","gvisor","kata-clh","kata-qemu"]}]}},"required":["enabled"],"additionalProperties":false},"services":{"type":"object","description":"Service sandboxing runtime configurations","properties":{"enabled":{"type":"boolean","examples":[false],"description":"Enables runtime scheduling constraints for services"},"runtimeClass":{"oneOf":[{"type":"string","examples":["gvisor"],"description":"Defines which runtime scheduling constraints apply for services","enum":["none","gvisor","kata-clh","kata-qemu"]}]}},"required":["enabled"],"additionalProperties":false},"addons":{"type":"object","description":"Addon sandboxing runtime configurations","properties":{"enabled":{"type":"boolean","examples":[false],"description":"Enables runtime scheduling constraints for addons"},"runtimeClass":{"oneOf":[{"type":"string","examples":["gvisor"],"description":"Defines which runtime scheduling constraints apply for addons","enum":["none","gvisor","kata-clh","kata-qemu"]}]}},"required":["enabled"],"additionalProperties":false},"jobs":{"type":"object","description":"Job secure runtime configurations","properties":{"enabled":{"type":"boolean","examples":[false],"description":"Enables runtime scheduling constraints for jobs"},"runtimeClass":{"oneOf":[{"type":"string","examples":["gvisor"],"description":"Defines which runtime scheduling constraints apply for jobs","enum":["none","gvisor","kata-clh","kata-qemu"]}]}},"required":["enabled"],"additionalProperties":false}},"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":{"canaryHeader":{"type":"object","description":"Header configuration that will route traffic to the canary deployment","properties":{"headerName":{"description":"HTTP header name used to identify requests that should be routed to the target deployment","oneOf":[{"type":"string","examples":["x-canary"],"description":"HTTP header name used to identify requests that should be routed to the target deployment","minLength":1},{"type":"string","pattern":".*\\${.*}.*"}]},"headerValue":{"description":"HTTP header value that routes matching requests to the target deployment","oneOf":[{"type":"string","examples":["true"],"description":"HTTP header value that routes matching requests to the target deployment","minLength":1},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["headerName","headerValue"],"additionalProperties":false},"stableHeader":{"type":"object","description":"Header configuration that will route traffic to the stable deployment","properties":{"headerName":{"description":"HTTP header name used to identify requests that should be routed to the target deployment","oneOf":[{"type":"string","examples":["x-canary"],"description":"HTTP header name used to identify requests that should be routed to the target deployment","minLength":1},{"type":"string","pattern":".*\\${.*}.*"}]},"headerValue":{"description":"HTTP header value that routes matching requests to the target deployment","oneOf":[{"type":"string","examples":["true"],"description":"HTTP header value that routes matching requests to the target deployment","minLength":1},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["headerName","headerValue"],"additionalProperties":false}},"required":["canaryHeader","stableHeader"],"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":".*\\${.*}.*"}]}},"crossProjectAccess":{"type":"object","description":"Controls which projects can use this build service.","properties":{"enabled":{"type":"boolean","examples":[true],"description":"Allow this build service to be referenced by resources in other projects."},"projects":{"type":"array","description":"A list of project IDs used as an allow list or deny list.","items":{"description":"The ID of a project to include or exclude.","oneOf":[{"type":"string","examples":["example-project"],"description":"The ID of a project to include or exclude.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"isAllowList":{"type":"boolean","description":"If true, only the listed projects can use this build service. If false, all projects except the listed ones can use this build service."}},"required":["enabled","projects","isAllowList"],"additionalProperties":false},"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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]+)*)?$"}},"expiryTime":{"type":"integer","examples":[86400],"description":"Number of seconds from creation after which the service should automatically expire. Once reached, the service is paused and scheduled for deletion. Must be between 300 (5 minutes) and 604800 (7 days).","minimum":300,"maximum":604800}},"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":[{"description":"ID of the build service to deploy","oneOf":[{"type":"string","examples":["example-build-service"],"minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","examples":["example-project/example-build-service"]}]},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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]+)*)?$"}},"expiryTime":{"type":"integer","examples":[86400],"description":"Number of seconds from creation after which the service should automatically expire. Once reached, the service is paused and scheduled for deletion. Must be between 300 (5 minutes) and 604800 (7 days).","minimum":300,"maximum":604800}},"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":[{"description":"ID of the build service to deploy","oneOf":[{"type":"string","examples":["example-build-service"],"minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","examples":["example-project/example-build-service"]}]},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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":[{"description":"ID of the build service to deploy","oneOf":[{"type":"string","examples":["example-build-service"],"minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","examples":["example-project/example-build-service"]}]},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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":[{"description":"ID of the build service to deploy","oneOf":[{"type":"string","examples":["example-build-service"],"minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","examples":["example-project/example-build-service"]}]},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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},"region":{"type":"string","examples":["eu-west-2"],"description":"The AWS region identifier for the bucket location."}},"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","cloudSql","memorystore"]},"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},"outputs":{"type":"object","additionalProperties":false,"patternProperties":{"^(?:[a-zA-Z]|_)(?:[a-zA-Z]|\\d|_|-)*$":{"type":"object","properties":{"value":{"type":"string"},"sensitive":{"type":"boolean"}},"required":["value"],"additionalProperties":false}}},"workloadIdentityId":{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"}},"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":"AddonImport 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":["AddonImport"],"description":"The kind of node.","const":"AddonImport"},"spec":{"type":"object","description":"The specification for the AddonImport node.","properties":{"projectId":{"description":"The ID of the project containing the addon.","oneOf":[{"type":"string","description":"The ID of the project containing the addon.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"addonId":{"description":"The ID of the addon to import a backup into.","oneOf":[{"type":"string","description":"The ID of the addon to import a backup into.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"importUrl":{"description":"A URL to import a backup file from.","oneOf":[{"type":"string","examples":["https://yourdomain.com/backup.db.gz"],"description":"A URL to import a backup file from.","format":"uri"},{"type":"string","pattern":".*\\${.*}.*"}]},"connectionString":{"description":"A connection string for a live database to dump and import.","oneOf":[{"type":"string","description":"A connection string for a live database to dump and import."},{"type":"string","pattern":".*\\${.*}.*"}]},"importAllDatabases":{"type":"boolean","description":"When true, all non-system databases will be detected and dumped. Only applicable when using a connection string with PostgreSQL.","default":true},"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":".*\\${.*}.*"}]}},"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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":"Reference to the source object. For a volume source: \"<volumeId>\". For a backup source: \"<volumeId>/<backupId>\", or \"<projectId>/<volumeId>/<backupId>\" to restore from a backup in another project on the same cluster (requires the cross-project clone feature).","oneOf":[{"type":"string","examples":["example-volume/example-backup"],"description":"Reference to the source object. For a volume source: \"<volumeId>\". For a backup source: \"<volumeId>/<backupId>\", or \"<projectId>/<volumeId>/<backupId>\" to restore from a backup in another project on the same cluster (requires the cross-project clone feature)."},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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":[{"description":"ID of the build service to deploy","oneOf":[{"type":"string","examples":["example-build-service"],"minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","examples":["example-project/example-build-service"]}]},{"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":"AddonImport condition","properties":{"kind":{"type":"string","examples":["AddonImport"],"description":"The kind of condition.","const":"AddonImport"},"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":".*\\${.*}.*"}]},"importId":{"description":"The id of the import to monitor.","oneOf":[{"type":"string","examples":["example-import"],"description":"The id of the import to monitor.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["addonId","importId"],"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","additionalProperties":false,"patternProperties":{"^[a-zA-Z0-9_./-]*$":{"type":"string"}}},{"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","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}]}}}