{"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/V1TemplateNodeSchema"}},"required":["apiVersion","spec"],"additionalProperties":false,"$defs":{"V1TemplateWorkflowSchema":{"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/V1TemplateNodeSchema"}},"context":{"type":"object","description":"Context passed on to child nodes.","properties":{"projectId":{"description":"Default project to apply to child nodes.","oneOf":[{"type":"string","examples":["example-project"],"description":"Default project to apply to child nodes.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"required":["type","steps"],"additionalProperties":false},"awsWorkloadProvider":{"type":"object","properties":{"type":{"type":"string","const":"aws"},"policyDocument":{"description":"The AWS IAM policy document.","oneOf":[{"type":"object","description":"The AWS IAM policy document.","properties":{"Version":{"type":"string","enum":["2012-10-17","2008-10-17"]},"Statement":{"oneOf":[{"type":"object","properties":{"Sid":{"type":"string"},"Effect":{"type":"string","enum":["Allow","Deny"]},"Action":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"Resource":{"oneOf":[{"type":"string","pattern":"^(\\*|arn:[a-zA-Z0-9:*/\\-?_+=,.@]+)$"},{"type":"array","items":{"type":"string","pattern":"^(\\*|arn:[a-zA-Z0-9:*/\\-?_+=,.@]+)$"}}]},"Condition":{"type":"object","properties":{},"additionalProperties":true}},"required":["Effect","Action","Resource"],"additionalProperties":false},{"type":"array","items":{"type":"object","properties":{"Sid":{"type":"string"},"Effect":{"type":"string","enum":["Allow","Deny"]},"Action":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"Resource":{"oneOf":[{"type":"string","pattern":"^(\\*|arn:[a-zA-Z0-9:*/\\-?_+=,.@]+)$"},{"type":"array","items":{"type":"string","pattern":"^(\\*|arn:[a-zA-Z0-9:*/\\-?_+=,.@]+)$"}}]},"Condition":{"type":"object","properties":{},"additionalProperties":true}},"required":["Effect","Action","Resource"],"additionalProperties":false}}]}},"required":["Version","Statement"],"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"arn":{"type":"string"},"existingRoleArn":{"not":{}}},"required":["type","policyDocument"],"additionalProperties":false},"awsExistingRoleProvider":{"type":"object","properties":{"type":{"type":"string","const":"aws"},"existingRoleArn":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"arn":{"type":"string"},"policyDocument":{"not":{}}},"required":["type","existingRoleArn"],"additionalProperties":false},"gcpWorkloadProvider":{"type":"object","properties":{"type":{"type":"string","const":"gcp"},"permissions":{"description":"A list of GCP permissions to assign to this workload identity.","oneOf":[{"type":"array","description":"A list of GCP permissions to assign to this workload identity.","minItems":1,"items":{"type":"string","pattern":"^[a-zA-Z0-9.]+$"}},{"type":"string","pattern":".*\\${.*}.*"}]},"impersonationUrl":{"type":"string"},"audience":{"type":"string"},"existingRoleAudience":{"not":{}},"existingRoleImpersonationUrl":{"not":{}}},"required":["type","permissions"],"additionalProperties":false},"gcpExistingRoleProvider":{"type":"object","properties":{"type":{"type":"string","const":"gcp"},"existingRoleAudience":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"existingRoleImpersonationUrl":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"impersonationUrl":{"type":"string"},"audience":{"type":"string"},"permissions":{"not":{}}},"required":["type","existingRoleAudience","existingRoleImpersonationUrl"],"additionalProperties":false},"V1TemplateLoopWorkflowSchema":{"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/V1TemplateNodeSchema"}}},"required":["iterations","steps"],"additionalProperties":false},"V1TemplateNodeSchema":{"description":"A node representing an action to be performed as part of the template.","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/V1TemplateWorkflowSchema"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"CustomPlan 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":["CustomPlan"],"description":"The kind of node.","const":"CustomPlan"},"spec":{"type":"object","description":"The specification for the CustomPlan node.","properties":{"type":{"type":"array","items":{"oneOf":[{"type":"string","enum":["deployment","build"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"configuration":{"type":"object","properties":{"type":{"oneOf":[{"type":"string","enum":["northflank","kubernetes"]},{"type":"string","pattern":".*\\${.*}.*"}]},"resources":{"type":"object","properties":{"cpu":{"type":"object","properties":{"resources":{"type":"object","properties":{"limit":{"oneOf":[{"type":"number","minimum":0.05},{"type":"string","pattern":".*\\${.*}.*"}]},"request":{"oneOf":[{"type":"number","minimum":0.05},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"options":{"type":"object","properties":{"unbounded":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"memory":{"type":"object","properties":{"resources":{"type":"object","properties":{"limit":{"oneOf":[{"type":"number","minimum":100},{"type":"string","pattern":".*\\${.*}.*"}]},"request":{"oneOf":[{"type":"number","minimum":100},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"name":{"oneOf":[{"type":"string","examples":["custom-plan"],"minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["type","configuration"],"additionalProperties":false},"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":"BYOCIntegration 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":["BYOCIntegration"],"description":"The kind of node.","const":"BYOCIntegration"},"spec":{"type":"object","description":"The specification for the BYOCIntegration node.","properties":{"name":{"description":"The name of the cloud provider integration.","oneOf":[{"type":"string","examples":["Example Integration"],"description":"The name of the cloud provider integration.","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"type":"string","examples":["This is a new cloud provider integration."],"description":"The description of the integration.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},"provider":{"description":"Cloud provider to be used for the selected resource","oneOf":[{"type":"string","examples":["gcp"],"description":"Cloud provider to be used for the selected resource","enum":["aws","azure","civo","gcp","oci","cloudflare","coreweave","aiven","backblaze","akamai","byok"]},{"type":"string","pattern":".*\\${.*}.*"}]},"features":{"type":"array","default":["byoc"],"items":{"type":"string","examples":["byoc"],"description":"The type of provider integration.","enum":["byoc","byoc-static-egress","byoc-custom-launch-templates","byoc-custom-vpc","byoc-logs","cloudfront","route53","registry-pull","registry-push","opentofu","workload-identity"]}},"restrictions":{"type":"object","description":"BYOC restrictions configuration for controlling team access","properties":{"enabled":{"type":"boolean","description":"Enable or disable BYOC restrictions for this entity"},"teams":{"type":"array","description":"List of teams that have access to this BYOC cluster","default":[],"items":{"type":"object","properties":{"teamId":{"type":"string","description":"The ID of the team that has access to this BYOC cluster","minLength":3,"maxLength":45,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}},"required":["teamId"],"additionalProperties":true}}},"required":["enabled"],"additionalProperties":false},"credentials":{"type":"object","description":"Cloud provider credential input, required fields dependent on which provider is chosen.","properties":{"keyfileJson":{"description":"Contents of a GCP key file.","oneOf":[{"type":"string","description":"Contents of a GCP key file."},{"type":"string","pattern":".*\\${.*}.*"}]},"accessKey":{"description":"AWS access key.","oneOf":[{"type":"string","description":"AWS access key."},{"type":"string","pattern":".*\\${.*}.*"}]},"secretKey":{"description":"AWS secret key.","oneOf":[{"type":"string","description":"AWS secret key."},{"type":"string","pattern":".*\\${.*}.*"}]},"roleArn":{"description":"AWS IAM role ARN.","oneOf":[{"type":"string","description":"AWS IAM role ARN."},{"type":"string","pattern":".*\\${.*}.*"}]},"externalId":{"description":"AWS shared secret (external id).","oneOf":[{"type":"string","description":"AWS shared secret (external id)."},{"type":"string","pattern":".*\\${.*}.*"}]},"apiKey":{"description":"API key.","oneOf":[{"type":"string","description":"API key."},{"type":"string","pattern":".*\\${.*}.*"}]},"email":{"description":"Email address for Cloudflare global API key.","oneOf":[{"type":"string","description":"Email address for Cloudflare global API key.","format":"email"},{"type":"string","pattern":".*\\${.*}.*"}]},"tenantId":{"description":"Directory (tenant) ID ","oneOf":[{"type":"string","description":"Directory (tenant) ID "},{"type":"string","pattern":".*\\${.*}.*"}]},"clientId":{"description":"Application (client) ID ","oneOf":[{"type":"string","description":"Application (client) ID "},{"type":"string","pattern":".*\\${.*}.*"}]},"objectId":{"description":"Object ID","oneOf":[{"type":"string","description":"Object ID"},{"type":"string","pattern":".*\\${.*}.*"}]},"secret":{"description":"Secret","oneOf":[{"type":"string","description":"Secret"},{"type":"string","pattern":".*\\${.*}.*"}]},"subscriptionId":{"description":"Azure Subscription ID","oneOf":[{"type":"string","description":"Azure Subscription ID"},{"type":"string","pattern":".*\\${.*}.*"}]},"region":{"description":"OCI Authentication Region","oneOf":[{"type":"string","description":"OCI Authentication Region"},{"type":"string","pattern":".*\\${.*}.*"}]},"tenancyId":{"description":"OCI Tenancy ID","oneOf":[{"type":"string","description":"OCI Tenancy ID"},{"type":"string","pattern":".*\\${.*}.*"}]},"userId":{"description":"User ID","oneOf":[{"type":"string","description":"User ID"},{"type":"string","pattern":".*\\${.*}.*"}]},"fingerprint":{"description":"Fingerprint","oneOf":[{"type":"string","description":"Fingerprint"},{"type":"string","pattern":".*\\${.*}.*"}]},"privateKey":{"description":"OCI Private Key","oneOf":[{"type":"string","description":"OCI Private Key"},{"type":"string","pattern":".*\\${.*}.*"}]},"passphrase":{"description":"Passphrase","oneOf":[{"type":"string","description":"Passphrase"},{"type":"string","pattern":".*\\${.*}.*"}]},"compartmentId":{"description":"OCI Compartment ID","oneOf":[{"type":"string","description":"OCI Compartment ID"},{"type":"string","pattern":".*\\${.*}.*"}]},"kubeconfig":{"description":"Kubeconfig","oneOf":[{"type":"string","description":"Kubeconfig"},{"type":"string","pattern":".*\\${.*}.*"}]},"applicationKeyId":{"description":"Backblaze Application Key ID","oneOf":[{"type":"string","description":"Backblaze Application Key ID"},{"type":"string","pattern":".*\\${.*}.*"}]},"applicationKey":{"description":"Backblaze Application Key","oneOf":[{"type":"string","description":"Backblaze Application Key"},{"type":"string","pattern":".*\\${.*}.*"}]},"host":{"description":"Akamai Host","oneOf":[{"type":"string","description":"Akamai Host"},{"type":"string","pattern":".*\\${.*}.*"}]},"accessToken":{"description":"Akamai Access Token","oneOf":[{"type":"string","description":"Akamai Access Token"},{"type":"string","pattern":".*\\${.*}.*"}]},"clientToken":{"description":"Akamai Client Token","oneOf":[{"type":"string","description":"Akamai Client Token"},{"type":"string","pattern":".*\\${.*}.*"}]},"clientSecret":{"description":"Akamai Client Secret","oneOf":[{"type":"string","description":"Akamai Client Secret"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"aws":{"type":"object","properties":{"authenticationMode":{"type":"string","examples":["accessKey"],"description":"The provider authentication mode to use for this integration.","enum":["accessKey","crossAccountRole"]},"permissionCheckLevel":{"type":"string","enum":["enabled","disabled","ignore-implicit-deny-by-organization"]}},"additionalProperties":false},"gcp":{"oneOf":[{"type":"object","properties":{"projectId":{"type":"string","pattern":"^[a-z][a-z0-9-]{4,28}[a-z0-9]$"},"authenticationMode":{"type":"string","examples":["accessKey"],"description":"The provider authentication mode to use for this integration.","enum":["accessKey","crossAccountRole"]}},"required":["projectId"],"additionalProperties":false}]},"cloudflare":{"oneOf":[{"type":"object","properties":{"credentialType":{"type":"string","examples":["apiToken"],"description":"The type of api key","enum":["apiToken","originCAKey","globalApiKey"]}},"additionalProperties":false}]}},"required":["name","provider","credentials"],"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":"BYOCCluster 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":["BYOCCluster"],"description":"The kind of node.","const":"BYOCCluster"},"spec":{"type":"object","description":"The specification for the BYOCCluster node.","properties":{"name":{"description":"The name of the cluster.","oneOf":[{"type":"string","examples":["GCP Cluster 1"],"description":"The name of the cluster.","minLength":3,"maxLength":20,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"type":"string","examples":["This is a new cluster."],"description":"The description of the cluster.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},"provider":{"description":"Cloud provider to be used for the selected resource","oneOf":[{"type":"string","examples":["gcp"],"description":"Cloud provider to be used for the selected resource","enum":["aws","azure","civo","gcp","oci","cloudflare","coreweave","aiven","backblaze","akamai","byok"]},{"type":"string","pattern":".*\\${.*}.*"}]},"region":{"oneOf":[{"description":"Region of the cluster.","oneOf":[{"type":"string","examples":["europe-west2"],"description":"Region of the cluster."},{"type":"string","pattern":".*\\${.*}.*"}]},{"description":"Region of the cluster.","oneOf":[{"type":"string","examples":["europe-west2"],"description":"Region of the cluster."},{"type":"string","pattern":".*\\${.*}.*"}]}]},"kubernetesVersion":{"description":"Deprecated: This field is no longer used, the version is now set by the platform.","oneOf":[{"type":"string","examples":["1.30"],"description":"Deprecated: This field is no longer used, the version is now set by the platform."},{"type":"string","pattern":".*\\${.*}.*"}]},"integrationId":{"description":"Existing integration to use for this cluster.","oneOf":[{"type":"string","examples":["gcp-integration"],"description":"Existing integration to use for this cluster.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"storage":{"oneOf":[{"type":"object","properties":{"storageEnabled":{"type":"boolean"},"snapshotsEnabled":{"type":"boolean"},"storageClasses":{"type":"array","uniqueItems":true,"items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["storage-class","snapshot-class"]},"kubernetesName":{"type":"string"},"defaultSnapshotClass":{"type":"string"},"options":{"type":"object","properties":{"capabilities":{"type":"object","properties":{"expansion":{"type":"boolean","description":"Increasing volume size after provisioning."},"snapshot":{"type":"boolean","description":"Point in time snapshotting of volumes."}},"additionalProperties":false},"accessModes":{"type":"object","properties":{"ReadWriteOnce":{"type":"boolean","description":"Access mode where a volume is exclusively attached to a single pod at a time."},"ReadWriteMany":{"type":"boolean","description":"Access mode where a volume can be attached to multiple single pods at a time for read and write operations."}},"additionalProperties":false},"storageSize":{"type":"object","properties":{"minValidSize":{"type":"integer","description":"Enforces a minimum storage size per addon or volume."},"maxValidSize":{"type":"integer","description":"Enforces a maximum storage size per addon or volume."},"suggestedOptions":{"type":"array","description":"Specific storage size options to suggest in the UI.","items":{"type":"integer"}}},"additionalProperties":false},"platform":{"type":"object","properties":{"supportedResources":{"type":"array","items":{"type":"string","enum":["addon","volume","build-cache"]}}},"additionalProperties":false}},"additionalProperties":false}},"required":["id","name","kubernetesName"],"additionalProperties":false}},"snapshotClasses":{"type":"array","uniqueItems":true,"items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"kubernetesName":{"type":"string"}},"required":["id","name","kubernetesName"],"additionalProperties":false}}},"additionalProperties":false},{"type":"object","properties":{"storageClasses":{"type":"array","uniqueItems":true,"items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["storage-class","snapshot-class"]},"kubernetesName":{"type":"string"},"defaultSnapshotClass":{"type":"string"},"options":{"type":"object","properties":{"capabilities":{"type":"object","properties":{"expansion":{"type":"boolean","description":"Increasing volume size after provisioning."},"snapshot":{"type":"boolean","description":"Point in time snapshotting of volumes."}},"additionalProperties":false},"accessModes":{"type":"object","properties":{"ReadWriteOnce":{"type":"boolean","description":"Access mode where a volume is exclusively attached to a single pod at a time."},"ReadWriteMany":{"type":"boolean","description":"Access mode where a volume can be attached to multiple single pods at a time for read and write operations."}},"additionalProperties":false},"storageSize":{"type":"object","properties":{"minValidSize":{"type":"integer","description":"Enforces a minimum storage size per addon or volume."},"maxValidSize":{"type":"integer","description":"Enforces a maximum storage size per addon or volume."},"suggestedOptions":{"type":"array","description":"Specific storage size options to suggest in the UI.","items":{"type":"integer"}}},"additionalProperties":false},"platform":{"type":"object","properties":{"supportedResources":{"type":"array","items":{"type":"string","enum":["addon","volume","build-cache"]}}},"additionalProperties":false}},"additionalProperties":false}},"required":["id","name","kubernetesName"],"additionalProperties":false}},"snapshotClasses":{"type":"array","uniqueItems":true,"items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"kubernetesName":{"type":"string"}},"required":["id","name","kubernetesName"],"additionalProperties":false}}},"additionalProperties":false}]},"nodePools":{"type":"array","items":{}},"settings":{"oneOf":[{"type":"object","properties":{"builds":{"type":"object","properties":{"mode":{"oneOf":[{"type":"string","enum":["paas","internal","build-cluster"]},{"type":"string","pattern":".*\\${.*}.*"}]},"plan":{"oneOf":[{"type":"string","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"clusterId":{"oneOf":[{"type":"string","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"caching":{"type":"object","description":"Cache settings for builds","properties":{"allow":{"type":"boolean","description":"Whether to allow local disk based caching for builds."},"storageClassName":{"type":"string","description":"Storage class used by default for local disk based caching."}},"additionalProperties":false}},"additionalProperties":false},"registry":{"type":"object","properties":{"mode":{"oneOf":[{"type":"string","enum":["paas","self-hosted"]},{"type":"string","pattern":".*\\${.*}.*"}]},"registryId":{"oneOf":[{"type":"string","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"logging":{"type":"object","default":{"mode":"paas"},"properties":{"mode":{"oneOf":[{"type":"string","enum":["paas","loki"]},{"type":"string","pattern":".*\\${.*}.*"}]},"loki":{"type":"object","properties":{},"additionalProperties":false}},"additionalProperties":false},"networking":{"type":"object","properties":{"overlayNetwork":{"type":"boolean","description":"Whether overlay networking is enabled for this cluster."},"overlayCIDR":{"type":"string","description":"CIDR range for the overlay network.","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]))$"}},"additionalProperties":false},"vanityDomains":{"type":"object","properties":{"apps":{"type":"object","properties":{"zoneName":{"type":"string"},"integrationId":{"type":"objectId"}},"required":["zoneName","integrationId"],"additionalProperties":false},"customDomains":{"type":"object","properties":{"zoneName":{"type":"string"},"integrationId":{"type":"objectId"}},"required":["zoneName","integrationId"],"additionalProperties":false},"loadBalancers":{"type":"object","properties":{"zoneName":{"type":"string"},"integrationId":{"type":"objectId"}},"required":["zoneName","integrationId"],"additionalProperties":false}},"additionalProperties":false},"infrastructure":{"type":"object","properties":{"workloads":{"type":"object","description":"DEPRECATED: This field will be removed in the near future.","properties":{"runtimeClass":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"builds":{"type":"object","description":"DEPRECATED: This field will be removed in the near future.","properties":{"runtimeClass":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"sandboxing":{"type":"object","properties":{"installGvisor":{"type":"boolean"},"installMicroVm":{"type":"boolean"},"defaultSandbox":{"type":"object","properties":{"builds":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]},"jobs":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]},"services":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]},"addons":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"gpu":{"type":"object","properties":{"installDrivers":{"type":"boolean","description":"Controls whether GPU driver installation will be handled by Northflank"}},"additionalProperties":false},"installKata":{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future."},"installGvisor":{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future."},"cleanupVolumes":{"type":"boolean","default":true},"cleanupSnapshots":{"type":"boolean","default":true},"cephStorageProvider":{"type":"object","properties":{"enabled":{"type":"boolean","default":false},"resources":{"type":"object","properties":{"cpu":{"type":"number","description":"Configure the CPU resources per Ceph replica","minimum":1,"maximum":20},"memory":{"type":"number","description":"Configure the memory resources per Ceph replica","minimum":4096,"maximum":40960},"storage":{"type":"number","description":"Configure the data disk size per Ceph replica","minimum":102400,"maximum":5242880}},"additionalProperties":false},"enableMultiReadWriteStorage":{"type":"boolean","description":"Configure Ceph to be enable use of multi read write storage for persistent volumes on the cluster."},"enableSingleReadWriteStorage":{"type":"boolean","description":"Configure Ceph to be used as default storage class for single read write storage. This will replace the default storage of the cloud provider."},"enableErasureCoding":{"type":"boolean","description":"Configure Ceph to be set up with erasure coding. This will be less fault tolerant but more cost effective."},"enableTopologyAwareScheduling":{"type":"boolean","description":"Configure Ceph to be set up with topology aware scheduling, enforcing deployment across multiple zones."}},"additionalProperties":false}},"additionalProperties":false},"requestModifiers":{"type":"object","description":"Allows customising request modifier values.","properties":{"services":{"type":"object","description":"Request modifiers for services","properties":{"cpu":{"type":"number","examples":[0.5],"default":0.5,"minimum":0.2,"maximum":1},"memory":{"type":"number","examples":[0.8],"default":0.8,"minimum":0.4,"maximum":1}},"required":["cpu","memory"],"additionalProperties":false},"jobs":{"type":"object","description":"Request modifiers for jobs","properties":{"cpu":{"type":"number","examples":[0.5],"default":0.5,"minimum":0.2,"maximum":1},"memory":{"type":"number","examples":[0.8],"default":0.8,"minimum":0.4,"maximum":1}},"required":["cpu","memory"],"additionalProperties":false},"builds":{"type":"object","description":"Request modifiers for builds","properties":{"cpu":{"type":"number","examples":[0.2],"default":0.2,"minimum":0.1,"maximum":1},"memory":{"type":"number","examples":[0.5],"default":0.5,"minimum":0.1,"maximum":1}},"required":["cpu","memory"],"additionalProperties":false},"addons":{"type":"object","description":"Request modifiers for addons","properties":{"cpu":{"type":"number","examples":[0.5],"default":0.5,"minimum":0.2,"maximum":1},"memory":{"type":"number","examples":[0.8],"default":0.8,"minimum":0.4,"maximum":1}},"required":["cpu","memory"],"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},{"type":"object","properties":{"builds":{"type":"object","properties":{"mode":{"oneOf":[{"type":"string","enum":["paas","internal","build-cluster"]},{"type":"string","pattern":".*\\${.*}.*"}]},"plan":{"oneOf":[{"type":"string","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"clusterId":{"oneOf":[{"type":"string","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"caching":{"type":"object","description":"Cache settings for builds","properties":{"allow":{"type":"boolean","description":"Whether to allow local disk based caching for builds."},"storageClassName":{"type":"string","description":"Storage class used by default for local disk based caching."}},"additionalProperties":false}},"additionalProperties":false},"registry":{"type":"object","properties":{"mode":{"oneOf":[{"type":"string","enum":["paas","self-hosted"]},{"type":"string","pattern":".*\\${.*}.*"}]},"registryId":{"oneOf":[{"type":"string","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"logging":{"type":"object","default":{"mode":"paas"},"properties":{"mode":{"oneOf":[{"type":"string","enum":["paas","loki"]},{"type":"string","pattern":".*\\${.*}.*"}]},"loki":{"type":"object","properties":{},"additionalProperties":false}},"additionalProperties":false},"networking":{"type":"object","properties":{"overlayNetwork":{"type":"boolean","description":"Whether overlay networking is enabled for this cluster."},"overlayCIDR":{"type":"string","description":"CIDR range for the overlay network.","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]))$"}},"additionalProperties":false},"vanityDomains":{"type":"object","properties":{"apps":{"type":"object","properties":{"zoneName":{"type":"string"},"integrationId":{"type":"objectId"}},"required":["zoneName","integrationId"],"additionalProperties":false},"customDomains":{"type":"object","properties":{"zoneName":{"type":"string"},"integrationId":{"type":"objectId"}},"required":["zoneName","integrationId"],"additionalProperties":false},"loadBalancers":{"type":"object","properties":{"zoneName":{"type":"string"},"integrationId":{"type":"objectId"}},"required":["zoneName","integrationId"],"additionalProperties":false}},"additionalProperties":false},"infrastructure":{"type":"object","properties":{"workloads":{"type":"object","description":"DEPRECATED: This field will be removed in the near future.","properties":{"runtimeClass":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"builds":{"type":"object","description":"DEPRECATED: This field will be removed in the near future.","properties":{"runtimeClass":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"sandboxing":{"type":"object","properties":{"installGvisor":{"type":"boolean"},"installMicroVm":{"type":"boolean"},"defaultSandbox":{"type":"object","properties":{"builds":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]},"jobs":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]},"services":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]},"addons":{"oneOf":[{"type":"string","enum":["none","gvisor","kata-clh","kata-qemu"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}},"additionalProperties":false},"installKata":{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future."},"installGvisor":{"type":"boolean","description":"DEPRECATED: This field will be removed in the near future."},"cleanupVolumes":{"type":"boolean","default":true},"cleanupSnapshots":{"type":"boolean","default":true},"cephStorageProvider":{"type":"object","properties":{"enabled":{"type":"boolean","default":false},"resources":{"type":"object","properties":{"cpu":{"type":"number","description":"Configure the CPU resources per Ceph replica","minimum":1,"maximum":20},"memory":{"type":"number","description":"Configure the memory resources per Ceph replica","minimum":4096,"maximum":40960},"storage":{"type":"number","description":"Configure the data disk size per Ceph replica","minimum":102400,"maximum":5242880}},"additionalProperties":false},"enableMultiReadWriteStorage":{"type":"boolean","description":"Configure Ceph to be enable use of multi read write storage for persistent volumes on the cluster."},"enableSingleReadWriteStorage":{"type":"boolean","description":"Configure Ceph to be used as default storage class for single read write storage. This will replace the default storage of the cloud provider."},"enableErasureCoding":{"type":"boolean","description":"Configure Ceph to be set up with erasure coding. This will be less fault tolerant but more cost effective."},"enableTopologyAwareScheduling":{"type":"boolean","description":"Configure Ceph to be set up with topology aware scheduling, enforcing deployment across multiple zones."}},"additionalProperties":false}},"additionalProperties":false},"requestModifiers":{"type":"object","description":"Allows customising request modifier values.","properties":{"services":{"type":"object","description":"Request modifiers for services","properties":{"cpu":{"type":"number","examples":[0.5],"default":0.5,"minimum":0.2,"maximum":1},"memory":{"type":"number","examples":[0.8],"default":0.8,"minimum":0.4,"maximum":1}},"required":["cpu","memory"],"additionalProperties":false},"jobs":{"type":"object","description":"Request modifiers for jobs","properties":{"cpu":{"type":"number","examples":[0.5],"default":0.5,"minimum":0.2,"maximum":1},"memory":{"type":"number","examples":[0.8],"default":0.8,"minimum":0.4,"maximum":1}},"required":["cpu","memory"],"additionalProperties":false},"builds":{"type":"object","description":"Request modifiers for builds","properties":{"cpu":{"type":"number","examples":[0.2],"default":0.2,"minimum":0.1,"maximum":1},"memory":{"type":"number","examples":[0.5],"default":0.5,"minimum":0.1,"maximum":1}},"required":["cpu","memory"],"additionalProperties":false},"addons":{"type":"object","description":"Request modifiers for addons","properties":{"cpu":{"type":"number","examples":[0.5],"default":0.5,"minimum":0.2,"maximum":1},"memory":{"type":"number","examples":[0.8],"default":0.8,"minimum":0.4,"maximum":1}},"required":["cpu","memory"],"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false}]},"restrictions":{"type":"object","description":"BYOC restrictions configuration for controlling team access","properties":{"enabled":{"type":"boolean","description":"Enable or disable BYOC restrictions for this entity"},"teams":{"type":"array","description":"List of teams that have access to this BYOC cluster","default":[],"items":{"type":"object","properties":{"teamId":{"type":"string","description":"The ID of the team that has access to this BYOC cluster","minLength":3,"maxLength":45,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}},"required":["teamId"],"additionalProperties":true}}},"required":["enabled"],"additionalProperties":false},"gcp":{"oneOf":[{"type":"object","properties":{"networking":{"type":"object","properties":{"network":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"subnetwork":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"enableAuthorizedIpRanges":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"authorizedIpRanges":{"oneOf":[{"type":"array","items":{"type":"string","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":".*\\${.*}.*"}]},"projectId":{"description":"GCP Project ID","oneOf":[{"type":"string","description":"GCP Project ID","pattern":"^[a-z][a-z0-9-]{4,28}[a-z0-9]$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}]},"aws":{"oneOf":[{"type":"object","properties":{"enablePublicAccessCidrs":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"publicAccessCidrs":{"oneOf":[{"type":"array","items":{"type":"string","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":".*\\${.*}.*"}]},"subnetConfiguration":{"type":"object","properties":{"mode":{"description":"The mode of the AWS subnet configuration","oneOf":[{"type":"string","description":"The mode of the AWS subnet configuration","enum":["default-subnets-for-azs","explicit-subnets"]},{"type":"string","pattern":".*\\${.*}.*"}]},"vpcId":{"oneOf":[{"oneOf":[{"type":"string"},{"type":"string"}]},{"type":"string","pattern":".*\\${.*}.*"}]},"subnets":{"description":"List of subnets the cluster should be created for. At least 2 must be specified.","oneOf":[{"type":"array","description":"List of subnets the cluster should be created for. At least 2 must be specified.","minItems":2,"items":{"type":"string","examples":["eu-west-1a"]}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["mode","subnets"],"additionalProperties":false},"vpcEgress":{"description":"If egress traffic from the cluster should come from a single static egress IP.","oneOf":[{"type":"boolean","description":"If egress traffic from the cluster should come from a single static egress IP."},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false}]},"oci":{"oneOf":[{"type":"object","properties":{"vcnConfiguration":{"type":"object","properties":{"vcnId":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"subnetIdForKubernetesApi":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"subnetIdsForServiceLBs":{"oneOf":[{"type":"array","items":{"type":"string"}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["vcnId","subnetIdForKubernetesApi","subnetIdsForServiceLBs"],"additionalProperties":false}},"required":["vcnConfiguration"],"additionalProperties":false}]},"azure":{"oneOf":[{"type":"object","properties":{"networking":{"type":"object","properties":{"vnetConfiguration":{"type":"object","properties":{"mode":{"description":"The vnet mode to use for this cluster. Use this to switch between creation of a new vnet per cluster or specifying a custom vnet.","oneOf":[{"type":"string","description":"The vnet mode to use for this cluster. Use this to switch between creation of a new vnet per cluster or specifying a custom vnet.","enum":["create-default","custom-vnet"]},{"type":"string","pattern":".*\\${.*}.*"}]},"vnetId":{"description":"Azure vnetId that should be used for this cluster. By default a new vnet will be created.","oneOf":[{"type":"string","description":"Azure vnetId that should be used for this cluster. By default a new vnet will be created."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["mode"],"additionalProperties":false},"networkPluginMode":{"description":"Optional setting to configure overlay mode on Azure.","oneOf":[{"type":"string","description":"Optional setting to configure overlay mode on Azure.","const":"overlay"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"enableAuthorizedIpRanges":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"authorizedIpRanges":{"oneOf":[{"type":"array","items":{"type":"string","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":".*\\${.*}.*"}]}},"additionalProperties":false}]},"coreweave":{"oneOf":[{"type":"object","properties":{"zone":{"description":"AZ of the cluster","oneOf":[{"type":"string","description":"AZ of the cluster"},{"type":"string","pattern":".*\\${.*}.*"}]},"network":{"type":"object","description":"Network settings","properties":{"networkMode":{"oneOf":[{"type":"string","enum":["create-default","custom"]},{"type":"string","pattern":".*\\${.*}.*"}]},"vpcId":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"customPrefixNames":{"type":"object","properties":{"podCidrName":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"serviceCidrName":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"internalLbCidrNames":{"oneOf":[{"type":"array","minItems":1,"items":{"type":"string"}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["podCidrName","serviceCidrName","internalLbCidrNames"],"additionalProperties":false}},"required":["networkMode"],"additionalProperties":false}},"required":["zone"],"additionalProperties":false}]},"byok":{"oneOf":[{"type":"object","properties":{"nodePoolProviderIdLabel":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["nodePoolProviderIdLabel"],"additionalProperties":false}]},"coordinates":{"oneOf":[{"type":"object","description":"Geographic coordinates of the cluster, used for CDN geo-routing.","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["latitude","longitude"],"additionalProperties":false}]}},"required":["name","provider","nodePools"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"BYOCRegistry 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":["BYOCRegistry"],"description":"The kind of node.","const":"BYOCRegistry"},"spec":{"type":"object","description":"The specification for the BYOCRegistry node.","properties":{"name":{"description":"The name of the cloud provider registry.","oneOf":[{"type":"string","examples":["Example Registry"],"description":"The name of the cloud provider registry.","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"type":"string","examples":["This is a new cloud provider registry."],"description":"The description of the integration.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},"uid":{"type":"string","examples":["nf-n7xyvdn4"],"description":"Unique id of the registry."},"provider":{"description":"Cloud provider to be used for the selected resource","oneOf":[{"type":"string","examples":["gcp"],"description":"Cloud provider to be used for the selected resource","enum":["aws","azure","civo","gcp","oci","cloudflare","coreweave","aiven","backblaze","akamai","byok"]},{"type":"string","pattern":".*\\${.*}.*"}]},"region":{"oneOf":[{"type":"string","examples":["eu-west-1"]},{"type":"string","pattern":".*\\${.*}.*"}]},"integrationId":{"description":"Integration to use for this registry.","oneOf":[{"type":"string","examples":["gcp-integration"],"description":"Integration to use for this registry.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"restrictions":{"type":"object","description":"BYOC restrictions configuration for controlling team access","properties":{"enabled":{"type":"boolean","description":"Enable or disable BYOC restrictions for this entity"},"teams":{"type":"array","description":"List of teams that have access to this BYOC cluster","default":[],"items":{"type":"object","properties":{"teamId":{"type":"string","description":"The ID of the team that has access to this BYOC cluster","minLength":3,"maxLength":45,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}},"required":["teamId"],"additionalProperties":true}}},"required":["enabled"],"additionalProperties":false},"updatedAt":{"type":"integer","description":"time of update"},"createdAt":{"type":"integer","description":"time of creation"}},"required":["name","provider","region"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"CustomDockerCredentials 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":["CustomDockerCredentials"],"description":"The kind of node.","const":"CustomDockerCredentials"},"spec":{"type":"object","description":"The specification for the CustomDockerCredentials node.","properties":{"name":{"description":"The name of the docker credentials.","oneOf":[{"type":"string","examples":["Example Docker Credentials"],"description":"The name of the docker credentials.","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"provider":{"type":"string","description":"The provider of the docker registry.","enum":["acr","ecr","gar","dockerhub","dhi","github","gitlab","custom","legacy"]},"registryUrl":{"description":"The URL of the docker registry.","oneOf":[{"type":"string","description":"The URL of the docker registry."},{"type":"string","pattern":".*\\${.*}.*"}]},"aws":{"type":"object","properties":{"region":{"type":"string","description":"The region of the docker registry."}},"additionalProperties":false},"gcp":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID of the GCP docker registry."}},"additionalProperties":false},"azure":{"type":"object","properties":{"resourceGroup":{"type":"string","description":"The resource group of the Azure docker registry."}},"additionalProperties":false},"integrationId":{"description":"Integration to use for this registry.","oneOf":[{"type":"string","description":"Integration to use for this registry.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"credentials":{"type":"object","properties":{"username":{"type":"string","description":"Username for the docker registry. Required when `integrationId` is provided."},"password":{"type":"string","description":"Password for the docker registry. Required when `integrationId` is provided."},"scope":{"type":"object","properties":{"pull":{"type":"boolean","description":"Whether the credentials can pull images."},"push":{"type":"boolean","description":"Whether the credentials can push images."}},"additionalProperties":false}},"required":["scope"],"additionalProperties":false},"restrictions":{"type":"object","properties":{"restricted":{"type":"boolean","description":"Whether access to this credential is restricted."},"projects":{"type":"array","description":"List of projects that have access to this credential.","items":{"type":"objectId"}}},"required":["restricted"],"additionalProperties":false},"updatedAt":{"type":"integer","description":"time of update"},"createdAt":{"type":"integer","description":"time of creation"}},"required":["name","provider"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Project 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":["Project"],"description":"The kind of node.","const":"Project"},"spec":{"type":"object","description":"The specification for the Project node.","properties":{"name":{"description":"The name of the project.","oneOf":[{"type":"string","examples":["New Project"],"description":"The name of the project.","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"The description of the project.","oneOf":[{"type":"string","examples":["This is a new project."],"description":"The description of the project.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"color":{"description":"The color of the project in the Northflank App.","oneOf":[{"type":"string","examples":["#EF233C"],"description":"The color of the project in the Northflank App.","pattern":"^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{"type":"string","pattern":".*\\${.*}.*"}]},"region":{"description":"The region the project will be hosted in.","oneOf":[{"type":"string","examples":["europe-west"],"description":"The region the project will be hosted in."},{"type":"string","pattern":".*\\${.*}.*"}]},"clusterId":{"description":"The BYOC cluster this project will be hosted in.","oneOf":[{"type":"string","examples":["gcp-cluster-1"],"description":"The BYOC cluster this project will be hosted in.","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"customRegistry":{"type":"object","description":"Registry configuration for the project. Can be PaaS or Self-Hosted","properties":{"enabled":{"type":"boolean"},"configuration":{"type":"object","properties":{"credentialId":{"oneOf":[{"type":"string","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"provider":{"oneOf":[{"type":"string","enum":["acr","ecr","gar","dockerhub","dhi","github","gitlab","custom","legacy"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["credentialId"],"additionalProperties":false}},"additionalProperties":false},"networking":{"type":"object","description":"Advanced project networking settings.","properties":{"allowedIngressProjects":{"type":"array","description":"Projects from which ingress request should be permitted.","items":{"oneOf":[{"type":"string","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"tailscale":{"type":"object","description":"Defines this project's Tailscale sidecar settings","properties":{"enabled":{"type":"boolean","description":"Whether or not to inject a Tailscale sidecar for this project's resources","default":false},"authKeyTags":{"type":"array","description":"Tailscale tags to apply to generated auth keys, must match with the tags applied when creating the OAuth Client.","default":[],"items":{"oneOf":[{"type":"string","pattern":"^tag:.+"},{"type":"string","pattern":".*\\${.*}.*"}]}},"restrictions":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether or not to restrict the settings to resources with specific tags","default":false},"tags":{"type":"array","description":"The tags which determine the resources the settings should be applied to","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[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":".*\\${.*}.*"}]}},"required":["enabled"],"additionalProperties":false},"options":{"type":"object","properties":{"applyToAddons":{"type":"boolean","description":"Apply the Tailscale configuration to addons.","default":false},"applyToAddonJobs":{"type":"boolean","description":"Apply the Tailscale configuration to addon jobs (backups, restores).","default":false},"autoRedeployOnRegeneration":{"type":"boolean","description":"Automatically restart applicable services when the auth key is regenerated","default":false}},"additionalProperties":false},"tailscaleOptions":{"type":"object","properties":{"acceptRoutes":{"type":"boolean","description":"Accept advertised routes from the Tailscale network","default":false}},"additionalProperties":false},"secrets":{"type":"object","description":"Relevant Tailscale secrets","properties":{"clientId":{"description":"Tailscale OAuth client ID (required for generating auth keys for Tailscale)","oneOf":[{"type":"string","description":"Tailscale OAuth client ID (required for generating auth keys for Tailscale)"},{"type":"string","pattern":".*\\${.*}.*"}]},"clientSecret":{"description":"Tailscale OAuth client secret (required for generating auth keys for Tailscale)","oneOf":[{"type":"string","description":"Tailscale OAuth client secret (required for generating auth keys for Tailscale)"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["clientId","clientSecret"],"additionalProperties":false}},"additionalProperties":false},"hostAliases":{"type":"object","description":"Defines the project host alias overrides to apply to /etc/hosts in resource containers","properties":{"enabled":{"type":"boolean","description":"Enable support for adding /etc/hosts overrides for a container","default":false},"hostEntries":{"type":"array","description":"Entries to add to /etc/hosts","items":{"oneOf":[{"type":"object","properties":{"ipAddress":{"oneOf":[{"type":"string","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])$"},{"type":"string","pattern":".*\\${.*}.*"}]},"hostnames":{"oneOf":[{"type":"array","items":{"oneOf":[{"type":"string","pattern":"^(([a-z0-9][a-z0-9\\-]*)|[a-z0-9]\\.)*([a-z]+|xn\\-\\-[a-z0-9]+)\\.?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["ipAddress","hostnames"],"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"restrictions":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether or not to restrict the settings to resources with specific tags","default":false},"tags":{"type":"array","description":"The tags which determine the resources the settings should be applied to","items":{"oneOf":[{"type":"string","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[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":".*\\${.*}.*"}]}},"required":["enabled"],"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false}},"required":["name"],"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":"SSHIdentity 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":["SSHIdentity"],"description":"The kind of node.","const":"SSHIdentity"},"spec":{"type":"object","description":"The specification for the SSHIdentity node.","properties":{"name":{"oneOf":[{"type":"string","examples":["Example SSH Identity"],"minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"oneOf":[{"type":"string","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"sshPublicKeys":{"type":"array","examples":[[{"key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ..."}]],"description":"A list of SSH public keys.","minItems":1,"items":{"type":"object","properties":{"key":{"description":"The SSH public key.","oneOf":[{"type":"string","examples":["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ..."],"description":"The SSH public key."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["key"],"additionalProperties":false}},"restrictions":{"type":"object","description":"Configuration of restrictions.","properties":{"projects":{"type":"object","description":"Configuration of project restriction settings.","properties":{"enabled":{"type":"boolean","examples":[false],"description":"Whether restriction by project should be enabled."},"items":{"type":"array","description":"An array of previously defined projects.","default":[],"items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}}},"additionalProperties":false},"tags":{"type":"object","description":"Configuration of tag restriction settings.","properties":{"enabled":{"type":"boolean","examples":[false],"description":"Whether restriction by tag should be enabled."},"items":{"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":".*\\${.*}.*"}]}},"matchCondition":{"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}},"additionalProperties":false},"updatedAt":{"type":"integer","description":"time of update"},"createdAt":{"type":"integer","description":"time of creation"}},"required":["name"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"WorkloadIdentity 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":["WorkloadIdentity"],"description":"The kind of node.","const":"WorkloadIdentity"},"spec":{"type":"object","description":"The specification for the WorkloadIdentity node.","properties":{"name":{"oneOf":[{"type":"string","examples":["Example Workload Identity"],"minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"oneOf":[{"type":"string","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"spec":{"type":"object","properties":{"providerLinkInternalId":{"description":"The internal ID of the BYOC provider integration to use.","oneOf":[{"type":"string","description":"The internal ID of the BYOC provider integration to use.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"roleMode":{"type":"string","enum":["managed","existing"]},"providerSetupMode":{"type":"string","enum":["auto","manual"]},"provider":{"oneOf":[{"$ref":"#/$defs/awsWorkloadProvider"},{"$ref":"#/$defs/awsExistingRoleProvider"},{"$ref":"#/$defs/gcpWorkloadProvider"},{"$ref":"#/$defs/gcpExistingRoleProvider"}]},"restrictions":{"type":"object","description":"Configuration of restrictions.","properties":{"projects":{"type":"object","description":"Configuration of project restriction settings.","properties":{"enabled":{"type":"boolean","examples":[false],"description":"Whether restriction by project should be enabled."},"items":{"type":"array","description":"An array of previously defined projects.","default":[],"items":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}}},"additionalProperties":false},"tags":{"type":"object","description":"Configuration of tag restriction settings.","properties":{"enabled":{"type":"boolean","examples":[false],"description":"Whether restriction by tag should be enabled."},"items":{"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":".*\\${.*}.*"}]}},"matchCondition":{"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}},"additionalProperties":false}},"required":["providerLinkInternalId","roleMode"],"additionalProperties":false},"updatedAt":{"type":"integer","description":"time of update"},"createdAt":{"type":"integer","description":"time of creation"}},"required":["name","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":"Pipeline 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":["Pipeline"],"description":"The kind of node.","const":"Pipeline"},"spec":{"type":"object","description":"The specification for the Pipeline node.","properties":{"name":{"description":"The name of the pipeline.","oneOf":[{"type":"string","examples":["example-pipeline"],"description":"The name of the pipeline.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"description":"A description of the pipeline.","oneOf":[{"type":"string","description":"A description of the pipeline.","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":".*\\${.*}.*"}]},"preview":{"type":"object","properties":{"kind":{"type":["array","boolean","number","object","string","null"],"const":"PreviewEnv"},"spec":{"type":"object","properties":{"apiVersion":{"type":"string","examples":["v1.2"],"description":"The version of the Northflank API to run the template against.","const":"v1.2"},"options":{"type":"object","description":"Options regarding how the template is run.","properties":{"concurrencyPolicy":{"type":"string","examples":["allow"],"description":"Defines the concurrency behaviour of the template with respect to parallel runs.","enum":["allow","queue","forbid","latest","replace"]},"nameFormat":{"type":"string","description":"The format of the automatically generated preview name. This is a parsed ref string."},"prefixName":{"type":"boolean","description":"If true, the preview name will default to the front of the resource name."},"useBranchContents":{"type":"boolean","description":"If true, and gitops is enabled, the preview will run based on the contents of the branch that triggered it, rather than the set branch."},"schedule":{"type":"object","description":"Options regarding which hours preview environments should be active. Only available for BYOC projects.","properties":{"mon":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"tue":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"wed":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"thu":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"fri":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"sat":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"sun":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false}},"additionalProperties":false},"expiry":{"type":"object","description":"Settings regarding the automatic deletion of previews.","properties":{"previewLifetime":{"type":"integer","description":"If set, preview environments will be automatically deleted after this many minutes since their last update.","minimum":1},"resetOnUpdate":{"type":"boolean","description":"If `true`, the expiry time for an existing preview will be reset when it is ran again."}},"additionalProperties":false}},"additionalProperties":false},"arguments":{"type":"object","description":"A set of arguments that can be referenced in a template using '${args.argumentName}'.","properties":{},"additionalProperties":true},"gitops":{"type":"object","properties":{"vcsService":{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},"selfHostedVcsId":{"oneOf":[{"type":"string","pattern":"^([A-Za-z0-9-]+)|([0-9a-f]{24})$"}]},"accountLogin":{"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."},"vcsLinkId":{"type":"objectId","description":"Legacy key. Please used accountLogin instead."},"repoUrl":{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo to sync the file with.","pattern":"^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"},"branch":{"type":"string","examples":["main"],"description":"The name of the branch to use."},"filePath":{"type":"string","examples":["/Dockerfile","northflank.json"],"description":"The file path in the repository. If using an existing file, it should be in JSON format.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"}},"required":["vcsService","repoUrl","branch","filePath"],"additionalProperties":false},"$schema":{"type":"string"},"spec":{"$ref":"#/$defs/V1PreviewEnvTemplateNodeSchema"},"triggers":{"type":"array","items":{"type":"object","properties":{"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"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":".*\\${.*}.*"}]}]},"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","examples":["000000000000000000000000"],"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo that will trigger the template.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo that will trigger the template.","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":".*\\${.*}.*"}]},"branchRestrictions":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"prRestrictions":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"pathIgnoreRules":{"type":"array","description":"An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.","default":[],"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":".*\\${.*}.*"}]}},"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]\"]`","default":[],"maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}},"ciIgnoreFlagsEnabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"isAllowList":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"ignoreDrafts":{"description":"If `true`, draft pull requests from this repo will not trigger the template.","oneOf":[{"type":"boolean","description":"If `true`, draft pull requests from this repo will not trigger the template.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl"],"additionalProperties":false}}},"required":["apiVersion"],"additionalProperties":false}},"required":["kind"],"additionalProperties":false},"stages":{"type":"array","default":[],"items":{"type":"object","properties":{"name":{"type":"string","examples":["Production"],"description":"The stage in the pipeline to include the resource.","enum":["Development","Staging","Production"]},"releaseFlow":{"type":"object","properties":{"kind":{"type":["array","boolean","number","object","string","null"],"const":"ReleaseFlow"},"spec":{"type":"object","properties":{"apiVersion":{"type":"string","examples":["v1.2"],"description":"The version of the Northflank API to run the template against.","const":"v1.2"},"arguments":{"type":"object","description":"A set of arguments that can be referenced in a template using '${args.argumentName}'.","properties":{},"additionalProperties":true},"options":{"type":"object","description":"Options regarding how the template is run.","properties":{"concurrencyPolicy":{"type":"string","examples":["allow"],"description":"Defines the concurrency behaviour of the template with respect to parallel runs.","enum":["allow","queue","forbid","latest","replace"]},"paused":{"type":"boolean","examples":[false],"description":"If `true`, the template will not run when triggered by git."}},"additionalProperties":false},"gitops":{"type":"object","properties":{"vcsService":{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},"selfHostedVcsId":{"oneOf":[{"type":"string","pattern":"^([A-Za-z0-9-]+)|([0-9a-f]{24})$"}]},"accountLogin":{"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."},"vcsLinkId":{"type":"objectId","description":"Legacy key. Please used accountLogin instead."},"repoUrl":{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo to sync the file with.","pattern":"^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"},"branch":{"type":"string","examples":["main"],"description":"The name of the branch to use."},"filePath":{"type":"string","examples":["/Dockerfile","northflank.json"],"description":"The file path in the repository. If using an existing file, it should be in JSON format.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"}},"required":["vcsService","repoUrl","branch","filePath"],"additionalProperties":false},"$schema":{"type":"string"},"spec":{"$ref":"#/$defs/V1ReleaseFlowTemplateNodeSchema"},"richInputs":{"type":"array","description":"An array of rich UI override inputs for the Release Flow template.","items":{"type":"object","properties":{"kind":{"type":"string","enum":["BranchCommitSelector","BuildSelector"]},"spec":{"oneOf":[{"type":"object","properties":{"title":{"type":"string","description":"The title displayed for the input."},"description":{"type":"string","description":"The description displayed for the input.","default":""},"required":{"type":"boolean","examples":[false],"description":"If true, an error will be displayed if this input is not provided a value."},"inputs":{"type":"object","description":"Inputs for the rich input node","properties":{"source":{"type":"string","examples":["build-service"],"description":"The ID of the build service to use for this input."}},"required":["source"],"additionalProperties":false},"outputs":{"type":"object","description":"Outputs for the rich input node. The value of each field corresponds to the argument name to be passed to the template.","properties":{"branch":{"type":"string","examples":["TARGET_BRANCH"]},"buildSha":{"type":"string","examples":["TARGET_COMMIT"]}},"additionalProperties":false}},"required":["title","inputs","outputs"],"additionalProperties":false},{"type":"object","properties":{"title":{"type":"string","description":"The title displayed for the input."},"description":{"type":"string","description":"The description displayed for the input.","default":""},"required":{"type":"boolean","examples":[false],"description":"If true, an error will be displayed if this input is not provided a value."},"inputs":{"type":"object","description":"Inputs for the rich input node","properties":{"source":{"type":"string","examples":["build-service"],"description":"The ID of the build service to use for this input."}},"required":["source"],"additionalProperties":false},"outputs":{"type":"object","description":"Outputs for the rich input node. The value of each field corresponds to the argument name to be passed to the template.","properties":{"branch":{"type":"string","examples":["TARGET_BRANCH"]},"buildId":{"type":"string","examples":["TARGET_BUILD"]},"buildSha":{"type":"string","examples":["TARGET_COMMIT"]}},"additionalProperties":false}},"required":["title","inputs","outputs"],"additionalProperties":false}]}},"required":["kind"],"additionalProperties":false}},"triggers":{"type":"array","items":{"type":"object","properties":{"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"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":".*\\${.*}.*"}]}]},"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","examples":["000000000000000000000000"],"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo that will trigger the template.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo that will trigger the template.","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":".*\\${.*}.*"}]},"branchRestrictions":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"prRestrictions":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"pathIgnoreRules":{"type":"array","description":"An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.","default":[],"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":".*\\${.*}.*"}]}},"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]\"]`","default":[],"maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}},"ciIgnoreFlagsEnabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"isAllowList":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"ignoreDrafts":{"description":"If `true`, draft pull requests from this repo will not trigger the template.","oneOf":[{"type":"boolean","description":"If `true`, draft pull requests from this repo will not trigger the template.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl"],"additionalProperties":false}}},"required":["apiVersion"],"additionalProperties":false}},"required":["kind"],"additionalProperties":false},"nfObjects":{"type":"array","items":{"type":"object","properties":{"id":{"description":"The ID of the service, job or addon to include in the pipeline.","oneOf":[{"type":"string","examples":["example-service"],"description":"The ID of the service, job or addon to include in the pipeline.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"type":"string","examples":["service"],"description":"The type of the resource to include in the pipeline.","enum":["service","job","addon"]}},"required":["id","type"],"additionalProperties":false}}},"required":["name"],"additionalProperties":false}}},"required":["name"],"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/V1TemplateLoopWorkflowSchema"},"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":"Template 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":["Template"],"description":"The kind of node.","const":"Template"},"spec":{"description":"The specification for the Template node.","oneOf":[{"type":"object","description":"ResourceTemplate template","properties":{"kind":{"type":"string","examples":["ResourceTemplate"],"description":"The kind of template.","const":"ResourceTemplate"},"spec":{"type":"object","properties":{},"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"ReleaseFlow template","properties":{"kind":{"type":"string","examples":["ReleaseFlow"],"description":"The kind of template.","const":"ReleaseFlow"},"spec":{"type":"object","properties":{},"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"PreviewEnv template","properties":{"kind":{"type":"string","examples":["PreviewEnv"],"description":"The kind of template.","const":"PreviewEnv"},"spec":{"type":"object","properties":{},"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":"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":"EgressIp 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":["EgressIp"],"description":"The kind of node.","const":"EgressIp"},"spec":{"type":"object","description":"The specification for the EgressIp node.","properties":{"name":{"description":"The name of the egress IP.","oneOf":[{"type":"string","examples":["my-egress-ip"],"description":"The name of the egress IP.","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"type":"string","examples":["This is a new egress IP."],"description":"The description of the egress IP.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},"spec":{"type":"object","description":"Egress IP specification","properties":{"provisioningMode":{"description":"Provisioning mode for the egress IP: shared (uses pre-provisioned infrastructure) or dedicated","oneOf":[{"type":"string","examples":["shared"],"description":"Provisioning mode for the egress IP: shared (uses pre-provisioned infrastructure) or dedicated","enum":["shared","dedicated"]},{"type":"string","pattern":".*\\${.*}.*"}]},"region":{"description":"Target region name","oneOf":[{"type":"string","examples":["europe-west"],"description":"Target region name","pattern":"^[A-Za-z0-9]+(-[A-Za-z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"mode":{"description":"Mode: include (only these projects/resources use this egress IP) or exclude (all except these use this egress IP)","oneOf":[{"type":"string","examples":["include"],"description":"Mode: include (only these projects/resources use this egress IP) or exclude (all except these use this egress IP)","default":"include","enum":["include","exclude"]},{"type":"string","pattern":".*\\${.*}.*"}]},"rules":{"description":"Egress IP rules - array of projects the rule applies to","oneOf":[{"type":"array","description":"Egress IP rules - array of projects the rule applies to","default":[],"items":{"type":"object","description":"Egress IP rule","properties":{"id":{"description":"Project internal ID","oneOf":[{"type":"string","description":"Project internal ID"},{"type":"string","pattern":".*\\${.*}.*"}]},"restrictions":{"type":"object","description":"Rule restrictions","properties":{"enabled":{"type":"boolean","description":"Whether restrictions scoping the rule to specific resources should be applied."},"resources":{"type":"array","description":"Resources the rule should be restricted to ","items":{"type":"object","properties":{"type":{"description":"Resource type","oneOf":[{"type":"string","description":"Resource type","enum":["service","job"]},{"type":"string","pattern":".*\\${.*}.*"}]},"id":{"description":"Resource internal ID","oneOf":[{"type":"string","description":"Resource internal ID"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["type","id"],"additionalProperties":false}}},"required":["enabled"],"additionalProperties":false}},"required":["id","restrictions"],"additionalProperties":false}},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["provisioningMode","region"],"additionalProperties":false}},"required":["name","spec"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"LoadBalancer 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":["LoadBalancer"],"description":"The kind of node.","const":"LoadBalancer"},"spec":{"type":"object","description":"The specification for the LoadBalancer node.","properties":{"name":{"description":"The name of the load balancer.","oneOf":[{"type":"string","examples":["my-load-balancer"],"description":"The name of the load balancer.","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"type":"string","examples":["This is a new load balancer."],"description":"The description of the load balancer.","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},"spec":{"type":"object","description":"Load balancer specification","properties":{"type":{"description":"Protocol type for the load balancer","oneOf":[{"type":"string","examples":["tcp"],"description":"Protocol type for the load balancer","enum":["tcp","udp"]},{"type":"string","pattern":".*\\${.*}.*"}]},"target":{"type":"object","properties":{"type":{"description":"Target type for the load balancer","oneOf":[{"type":"string","examples":["region"],"description":"Target type for the load balancer","enum":["region","cluster"]},{"type":"string","pattern":".*\\${.*}.*"}]},"targetId":{"description":"Id of the loadbalancer target","oneOf":[{"description":"Id of the loadbalancer target","oneOf":[{"type":"string","examples":["europe-west"],"description":"Target region name","pattern":"^[A-Za-z0-9]+(-[A-Za-z0-9]+)*$"},{"type":"string","examples":["my-cluster"],"description":"Target cluster internal ID","pattern":"^((org|team)\\/)?[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"}]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["type"],"additionalProperties":false},"ports":{"type":"array","description":"Port configurations for the load balancer","minItems":1,"items":{"type":"object","properties":{"id":{"description":"Unique port identifier","oneOf":[{"type":"string","examples":["port-80"],"description":"Unique port identifier","pattern":"^port-\\d+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"port":{"description":"Port number or range (single port, multiple comma-separated, or range with dash)","oneOf":[{"type":"string","examples":["80","80,443,8000-9000"],"description":"Port number or range (single port, multiple comma-separated, or range with dash)"},{"type":"string","pattern":".*\\${.*}.*"}]},"backends":{"type":"array","description":"Backend services or addons for this port","minItems":1,"items":{"type":"object","properties":{"id":{"description":"Backend reference in format {projectId}/{nfObjectId}","oneOf":[{"type":"string","examples":["my-project/my-service"],"description":"Backend reference in format {projectId}/{nfObjectId}","pattern":"^[a-zA-Z0-9-]+\\/[a-zA-Z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"Backend type (service or addon)","oneOf":[{"type":"string","examples":["service"],"description":"Backend type (service or addon)","enum":["service","addon"]},{"type":"string","pattern":".*\\${.*}.*"}]},"port":{"description":"Backend port number","oneOf":[{"type":"integer","examples":[3000],"description":"Backend port number","minimum":1,"maximum":65535},{"type":"string","pattern":".*\\${.*}.*"}]},"weight":{"description":"Traffic weight for this backend","oneOf":[{"type":"integer","examples":[1],"description":"Traffic weight for this backend","default":1,"minimum":1,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["id","type","port"],"additionalProperties":false}}},"required":["id","port","backends"],"additionalProperties":false}}},"required":["type","target","ports"],"additionalProperties":false}},"required":["name","spec"],"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":"WorkflowTemplate 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":["WorkflowTemplate"],"description":"The kind of node.","const":"WorkflowTemplate"},"spec":{"type":"object","description":"The specification for the WorkflowTemplate node.","properties":{"apiVersion":{"type":"string","examples":["v1.2"],"description":"The version of the Northflank API to run the template against.","const":"v1.2"},"arguments":{"type":"object","description":"A set of arguments that can be referenced in a template using '${args.argumentName}'.","properties":{},"additionalProperties":true},"gitops":{"type":"object","properties":{"vcsService":{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},"selfHostedVcsId":{"oneOf":[{"type":"string","pattern":"^([A-Za-z0-9-]+)|([0-9a-f]{24})$"}]},"accountLogin":{"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."},"vcsLinkId":{"type":"objectId","description":"Legacy key. Please used accountLogin instead."},"repoUrl":{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo to sync the file with.","pattern":"^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"},"branch":{"type":"string","examples":["main"],"description":"The name of the branch to use."},"filePath":{"type":"string","examples":["/Dockerfile","northflank.json"],"description":"The file path in the repository. If using an existing file, it should be in JSON format.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"}},"required":["vcsService","repoUrl","branch","filePath"],"additionalProperties":false},"$schema":{"type":"string"},"name":{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*$"},"description":{"type":"string","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},"spec":{"$ref":"#/$defs/V1ReleaseFlowTemplateNodeSchema"},"richInputs":{"type":"array","description":"An array of rich UI override inputs for the workflow.","items":{"type":"object","properties":{"kind":{"type":"string","enum":["BranchCommitSelector","BuildSelector"]},"spec":{"oneOf":[{"type":"object","properties":{"title":{"type":"string","description":"The title displayed for the input."},"description":{"type":"string","description":"The description displayed for the input.","default":""},"required":{"type":"boolean","examples":[false],"description":"If true, an error will be displayed if this input is not provided a value."},"inputs":{"type":"object","description":"Inputs for the rich input node","properties":{"source":{"type":"string","examples":["build-service"],"description":"The ID of the build service to use for this input."}},"required":["source"],"additionalProperties":false},"outputs":{"type":"object","description":"Outputs for the rich input node. The value of each field corresponds to the argument name to be passed to the template.","properties":{"branch":{"type":"string","examples":["TARGET_BRANCH"]},"buildSha":{"type":"string","examples":["TARGET_COMMIT"]}},"additionalProperties":false}},"required":["title","inputs","outputs"],"additionalProperties":false},{"type":"object","properties":{"title":{"type":"string","description":"The title displayed for the input."},"description":{"type":"string","description":"The description displayed for the input.","default":""},"required":{"type":"boolean","examples":[false],"description":"If true, an error will be displayed if this input is not provided a value."},"inputs":{"type":"object","description":"Inputs for the rich input node","properties":{"source":{"type":"string","examples":["build-service"],"description":"The ID of the build service to use for this input."}},"required":["source"],"additionalProperties":false},"outputs":{"type":"object","description":"Outputs for the rich input node. The value of each field corresponds to the argument name to be passed to the template.","properties":{"branch":{"type":"string","examples":["TARGET_BRANCH"]},"buildId":{"type":"string","examples":["TARGET_BUILD"]},"buildSha":{"type":"string","examples":["TARGET_COMMIT"]}},"additionalProperties":false}},"required":["title","inputs","outputs"],"additionalProperties":false}]}},"required":["kind"],"additionalProperties":false}},"triggers":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"vcs-push"},"spec":{"type":"object","properties":{"vcs":{"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":".*\\${.*}.*"}]}]},"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","examples":["000000000000000000000000"],"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo that will trigger the template.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo that will trigger the template.","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":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl"],"additionalProperties":true},"branchNamePatterns":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"commitMessageFlags":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"flags":{"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]\"]`","default":[],"maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}}},"additionalProperties":false},"filePaths":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"allowList":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"paths":{"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.","default":[],"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":".*\\${.*}.*"}]}}},"additionalProperties":false}},"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"vcs-pr"},"spec":{"type":"object","properties":{"vcs":{"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":".*\\${.*}.*"}]}]},"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","examples":["000000000000000000000000"],"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo that will trigger the template.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo that will trigger the template.","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":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl"],"additionalProperties":true},"branchNamePatterns":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"commitMessageFlags":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"flags":{"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]\"]`","default":[],"maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}}},"additionalProperties":false},"filePaths":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"allowList":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"paths":{"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.","default":[],"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":".*\\${.*}.*"}]}}},"additionalProperties":false},"ignoreDrafts":{"description":"If `true`, draft pull requests from this repo will not trigger the template.","oneOf":[{"type":"boolean","description":"If `true`, draft pull requests from this repo will not trigger the template.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"webhook"},"spec":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"],"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"vcs-release"},"spec":{"type":"object","properties":{"vcs":{"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":".*\\${.*}.*"}]}]},"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","examples":["000000000000000000000000"],"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo that will trigger the template.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo that will trigger the template.","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":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl"],"additionalProperties":true}},"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"vcs-pr-label"},"spec":{"type":"object","properties":{"vcs":{"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":".*\\${.*}.*"}]}]},"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","examples":["000000000000000000000000"],"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo that will trigger the template.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo that will trigger the template.","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":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl"],"additionalProperties":true},"labelNamePatterns":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"branchNamePatterns":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"names":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}}},"additionalProperties":false},"commitMessageFlags":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"flags":{"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]\"]`","default":[],"maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}}},"additionalProperties":false},"filePaths":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"allowList":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"paths":{"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.","default":[],"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":".*\\${.*}.*"}]}}},"additionalProperties":false},"ignoreDrafts":{"description":"If `true`, draft pull requests from this repo will not trigger the template.","oneOf":[{"type":"boolean","description":"If `true`, draft pull requests from this repo will not trigger the template.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"cron"},"spec":{"type":"object","properties":{"cron":{"type":"string","examples":["0 * * * *"],"description":"A cron expression that defines the schedule on which the template will be executed."}},"required":["cron"],"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false}]}},"options":{"type":"object","description":"Options regarding how the template is run.","properties":{"autorun":{"type":"boolean","examples":[false],"description":"If true, the template will run automatically whenever a change is made to it."},"concurrencyPolicy":{"type":"string","examples":["allow"],"description":"Defines the concurrency behaviour of the template with respect to parallel runs.","enum":["allow","queue","forbid","latest","replace"]}},"additionalProperties":false},"teardownSpec":{"type":"object","description":"Optional spec to run when the workflow is deleted.","properties":{"spec":{"type":["array","boolean","number","object","string","null"],"description":"The root node of the teardown workflow."},"failurePolicy":{"type":"string","description":"Controls what happens if the teardown spec fails or times out. `ignore` (default) — proceed with resource deletion regardless. `block` — halt deletion and set the environment to `teardown_failed`","default":"ignore","enum":["ignore","block"]}},"required":["spec"],"additionalProperties":false},"argumentOverrides":{"type":"object","description":"A set of arguments that can be referenced in a template using '${args.argumentName}'.","properties":{},"additionalProperties":true},"crossProjectAccess":{"type":"object","description":"Controls which projects can run this workflow.","properties":{"enabled":{"type":"boolean","description":"Allow this workflow to be run from other projects."},"projects":{"type":"array","description":"A list of project IDs used as an allow list or deny list.","items":{"type":"string","examples":["example-project"],"pattern":"^[A-Za-z0-9-]+$"}},"isAllowList":{"type":"boolean","description":"If true, only the listed projects can run this workflow. If false, all projects except the listed ones can run this workflow."}},"required":["enabled","projects","isAllowList"],"additionalProperties":false},"stageId":{"description":"ID of the stage","oneOf":[{"type":["string","null"],"description":"ID of the stage","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"projectId":{"description":"ID of parent project","oneOf":[{"type":"objectId","description":"ID of parent project"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["apiVersion","name"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"PreviewBlueprint 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":["PreviewBlueprint"],"description":"The kind of node.","const":"PreviewBlueprint"},"spec":{"type":"object","description":"The specification for the PreviewBlueprint node.","properties":{"apiVersion":{"type":"string","examples":["v1.2"],"description":"The version of the Northflank API to run the template against.","const":"v1.2"},"arguments":{"type":"object","description":"A set of arguments that can be referenced in a template using '${args.argumentName}'.","properties":{},"additionalProperties":true},"gitops":{"type":"object","properties":{"vcsService":{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},"selfHostedVcsId":{"oneOf":[{"type":"string","pattern":"^([A-Za-z0-9-]+)|([0-9a-f]{24})$"}]},"accountLogin":{"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."},"vcsLinkId":{"type":"objectId","description":"Legacy key. Please used accountLogin instead."},"repoUrl":{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo to sync the file with.","pattern":"^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"},"branch":{"type":"string","examples":["main"],"description":"The name of the branch to use."},"filePath":{"type":"string","examples":["/Dockerfile","northflank.json"],"description":"The file path in the repository. If using an existing file, it should be in JSON format.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"}},"required":["vcsService","repoUrl","branch","filePath"],"additionalProperties":false},"$schema":{"type":"string"},"name":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"oneOf":[{"type":"string","default":"","maxLength":200,"pattern":"^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"spec":{"$ref":"#/$defs/V1PreviewEnvTemplateNodeSchema"},"triggers":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"vcs-push"},"spec":{"type":"object","properties":{"vcs":{"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":".*\\${.*}.*"}]}]},"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","examples":["000000000000000000000000"],"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo that will trigger the template.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo that will trigger the template.","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":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl"],"additionalProperties":true},"branchNamePatterns":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"commitMessageFlags":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"flags":{"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]\"]`","default":[],"maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}}},"additionalProperties":false},"filePaths":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"allowList":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"paths":{"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.","default":[],"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":".*\\${.*}.*"}]}}},"additionalProperties":false}},"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"vcs-pr"},"spec":{"type":"object","properties":{"vcs":{"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":".*\\${.*}.*"}]}]},"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","examples":["000000000000000000000000"],"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo that will trigger the template.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo that will trigger the template.","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":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl"],"additionalProperties":true},"branchNamePatterns":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"commitMessageFlags":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"flags":{"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]\"]`","default":[],"maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}}},"additionalProperties":false},"filePaths":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"allowList":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"paths":{"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.","default":[],"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":".*\\${.*}.*"}]}}},"additionalProperties":false},"ignoreDrafts":{"description":"If `true`, draft pull requests from this repo will not trigger the template.","oneOf":[{"type":"boolean","description":"If `true`, draft pull requests from this repo will not trigger the template.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"webhook"},"spec":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"],"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"vcs-release"},"spec":{"type":"object","properties":{"vcs":{"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":".*\\${.*}.*"}]}]},"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","examples":["000000000000000000000000"],"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo that will trigger the template.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo that will trigger the template.","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":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl"],"additionalProperties":true}},"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"vcs-pr-label"},"spec":{"type":"object","properties":{"vcs":{"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":".*\\${.*}.*"}]}]},"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","examples":["000000000000000000000000"],"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo that will trigger the template.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo that will trigger the template.","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":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl"],"additionalProperties":true},"labelNamePatterns":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"branchNamePatterns":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"names":{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[a-zA-Z/*0-9%\\-.#_!'();,&=+]*$"},{"type":"string","pattern":".*\\${.*}.*"}]}}},"additionalProperties":false},"commitMessageFlags":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"flags":{"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]\"]`","default":[],"maxItems":200,"items":{"description":"A commit ignore flag.","oneOf":[{"type":"string","examples":["[skip ci]"],"description":"A commit ignore flag.","maxLength":72},{"type":"string","pattern":".*\\${.*}.*"}]}}},"additionalProperties":false},"filePaths":{"type":"object","properties":{"enabled":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"allowList":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"paths":{"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.","default":[],"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":".*\\${.*}.*"}]}}},"additionalProperties":false},"ignoreDrafts":{"description":"If `true`, draft pull requests from this repo will not trigger the template.","oneOf":[{"type":"boolean","description":"If `true`, draft pull requests from this repo will not trigger the template.","default":false},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"cron"},"spec":{"type":"object","properties":{"cron":{"type":"string","examples":["0 * * * *"],"description":"A cron expression that defines the schedule on which the template will be executed."}},"required":["cron"],"additionalProperties":false},"ref":{"type":"string","description":"A reference that can be used to access the output of this trigger in the template."},"id":{"type":"string"}},"required":["kind","spec"],"additionalProperties":false}]}},"options":{"type":"object","description":"Options regarding how the template is run.","properties":{"concurrencyPolicy":{"type":"string","examples":["allow","allow"],"description":"Defines the concurrency behaviour of the template with respect to parallel runs.","enum":["allow","queue","forbid","latest","replace"]},"nameFormat":{"type":"string","description":"The format of the automatically generated preview name. This is a parsed ref string."},"prefixName":{"type":"boolean","description":"If true, the preview name will default to the front of the resource name."},"useBranchContents":{"type":"boolean","description":"If true, and gitops is enabled, the preview will run based on the contents of the branch that triggered it, rather than the set branch."},"schedule":{"type":"object","description":"Options regarding which hours preview environments should be active. Only available for BYOC projects.","properties":{"mon":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"tue":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"wed":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"thu":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"fri":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"sat":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false},"sun":{"type":"object","properties":{"startTime":{"type":"integer","minimum":0,"maximum":2400},"endTime":{"type":"integer","minimum":0,"maximum":2400}},"additionalProperties":false}},"additionalProperties":false},"expiry":{"type":"object","description":"Settings regarding the automatic deletion of previews.","properties":{"previewLifetime":{"type":"integer","description":"If set, preview environments will be automatically deleted after this many minutes since their last update.","minimum":1},"resetOnUpdate":{"type":"boolean","description":"If `true`, the expiry time for an existing preview will be reset when it is ran again."}},"additionalProperties":false},"autorun":{"type":"boolean","examples":[false],"description":"If true, the template will run automatically whenever a change is made to it."}},"additionalProperties":false},"argumentOverrides":{"type":"object","description":"A set of arguments that can be referenced in a template using '${args.argumentName}'.","properties":{},"additionalProperties":true},"teardownSpec":{"type":"object","description":"Optional spec to run when the template is deleted.","properties":{"spec":{"type":["array","boolean","number","object","string","null"],"description":"The root node of the teardown workflow."},"failurePolicy":{"type":"string","description":"Controls what happens if the teardown spec fails or times out. `ignore` (default) — proceed with resource deletion regardless. `block` — halt deletion and set the environment to `teardown_failed`","default":"ignore","enum":["ignore","block"]}},"required":["spec"],"additionalProperties":false},"projectId":{"description":"ID of parent project","oneOf":[{"type":"objectId","description":"ID of parent project"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["apiVersion","name"],"additionalProperties":false},"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},{"type":"object","description":"ReleaseStage 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":["ReleaseStage"],"description":"The kind of node.","const":"ReleaseStage"},"spec":{"type":"object","description":"The specification for the ReleaseStage node.","properties":{"name":{"oneOf":[{"type":"string","minLength":3,"maxLength":20,"pattern":"^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"position":{"type":"integer","minimum":0},"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","position"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false}]}}}