From 923a4507814c508c271e465ffbafea9ef6b16509 Mon Sep 17 00:00:00 2001 From: Jason Lynch Date: Thu, 16 Jan 2025 17:07:02 -0500 Subject: [PATCH 1/4] feat(api): serve openapi3 spec This is a small change to serve the OpenAPI 3 specification instead of the OpenAPI 2 version. This change will support some automated API tooling, like restish. --- api/design/api.go | 2 +- api/gen/http/control_plane/server/server.go | 60 +++++++++++---------- api/gen/http/openapi.json | 2 +- api/gen/http/openapi.yaml | 2 +- api/gen/http/openapi3.json | 2 +- api/gen/http/openapi3.yaml | 2 +- api/go.mod | 7 ++- api/go.sum | 23 ++++++-- api/openapi.go | 6 +++ 9 files changed, 65 insertions(+), 41 deletions(-) create mode 100644 api/openapi.go diff --git a/api/design/api.go b/api/design/api.go index 9ccd6c32..3ed03737 100644 --- a/api/design/api.go +++ b/api/design/api.go @@ -126,5 +126,5 @@ var _ = g.Service("control-plane", func() { }) // Serves the OpenAPI spec as a static file - g.Files("/openapi.json", "./gen/http/openapi.json") + g.Files("/openapi.json", "./gen/http/openapi3.json") }) diff --git a/api/gen/http/control_plane/server/server.go b/api/gen/http/control_plane/server/server.go index f0a4992c..8a7442ff 100644 --- a/api/gen/http/control_plane/server/server.go +++ b/api/gen/http/control_plane/server/server.go @@ -19,17 +19,17 @@ import ( // Server lists the control-plane service endpoint HTTP handlers. type Server struct { - Mounts []*MountPoint - InspectCluster http.Handler - ListHosts http.Handler - InspectHost http.Handler - RemoveHost http.Handler - ListDatabases http.Handler - CreateDatabase http.Handler - InspectDatabase http.Handler - UpdateDatabase http.Handler - DeleteDatabase http.Handler - GenHTTPOpenapiJSON http.Handler + Mounts []*MountPoint + InspectCluster http.Handler + ListHosts http.Handler + InspectHost http.Handler + RemoveHost http.Handler + ListDatabases http.Handler + CreateDatabase http.Handler + InspectDatabase http.Handler + UpdateDatabase http.Handler + DeleteDatabase http.Handler + GenHTTPOpenapi3JSON http.Handler } // MountPoint holds information about the mounted endpoints. @@ -56,12 +56,12 @@ func New( encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, errhandler func(context.Context, http.ResponseWriter, error), formatter func(ctx context.Context, err error) goahttp.Statuser, - fileSystemGenHTTPOpenapiJSON http.FileSystem, + fileSystemGenHTTPOpenapi3JSON http.FileSystem, ) *Server { - if fileSystemGenHTTPOpenapiJSON == nil { - fileSystemGenHTTPOpenapiJSON = http.Dir(".") + if fileSystemGenHTTPOpenapi3JSON == nil { + fileSystemGenHTTPOpenapi3JSON = http.Dir(".") } - fileSystemGenHTTPOpenapiJSON = appendPrefix(fileSystemGenHTTPOpenapiJSON, "/gen/http") + fileSystemGenHTTPOpenapi3JSON = appendPrefix(fileSystemGenHTTPOpenapi3JSON, "/gen/http") return &Server{ Mounts: []*MountPoint{ {"InspectCluster", "GET", "/cluster"}, @@ -73,18 +73,18 @@ func New( {"InspectDatabase", "GET", "/databases/{database_id}"}, {"UpdateDatabase", "POST", "/databases/{database_id}"}, {"DeleteDatabase", "DELETE", "/databases/{database_id}"}, - {"Serve ./gen/http/openapi.json", "GET", "/openapi.json"}, + {"Serve ./gen/http/openapi3.json", "GET", "/openapi.json"}, }, - InspectCluster: NewInspectClusterHandler(e.InspectCluster, mux, decoder, encoder, errhandler, formatter), - ListHosts: NewListHostsHandler(e.ListHosts, mux, decoder, encoder, errhandler, formatter), - InspectHost: NewInspectHostHandler(e.InspectHost, mux, decoder, encoder, errhandler, formatter), - RemoveHost: NewRemoveHostHandler(e.RemoveHost, mux, decoder, encoder, errhandler, formatter), - ListDatabases: NewListDatabasesHandler(e.ListDatabases, mux, decoder, encoder, errhandler, formatter), - CreateDatabase: NewCreateDatabaseHandler(e.CreateDatabase, mux, decoder, encoder, errhandler, formatter), - InspectDatabase: NewInspectDatabaseHandler(e.InspectDatabase, mux, decoder, encoder, errhandler, formatter), - UpdateDatabase: NewUpdateDatabaseHandler(e.UpdateDatabase, mux, decoder, encoder, errhandler, formatter), - DeleteDatabase: NewDeleteDatabaseHandler(e.DeleteDatabase, mux, decoder, encoder, errhandler, formatter), - GenHTTPOpenapiJSON: http.FileServer(fileSystemGenHTTPOpenapiJSON), + InspectCluster: NewInspectClusterHandler(e.InspectCluster, mux, decoder, encoder, errhandler, formatter), + ListHosts: NewListHostsHandler(e.ListHosts, mux, decoder, encoder, errhandler, formatter), + InspectHost: NewInspectHostHandler(e.InspectHost, mux, decoder, encoder, errhandler, formatter), + RemoveHost: NewRemoveHostHandler(e.RemoveHost, mux, decoder, encoder, errhandler, formatter), + ListDatabases: NewListDatabasesHandler(e.ListDatabases, mux, decoder, encoder, errhandler, formatter), + CreateDatabase: NewCreateDatabaseHandler(e.CreateDatabase, mux, decoder, encoder, errhandler, formatter), + InspectDatabase: NewInspectDatabaseHandler(e.InspectDatabase, mux, decoder, encoder, errhandler, formatter), + UpdateDatabase: NewUpdateDatabaseHandler(e.UpdateDatabase, mux, decoder, encoder, errhandler, formatter), + DeleteDatabase: NewDeleteDatabaseHandler(e.DeleteDatabase, mux, decoder, encoder, errhandler, formatter), + GenHTTPOpenapi3JSON: http.FileServer(fileSystemGenHTTPOpenapi3JSON), } } @@ -118,7 +118,7 @@ func Mount(mux goahttp.Muxer, h *Server) { MountInspectDatabaseHandler(mux, h.InspectDatabase) MountUpdateDatabaseHandler(mux, h.UpdateDatabase) MountDeleteDatabaseHandler(mux, h.DeleteDatabase) - MountGenHTTPOpenapiJSON(mux, h.GenHTTPOpenapiJSON) + MountGenHTTPOpenapi3JSON(mux, h.GenHTTPOpenapi3JSON) } // Mount configures the mux to serve the control-plane endpoints. @@ -575,6 +575,8 @@ type appendFS struct { // passing it to the underlying fs.FS. func (s appendFS) Open(name string) (http.File, error) { switch name { + case "/openapi.json": + name = "/openapi3.json" } return s.fs.Open(path.Join(s.prefix, name)) } @@ -585,8 +587,8 @@ func appendPrefix(fsys http.FileSystem, prefix string) http.FileSystem { return appendFS{prefix: prefix, fs: fsys} } -// MountGenHTTPOpenapiJSON configures the mux to serve GET request made to +// MountGenHTTPOpenapi3JSON configures the mux to serve GET request made to // "/openapi.json". -func MountGenHTTPOpenapiJSON(mux goahttp.Muxer, h http.Handler) { +func MountGenHTTPOpenapi3JSON(mux goahttp.Muxer, h http.Handler) { mux.Handle("GET", "/openapi.json", h.ServeHTTP) } diff --git a/api/gen/http/openapi.json b/api/gen/http/openapi.json index 31fd449a..59a5d80b 100644 --- a/api/gen/http/openapi.json +++ b/api/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"pgEdge Control Plane API","description":"Service for creating, modifying, and operating pgEdge databases.","version":"0.0.1"},"host":"localhost:3000","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/cluster":{"get":{"tags":["control-plane"],"summary":"inspect-cluster control-plane","description":"Returns information about the cluster.","operationId":"control-plane#inspect-cluster","responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Cluster","required":["id","tenant_id","status","hosts"]}}},"schemes":["http"]}},"/databases":{"get":{"tags":["control-plane"],"summary":"list-databases control-plane","description":"Lists all databases in the cluster.","operationId":"control-plane#list-databases","responses":{"200":{"description":"OK response.","schema":{"type":"array","items":{"$ref":"#/definitions/Database"}}}},"schemes":["http"]},"post":{"tags":["control-plane"],"summary":"create-database control-plane","description":"Creates a new database in the cluster.","operationId":"control-plane#create-database","parameters":[{"name":"Create-DatabaseRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/CreateDatabaseRequest"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Database","required":["id","status","instances"]}}},"schemes":["http"]}},"/databases/{database_id}":{"get":{"tags":["control-plane"],"summary":"inspect-database control-plane","description":"Returns information about a particular database in the cluster.","operationId":"control-plane#inspect-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to inspect.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Database","required":["id","status","instances"]}}},"schemes":["http"]},"post":{"tags":["control-plane"],"summary":"update-database control-plane","description":"Updates a database with the given specification.","operationId":"control-plane#update-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to update.","required":true,"type":"string"},{"name":"Update-DatabaseRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/UpdateDatabaseRequest"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Database","required":["id","status","instances"]}}},"schemes":["http"]},"delete":{"tags":["control-plane"],"summary":"delete-database control-plane","description":"Deletes a database from the cluster.","operationId":"control-plane#delete-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to delete.","required":true,"type":"string"}],"responses":{"204":{"description":"No Content response."}},"schemes":["http"]}},"/hosts":{"get":{"tags":["control-plane"],"summary":"list-hosts control-plane","description":"Lists all hosts within the cluster.","operationId":"control-plane#list-hosts","responses":{"200":{"description":"OK response.","schema":{"type":"array","items":{"$ref":"#/definitions/Host"}}}},"schemes":["http"]}},"/hosts/{host_id}":{"get":{"tags":["control-plane"],"summary":"inspect-host control-plane","description":"Returns information about a particular host in the cluster.","operationId":"control-plane#inspect-host","parameters":[{"name":"host_id","in":"path","description":"ID of the host to inspect.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Host","required":["id","status","hostname","ipv4_address"]}}},"schemes":["http"]},"delete":{"tags":["control-plane"],"summary":"remove-host control-plane","description":"Removes a host from the cluster.","operationId":"control-plane#remove-host","parameters":[{"name":"host_id","in":"path","description":"ID of the host to remove.","required":true,"type":"string"}],"responses":{"204":{"description":"No Content response."}},"schemes":["http"]}},"/openapi.json":{"get":{"tags":["control-plane"],"summary":"Download ./gen/http/openapi.json","operationId":"control-plane#/openapi.json","responses":{"200":{"description":"File downloaded","schema":{"type":"file"}}},"schemes":["http"]}}},"definitions":{"BackupConfigSpec":{"title":"BackupConfigSpec","type":"object","properties":{"id":{"type":"string","description":"The unique identifier for this backup configuration.","example":"default"},"node_names":{"type":"array","items":{"type":"string","example":"Labore in."},"description":"The names of the nodes where this backup configuration should be applied. The configuration will apply to all nodes when this field is empty or unspecified.","example":["n1","n3"]},"provider":{"type":"string","description":"The backup provider for this backup configuration.","example":"pgbackrest","enum":["pgbackrest","pg_dump"]},"repositories":{"type":"array","items":{"$ref":"#/definitions/BackupRepositorySpec"},"description":"The repositories for this backup configuration.","example":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}]},"schedules":{"type":"array","items":{"$ref":"#/definitions/BackupScheduleSpec"},"description":"The schedules for this backup configuration.","example":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}},"example":{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},"required":["id","provider"]},"BackupRepositorySpec":{"title":"BackupRepositorySpec","type":"object","properties":{"azure_account":{"type":"string","description":"The Azure account name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups"},"azure_container":{"type":"string","description":"The Azure container name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"azure_endpoint":{"type":"string","description":"The optional Azure endpoint for this repository. Only applies when type = 'azure'.","example":"blob.core.usgovcloudapi.net"},"base_path":{"type":"string","description":"The base path within the repository to store backups.","example":"/backups"},"gcs_bucket":{"type":"string","description":"The GCS bucket name for this repository. Only applies when type = 'gcs'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"gcs_endpoint":{"type":"string","description":"The optional GCS endpoint for this repository. Only applies when type = 'gcs'.","example":"localhost"},"id":{"type":"string","description":"The unique identifier of this repository.","example":"f6b84a99-5e91-4203-be1e-131fe82e5984"},"retention_full":{"type":"integer","description":"The count of full backups to retain or the time to retain full backups.","example":2,"format":"int64"},"retention_full_type":{"type":"string","description":"The type of measure used for retention_full.","example":"count","enum":["time","count"]},"s3_bucket":{"type":"string","description":"The S3 bucket name for this repository. Only applies when type = 's3'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"s3_endpoint":{"type":"string","description":"The optional S3 endpoint for this repository. Only applies when type = 's3'.","example":"s3.us-east-1.amazonaws.com"},"s3_region":{"type":"string","description":"The region of the S3 bucket for this repository. Only applies when type = 's3'.","example":"us-east-1"},"type":{"type":"string","description":"The type of this repository.","example":"s3","enum":["s3","gcs","azure"]}},"example":{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},"required":["type"]},"BackupScheduleSpec":{"title":"BackupScheduleSpec","type":"object","properties":{"cron_expression":{"type":"string","description":"The cron expression for this schedule.","example":"0 6 * * ?"},"id":{"type":"string","description":"The unique identifier for this backup schedule.","example":"daily-full-backup"},"type":{"type":"string","description":"The type of backup to take on this schedule.","example":"full","enum":["full","incr"]}},"example":{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},"required":["id","type","cron_expression"]},"Cluster":{"title":"Cluster","type":"object","properties":{"hosts":{"type":"array","items":{"$ref":"#/definitions/Host"},"description":"All of the hosts in the cluster.","example":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"}]},"id":{"type":"string","description":"Unique identifier for the cluster.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"status":{"$ref":"#/definitions/ClusterStatus"},"tenant_id":{"type":"string","description":"Unique identifier for the cluster's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"example":{"hosts":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"}],"id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","status":{"state":"available"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"},"required":["id","tenant_id","status","hosts"]},"ClusterStatus":{"title":"ClusterStatus","type":"object","properties":{"state":{"type":"string","description":"The current state of the cluster.","example":"error","enum":["available","error"]}},"example":{"state":"error"},"required":["state"]},"CreateDatabaseRequest":{"title":"CreateDatabaseRequest","type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the database.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"spec":{"$ref":"#/definitions/DatabaseSpec"},"tenant_id":{"type":"string","description":"Unique identifier for the databases's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"example":{"id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"Database":{"title":"Database","type":"object","properties":{"created_at":{"type":"string","description":"The time that the database was created.","example":"2025-01-01T01:30:00Z","format":"date-time"},"id":{"type":"string","description":"Unique identifier for the database.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"instances":{"$ref":"#/definitions/Instance"},"spec":{"$ref":"#/definitions/DatabaseSpec"},"status":{"$ref":"#/definitions/DatabaseStatus"},"tenant_id":{"type":"string","description":"Unique identifier for the databases's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"},"updated_at":{"type":"string","description":"The time that the database was last updated.","example":"2025-01-01T02:30:00Z","format":"date-time"}},"example":{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},"required":["id","status","instances"]},"DatabaseExtensionSpec":{"title":"DatabaseExtensionSpec","type":"object","properties":{"name":{"type":"string","description":"The name of the extension to install in this database.","example":"postgis"},"version":{"type":"string","description":"The version of the extension to install in this database.","example":"1.2.3"}},"example":{"name":"postgis","version":"1.2.3"},"required":["name"]},"DatabaseNodeSpec":{"title":"DatabaseNodeSpec","type":"object","properties":{"host_id":{"type":"string","description":"The ID of the host that should run this node.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"instance_id":{"type":"string","description":"A unique identifier for the instance that will be created from this node specification.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"name":{"type":"string","description":"The name of the database node.","example":"n1"},"port":{"type":"integer","description":"The port used by the Postgres database for this node. Overrides the Postgres port set in the DatabaseSpec.","example":5432,"format":"int64"},"postgres_version":{"type":"string","description":"The major version of Postgres for this node. Overrides the Postgres version set in the DatabaseSpec.","example":"17","enum":["16","17"]},"postgresql_conf":{"type":"object","description":"Additional postgresql.conf settings for this particular node. Will be merged with the settings provided by control-plane.","example":{"max_connections":1000},"additionalProperties":true},"read_replicas":{"$ref":"#/definitions/DatabaseReplicaSpec"}},"example":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},"required":["name","instance_id","host_id"]},"DatabaseReplicaSpec":{"title":"DatabaseReplicaSpec","type":"object","properties":{"host_id":{"type":"string","description":"The ID of the host that should run this read replica.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"instance_id":{"type":"string","description":"A unique identifier for the instance that will be created from this replica specification.","example":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},"example":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"},"required":["instance_id","host_id"]},"DatabaseSpec":{"title":"DatabaseSpec","type":"object","properties":{"backup_configs":{"type":"array","items":{"$ref":"#/definitions/BackupConfigSpec"},"description":"The backup configurations for this database.","example":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}]},"database_name":{"type":"string","description":"The name of the Postgres database.","example":"northwind"},"database_users":{"type":"array","items":{"$ref":"#/definitions/DatabaseUserSpec"},"description":"The users to create for this database.","example":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}]},"deletion_protection":{"type":"boolean","description":"Prevents deletion when true.","example":true},"extensions":{"type":"array","items":{"$ref":"#/definitions/DatabaseExtensionSpec"},"description":"The extensions to install for this database.","example":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}]},"features":{"type":"object","description":"The feature flags for this database.","example":{"some_feature":"enabled"},"additionalProperties":{"type":"string","example":"Magni quaerat qui quam id aut velit."}},"nodes":{"type":"array","items":{"$ref":"#/definitions/DatabaseNodeSpec"},"description":"The Spock nodes for this database.","example":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}]},"port":{"type":"integer","description":"The port used by the Postgres database.","example":5432,"format":"int64"},"postgres_version":{"type":"string","description":"The major version of the Postgres database.","example":"17","enum":["16","17"]},"postgresql_conf":{"type":"object","description":"Additional postgresql.conf settings. Will be merged with the settings provided by control-plane.","example":{"max_connections":1000},"additionalProperties":true},"spock_version":{"type":"string","description":"The major version of the Spock extension.","example":"4","enum":["4"]}},"example":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"required":["database_name","nodes"]},"DatabaseStatus":{"title":"DatabaseStatus","type":"object","properties":{"state":{"type":"string","example":"available","enum":["creating","modifying","available","error"]},"updated_at":{"type":"string","description":"The time that the database status was last updated.","example":"2025-01-01T10:30:37Z","format":"date-time"}},"example":{"state":"modifying","updated_at":"2025-01-01T10:30:37Z"}},"DatabaseUserSpec":{"title":"DatabaseUserSpec","type":"object","properties":{"password":{"type":"string","description":"The password for this database user.","example":"secret"},"roles":{"type":"array","items":{"type":"string","example":"Laudantium et quia commodi."},"description":"The roles to assign to this database user.","example":["application_read_only"]},"superuser":{"type":"boolean","description":"Enables SUPERUSER for this database user when true.","example":true},"username":{"type":"string","description":"The username for this database user.","example":"admin"}},"example":{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},"required":["username","password"]},"Host":{"title":"Host","type":"object","properties":{"cohort":{"type":"string","description":"The cohort that this host belongs to","example":"pps1n11hqijn9rbee4cjil453"},"config":{"$ref":"#/definitions/HostConfiguration"},"hostname":{"type":"string","description":"The hostname of this host.","example":"i-0123456789abcdef.ec2.internal"},"id":{"type":"string","description":"Unique identifier for the host","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"ipv4_address":{"type":"string","description":"The IPv4 address of this host.","example":"10.24.34.0","format":"ipv4"},"status":{"$ref":"#/definitions/HostStatus"},"type":{"type":"string","description":"The type of this host","example":"swarm","enum":["swarm","systemd"]}},"example":{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"},"required":["id","status","hostname","ipv4_address"]},"HostConfiguration":{"title":"HostConfiguration","type":"object","properties":{"traefik_enabled":{"type":"boolean","description":"Enables the Treafik load balancer","example":false},"vector_enabled":{"type":"boolean","description":"Enables the Vector service for metrics and log collection","example":true}},"example":{"traefik_enabled":false,"vector_enabled":true}},"HostStatus":{"title":"HostStatus","type":"object","properties":{"state":{"type":"string","example":"available","enum":["available","unreachable","error"]}},"example":{"state":"available"},"required":["state"]},"Instance":{"title":"Instance","type":"object","properties":{"created_at":{"type":"string","description":"The time that the instance was created.","example":"1981-08-03T21:17:54Z","format":"date-time"},"host_id":{"type":"string","description":"The ID of the host this instance is running on.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"id":{"type":"string","description":"Unique identifier for the instance.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"interfaces":{"type":"array","items":{"$ref":"#/definitions/InstanceInterface"},"description":"All interfaces that this instance serves on.","example":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}]},"node_name":{"type":"string","description":"The Spock node name for this instance.","example":"n1"},"status":{"$ref":"#/definitions/InstanceStatus"},"updated_at":{"type":"string","description":"The time that the instance was last updated.","example":"2009-09-01T05:13:11Z","format":"date-time"}},"example":{"created_at":"2004-11-09T18:36:56Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1978-08-17T11:52:12Z"},"required":["id","status"]},"InstanceInterface":{"title":"InstanceInterface","type":"object","properties":{"hostname":{"type":"string","description":"The hostname of the instance on this interface.","example":"postgres-n1"},"ipv4_address":{"type":"string","description":"The IPv4 address of the instance on this interface.","example":"10.1.0.113","format":"ipv4"},"network_id":{"type":"string","description":"The unique identifier of the network for this interface.","example":"l5imrq28sh6s"},"network_type":{"type":"string","description":"The type of network for this interface.","example":"docker","enum":["docker","host"]},"port":{"type":"integer","description":"The Postgres port for the instance on this interface.","example":5432,"format":"int64"}},"example":{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}},"InstanceStatus":{"title":"InstanceStatus","type":"object","properties":{"patroni_paused":{"type":"boolean","description":"True if Patroni has been paused for this instance.","example":true},"patroni_state":{"type":"string","example":"custom bootstrap failed","enum":["stopping","stopped","stop failed","crashed","running","starting","start failed","restarting","restart failed","initializing new cluster","initdb failed","running custom bootstrap script","custom bootstrap failed","creating replica","unknown"]},"pending_restart":{"type":"boolean","description":"True if this instance is pending to be restarted from a configuration change.","example":true},"postgres_version":{"type":"string","description":"The version of Postgres for this instance.","example":"17.1"},"read_only":{"type":"boolean","description":"True if this instance is in read-only mode.","example":false},"role":{"type":"string","example":"replica","enum":["replica","primary"]},"spock_version":{"type":"string","description":"The version of Spock for this instance.","example":"4.0.9"},"state":{"type":"string","example":"creating","enum":["creating","modifying","backing_up","available","error"]},"updated_at":{"type":"string","description":"The time that the instance status was last updated.","example":"1998-03-09T10:30:37Z","format":"date-time"}},"example":{"patroni_paused":true,"patroni_state":"stopped","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"1986-12-19T00:29:43Z"},"required":["state"]},"UpdateDatabaseRequest":{"title":"UpdateDatabaseRequest","type":"object","properties":{"spec":{"$ref":"#/definitions/DatabaseSpec"}},"example":{"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"}}}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"pgEdge Control Plane API","description":"Service for creating, modifying, and operating pgEdge databases.","version":"0.0.1"},"host":"localhost:3000","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/cluster":{"get":{"tags":["control-plane"],"summary":"inspect-cluster control-plane","description":"Returns information about the cluster.","operationId":"control-plane#inspect-cluster","responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Cluster","required":["id","tenant_id","status","hosts"]}}},"schemes":["http"]}},"/databases":{"get":{"tags":["control-plane"],"summary":"list-databases control-plane","description":"Lists all databases in the cluster.","operationId":"control-plane#list-databases","responses":{"200":{"description":"OK response.","schema":{"type":"array","items":{"$ref":"#/definitions/Database"}}}},"schemes":["http"]},"post":{"tags":["control-plane"],"summary":"create-database control-plane","description":"Creates a new database in the cluster.","operationId":"control-plane#create-database","parameters":[{"name":"Create-DatabaseRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/CreateDatabaseRequest"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Database","required":["id","status","instances"]}}},"schemes":["http"]}},"/databases/{database_id}":{"get":{"tags":["control-plane"],"summary":"inspect-database control-plane","description":"Returns information about a particular database in the cluster.","operationId":"control-plane#inspect-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to inspect.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Database","required":["id","status","instances"]}}},"schemes":["http"]},"post":{"tags":["control-plane"],"summary":"update-database control-plane","description":"Updates a database with the given specification.","operationId":"control-plane#update-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to update.","required":true,"type":"string"},{"name":"Update-DatabaseRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/UpdateDatabaseRequest"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Database","required":["id","status","instances"]}}},"schemes":["http"]},"delete":{"tags":["control-plane"],"summary":"delete-database control-plane","description":"Deletes a database from the cluster.","operationId":"control-plane#delete-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to delete.","required":true,"type":"string"}],"responses":{"204":{"description":"No Content response."}},"schemes":["http"]}},"/hosts":{"get":{"tags":["control-plane"],"summary":"list-hosts control-plane","description":"Lists all hosts within the cluster.","operationId":"control-plane#list-hosts","responses":{"200":{"description":"OK response.","schema":{"type":"array","items":{"$ref":"#/definitions/Host"}}}},"schemes":["http"]}},"/hosts/{host_id}":{"get":{"tags":["control-plane"],"summary":"inspect-host control-plane","description":"Returns information about a particular host in the cluster.","operationId":"control-plane#inspect-host","parameters":[{"name":"host_id","in":"path","description":"ID of the host to inspect.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/Host","required":["id","status","hostname","ipv4_address"]}}},"schemes":["http"]},"delete":{"tags":["control-plane"],"summary":"remove-host control-plane","description":"Removes a host from the cluster.","operationId":"control-plane#remove-host","parameters":[{"name":"host_id","in":"path","description":"ID of the host to remove.","required":true,"type":"string"}],"responses":{"204":{"description":"No Content response."}},"schemes":["http"]}},"/openapi.json":{"get":{"tags":["control-plane"],"summary":"Download ./gen/http/openapi3.json","operationId":"control-plane#/openapi.json","responses":{"200":{"description":"File downloaded","schema":{"type":"file"}}},"schemes":["http"]}}},"definitions":{"BackupConfigSpec":{"title":"BackupConfigSpec","type":"object","properties":{"id":{"type":"string","description":"The unique identifier for this backup configuration.","example":"default"},"node_names":{"type":"array","items":{"type":"string","example":"Labore in."},"description":"The names of the nodes where this backup configuration should be applied. The configuration will apply to all nodes when this field is empty or unspecified.","example":["n1","n3"]},"provider":{"type":"string","description":"The backup provider for this backup configuration.","example":"pgbackrest","enum":["pgbackrest","pg_dump"]},"repositories":{"type":"array","items":{"$ref":"#/definitions/BackupRepositorySpec"},"description":"The repositories for this backup configuration.","example":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}]},"schedules":{"type":"array","items":{"$ref":"#/definitions/BackupScheduleSpec"},"description":"The schedules for this backup configuration.","example":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}},"example":{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},"required":["id","provider"]},"BackupRepositorySpec":{"title":"BackupRepositorySpec","type":"object","properties":{"azure_account":{"type":"string","description":"The Azure account name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups"},"azure_container":{"type":"string","description":"The Azure container name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"azure_endpoint":{"type":"string","description":"The optional Azure endpoint for this repository. Only applies when type = 'azure'.","example":"blob.core.usgovcloudapi.net"},"base_path":{"type":"string","description":"The base path within the repository to store backups.","example":"/backups"},"gcs_bucket":{"type":"string","description":"The GCS bucket name for this repository. Only applies when type = 'gcs'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"gcs_endpoint":{"type":"string","description":"The optional GCS endpoint for this repository. Only applies when type = 'gcs'.","example":"localhost"},"id":{"type":"string","description":"The unique identifier of this repository.","example":"f6b84a99-5e91-4203-be1e-131fe82e5984"},"retention_full":{"type":"integer","description":"The count of full backups to retain or the time to retain full backups.","example":2,"format":"int64"},"retention_full_type":{"type":"string","description":"The type of measure used for retention_full.","example":"count","enum":["time","count"]},"s3_bucket":{"type":"string","description":"The S3 bucket name for this repository. Only applies when type = 's3'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"s3_endpoint":{"type":"string","description":"The optional S3 endpoint for this repository. Only applies when type = 's3'.","example":"s3.us-east-1.amazonaws.com"},"s3_region":{"type":"string","description":"The region of the S3 bucket for this repository. Only applies when type = 's3'.","example":"us-east-1"},"type":{"type":"string","description":"The type of this repository.","example":"s3","enum":["s3","gcs","azure"]}},"example":{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},"required":["type"]},"BackupScheduleSpec":{"title":"BackupScheduleSpec","type":"object","properties":{"cron_expression":{"type":"string","description":"The cron expression for this schedule.","example":"0 6 * * ?"},"id":{"type":"string","description":"The unique identifier for this backup schedule.","example":"daily-full-backup"},"type":{"type":"string","description":"The type of backup to take on this schedule.","example":"full","enum":["full","incr"]}},"example":{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},"required":["id","type","cron_expression"]},"Cluster":{"title":"Cluster","type":"object","properties":{"hosts":{"type":"array","items":{"$ref":"#/definitions/Host"},"description":"All of the hosts in the cluster.","example":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"}]},"id":{"type":"string","description":"Unique identifier for the cluster.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"status":{"$ref":"#/definitions/ClusterStatus"},"tenant_id":{"type":"string","description":"Unique identifier for the cluster's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"example":{"hosts":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"}],"id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","status":{"state":"available"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"},"required":["id","tenant_id","status","hosts"]},"ClusterStatus":{"title":"ClusterStatus","type":"object","properties":{"state":{"type":"string","description":"The current state of the cluster.","example":"error","enum":["available","error"]}},"example":{"state":"error"},"required":["state"]},"CreateDatabaseRequest":{"title":"CreateDatabaseRequest","type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the database.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"spec":{"$ref":"#/definitions/DatabaseSpec"},"tenant_id":{"type":"string","description":"Unique identifier for the databases's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"example":{"id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"Database":{"title":"Database","type":"object","properties":{"created_at":{"type":"string","description":"The time that the database was created.","example":"2025-01-01T01:30:00Z","format":"date-time"},"id":{"type":"string","description":"Unique identifier for the database.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"instances":{"$ref":"#/definitions/Instance"},"spec":{"$ref":"#/definitions/DatabaseSpec"},"status":{"$ref":"#/definitions/DatabaseStatus"},"tenant_id":{"type":"string","description":"Unique identifier for the databases's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"},"updated_at":{"type":"string","description":"The time that the database was last updated.","example":"2025-01-01T02:30:00Z","format":"date-time"}},"example":{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},"required":["id","status","instances"]},"DatabaseExtensionSpec":{"title":"DatabaseExtensionSpec","type":"object","properties":{"name":{"type":"string","description":"The name of the extension to install in this database.","example":"postgis"},"version":{"type":"string","description":"The version of the extension to install in this database.","example":"1.2.3"}},"example":{"name":"postgis","version":"1.2.3"},"required":["name"]},"DatabaseNodeSpec":{"title":"DatabaseNodeSpec","type":"object","properties":{"host_id":{"type":"string","description":"The ID of the host that should run this node.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"instance_id":{"type":"string","description":"A unique identifier for the instance that will be created from this node specification.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"name":{"type":"string","description":"The name of the database node.","example":"n1"},"port":{"type":"integer","description":"The port used by the Postgres database for this node. Overrides the Postgres port set in the DatabaseSpec.","example":5432,"format":"int64"},"postgres_version":{"type":"string","description":"The major version of Postgres for this node. Overrides the Postgres version set in the DatabaseSpec.","example":"17","enum":["16","17"]},"postgresql_conf":{"type":"object","description":"Additional postgresql.conf settings for this particular node. Will be merged with the settings provided by control-plane.","example":{"max_connections":1000},"additionalProperties":true},"read_replicas":{"$ref":"#/definitions/DatabaseReplicaSpec"}},"example":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},"required":["name","instance_id","host_id"]},"DatabaseReplicaSpec":{"title":"DatabaseReplicaSpec","type":"object","properties":{"host_id":{"type":"string","description":"The ID of the host that should run this read replica.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"instance_id":{"type":"string","description":"A unique identifier for the instance that will be created from this replica specification.","example":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},"example":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"},"required":["instance_id","host_id"]},"DatabaseSpec":{"title":"DatabaseSpec","type":"object","properties":{"backup_configs":{"type":"array","items":{"$ref":"#/definitions/BackupConfigSpec"},"description":"The backup configurations for this database.","example":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}]},"database_name":{"type":"string","description":"The name of the Postgres database.","example":"northwind"},"database_users":{"type":"array","items":{"$ref":"#/definitions/DatabaseUserSpec"},"description":"The users to create for this database.","example":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}]},"deletion_protection":{"type":"boolean","description":"Prevents deletion when true.","example":true},"extensions":{"type":"array","items":{"$ref":"#/definitions/DatabaseExtensionSpec"},"description":"The extensions to install for this database.","example":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}]},"features":{"type":"object","description":"The feature flags for this database.","example":{"some_feature":"enabled"},"additionalProperties":{"type":"string","example":"Magni quaerat qui quam id aut velit."}},"nodes":{"type":"array","items":{"$ref":"#/definitions/DatabaseNodeSpec"},"description":"The Spock nodes for this database.","example":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}]},"port":{"type":"integer","description":"The port used by the Postgres database.","example":5432,"format":"int64"},"postgres_version":{"type":"string","description":"The major version of the Postgres database.","example":"17","enum":["16","17"]},"postgresql_conf":{"type":"object","description":"Additional postgresql.conf settings. Will be merged with the settings provided by control-plane.","example":{"max_connections":1000},"additionalProperties":true},"spock_version":{"type":"string","description":"The major version of the Spock extension.","example":"4","enum":["4"]}},"example":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"required":["database_name","nodes"]},"DatabaseStatus":{"title":"DatabaseStatus","type":"object","properties":{"state":{"type":"string","example":"available","enum":["creating","modifying","available","error"]},"updated_at":{"type":"string","description":"The time that the database status was last updated.","example":"2025-01-01T10:30:37Z","format":"date-time"}},"example":{"state":"modifying","updated_at":"2025-01-01T10:30:37Z"}},"DatabaseUserSpec":{"title":"DatabaseUserSpec","type":"object","properties":{"password":{"type":"string","description":"The password for this database user.","example":"secret"},"roles":{"type":"array","items":{"type":"string","example":"Laudantium et quia commodi."},"description":"The roles to assign to this database user.","example":["application_read_only"]},"superuser":{"type":"boolean","description":"Enables SUPERUSER for this database user when true.","example":true},"username":{"type":"string","description":"The username for this database user.","example":"admin"}},"example":{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},"required":["username","password"]},"Host":{"title":"Host","type":"object","properties":{"cohort":{"type":"string","description":"The cohort that this host belongs to","example":"pps1n11hqijn9rbee4cjil453"},"config":{"$ref":"#/definitions/HostConfiguration"},"hostname":{"type":"string","description":"The hostname of this host.","example":"i-0123456789abcdef.ec2.internal"},"id":{"type":"string","description":"Unique identifier for the host","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"ipv4_address":{"type":"string","description":"The IPv4 address of this host.","example":"10.24.34.0","format":"ipv4"},"status":{"$ref":"#/definitions/HostStatus"},"type":{"type":"string","description":"The type of this host","example":"swarm","enum":["swarm","systemd"]}},"example":{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"},"required":["id","status","hostname","ipv4_address"]},"HostConfiguration":{"title":"HostConfiguration","type":"object","properties":{"traefik_enabled":{"type":"boolean","description":"Enables the Treafik load balancer","example":false},"vector_enabled":{"type":"boolean","description":"Enables the Vector service for metrics and log collection","example":true}},"example":{"traefik_enabled":false,"vector_enabled":true}},"HostStatus":{"title":"HostStatus","type":"object","properties":{"state":{"type":"string","example":"available","enum":["available","unreachable","error"]}},"example":{"state":"available"},"required":["state"]},"Instance":{"title":"Instance","type":"object","properties":{"created_at":{"type":"string","description":"The time that the instance was created.","example":"1981-08-03T21:17:54Z","format":"date-time"},"host_id":{"type":"string","description":"The ID of the host this instance is running on.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"id":{"type":"string","description":"Unique identifier for the instance.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"interfaces":{"type":"array","items":{"$ref":"#/definitions/InstanceInterface"},"description":"All interfaces that this instance serves on.","example":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}]},"node_name":{"type":"string","description":"The Spock node name for this instance.","example":"n1"},"status":{"$ref":"#/definitions/InstanceStatus"},"updated_at":{"type":"string","description":"The time that the instance was last updated.","example":"2009-09-01T05:13:11Z","format":"date-time"}},"example":{"created_at":"2004-11-09T18:36:56Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1978-08-17T11:52:12Z"},"required":["id","status"]},"InstanceInterface":{"title":"InstanceInterface","type":"object","properties":{"hostname":{"type":"string","description":"The hostname of the instance on this interface.","example":"postgres-n1"},"ipv4_address":{"type":"string","description":"The IPv4 address of the instance on this interface.","example":"10.1.0.113","format":"ipv4"},"network_id":{"type":"string","description":"The unique identifier of the network for this interface.","example":"l5imrq28sh6s"},"network_type":{"type":"string","description":"The type of network for this interface.","example":"docker","enum":["docker","host"]},"port":{"type":"integer","description":"The Postgres port for the instance on this interface.","example":5432,"format":"int64"}},"example":{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}},"InstanceStatus":{"title":"InstanceStatus","type":"object","properties":{"patroni_paused":{"type":"boolean","description":"True if Patroni has been paused for this instance.","example":true},"patroni_state":{"type":"string","example":"custom bootstrap failed","enum":["stopping","stopped","stop failed","crashed","running","starting","start failed","restarting","restart failed","initializing new cluster","initdb failed","running custom bootstrap script","custom bootstrap failed","creating replica","unknown"]},"pending_restart":{"type":"boolean","description":"True if this instance is pending to be restarted from a configuration change.","example":true},"postgres_version":{"type":"string","description":"The version of Postgres for this instance.","example":"17.1"},"read_only":{"type":"boolean","description":"True if this instance is in read-only mode.","example":false},"role":{"type":"string","example":"replica","enum":["replica","primary"]},"spock_version":{"type":"string","description":"The version of Spock for this instance.","example":"4.0.9"},"state":{"type":"string","example":"creating","enum":["creating","modifying","backing_up","available","error"]},"updated_at":{"type":"string","description":"The time that the instance status was last updated.","example":"1998-03-09T10:30:37Z","format":"date-time"}},"example":{"patroni_paused":true,"patroni_state":"stopped","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"1986-12-19T00:29:43Z"},"required":["state"]},"UpdateDatabaseRequest":{"title":"UpdateDatabaseRequest","type":"object","properties":{"spec":{"$ref":"#/definitions/DatabaseSpec"}},"example":{"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"}}}}} \ No newline at end of file diff --git a/api/gen/http/openapi.yaml b/api/gen/http/openapi.yaml index edc05cb3..9f5297e5 100644 --- a/api/gen/http/openapi.yaml +++ b/api/gen/http/openapi.yaml @@ -202,7 +202,7 @@ paths: get: tags: - control-plane - summary: Download ./gen/http/openapi.json + summary: Download ./gen/http/openapi3.json operationId: control-plane#/openapi.json responses: "200": diff --git a/api/gen/http/openapi3.json b/api/gen/http/openapi3.json index de9bc330..f7fc8072 100644 --- a/api/gen/http/openapi3.json +++ b/api/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"pgEdge Control Plane API","description":"Service for creating, modifying, and operating pgEdge databases.","version":"0.0.1"},"servers":[{"url":"http://localhost:3000"}],"paths":{"/cluster":{"get":{"tags":["control-plane"],"summary":"inspect-cluster control-plane","description":"Returns information about the cluster.","operationId":"control-plane#inspect-cluster","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cluster"},"example":{"hosts":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"}],"id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","status":{"state":"available"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"}}}}}}},"/databases":{"get":{"tags":["control-plane"],"summary":"list-databases control-plane","description":"Lists all databases in the cluster.","operationId":"control-plane#list-databases","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Database"},"example":[{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"}]},"example":[{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"}]}}}}},"post":{"tags":["control-plane"],"summary":"create-database control-plane","description":"Creates a new database in the cluster.","operationId":"control-plane#create-database","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDatabaseRequest"},"example":{"id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"}}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Database"},"example":{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1983-06-23T19:00:09Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":false,"patroni_state":"running","pending_restart":false,"postgres_version":"17.1","read_only":false,"role":"replica","spock_version":"4.0.9","state":"available","updated_at":"1987-12-08T09:28:21Z"},"updated_at":"1985-05-18T17:19:50Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"available","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"}}}}}}},"/databases/{database_id}":{"delete":{"tags":["control-plane"],"summary":"delete-database control-plane","description":"Deletes a database from the cluster.","operationId":"control-plane#delete-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to delete.","required":true,"schema":{"type":"string","description":"ID of the database to delete.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"}],"responses":{"204":{"description":"No Content response."}}},"get":{"tags":["control-plane"],"summary":"inspect-database control-plane","description":"Returns information about a particular database in the cluster.","operationId":"control-plane#inspect-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to inspect.","required":true,"schema":{"type":"string","description":"ID of the database to inspect.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Database"},"example":{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1983-06-23T19:00:09Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":false,"patroni_state":"running","pending_restart":false,"postgres_version":"17.1","read_only":false,"role":"replica","spock_version":"4.0.9","state":"available","updated_at":"1987-12-08T09:28:21Z"},"updated_at":"1985-05-18T17:19:50Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"available","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"}}}}}},"post":{"tags":["control-plane"],"summary":"update-database control-plane","description":"Updates a database with the given specification.","operationId":"control-plane#update-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to update.","required":true,"schema":{"type":"string","description":"ID of the database to update.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDatabaseRequest"},"example":{"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"}}}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Database"},"example":{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1983-06-23T19:00:09Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":false,"patroni_state":"running","pending_restart":false,"postgres_version":"17.1","read_only":false,"role":"replica","spock_version":"4.0.9","state":"available","updated_at":"1987-12-08T09:28:21Z"},"updated_at":"1985-05-18T17:19:50Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"available","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"}}}}}}},"/hosts":{"get":{"tags":["control-plane"],"summary":"list-hosts control-plane","description":"Lists all hosts within the cluster.","operationId":"control-plane#list-hosts","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Host"},"example":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":false,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":false,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"}]},"example":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":false,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":false,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"}]}}}}}},"/hosts/{host_id}":{"delete":{"tags":["control-plane"],"summary":"remove-host control-plane","description":"Removes a host from the cluster.","operationId":"control-plane#remove-host","parameters":[{"name":"host_id","in":"path","description":"ID of the host to remove.","required":true,"schema":{"type":"string","description":"ID of the host to remove.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"}],"responses":{"204":{"description":"No Content response."}}},"get":{"tags":["control-plane"],"summary":"inspect-host control-plane","description":"Returns information about a particular host in the cluster.","operationId":"control-plane#inspect-host","parameters":[{"name":"host_id","in":"path","description":"ID of the host to inspect.","required":true,"schema":{"type":"string","description":"ID of the host to inspect.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Host"},"example":{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"}}}}}}},"/openapi.json":{"get":{"tags":["control-plane"],"summary":"Download ./gen/http/openapi.json","operationId":"control-plane#/openapi.json","responses":{"200":{"description":"File downloaded"}}}}},"components":{"schemas":{"BackupConfigSpec":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier for this backup configuration.","example":"default"},"node_names":{"type":"array","items":{"type":"string","example":"Totam dolorem."},"description":"The names of the nodes where this backup configuration should be applied. The configuration will apply to all nodes when this field is empty or unspecified.","example":["n1","n3"]},"provider":{"type":"string","description":"The backup provider for this backup configuration.","example":"pgbackrest","enum":["pgbackrest","pg_dump"]},"repositories":{"type":"array","items":{"$ref":"#/components/schemas/BackupRepositorySpec"},"description":"The repositories for this backup configuration.","example":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}]},"schedules":{"type":"array","items":{"$ref":"#/components/schemas/BackupScheduleSpec"},"description":"The schedules for this backup configuration.","example":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}},"example":{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},"required":["id","provider"]},"BackupRepositorySpec":{"type":"object","properties":{"azure_account":{"type":"string","description":"The Azure account name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups"},"azure_container":{"type":"string","description":"The Azure container name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"azure_endpoint":{"type":"string","description":"The optional Azure endpoint for this repository. Only applies when type = 'azure'.","example":"blob.core.usgovcloudapi.net"},"base_path":{"type":"string","description":"The base path within the repository to store backups.","example":"/backups"},"gcs_bucket":{"type":"string","description":"The GCS bucket name for this repository. Only applies when type = 'gcs'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"gcs_endpoint":{"type":"string","description":"The optional GCS endpoint for this repository. Only applies when type = 'gcs'.","example":"localhost"},"id":{"type":"string","description":"The unique identifier of this repository.","example":"f6b84a99-5e91-4203-be1e-131fe82e5984"},"retention_full":{"type":"integer","description":"The count of full backups to retain or the time to retain full backups.","example":2,"format":"int64"},"retention_full_type":{"type":"string","description":"The type of measure used for retention_full.","example":"count","enum":["time","count"]},"s3_bucket":{"type":"string","description":"The S3 bucket name for this repository. Only applies when type = 's3'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"s3_endpoint":{"type":"string","description":"The optional S3 endpoint for this repository. Only applies when type = 's3'.","example":"s3.us-east-1.amazonaws.com"},"s3_region":{"type":"string","description":"The region of the S3 bucket for this repository. Only applies when type = 's3'.","example":"us-east-1"},"type":{"type":"string","description":"The type of this repository.","example":"s3","enum":["s3","gcs","azure"]}},"example":{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},"required":["type"]},"BackupScheduleSpec":{"type":"object","properties":{"cron_expression":{"type":"string","description":"The cron expression for this schedule.","example":"0 6 * * ?"},"id":{"type":"string","description":"The unique identifier for this backup schedule.","example":"daily-full-backup"},"type":{"type":"string","description":"The type of backup to take on this schedule.","example":"full","enum":["full","incr"]}},"example":{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},"required":["id","type","cron_expression"]},"Cluster":{"type":"object","properties":{"hosts":{"type":"array","items":{"$ref":"#/components/schemas/Host"},"description":"All of the hosts in the cluster.","example":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"}]},"id":{"type":"string","description":"Unique identifier for the cluster.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"status":{"$ref":"#/components/schemas/ClusterStatus"},"tenant_id":{"type":"string","description":"Unique identifier for the cluster's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"example":{"hosts":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"}],"id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","status":{"state":"available"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"},"required":["id","tenant_id","status","hosts"]},"ClusterStatus":{"type":"object","properties":{"state":{"type":"string","description":"The current state of the cluster.","example":"error","enum":["available","error"]}},"example":{"state":"available"},"required":["state"]},"CreateDatabaseRequest":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the database.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"spec":{"$ref":"#/components/schemas/DatabaseSpec"},"tenant_id":{"type":"string","description":"Unique identifier for the databases's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"example":{"id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"Database":{"type":"object","properties":{"created_at":{"type":"string","description":"The time that the database was created.","example":"2025-01-01T01:30:00Z","format":"date-time"},"id":{"type":"string","description":"Unique identifier for the database.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"instances":{"$ref":"#/components/schemas/Instance"},"spec":{"$ref":"#/components/schemas/DatabaseSpec"},"status":{"$ref":"#/components/schemas/DatabaseStatus"},"tenant_id":{"type":"string","description":"Unique identifier for the databases's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"},"updated_at":{"type":"string","description":"The time that the database was last updated.","example":"2025-01-01T02:30:00Z","format":"date-time"}},"example":{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1975-03-20T03:08:32Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"unknown","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"backing_up","updated_at":"2000-08-17T12:59:00Z"},"updated_at":"1972-05-07T22:20:35Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},"required":["id","status","instances"]},"DatabaseExtensionSpec":{"type":"object","properties":{"name":{"type":"string","description":"The name of the extension to install in this database.","example":"postgis"},"version":{"type":"string","description":"The version of the extension to install in this database.","example":"1.2.3"}},"example":{"name":"postgis","version":"1.2.3"},"required":["name"]},"DatabaseNodeSpec":{"type":"object","properties":{"host_id":{"type":"string","description":"The ID of the host that should run this node.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"instance_id":{"type":"string","description":"A unique identifier for the instance that will be created from this node specification.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"name":{"type":"string","description":"The name of the database node.","example":"n1"},"port":{"type":"integer","description":"The port used by the Postgres database for this node. Overrides the Postgres port set in the DatabaseSpec.","example":5432,"format":"int64"},"postgres_version":{"type":"string","description":"The major version of Postgres for this node. Overrides the Postgres version set in the DatabaseSpec.","example":"17","enum":["16","17"]},"postgresql_conf":{"type":"object","description":"Additional postgresql.conf settings for this particular node. Will be merged with the settings provided by control-plane.","example":{"max_connections":1000},"additionalProperties":true},"read_replicas":{"$ref":"#/components/schemas/DatabaseReplicaSpec"}},"example":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},"required":["name","instance_id","host_id"]},"DatabaseReplicaSpec":{"type":"object","properties":{"host_id":{"type":"string","description":"The ID of the host that should run this read replica.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"instance_id":{"type":"string","description":"A unique identifier for the instance that will be created from this replica specification.","example":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},"example":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"},"required":["instance_id","host_id"]},"DatabaseSpec":{"type":"object","properties":{"backup_configs":{"type":"array","items":{"$ref":"#/components/schemas/BackupConfigSpec"},"description":"The backup configurations for this database.","example":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}]},"database_name":{"type":"string","description":"The name of the Postgres database.","example":"northwind"},"database_users":{"type":"array","items":{"$ref":"#/components/schemas/DatabaseUserSpec"},"description":"The users to create for this database.","example":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}]},"deletion_protection":{"type":"boolean","description":"Prevents deletion when true.","example":true},"extensions":{"type":"array","items":{"$ref":"#/components/schemas/DatabaseExtensionSpec"},"description":"The extensions to install for this database.","example":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}]},"features":{"type":"object","description":"The feature flags for this database.","example":{"some_feature":"enabled"},"additionalProperties":{"type":"string","example":"Nihil facere ad tenetur iure quisquam."}},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/DatabaseNodeSpec"},"description":"The Spock nodes for this database.","example":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}]},"port":{"type":"integer","description":"The port used by the Postgres database.","example":5432,"format":"int64"},"postgres_version":{"type":"string","description":"The major version of the Postgres database.","example":"17","enum":["16","17"]},"postgresql_conf":{"type":"object","description":"Additional postgresql.conf settings. Will be merged with the settings provided by control-plane.","example":{"max_connections":1000},"additionalProperties":true},"spock_version":{"type":"string","description":"The major version of the Spock extension.","example":"4","enum":["4"]}},"example":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"required":["database_name","nodes"]},"DatabaseStatus":{"type":"object","properties":{"state":{"type":"string","example":"available","enum":["creating","modifying","available","error"]},"updated_at":{"type":"string","description":"The time that the database status was last updated.","example":"2025-01-01T10:30:37Z","format":"date-time"}},"example":{"state":"modifying","updated_at":"2025-01-01T10:30:37Z"}},"DatabaseUserSpec":{"type":"object","properties":{"password":{"type":"string","description":"The password for this database user.","example":"secret"},"roles":{"type":"array","items":{"type":"string","example":"Voluptatum nulla commodi quo aut facere."},"description":"The roles to assign to this database user.","example":["application_read_only"]},"superuser":{"type":"boolean","description":"Enables SUPERUSER for this database user when true.","example":true},"username":{"type":"string","description":"The username for this database user.","example":"admin"}},"example":{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},"required":["username","password"]},"Host":{"type":"object","properties":{"cohort":{"type":"string","description":"The cohort that this host belongs to","example":"pps1n11hqijn9rbee4cjil453"},"config":{"$ref":"#/components/schemas/HostConfiguration"},"hostname":{"type":"string","description":"The hostname of this host.","example":"i-0123456789abcdef.ec2.internal"},"id":{"type":"string","description":"Unique identifier for the host","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"ipv4_address":{"type":"string","description":"The IPv4 address of this host.","example":"10.24.34.0","format":"ipv4"},"status":{"$ref":"#/components/schemas/HostStatus"},"type":{"type":"string","description":"The type of this host","example":"swarm","enum":["swarm","systemd"]}},"example":{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"},"required":["id","status","hostname","ipv4_address"]},"HostConfiguration":{"type":"object","properties":{"traefik_enabled":{"type":"boolean","description":"Enables the Treafik load balancer","example":false},"vector_enabled":{"type":"boolean","description":"Enables the Vector service for metrics and log collection","example":false}},"example":{"traefik_enabled":true,"vector_enabled":false}},"HostStatus":{"type":"object","properties":{"state":{"type":"string","example":"available","enum":["available","unreachable","error"]}},"example":{"state":"available"},"required":["state"]},"Instance":{"type":"object","properties":{"created_at":{"type":"string","description":"The time that the instance was created.","example":"1975-11-29T11:29:36Z","format":"date-time"},"host_id":{"type":"string","description":"The ID of the host this instance is running on.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"id":{"type":"string","description":"Unique identifier for the instance.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"interfaces":{"type":"array","items":{"$ref":"#/components/schemas/InstanceInterface"},"description":"All interfaces that this instance serves on.","example":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}]},"node_name":{"type":"string","description":"The Spock node name for this instance.","example":"n1"},"status":{"$ref":"#/components/schemas/InstanceStatus"},"updated_at":{"type":"string","description":"The time that the instance was last updated.","example":"1975-10-27T03:55:24Z","format":"date-time"}},"example":{"created_at":"1972-05-03T15:38:49Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"unknown","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"backing_up","updated_at":"2000-08-17T12:59:00Z"},"updated_at":"1982-12-11T10:43:34Z"},"required":["id","status"]},"InstanceInterface":{"type":"object","properties":{"hostname":{"type":"string","description":"The hostname of the instance on this interface.","example":"postgres-n1"},"ipv4_address":{"type":"string","description":"The IPv4 address of the instance on this interface.","example":"10.1.0.113","format":"ipv4"},"network_id":{"type":"string","description":"The unique identifier of the network for this interface.","example":"l5imrq28sh6s"},"network_type":{"type":"string","description":"The type of network for this interface.","example":"docker","enum":["docker","host"]},"port":{"type":"integer","description":"The Postgres port for the instance on this interface.","example":5432,"format":"int64"}},"example":{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}},"InstanceStatus":{"type":"object","properties":{"patroni_paused":{"type":"boolean","description":"True if Patroni has been paused for this instance.","example":true},"patroni_state":{"type":"string","example":"crashed","enum":["stopping","stopped","stop failed","crashed","running","starting","start failed","restarting","restart failed","initializing new cluster","initdb failed","running custom bootstrap script","custom bootstrap failed","creating replica","unknown"]},"pending_restart":{"type":"boolean","description":"True if this instance is pending to be restarted from a configuration change.","example":false},"postgres_version":{"type":"string","description":"The version of Postgres for this instance.","example":"17.1"},"read_only":{"type":"boolean","description":"True if this instance is in read-only mode.","example":false},"role":{"type":"string","example":"replica","enum":["replica","primary"]},"spock_version":{"type":"string","description":"The version of Spock for this instance.","example":"4.0.9"},"state":{"type":"string","example":"error","enum":["creating","modifying","backing_up","available","error"]},"updated_at":{"type":"string","description":"The time that the instance status was last updated.","example":"2000-09-09T15:06:57Z","format":"date-time"}},"example":{"patroni_paused":false,"patroni_state":"stopping","pending_restart":false,"postgres_version":"17.1","read_only":false,"role":"replica","spock_version":"4.0.9","state":"creating","updated_at":"1997-12-31T00:50:06Z"},"required":["state"]},"RestoreConfigSpec":{"type":"object","properties":{"node_name":{"type":"string","description":"The name of the node to restore this database from.","example":"n1"},"provider":{"type":"string","description":"The backup provider for this restore configuration.","example":"pgbackrest","enum":["pgbackrest","pg_dump"]},"repository":{"$ref":"#/components/schemas/RestoreRepositorySpec"}},"example":{"node_name":"n1","provider":"pgbackrest","repository":{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}},"required":["provider","node_name","repository"]},"RestoreRepositorySpec":{"type":"object","properties":{"azure_account":{"type":"string","description":"The Azure account name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups"},"azure_container":{"type":"string","description":"The Azure container name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"azure_endpoint":{"type":"string","description":"The optional Azure endpoint for this repository. Only applies when type = 'azure'.","example":"blob.core.usgovcloudapi.net"},"base_path":{"type":"string","description":"The base path within the repository where backups are stored.","example":"/backups"},"gcs_bucket":{"type":"string","description":"The GCS bucket name for this repository. Only applies when type = 'gcs'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"gcs_endpoint":{"type":"string","description":"The optional GCS endpoint for this repository. Only applies when type = 'gcs'.","example":"localhost"},"id":{"type":"string","description":"The unique identifier of this repository.","example":"f6b84a99-5e91-4203-be1e-131fe82e5984"},"s3_bucket":{"type":"string","description":"The S3 bucket name for this repository. Only applies when type = 's3'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"s3_endpoint":{"type":"string","description":"The optional S3 endpoint for this repository. Only applies when type = 's3'.","example":"s3.us-east-1.amazonaws.com"},"s3_region":{"type":"string","description":"The region of the S3 bucket for this repository. Only applies when type = 's3'.","example":"us-east-1"},"type":{"type":"string","description":"The type of this repository.","example":"s3","enum":["s3","gcs","azure"]}},"example":{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},"required":["id","type"]},"UpdateDatabaseRequest":{"type":"object","properties":{"spec":{"$ref":"#/components/schemas/DatabaseSpec"}},"example":{"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"}}}}},"tags":[{"name":"control-plane"}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"pgEdge Control Plane API","description":"Service for creating, modifying, and operating pgEdge databases.","version":"0.0.1"},"servers":[{"url":"http://localhost:3000"}],"paths":{"/cluster":{"get":{"tags":["control-plane"],"summary":"inspect-cluster control-plane","description":"Returns information about the cluster.","operationId":"control-plane#inspect-cluster","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cluster"},"example":{"hosts":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"}],"id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","status":{"state":"available"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"}}}}}}},"/databases":{"get":{"tags":["control-plane"],"summary":"list-databases control-plane","description":"Lists all databases in the cluster.","operationId":"control-plane#list-databases","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Database"},"example":[{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"}]},"example":[{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1979-11-26T06:52:11Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"initializing new cluster","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"modifying","updated_at":"2014-10-05T16:37:36Z"},"updated_at":"1981-04-07T04:09:52Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"}]}}}}},"post":{"tags":["control-plane"],"summary":"create-database control-plane","description":"Creates a new database in the cluster.","operationId":"control-plane#create-database","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDatabaseRequest"},"example":{"id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"}}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Database"},"example":{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1983-06-23T19:00:09Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":false,"patroni_state":"running","pending_restart":false,"postgres_version":"17.1","read_only":false,"role":"replica","spock_version":"4.0.9","state":"available","updated_at":"1987-12-08T09:28:21Z"},"updated_at":"1985-05-18T17:19:50Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"available","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"}}}}}}},"/databases/{database_id}":{"delete":{"tags":["control-plane"],"summary":"delete-database control-plane","description":"Deletes a database from the cluster.","operationId":"control-plane#delete-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to delete.","required":true,"schema":{"type":"string","description":"ID of the database to delete.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"}],"responses":{"204":{"description":"No Content response."}}},"get":{"tags":["control-plane"],"summary":"inspect-database control-plane","description":"Returns information about a particular database in the cluster.","operationId":"control-plane#inspect-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to inspect.","required":true,"schema":{"type":"string","description":"ID of the database to inspect.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Database"},"example":{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1983-06-23T19:00:09Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":false,"patroni_state":"running","pending_restart":false,"postgres_version":"17.1","read_only":false,"role":"replica","spock_version":"4.0.9","state":"available","updated_at":"1987-12-08T09:28:21Z"},"updated_at":"1985-05-18T17:19:50Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"available","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"}}}}}},"post":{"tags":["control-plane"],"summary":"update-database control-plane","description":"Updates a database with the given specification.","operationId":"control-plane#update-database","parameters":[{"name":"database_id","in":"path","description":"ID of the database to update.","required":true,"schema":{"type":"string","description":"ID of the database to update.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDatabaseRequest"},"example":{"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"}}}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Database"},"example":{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1983-06-23T19:00:09Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":false,"patroni_state":"running","pending_restart":false,"postgres_version":"17.1","read_only":false,"role":"replica","spock_version":"4.0.9","state":"available","updated_at":"1987-12-08T09:28:21Z"},"updated_at":"1985-05-18T17:19:50Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"available","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"}}}}}}},"/hosts":{"get":{"tags":["control-plane"],"summary":"list-hosts control-plane","description":"Lists all hosts within the cluster.","operationId":"control-plane#list-hosts","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Host"},"example":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":false,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":false,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"}]},"example":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":false,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":false,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"}]}}}}}},"/hosts/{host_id}":{"delete":{"tags":["control-plane"],"summary":"remove-host control-plane","description":"Removes a host from the cluster.","operationId":"control-plane#remove-host","parameters":[{"name":"host_id","in":"path","description":"ID of the host to remove.","required":true,"schema":{"type":"string","description":"ID of the host to remove.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"}],"responses":{"204":{"description":"No Content response."}}},"get":{"tags":["control-plane"],"summary":"inspect-host control-plane","description":"Returns information about a particular host in the cluster.","operationId":"control-plane#inspect-host","parameters":[{"name":"host_id","in":"path","description":"ID of the host to inspect.","required":true,"schema":{"type":"string","description":"ID of the host to inspect.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Host"},"example":{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":true},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"}}}}}}},"/openapi.json":{"get":{"tags":["control-plane"],"summary":"Download ./gen/http/openapi3.json","operationId":"control-plane#/openapi.json","responses":{"200":{"description":"File downloaded"}}}}},"components":{"schemas":{"BackupConfigSpec":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier for this backup configuration.","example":"default"},"node_names":{"type":"array","items":{"type":"string","example":"Totam dolorem."},"description":"The names of the nodes where this backup configuration should be applied. The configuration will apply to all nodes when this field is empty or unspecified.","example":["n1","n3"]},"provider":{"type":"string","description":"The backup provider for this backup configuration.","example":"pgbackrest","enum":["pgbackrest","pg_dump"]},"repositories":{"type":"array","items":{"$ref":"#/components/schemas/BackupRepositorySpec"},"description":"The repositories for this backup configuration.","example":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}]},"schedules":{"type":"array","items":{"$ref":"#/components/schemas/BackupScheduleSpec"},"description":"The schedules for this backup configuration.","example":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}},"example":{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},"required":["id","provider"]},"BackupRepositorySpec":{"type":"object","properties":{"azure_account":{"type":"string","description":"The Azure account name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups"},"azure_container":{"type":"string","description":"The Azure container name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"azure_endpoint":{"type":"string","description":"The optional Azure endpoint for this repository. Only applies when type = 'azure'.","example":"blob.core.usgovcloudapi.net"},"base_path":{"type":"string","description":"The base path within the repository to store backups.","example":"/backups"},"gcs_bucket":{"type":"string","description":"The GCS bucket name for this repository. Only applies when type = 'gcs'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"gcs_endpoint":{"type":"string","description":"The optional GCS endpoint for this repository. Only applies when type = 'gcs'.","example":"localhost"},"id":{"type":"string","description":"The unique identifier of this repository.","example":"f6b84a99-5e91-4203-be1e-131fe82e5984"},"retention_full":{"type":"integer","description":"The count of full backups to retain or the time to retain full backups.","example":2,"format":"int64"},"retention_full_type":{"type":"string","description":"The type of measure used for retention_full.","example":"count","enum":["time","count"]},"s3_bucket":{"type":"string","description":"The S3 bucket name for this repository. Only applies when type = 's3'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"s3_endpoint":{"type":"string","description":"The optional S3 endpoint for this repository. Only applies when type = 's3'.","example":"s3.us-east-1.amazonaws.com"},"s3_region":{"type":"string","description":"The region of the S3 bucket for this repository. Only applies when type = 's3'.","example":"us-east-1"},"type":{"type":"string","description":"The type of this repository.","example":"s3","enum":["s3","gcs","azure"]}},"example":{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},"required":["type"]},"BackupScheduleSpec":{"type":"object","properties":{"cron_expression":{"type":"string","description":"The cron expression for this schedule.","example":"0 6 * * ?"},"id":{"type":"string","description":"The unique identifier for this backup schedule.","example":"daily-full-backup"},"type":{"type":"string","description":"The type of backup to take on this schedule.","example":"full","enum":["full","incr"]}},"example":{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},"required":["id","type","cron_expression"]},"Cluster":{"type":"object","properties":{"hosts":{"type":"array","items":{"$ref":"#/components/schemas/Host"},"description":"All of the hosts in the cluster.","example":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"}]},"id":{"type":"string","description":"Unique identifier for the cluster.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"status":{"$ref":"#/components/schemas/ClusterStatus"},"tenant_id":{"type":"string","description":"Unique identifier for the cluster's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"example":{"hosts":[{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"},{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"swarm"}],"id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","status":{"state":"available"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"},"required":["id","tenant_id","status","hosts"]},"ClusterStatus":{"type":"object","properties":{"state":{"type":"string","description":"The current state of the cluster.","example":"error","enum":["available","error"]}},"example":{"state":"available"},"required":["state"]},"CreateDatabaseRequest":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the database.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"spec":{"$ref":"#/components/schemas/DatabaseSpec"},"tenant_id":{"type":"string","description":"Unique identifier for the databases's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"example":{"id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954"}},"Database":{"type":"object","properties":{"created_at":{"type":"string","description":"The time that the database was created.","example":"2025-01-01T01:30:00Z","format":"date-time"},"id":{"type":"string","description":"Unique identifier for the database.","example":"02f1a7db-fca8-4521-b57a-2a375c1ced51"},"instances":{"$ref":"#/components/schemas/Instance"},"spec":{"$ref":"#/components/schemas/DatabaseSpec"},"status":{"$ref":"#/components/schemas/DatabaseStatus"},"tenant_id":{"type":"string","description":"Unique identifier for the databases's owner.","example":"8210ec10-2dca-406c-ac4a-0661d2189954"},"updated_at":{"type":"string","description":"The time that the database was last updated.","example":"2025-01-01T02:30:00Z","format":"date-time"}},"example":{"created_at":"2025-01-01T01:30:00Z","id":"02f1a7db-fca8-4521-b57a-2a375c1ced51","instances":{"created_at":"1975-03-20T03:08:32Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"unknown","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"backing_up","updated_at":"2000-08-17T12:59:00Z"},"updated_at":"1972-05-07T22:20:35Z"},"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"status":{"state":"error","updated_at":"2025-01-01T10:30:37Z"},"tenant_id":"8210ec10-2dca-406c-ac4a-0661d2189954","updated_at":"2025-01-01T02:30:00Z"},"required":["id","status","instances"]},"DatabaseExtensionSpec":{"type":"object","properties":{"name":{"type":"string","description":"The name of the extension to install in this database.","example":"postgis"},"version":{"type":"string","description":"The version of the extension to install in this database.","example":"1.2.3"}},"example":{"name":"postgis","version":"1.2.3"},"required":["name"]},"DatabaseNodeSpec":{"type":"object","properties":{"host_id":{"type":"string","description":"The ID of the host that should run this node.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"instance_id":{"type":"string","description":"A unique identifier for the instance that will be created from this node specification.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"name":{"type":"string","description":"The name of the database node.","example":"n1"},"port":{"type":"integer","description":"The port used by the Postgres database for this node. Overrides the Postgres port set in the DatabaseSpec.","example":5432,"format":"int64"},"postgres_version":{"type":"string","description":"The major version of Postgres for this node. Overrides the Postgres version set in the DatabaseSpec.","example":"17","enum":["16","17"]},"postgresql_conf":{"type":"object","description":"Additional postgresql.conf settings for this particular node. Will be merged with the settings provided by control-plane.","example":{"max_connections":1000},"additionalProperties":true},"read_replicas":{"$ref":"#/components/schemas/DatabaseReplicaSpec"}},"example":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},"required":["name","instance_id","host_id"]},"DatabaseReplicaSpec":{"type":"object","properties":{"host_id":{"type":"string","description":"The ID of the host that should run this read replica.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"instance_id":{"type":"string","description":"A unique identifier for the instance that will be created from this replica specification.","example":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},"example":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"},"required":["instance_id","host_id"]},"DatabaseSpec":{"type":"object","properties":{"backup_configs":{"type":"array","items":{"$ref":"#/components/schemas/BackupConfigSpec"},"description":"The backup configurations for this database.","example":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}]},"database_name":{"type":"string","description":"The name of the Postgres database.","example":"northwind"},"database_users":{"type":"array","items":{"$ref":"#/components/schemas/DatabaseUserSpec"},"description":"The users to create for this database.","example":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}]},"deletion_protection":{"type":"boolean","description":"Prevents deletion when true.","example":true},"extensions":{"type":"array","items":{"$ref":"#/components/schemas/DatabaseExtensionSpec"},"description":"The extensions to install for this database.","example":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}]},"features":{"type":"object","description":"The feature flags for this database.","example":{"some_feature":"enabled"},"additionalProperties":{"type":"string","example":"Nihil facere ad tenetur iure quisquam."}},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/DatabaseNodeSpec"},"description":"The Spock nodes for this database.","example":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}]},"port":{"type":"integer","description":"The port used by the Postgres database.","example":5432,"format":"int64"},"postgres_version":{"type":"string","description":"The major version of the Postgres database.","example":"17","enum":["16","17"]},"postgresql_conf":{"type":"object","description":"Additional postgresql.conf settings. Will be merged with the settings provided by control-plane.","example":{"max_connections":1000},"additionalProperties":true},"spock_version":{"type":"string","description":"The major version of the Spock extension.","example":"4","enum":["4"]}},"example":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"},"required":["database_name","nodes"]},"DatabaseStatus":{"type":"object","properties":{"state":{"type":"string","example":"available","enum":["creating","modifying","available","error"]},"updated_at":{"type":"string","description":"The time that the database status was last updated.","example":"2025-01-01T10:30:37Z","format":"date-time"}},"example":{"state":"modifying","updated_at":"2025-01-01T10:30:37Z"}},"DatabaseUserSpec":{"type":"object","properties":{"password":{"type":"string","description":"The password for this database user.","example":"secret"},"roles":{"type":"array","items":{"type":"string","example":"Voluptatum nulla commodi quo aut facere."},"description":"The roles to assign to this database user.","example":["application_read_only"]},"superuser":{"type":"boolean","description":"Enables SUPERUSER for this database user when true.","example":true},"username":{"type":"string","description":"The username for this database user.","example":"admin"}},"example":{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},"required":["username","password"]},"Host":{"type":"object","properties":{"cohort":{"type":"string","description":"The cohort that this host belongs to","example":"pps1n11hqijn9rbee4cjil453"},"config":{"$ref":"#/components/schemas/HostConfiguration"},"hostname":{"type":"string","description":"The hostname of this host.","example":"i-0123456789abcdef.ec2.internal"},"id":{"type":"string","description":"Unique identifier for the host","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"ipv4_address":{"type":"string","description":"The IPv4 address of this host.","example":"10.24.34.0","format":"ipv4"},"status":{"$ref":"#/components/schemas/HostStatus"},"type":{"type":"string","description":"The type of this host","example":"swarm","enum":["swarm","systemd"]}},"example":{"cohort":"pps1n11hqijn9rbee4cjil453","config":{"traefik_enabled":true,"vector_enabled":false},"hostname":"i-0123456789abcdef.ec2.internal","id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","ipv4_address":"10.24.34.0","status":{"state":"available"},"type":"systemd"},"required":["id","status","hostname","ipv4_address"]},"HostConfiguration":{"type":"object","properties":{"traefik_enabled":{"type":"boolean","description":"Enables the Treafik load balancer","example":false},"vector_enabled":{"type":"boolean","description":"Enables the Vector service for metrics and log collection","example":false}},"example":{"traefik_enabled":true,"vector_enabled":false}},"HostStatus":{"type":"object","properties":{"state":{"type":"string","example":"available","enum":["available","unreachable","error"]}},"example":{"state":"available"},"required":["state"]},"Instance":{"type":"object","properties":{"created_at":{"type":"string","description":"The time that the instance was created.","example":"1975-11-29T11:29:36Z","format":"date-time"},"host_id":{"type":"string","description":"The ID of the host this instance is running on.","example":"de3b1388-1f0c-42f1-a86c-59ab72f255ec"},"id":{"type":"string","description":"Unique identifier for the instance.","example":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d"},"interfaces":{"type":"array","items":{"$ref":"#/components/schemas/InstanceInterface"},"description":"All interfaces that this instance serves on.","example":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}]},"node_name":{"type":"string","description":"The Spock node name for this instance.","example":"n1"},"status":{"$ref":"#/components/schemas/InstanceStatus"},"updated_at":{"type":"string","description":"The time that the instance was last updated.","example":"1975-10-27T03:55:24Z","format":"date-time"}},"example":{"created_at":"1972-05-03T15:38:49Z","host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","interfaces":[{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432},{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}],"node_name":"n1","status":{"patroni_paused":true,"patroni_state":"unknown","pending_restart":false,"postgres_version":"17.1","read_only":true,"role":"primary","spock_version":"4.0.9","state":"backing_up","updated_at":"2000-08-17T12:59:00Z"},"updated_at":"1982-12-11T10:43:34Z"},"required":["id","status"]},"InstanceInterface":{"type":"object","properties":{"hostname":{"type":"string","description":"The hostname of the instance on this interface.","example":"postgres-n1"},"ipv4_address":{"type":"string","description":"The IPv4 address of the instance on this interface.","example":"10.1.0.113","format":"ipv4"},"network_id":{"type":"string","description":"The unique identifier of the network for this interface.","example":"l5imrq28sh6s"},"network_type":{"type":"string","description":"The type of network for this interface.","example":"docker","enum":["docker","host"]},"port":{"type":"integer","description":"The Postgres port for the instance on this interface.","example":5432,"format":"int64"}},"example":{"hostname":"postgres-n1","ipv4_address":"10.1.0.113","network_id":"l5imrq28sh6s","network_type":"docker","port":5432}},"InstanceStatus":{"type":"object","properties":{"patroni_paused":{"type":"boolean","description":"True if Patroni has been paused for this instance.","example":true},"patroni_state":{"type":"string","example":"crashed","enum":["stopping","stopped","stop failed","crashed","running","starting","start failed","restarting","restart failed","initializing new cluster","initdb failed","running custom bootstrap script","custom bootstrap failed","creating replica","unknown"]},"pending_restart":{"type":"boolean","description":"True if this instance is pending to be restarted from a configuration change.","example":false},"postgres_version":{"type":"string","description":"The version of Postgres for this instance.","example":"17.1"},"read_only":{"type":"boolean","description":"True if this instance is in read-only mode.","example":false},"role":{"type":"string","example":"replica","enum":["replica","primary"]},"spock_version":{"type":"string","description":"The version of Spock for this instance.","example":"4.0.9"},"state":{"type":"string","example":"error","enum":["creating","modifying","backing_up","available","error"]},"updated_at":{"type":"string","description":"The time that the instance status was last updated.","example":"2000-09-09T15:06:57Z","format":"date-time"}},"example":{"patroni_paused":false,"patroni_state":"stopping","pending_restart":false,"postgres_version":"17.1","read_only":false,"role":"replica","spock_version":"4.0.9","state":"creating","updated_at":"1997-12-31T00:50:06Z"},"required":["state"]},"RestoreConfigSpec":{"type":"object","properties":{"node_name":{"type":"string","description":"The name of the node to restore this database from.","example":"n1"},"provider":{"type":"string","description":"The backup provider for this restore configuration.","example":"pgbackrest","enum":["pgbackrest","pg_dump"]},"repository":{"$ref":"#/components/schemas/RestoreRepositorySpec"}},"example":{"node_name":"n1","provider":"pgbackrest","repository":{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}},"required":["provider","node_name","repository"]},"RestoreRepositorySpec":{"type":"object","properties":{"azure_account":{"type":"string","description":"The Azure account name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups"},"azure_container":{"type":"string","description":"The Azure container name for this repository. Only applies when type = 'azure'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"azure_endpoint":{"type":"string","description":"The optional Azure endpoint for this repository. Only applies when type = 'azure'.","example":"blob.core.usgovcloudapi.net"},"base_path":{"type":"string","description":"The base path within the repository where backups are stored.","example":"/backups"},"gcs_bucket":{"type":"string","description":"The GCS bucket name for this repository. Only applies when type = 'gcs'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"gcs_endpoint":{"type":"string","description":"The optional GCS endpoint for this repository. Only applies when type = 'gcs'.","example":"localhost"},"id":{"type":"string","description":"The unique identifier of this repository.","example":"f6b84a99-5e91-4203-be1e-131fe82e5984"},"s3_bucket":{"type":"string","description":"The S3 bucket name for this repository. Only applies when type = 's3'.","example":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1"},"s3_endpoint":{"type":"string","description":"The optional S3 endpoint for this repository. Only applies when type = 's3'.","example":"s3.us-east-1.amazonaws.com"},"s3_region":{"type":"string","description":"The region of the S3 bucket for this repository. Only applies when type = 's3'.","example":"us-east-1"},"type":{"type":"string","description":"The type of this repository.","example":"s3","enum":["s3","gcs","azure"]}},"example":{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},"required":["id","type"]},"UpdateDatabaseRequest":{"type":"object","properties":{"spec":{"$ref":"#/components/schemas/DatabaseSpec"}},"example":{"spec":{"backup_configs":[{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]},{"id":"default","node_names":["n1","n3"],"provider":"pgbackrest","repositories":[{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"},{"azure_account":"pgedge-backups","azure_container":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","azure_endpoint":"blob.core.usgovcloudapi.net","base_path":"/backups","gcs_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","gcs_endpoint":"localhost","id":"f6b84a99-5e91-4203-be1e-131fe82e5984","retention_full":2,"retention_full_type":"count","s3_bucket":"pgedge-backups-9f81786f-373b-4ff2-afee-e054a06a96f1","s3_endpoint":"s3.us-east-1.amazonaws.com","s3_region":"us-east-1","type":"s3"}],"schedules":[{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"},{"cron_expression":"0 6 * * ?","id":"daily-full-backup","type":"full"}]}],"database_name":"northwind","database_users":[{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"},{"password":"secret","roles":["application_read_only"],"superuser":true,"username":"admin"}],"deletion_protection":true,"extensions":[{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"},{"name":"postgis","version":"1.2.3"}],"features":{"some_feature":"enabled"},"nodes":[{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}},{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"a67cbb36-c3c3-49c9-8aac-f4a0438a883d","name":"n1","port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"read_replicas":{"host_id":"de3b1388-1f0c-42f1-a86c-59ab72f255ec","instance_id":"5ec51c55-0921-445e-9d5b-32f5fb5dfbae"}}],"port":5432,"postgres_version":"17","postgresql_conf":{"max_connections":1000},"spock_version":"4"}}}}},"tags":[{"name":"control-plane"}]} \ No newline at end of file diff --git a/api/gen/http/openapi3.yaml b/api/gen/http/openapi3.yaml index 64f1d9d4..409e1c58 100644 --- a/api/gen/http/openapi3.yaml +++ b/api/gen/http/openapi3.yaml @@ -2577,7 +2577,7 @@ paths: get: tags: - control-plane - summary: Download ./gen/http/openapi.json + summary: Download ./gen/http/openapi3.json operationId: control-plane#/openapi.json responses: "200": diff --git a/api/go.mod b/api/go.mod index ffd03497..93eabb6e 100644 --- a/api/go.mod +++ b/api/go.mod @@ -10,12 +10,15 @@ require ( github.com/go-chi/chi/v5 v5.1.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect + github.com/kr/pretty v0.3.1 // indirect github.com/manveru/faker v0.0.0-20171103152722-9fbc68a78c4d // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/testify v1.9.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/stretchr/testify v1.10.0 // indirect golang.org/x/mod v0.21.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/text v0.18.0 // indirect + golang.org/x/text v0.19.0 // indirect golang.org/x/tools v0.25.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/api/go.sum b/api/go.sum index 50bc10de..7a837ae0 100644 --- a/api/go.sum +++ b/api/go.sum @@ -1,3 +1,4 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dimfeld/httppath v0.0.0-20170720192232-ee938bf73598 h1:MGKhKyiYrvMDZsmLR/+RGffQSXwEkXgfLSA08qDn9AI= @@ -8,25 +9,37 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/manveru/faker v0.0.0-20171103152722-9fbc68a78c4d h1:Zj+PHjnhRYWBK6RqCDBcAhLXoi3TzC27Zad/Vn+gnVQ= github.com/manveru/faker v0.0.0-20171103152722-9fbc68a78c4d/go.mod h1:WZy8Q5coAB1zhY9AOBJP0O6J4BuDfbupUDavKY+I3+s= github.com/manveru/gobdd v0.0.0-20131210092515-f1a17fdd710b h1:3E44bLeN8uKYdfQqVQycPnaVviZdBLbizFhU49mtbe4= github.com/manveru/gobdd v0.0.0-20131210092515-f1a17fdd710b/go.mod h1:Bj8LjjP0ReT1eKt5QlKjwgi5AFm5mI6O1A2G4ChI0Ag= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= goa.design/goa/v3 v3.19.1 h1:jpV3LEy7YANzPMwm++Lu17RoThRJgXrPxdEM0A1nlOE= goa.design/goa/v3 v3.19.1/go.mod h1:astNE9ube0YCxqq7DQkt1MtLxB/b3kRPEFkEZovcO2I= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/api/openapi.go b/api/openapi.go new file mode 100644 index 00000000..b9f438f7 --- /dev/null +++ b/api/openapi.go @@ -0,0 +1,6 @@ +package api + +import "embed" + +//go:embed gen/http/openapi3.json +var OpenAPISpecFS embed.FS From aaa90523576bd179f57fa4d889150bfd4550c155 Mon Sep 17 00:00:00 2001 From: Jason Lynch Date: Thu, 16 Jan 2025 17:08:40 -0500 Subject: [PATCH 2/4] refactor(mqtt): move error out of endpoint constructor This change makes the MQTT code more symmetrical with http.Server by deferring all errors until `Connect` is called. It makes this library a little more ergonomic because we only need to implement one set of error handling. --- mqtt/endpoint.go | 23 ++++++++++---------- mqtt/endpoint_test.go | 50 ++++++++++++++++++------------------------- mqtt/http.go | 22 +++++++++---------- mqtt/http_test.go | 12 ++++------- 4 files changed, 47 insertions(+), 60 deletions(-) diff --git a/mqtt/endpoint.go b/mqtt/endpoint.go index f6f53fcf..f0f0fc92 100644 --- a/mqtt/endpoint.go +++ b/mqtt/endpoint.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "net/url" - "strings" "sync" "time" @@ -98,7 +97,7 @@ func (c *Call) Payload() ([]byte, error) { return json.Marshal(c.Request) } -func New(config Config) (*MQTTEndpoint, error) { +func New(config Config) *MQTTEndpoint { clientID := config.Broker.ClientID if clientID == "" { clientID = fmt.Sprintf("mqtt-%s", uuid.New()) @@ -108,13 +107,6 @@ func New(config Config) (*MQTTEndpoint, error) { if handlerTimeout == 0 { handlerTimeout = time.Minute } - url := config.Broker.URL - if url == "" { - return nil, errors.New("url is required") - } - if !strings.HasPrefix(url, "tls://") && !strings.HasPrefix(url, "tcp://") { - url = fmt.Sprintf("tls://%s:8883", url) - } var logger zerolog.Logger if config.Logger != nil { logger = *config.Logger @@ -123,7 +115,7 @@ func New(config Config) (*MQTTEndpoint, error) { } e := &MQTTEndpoint{ logger: logger, - url: url, + url: config.Broker.URL, clientID: clientID, responseTopic: respTopic, responseChans: make(map[string]chan *paho.Publish), @@ -153,7 +145,7 @@ func New(config Config) (*MQTTEndpoint, error) { // Response handler e.router.RegisterHandler(respTopic, e.handleResponse) e.subs[respTopic] = true - return e, nil + return e } func (e *MQTTEndpoint) Connect(ctx context.Context) error { @@ -164,10 +156,19 @@ func (e *MQTTEndpoint) Connect(ctx context.Context) error { return errors.New("mqtt endpoint is already connected") } e.subsErr = nil + if e.url == "" { + return errors.New("got empty broker URL") + } brokerURL, err := url.Parse(e.url) if err != nil { return fmt.Errorf("failed to parse mqtt url: %v", err) } + if brokerURL.Scheme == "" { + brokerURL.Scheme = "tls" + } + if brokerURL.Port() == "" { + brokerURL.Host = fmt.Sprintf("%s:%d", brokerURL.Hostname(), 8883) + } readyChan := make(chan struct{}) e.cm, err = autopaho.NewConnection(ctx, e.getPahoConfig(brokerURL, readyChan)) if err != nil { diff --git a/mqtt/endpoint_test.go b/mqtt/endpoint_test.go index 1ba1674d..102c7224 100644 --- a/mqtt/endpoint_test.go +++ b/mqtt/endpoint_test.go @@ -15,14 +15,13 @@ import ( func TestConnectAndDisconnect(t *testing.T) { ctx, broker := setupTestBroker(t) - endpoint, err := mqtt.New(mqtt.Config{ + endpoint := mqtt.New(mqtt.Config{ Broker: mqtt.BrokerConfig{ URL: broker.URL(), }, }) - require.Nil(t, err) - require.Nil(t, endpoint.Connect(ctx)) - require.Nil(t, endpoint.Disconnect(ctx)) + require.NoError(t, endpoint.Connect(ctx)) + require.NoError(t, endpoint.Disconnect(ctx)) } func TestPublishAndReceive(t *testing.T) { @@ -30,7 +29,7 @@ func TestPublishAndReceive(t *testing.T) { receiveChan := make(chan *mqtt.Message) - receiver, err := mqtt.New(mqtt.Config{ + receiver := mqtt.New(mqtt.Config{ Broker: mqtt.BrokerConfig{ URL: broker.URL(), }, @@ -41,25 +40,23 @@ func TestPublishAndReceive(t *testing.T) { }, }, }) - require.Nil(t, err) - require.Nil(t, receiver.Connect(ctx)) + require.NoError(t, receiver.Connect(ctx)) defer receiver.Disconnect(ctx) - sender, err := mqtt.New(mqtt.Config{ + sender := mqtt.New(mqtt.Config{ Broker: mqtt.BrokerConfig{ URL: broker.URL(), }, }) - require.Nil(t, err) - require.Nil(t, sender.Connect(ctx)) + require.NoError(t, sender.Connect(ctx)) defer sender.Disconnect(ctx) - err = sender.Publish(ctx, &mqtt.Message{ + err := sender.Publish(ctx, &mqtt.Message{ Topic: "data/test", Payload: []byte("HELLO"), QoS: 2, }) - require.Nil(t, err) + require.NoError(t, err) select { case msg := <-receiveChan: @@ -75,7 +72,7 @@ func TestCall(t *testing.T) { ctx, broker := setupTestBroker(t) // Create a service that responds to commands - service, err := mqtt.New(mqtt.Config{ + service := mqtt.New(mqtt.Config{ Broker: mqtt.BrokerConfig{ Username: "service", URL: broker.URL(), @@ -93,29 +90,27 @@ func TestCall(t *testing.T) { }, }, }) - require.Nil(t, err) - require.Nil(t, service.Connect(ctx)) + require.NoError(t, service.Connect(ctx)) defer service.Disconnect(ctx) // Create a client that calls the service - client, err := mqtt.New(mqtt.Config{ + client := mqtt.New(mqtt.Config{ Broker: mqtt.BrokerConfig{ Username: "client", URL: broker.URL(), }, }) - require.Nil(t, err) - require.Nil(t, client.Connect(ctx)) + require.NoError(t, client.Connect(ctx)) defer client.Disconnect(ctx) // cmd/echo should yield a response with the request value var responseMap map[string]interface{} - err = client.Call(ctx, &mqtt.Call{ + err := client.Call(ctx, &mqtt.Call{ Topic: "cmd/echo", Request: map[string]interface{}{"poem": "jabberwocky"}, Response: &responseMap, }) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, map[string]interface{}{"poem": "jabberwocky"}, responseMap) // cmd/ping should yield a "pong" response @@ -124,7 +119,7 @@ func TestCall(t *testing.T) { Topic: "cmd/ping", Response: &responseStr, }) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "pong", responseStr) // cmd/error should return an error @@ -138,7 +133,7 @@ func TestCall(t *testing.T) { func TestUnsupportedOperation(t *testing.T) { ctx, broker := setupTestBroker(t) - service, err := mqtt.New(mqtt.Config{ + service := mqtt.New(mqtt.Config{ Broker: mqtt.BrokerConfig{ Username: "service", URL: broker.URL(), @@ -147,26 +142,23 @@ func TestUnsupportedOperation(t *testing.T) { Subscriptions: []string{"cmd/#"}, RequestHandlers: map[string]mqtt.RequestHandler{}, }) - require.Nil(t, err) - require.Nil(t, service.Connect(ctx)) + require.NoError(t, service.Connect(ctx)) defer service.Disconnect(ctx) // Create a client that calls the service - client, err := mqtt.New(mqtt.Config{ + client := mqtt.New(mqtt.Config{ Broker: mqtt.BrokerConfig{ Username: "client", URL: broker.URL(), }, }) - require.Nil(t, err) - require.Nil(t, client.Connect(ctx)) + require.NoError(t, client.Connect(ctx)) defer client.Disconnect(ctx) // cmd/unsupported should return an "unsupported operation" error - err = client.Call(ctx, &mqtt.Call{ + err := client.Call(ctx, &mqtt.Call{ Topic: "cmd/unsupported", }) - require.NotNil(t, err) require.ErrorIs(t, err, mqtt.ErrUnsupported) } diff --git a/mqtt/http.go b/mqtt/http.go index b3f1aefc..d60d8c20 100644 --- a/mqtt/http.go +++ b/mqtt/http.go @@ -8,6 +8,8 @@ import ( "io" "net/http" "time" + + "github.com/rs/zerolog" ) // HTTPServer is an HTTP server that communicates over MQTT. It works by reading @@ -22,17 +24,16 @@ type HTTPServerConfig struct { Broker BrokerConfig HandlerTimeout time.Duration Handler http.Handler + Logger *zerolog.Logger } -func NewHTTPServer(config HTTPServerConfig) (*HTTPServer, error) { - endpoint, err := New(Config{ +func NewHTTPServer(config HTTPServerConfig) *HTTPServer { + endpoint := New(Config{ Broker: config.Broker, HandlerTimeout: config.HandlerTimeout, Subscriptions: []string{config.Topic}, + Logger: config.Logger, }) - if err != nil { - return nil, err - } svr := &HTTPServer{ endpoint: endpoint, @@ -40,7 +41,7 @@ func NewHTTPServer(config HTTPServerConfig) (*HTTPServer, error) { } endpoint.RegisterRequestHandler(config.Topic, svr.handleRequest) - return svr, nil + return svr } func (s *HTTPServer) Start(ctx context.Context) error { @@ -88,20 +89,17 @@ type HTTPDoerConfig struct { Retain bool } -func NewHTTPDoer(config HTTPDoerConfig) (*HTTPDoer, error) { - endpoint, err := New(Config{ +func NewHTTPDoer(config HTTPDoerConfig) *HTTPDoer { + endpoint := New(Config{ Broker: config.Broker, }) - if err != nil { - return nil, err - } return &HTTPDoer{ topic: config.Topic, endpoint: endpoint, maxWait: config.MaxWait, qos: config.QoS, retain: config.Retain, - }, nil + } } func (d *HTTPDoer) Connect(ctx context.Context) error { diff --git a/mqtt/http_test.go b/mqtt/http_test.go index f1a48134..5c451d5f 100644 --- a/mqtt/http_test.go +++ b/mqtt/http_test.go @@ -32,25 +32,23 @@ func TestHTTPRequestResponse(t *testing.T) { } }) - server, err := mqtt.NewHTTPServer(mqtt.HTTPServerConfig{ + server := mqtt.NewHTTPServer(mqtt.HTTPServerConfig{ Topic: t.Name(), Broker: mqtt.BrokerConfig{ URL: broker.URL(), }, Handler: mux, }) - require.NoError(t, err) require.NoError(t, server.Start(ctx)) defer server.Stop(ctx) - doer, err := mqtt.NewHTTPDoer(mqtt.HTTPDoerConfig{ + doer := mqtt.NewHTTPDoer(mqtt.HTTPDoerConfig{ Topic: t.Name(), Broker: mqtt.BrokerConfig{ URL: broker.URL(), }, }) - require.NoError(t, err) require.NoError(t, doer.Connect(ctx)) defer doer.Disconnect(ctx) @@ -77,7 +75,7 @@ func TestHTTPRequestResponse(t *testing.T) { t.Run("message retain", func(t *testing.T) { // validates that the client can be configured in a way that its // requests will be retained even if the server is down. - doer, err := mqtt.NewHTTPDoer(mqtt.HTTPDoerConfig{ + doer := mqtt.NewHTTPDoer(mqtt.HTTPDoerConfig{ Topic: t.Name(), Broker: mqtt.BrokerConfig{ URL: broker.URL(), @@ -86,7 +84,6 @@ func TestHTTPRequestResponse(t *testing.T) { QoS: 2, Retain: true, }) - require.NoError(t, err) require.NoError(t, doer.Connect(ctx)) defer doer.Disconnect(ctx) @@ -119,14 +116,13 @@ func TestHTTPRequestResponse(t *testing.T) { } }) - server, err := mqtt.NewHTTPServer(mqtt.HTTPServerConfig{ + server := mqtt.NewHTTPServer(mqtt.HTTPServerConfig{ Topic: t.Name(), Broker: mqtt.BrokerConfig{ URL: broker.URL(), }, Handler: mux, }) - require.NoError(t, err) require.NoError(t, server.Start(ctx)) defer server.Stop(ctx) From d5238a8634b671b9dd6530adccaa64b85fdc0e2e Mon Sep 17 00:00:00 2001 From: Jason Lynch Date: Thu, 16 Jan 2025 17:19:52 -0500 Subject: [PATCH 3/4] feat(server): run command This commit adds a `run` command to the server module that starts an HTTP server and an HTTP-over-MQTT server. It also includes a configuration mechanism that supports configuration via a file, environment variables, or command line arguments. The HTTP server is enabled by default in this configuration. The MQTT server is disabled by default, but can optionally be enabled via a config file or environment variables. --- server/cmd/root.go | 77 ++++++++++++++ server/cmd/run.go | 54 ++++++++++ server/go.mod | 38 ++++++- server/go.sum | 128 ++++++++++++++++++++-- server/internal/api/http.go | 52 +++++++++ server/internal/api/middleware.go | 41 ++++++++ server/internal/api/mqtt.go | 61 +++++++++++ server/internal/api/server.go | 95 +++++++++++++++++ server/internal/api/service.go | 58 ++++++++++ server/internal/config/config.go | 169 ++++++++++++++++++++++++++++++ server/internal/logging/logger.go | 64 +++++++++++ server/main.go | 7 ++ 12 files changed, 831 insertions(+), 13 deletions(-) create mode 100644 server/cmd/root.go create mode 100644 server/cmd/run.go create mode 100644 server/internal/api/http.go create mode 100644 server/internal/api/middleware.go create mode 100644 server/internal/api/mqtt.go create mode 100644 server/internal/api/server.go create mode 100644 server/internal/api/service.go create mode 100644 server/internal/config/config.go create mode 100644 server/internal/logging/logger.go create mode 100644 server/main.go diff --git a/server/cmd/root.go b/server/cmd/root.go new file mode 100644 index 00000000..644b3c5f --- /dev/null +++ b/server/cmd/root.go @@ -0,0 +1,77 @@ +package cmd + +import ( + "fmt" + + "github.com/rs/zerolog" + "github.com/spf13/cobra" + + "github.com/pgEdge/control-plane/server/internal/config" + "github.com/pgEdge/control-plane/server/internal/logging" +) + +var ( + configPath string + configMgr *config.Manager + logger zerolog.Logger +) + +func newRootCmd() *cobra.Command { + return &cobra.Command{ + Use: "control-plane", + Short: "pgEdge control plane server", + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + cmd.SilenceErrors = true + + sources := []*config.Source{ + config.NewEnvVarSource(), + config.NewPFlagSource(cmd.Flags()), + } + if configPath != "" { + sources = append(sources, config.NewJsonFileSource(configPath)) + } + mgr, err := config.NewManager(sources...) + if err != nil { + return fmt.Errorf("failed to initialize config manager: %w", err) + } + configMgr = mgr + + cfg := configMgr.Config() + + lgr, err := logging.NewLogger(cfg.Logging) + if err != nil { + return fmt.Errorf("failed to initialize logger: %w", err) + } + logger = lgr.With(). + Str("tenant_id", cfg.TenantID). + Str("cluster_id", cfg.ClusterID). + Str("host_id", cfg.HostID). + Logger() + + zerolog.DefaultContextLogger = &logger + + return nil + }, + } +} + +func Execute() { + rootCmd := newRootCmd() + rootCmd.PersistentFlags().StringVarP(&configPath, "config-path", "c", "", "Path to the config.json file for this service.") + rootCmd.PersistentFlags().StringP("logging.level", "l", "", "The logging level, e.g. 'debug', 'info', 'error', etc.") + rootCmd.PersistentFlags().BoolP("logging.pretty", "p", false, "Use pretty logging instead of JSON logging.") + + rootCmd.AddCommand(newRunCommand()) + + if err := rootCmd.Execute(); err != nil { + if logger.GetLevel() == zerolog.NoLevel { + // The zero value for zerolog.Logger has level set to NoLevel. We + // want to use our fallback logger in this case. + logging.Fatal(err, "command failed") + } else { + logger.Fatal(). + Err(err). + Msg("command failed") + } + } +} diff --git a/server/cmd/run.go b/server/cmd/run.go new file mode 100644 index 00000000..11368214 --- /dev/null +++ b/server/cmd/run.go @@ -0,0 +1,54 @@ +package cmd + +import ( + "context" + "os" + "os/signal" + "syscall" + "time" + + "github.com/pgEdge/control-plane/server/internal/api" + "github.com/spf13/cobra" +) + +func newRunCommand() *cobra.Command { + return &cobra.Command{ + Use: "run", + Short: "Run the server", + RunE: func(cmd *cobra.Command, args []string) error { + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + defer stop() + + cfg := configMgr.Config() + server := api.NewServer(configMgr.Config(), logger) + server.Start(ctx) + + shutdown := func() { + logger.Info().Msg("attempting to shut gracefully. press ctrl+c again to force shutdown.") + + gracePeriod := time.Second * time.Duration(cfg.StopGracePeriodSeconds) + shutdownCtx, cancel := context.WithTimeout(context.Background(), gracePeriod) + defer cancel() + + if err := server.Stop(shutdownCtx); err != nil { + logger.Err(err).Msg("error while stopping the server") + } + } + + select { + case <-ctx.Done(): + logger.Info().Msg("got shutdown signal") + + shutdown() + case err := <-server.Error(): + logger.Err(err).Msg("server error") + + shutdown() + + return err + } + + return nil + }, + } +} diff --git a/server/go.mod b/server/go.mod index edee1627..9a044e5b 100644 --- a/server/go.mod +++ b/server/go.mod @@ -5,12 +5,24 @@ go 1.23.1 require ( github.com/cschleiden/go-workflows v0.19.0 github.com/google/uuid v1.6.0 - github.com/stretchr/testify v1.9.0 + github.com/knadh/koanf/parsers/json v0.1.0 + github.com/knadh/koanf/providers/env v1.0.0 + github.com/knadh/koanf/providers/file v1.1.2 + github.com/knadh/koanf/providers/posflag v0.1.0 + github.com/knadh/koanf/providers/structs v0.1.0 + github.com/knadh/koanf/v2 v2.1.2 + github.com/pgEdge/control-plane/api v0.0.0 + github.com/pgEdge/control-plane/mqtt v0.0.0 + github.com/rs/zerolog v1.33.0 + github.com/spf13/cobra v1.7.0 + github.com/spf13/pflag v1.0.5 + github.com/stretchr/testify v1.10.0 go.etcd.io/etcd/api/v3 v3.5.17 go.etcd.io/etcd/client/v3 v3.5.17 go.etcd.io/etcd/server/v3 v3.5.17 go.opentelemetry.io/otel/trace v1.31.0 go.uber.org/zap v1.24.0 + goa.design/goa/v3 v3.19.1 ) require ( @@ -19,25 +31,36 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.3.2 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/eclipse/paho.golang v0.22.0 // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-chi/chi/v5 v5.1.0 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.4.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/btree v1.0.1 // indirect - github.com/gorilla/websocket v1.4.2 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jellydator/ttlcache/v3 v3.0.0 // indirect github.com/jonboulle/clockwork v0.2.2 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -45,9 +68,9 @@ require ( github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/procfs v0.7.3 // indirect + github.com/rs/xid v1.5.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/soheilhy/cmux v0.1.5 // indirect - github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 // indirect github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect @@ -73,7 +96,7 @@ require ( golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect google.golang.org/grpc v1.67.1 // indirect google.golang.org/protobuf v1.35.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect @@ -81,3 +104,8 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect sigs.k8s.io/yaml v1.2.0 // indirect ) + +replace ( + github.com/pgEdge/control-plane/api => ../api + github.com/pgEdge/control-plane/mqtt => ../mqtt +) diff --git a/server/go.sum b/server/go.sum index bc66dfa8..4efd9515 100644 --- a/server/go.sum +++ b/server/go.sum @@ -34,11 +34,17 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -67,24 +73,51 @@ github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 h1:N+3sFI5GUjRKBi+i0Tx github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= +github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cschleiden/go-workflows v0.19.0 h1:1QknNvYNr6ka4/8dynlyRfKlG4BS+bp8kjsdve5vmgA= github.com/cschleiden/go-workflows v0.19.0/go.mod h1:ks4nRGXcsCi7U6mM05IbegGgdH4+jAKI0+ia+BAudxw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= +github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eclipse/paho.golang v0.22.0 h1:JhhUngr8TBlyUZDZw/L6WVayPi9qmSmdWeki48i5AVE= +github.com/eclipse/paho.golang v0.22.0/go.mod h1:9ZiYJ93iEfGRJri8tErNeStPKLXIGBHiqbHV74t5pqI= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -101,7 +134,11 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -168,8 +205,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= @@ -181,6 +218,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jellydator/ttlcache/v3 v3.0.0 h1:zmFhqrB/4sKiEiJHhtseJsNRE32IMVmJSs4++4gaQO4= github.com/jellydator/ttlcache/v3 v3.0.0/go.mod h1:WwTaEmcXQ3MTjOm4bsZoDFiCu/hMvNWLO1w67RXz6h4= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= @@ -197,6 +236,22 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/parsers/json v0.1.0 h1:dzSZl5pf5bBcW0Acnu20Djleto19T0CfHcvZ14NJ6fU= +github.com/knadh/koanf/parsers/json v0.1.0/go.mod h1:ll2/MlXcZ2BfXD6YJcjVFzhG9P0TdJ207aIBKQhV2hY= +github.com/knadh/koanf/providers/env v1.0.0 h1:ufePaI9BnWH+ajuxGGiJ8pdTG0uLEUWC7/HDDPGLah0= +github.com/knadh/koanf/providers/env v1.0.0/go.mod h1:mzFyRZueYhb37oPmC1HAv/oGEEuyvJDA98r3XAa8Gak= +github.com/knadh/koanf/providers/file v1.1.2 h1:aCC36YGOgV5lTtAFz2qkgtWdeQsgfxUkxDOe+2nQY3w= +github.com/knadh/koanf/providers/file v1.1.2/go.mod h1:/faSBcv2mxPVjFrXck95qeoyoZ5myJ6uxN8OOVNJJCI= +github.com/knadh/koanf/providers/posflag v0.1.0 h1:mKJlLrKPcAP7Ootf4pBZWJ6J+4wHYujwipe7Ie3qW6U= +github.com/knadh/koanf/providers/posflag v0.1.0/go.mod h1:SYg03v/t8ISBNrMBRMlojH8OsKowbkXV7giIbBVgbz0= +github.com/knadh/koanf/providers/structs v0.1.0 h1:wJRteCNn1qvLtE5h8KQBvLJovidSdntfdyIbbCzEyE0= +github.com/knadh/koanf/providers/structs v0.1.0/go.mod h1:sw2YZ3txUcqA3Z27gPlmmBzWn1h8Nt9O6EP/91MkcWE= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -207,8 +262,31 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -216,8 +294,14 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -225,6 +309,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= @@ -251,6 +337,15 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= +github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -258,6 +353,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -268,8 +365,14 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= @@ -278,6 +381,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= go.etcd.io/etcd/api/v3 v3.5.17 h1:cQB8eb8bxwuxOilBpMJAEo8fAONyrdXTHUNcMd8yT1w= @@ -301,6 +406,8 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0 h1:PzIubN4/sjByhDRHLviCjJuweBXWFZWhghjg7cS28+M= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0/go.mod h1:Ct6zzQEuGK3WpJs2n4dn+wfJYzd/+hNnxMRTWjGn30M= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= @@ -326,6 +433,8 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +goa.design/goa/v3 v3.19.1 h1:jpV3LEy7YANzPMwm++Lu17RoThRJgXrPxdEM0A1nlOE= +goa.design/goa/v3 v3.19.1/go.mod h1:astNE9ube0YCxqq7DQkt1MtLxB/b3kRPEFkEZovcO2I= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -455,6 +564,9 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -574,8 +686,8 @@ google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ19 google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/server/internal/api/http.go b/server/internal/api/http.go new file mode 100644 index 00000000..718afc96 --- /dev/null +++ b/server/internal/api/http.go @@ -0,0 +1,52 @@ +package api + +import ( + "context" + "fmt" + "net/http" + + "github.com/pgEdge/control-plane/server/internal/config" + "github.com/rs/zerolog" +) + +type httpServer struct { + logger zerolog.Logger + server *http.Server + errCh chan error +} + +func newHTTPServer( + cfg config.HTTP, + handler http.Handler, + logger zerolog.Logger, +) *httpServer { + return &httpServer{ + logger: logger, + errCh: make(chan error, 1), + server: &http.Server{ + Addr: cfg.HostPort, + Handler: handler, + }, + } +} + +func (s *httpServer) start() { + go func() { + s.logger.Info(). + Str("host_port", s.server.Addr). + Msg("starting http server") + + if err := s.server.ListenAndServe(); err != nil { + s.errCh <- fmt.Errorf("http server error: %w", err) + } + }() +} + +func (s *httpServer) stop(ctx context.Context) error { + defer close(s.errCh) + + if err := s.server.Shutdown(ctx); err != nil { + return fmt.Errorf("error while shutting down http server: %w", err) + } + return nil +} diff --git a/server/internal/api/middleware.go b/server/internal/api/middleware.go new file mode 100644 index 00000000..00c6c19a --- /dev/null +++ b/server/internal/api/middleware.go @@ -0,0 +1,41 @@ +package api + +import ( + "net/http" + "time" + + "github.com/rs/zerolog" + "github.com/rs/zerolog/hlog" +) + +func addMiddleware(logger zerolog.Logger, next http.Handler) http.Handler { + for _, m := range []func(http.Handler) http.Handler{ + hlog.NewHandler(logger), + hlog.URLHandler("http.url"), + hlog.MethodHandler("http.method"), + hlog.RemoteIPHandler("http.client_ip"), + hlog.UserAgentHandler("http.useragent"), + hlog.AccessHandler(func(r *http.Request, status, size int, duration time.Duration) { + log := zerolog.Ctx(r.Context()) + + var evt *zerolog.Event + if status >= 400 && status <= 599 { + evt = log.Error() + } else { + evt = log.Debug() + } + + // DataDog wants nanoseconds in the duration field. The Separate ms + // duration is for humans. + evt.Int("http.status_code", status). + Int64("duration_ms", duration.Milliseconds()). + Int64("duration", duration.Nanoseconds()). + Int("http.response.content_length", size). + Msg("http request") + }), + } { + next = m(next) + } + + return next +} diff --git a/server/internal/api/mqtt.go b/server/internal/api/mqtt.go new file mode 100644 index 00000000..1522a810 --- /dev/null +++ b/server/internal/api/mqtt.go @@ -0,0 +1,61 @@ +package api + +import ( + "context" + "fmt" + "net/http" + + "github.com/pgEdge/control-plane/mqtt" + "github.com/pgEdge/control-plane/server/internal/config" + "github.com/rs/zerolog" +) + +type mqttServer struct { + cfg config.MQTT + server *mqtt.HTTPServer + logger zerolog.Logger + errCh chan error +} + +func newMQTTServer( + cfg config.MQTT, + handler http.Handler, + logger zerolog.Logger, +) *mqttServer { + server := mqtt.NewHTTPServer(mqtt.HTTPServerConfig{ + Topic: cfg.Topic, + Logger: &logger, + Handler: handler, + Broker: mqtt.BrokerConfig{ + URL: cfg.BrokerURL, + ClientID: cfg.ClientID, + Username: cfg.Username, + Password: cfg.Password, + }, + }) + return &mqttServer{ + cfg: cfg, + server: server, + logger: logger, + errCh: make(chan error, 1), + } +} + +func (s *mqttServer) start(ctx context.Context) { + s.logger.Info(). + Str("broker_url", s.cfg.BrokerURL). + Msg("starting mqtt server") + + if err := s.server.Start(ctx); err != nil { + s.errCh <- fmt.Errorf("error while starting mqtt server: %w", err) + } +} + +func (s *mqttServer) stop(ctx context.Context) error { + defer close(s.errCh) + + if err := s.server.Stop(ctx); err != nil { + return fmt.Errorf("error while stopping mqtt server: %w", err) + } + return nil +} diff --git a/server/internal/api/server.go b/server/internal/api/server.go new file mode 100644 index 00000000..5cec00c5 --- /dev/null +++ b/server/internal/api/server.go @@ -0,0 +1,95 @@ +package api + +import ( + "context" + "errors" + "net/http" + + "github.com/rs/zerolog" + goahttp "goa.design/goa/v3/http" + + "github.com/pgEdge/control-plane/api" + controlplane "github.com/pgEdge/control-plane/api/gen/control_plane" + "github.com/pgEdge/control-plane/api/gen/http/control_plane/server" + "github.com/pgEdge/control-plane/server/internal/config" +) + +type Server struct { + http *httpServer + mqtt *mqttServer + errCh chan error +} + +func NewServer(cfg config.Config, logger zerolog.Logger) *Server { + svc := newService() + endpoints := controlplane.NewEndpoints(svc) + mux := goahttp.NewMuxer() + mux.Handle("GET", "/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Link", `; rel="service-desc"`) + w.WriteHeader(204) + }) + dec := goahttp.RequestDecoder + enc := goahttp.ResponseEncoder + fs := http.FS(api.OpenAPISpecFS) + svr := server.New(endpoints, mux, dec, enc, nil, nil, fs) + server.Mount(mux, svr) + handler := addMiddleware(logger, mux) + + var ( + httpSvr *httpServer + mqttSvr *mqttServer + ) + + if cfg.HTTP.Enabled { + httpSvr = newHTTPServer(cfg.HTTP, handler, logger) + } + if cfg.MQTT.Enabled { + mqttSvr = newMQTTServer(cfg.MQTT, handler, logger) + } + + return &Server{ + http: httpSvr, + mqtt: mqttSvr, + errCh: make(chan error, 2), + } +} + +func (s *Server) Start(ctx context.Context) { + var errChs []chan error + + if s.http != nil { + s.http.start() + errChs = append(errChs, s.http.errCh) + } + if s.mqtt != nil { + s.mqtt.start(ctx) + errChs = append(errChs, s.mqtt.errCh) + } + + for _, c := range errChs { + go func(c chan error) { + for err := range c { + s.errCh <- err + } + }(c) + } +} + +func (s *Server) Stop(ctx context.Context) error { + defer close(s.errCh) + + var errs []error + + if s.http != nil { + errs = append(errs, s.http.stop(ctx)) + } + if s.mqtt != nil { + errs = append(errs, s.mqtt.stop(ctx)) + } + + return errors.Join(errs...) +} + +func (s *Server) Error() chan error { + return s.errCh +} diff --git a/server/internal/api/service.go b/server/internal/api/service.go new file mode 100644 index 00000000..8f67a4ce --- /dev/null +++ b/server/internal/api/service.go @@ -0,0 +1,58 @@ +package api + +import ( + "context" + "errors" + + api "github.com/pgEdge/control-plane/api/gen/control_plane" +) + +var ErrNotImplemented = errors.New("endpoint not implemented") + +var _ api.Service = (*service)(nil) + +type service struct{} + +func newService() *service { + return &service{} +} + +func (s *service) ServiceDescription(ctx context.Context) (string, error) { + return "", ErrNotImplemented +} + +func (s *service) InspectCluster(ctx context.Context) (*api.Cluster, error) { + return nil, ErrNotImplemented +} + +func (s *service) ListHosts(ctx context.Context) ([]*api.Host, error) { + return nil, ErrNotImplemented +} + +func (s *service) InspectHost(ctx context.Context, req *api.InspectHostPayload) (*api.Host, error) { + return nil, ErrNotImplemented +} + +func (s *service) RemoveHost(ctx context.Context, req *api.RemoveHostPayload) error { + return ErrNotImplemented +} + +func (s *service) ListDatabases(ctx context.Context) ([]*api.Database, error) { + return nil, ErrNotImplemented +} + +func (s *service) CreateDatabase(ctx context.Context, req *api.CreateDatabaseRequest) (*api.Database, error) { + return nil, ErrNotImplemented +} + +func (s *service) InspectDatabase(ctx context.Context, req *api.InspectDatabasePayload) (*api.Database, error) { + return nil, ErrNotImplemented +} + +func (s *service) UpdateDatabase(ctx context.Context, req *api.UpdateDatabasePayload) (*api.Database, error) { + return nil, ErrNotImplemented +} + +func (s *service) DeleteDatabase(ctx context.Context, req *api.DeleteDatabasePayload) (err error) { + return ErrNotImplemented +} diff --git a/server/internal/config/config.go b/server/internal/config/config.go new file mode 100644 index 00000000..40de28ce --- /dev/null +++ b/server/internal/config/config.go @@ -0,0 +1,169 @@ +package config + +import ( + "fmt" + "strings" + "sync" + + "github.com/knadh/koanf/parsers/json" + "github.com/knadh/koanf/providers/env" + "github.com/knadh/koanf/providers/file" + "github.com/knadh/koanf/providers/posflag" + "github.com/knadh/koanf/providers/structs" + "github.com/knadh/koanf/v2" + "github.com/spf13/pflag" +) + +type Logging struct { + Level string `koanf:"level"` + Pretty bool `koanf:"pretty"` +} + +var loggingDefault = Logging{ + Level: "debug", +} + +type MQTT struct { + Enabled bool `koanf:"enabled"` + BrokerURL string `koanf:"broker_url"` + Topic string `koanf:"topic"` + ClientID string `koanf:"client_id"` + Username string `koanf:"username"` + Password string `koanf:"password"` +} + +type DockerSwarm struct { + DataDir string `koanf:"data_dir"` + TraefikEnabled bool `koanf:"traefik_enabled"` + VectorEnabled bool `koanf:"vector_enabled"` +} + +type HTTP struct { + Enabled bool `koanf:"enabled"` + HostPort string `koanf:"host_port"` +} + +var httpDefault = HTTP{ + Enabled: true, + HostPort: ":3000", +} + +type EmbeddedEtcd struct { + Enabled bool `koanf:"enabled"` + DataDir string `koanf:"data_dir"` + PeerHostPort string `koanf:"peer_host_port"` + ClientHostPort string `koanf:"client_host_port"` + InitialClusterToken string `koanf:"initial_cluster_token"` + InitialCluster string `koanf:"initial_cluster"` +} + +type Config struct { + TenantID string `koanf:"tenant_id"` + ClusterID string `koanf:"cluster_id"` + HostID string `koanf:"host_id"` + Region string `koanf:"region"` + IPAddress string `koanf:"ip_address"` + StopGracePeriodSeconds int64 `koanf:"stop_grace_period_seconds"` + MQTT MQTT `koanf:"mqtt"` + DockerSwarm DockerSwarm `koanf:"docker_swarm"` + HTTP HTTP `koanf:"http"` + Logging Logging `koanf:"logging"` +} + +var defaultConfig = Config{ + Logging: loggingDefault, + HTTP: httpDefault, + StopGracePeriodSeconds: 30, +} + +type Source struct { + Provider func(k *koanf.Koanf) koanf.Provider + Parser koanf.Parser + Options []koanf.Option +} + +func NewJsonFileSource(path string) *Source { + return &Source{ + Provider: func(_ *koanf.Koanf) koanf.Provider { + return file.Provider(path) + }, + Parser: json.Parser(), + } +} + +func NewEnvVarSource() *Source { + return &Source{ + Provider: func(_ *koanf.Koanf) koanf.Provider { + return env.Provider("PGEDGE_", ".", func(s string) string { + s = strings.TrimPrefix(s, "PGEDGE_") + s = strings.ToLower(s) + return strings.ReplaceAll(s, "__", ".") + }) + }, + } +} + +func NewPFlagSource(flagSet *pflag.FlagSet) *Source { + return &Source{ + Provider: func(k *koanf.Koanf) koanf.Provider { + return posflag.ProviderWithFlag(flagSet, ".", k, func(f *pflag.Flag) (string, interface{}) { + key := strings.ReplaceAll(f.Name, "-", "_") + return key, f.Value + }) + }, + } +} + +func newDefaultsSource() *Source { + return &Source{ + Provider: func(k *koanf.Koanf) koanf.Provider { + return structs.Provider(defaultConfig, "koanf") + }, + } +} + +type Manager struct { + mu sync.Mutex + k *koanf.Koanf + sources []*Source + config Config +} + +func NewManager(sources ...*Source) (*Manager, error) { + m := &Manager{ + sources: append([]*Source{newDefaultsSource()}, sources...), + } + if err := m.Reload(); err != nil { + return nil, err + } + return m, nil +} + +func (m *Manager) Reload() error { + m.mu.Lock() + defer m.mu.Unlock() + + k := koanf.New(".") + for _, source := range m.sources { + err := k.Load(source.Provider(k), source.Parser, source.Options...) + if err != nil { + return fmt.Errorf("failed to load config: %w", err) + } + } + + var config Config + if err := k.Unmarshal("", &config); err != nil { + return fmt.Errorf("failed to unmarshal config: %w", err) + } + + m.k = k + m.config = config + + return nil +} + +func (m *Manager) Config() Config { + m.mu.Lock() + defer m.mu.Unlock() + return m.config +} diff --git a/server/internal/logging/logger.go b/server/internal/logging/logger.go new file mode 100644 index 00000000..9cc24b40 --- /dev/null +++ b/server/internal/logging/logger.go @@ -0,0 +1,64 @@ +package logging + +import ( + "fmt" + "io" + "os" + + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + + "github.com/pgEdge/control-plane/server/internal/config" +) + +const defaultLevel = zerolog.DebugLevel + +// NewLogger initializes and configures a new zerolog.Logger. +func NewLogger(cfg config.Logging) (zerolog.Logger, error) { + level := defaultLevel + if cfg.Level != "" { + l, err := zerolog.ParseLevel(cfg.Level) + if err != nil { + return zerolog.Nop(), fmt.Errorf("failed to parse log level '%s': %w", cfg.Level, err) + } + + level = l + } + + var out io.Writer + out = os.Stdout + if cfg.Pretty { + out = zerolog.ConsoleWriter{Out: out} + } + + logger := zerolog.New(out). + With(). + Timestamp(). + Caller(). + Logger(). + Level(level) + + return logger, nil +} + +// Fatal calls Fatal on the default zerolog logger. It's intended to be used in +// panic recovery or other places where a logger instance isn't available. +func Fatal(err any, msg string) { + logger := log.With(). + Timestamp(). + Caller(). + Logger() + + switch v := err.(type) { + case error: + logger.Fatal(). + CallerSkipFrame(2). + Err(v). + Msg(msg) + default: + logger.Fatal(). + CallerSkipFrame(2). + Interface("error", err). + Msg(msg) + } +} diff --git a/server/main.go b/server/main.go new file mode 100644 index 00000000..30248605 --- /dev/null +++ b/server/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/pgEdge/control-plane/server/cmd" + +func main() { + cmd.Execute() +} From c4ccaa51c43192a681d515442923fa87c647e270 Mon Sep 17 00:00:00 2001 From: Jason Lynch Date: Thu, 16 Jan 2025 17:25:13 -0500 Subject: [PATCH 4/4] chore: update go.work.sum --- go.work.sum | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/go.work.sum b/go.work.sum index a14c67de..fb01ad42 100644 --- a/go.work.sum +++ b/go.work.sum @@ -480,8 +480,6 @@ github.com/containerd/zfs v1.1.0/go.mod h1:oZF9wBnrnQjpWLaPKEinrx3TQ9a+W/RJO7Zb4 github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4= github.com/containers/ocicrypt v1.1.10/go.mod h1:YfzSSr06PTHQwSTUKqDSjish9BeW1E4HUmreluQcMd8= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= @@ -622,8 +620,6 @@ github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUq github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/intel/goresctrl v0.3.0/go.mod h1:fdz3mD85cmP9sHD8JUlrNWAxvwM86CrbmVXltEKd7zk= github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= @@ -750,8 +746,8 @@ github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEt github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= @@ -781,8 +777,6 @@ github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfA github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= @@ -794,6 +788,7 @@ github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8L github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -937,8 +932,7 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= google.golang.org/genproto/googleapis/rpc v0.0.0-20240730163845-b1a4ccb954bf/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=