Skip to content

Commit 636ba9b

Browse files
authored
[UI] reflect new backup paths and cluster status (zalando#1260)
* [UI] reflect new backup paths and cluster status
1 parent 77252e3 commit 636ba9b

File tree

4 files changed

+34
-19
lines changed

4 files changed

+34
-19
lines changed

ui/app/src/postgresql.tag.pug

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,13 @@ postgresql
7474

7575
.alert.alert-info(if='{ !progress.requestStatus }') PostgreSQL cluster requested
7676
.alert.alert-danger(if='{ progress.requestStatus !== "OK" }') Create request failed
77-
.alert.alert-success(if='{ progress.requestStatus === "OK" }') Create request successful ({ new Date(progress.createdTimestamp).toLocaleString() })
77+
.alert.alert-success(if='{ progress.requestStatus === "OK" }') Manifest creation successful ({ new Date(progress.createdTimestamp).toLocaleString() })
7878

7979
.alert.alert-info(if='{ !progress.postgresql }') PostgreSQL cluster manifest pending
8080
.alert.alert-success(if='{ progress.postgresql }') PostgreSQL cluster manifest created
8181

82+
.alert.alert-danger(if='{progress.status && progress.status.PostgresClusterStatus == "CreateFailed"}') Cluster creation failed: Check events and cluster name!
83+
8284
.alert.alert-info(if='{ !progress.statefulSet }') StatefulSet pending
8385
.alert.alert-success(if='{ progress.statefulSet }') StatefulSet created
8486

@@ -127,6 +129,8 @@ postgresql
127129
this.progress.pooler = false
128130
this.progress.postgresql = true
129131
this.progress.postgresqlManifest = data
132+
// copy status as we delete later for edit
133+
this.progress.status = data.status
130134
this.progress.createdTimestamp = data.metadata.creationTimestamp
131135
this.progress.poolerEnabled = data.spec.enableConnectionPooler
132136
this.uid = this.progress.postgresqlManifest.metadata.uid
@@ -203,6 +207,7 @@ postgresql
203207
delete manifest.metadata.annotations[last_applied]
204208
}
205209

210+
delete manifest.metadata.managedFields
206211
delete manifest.metadata.creationTimestamp
207212
delete manifest.metadata.deletionGracePeriodSeconds
208213
delete manifest.metadata.deletionTimestamp

ui/app/src/postgresqls.tag.pug

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,8 @@ postgresqls
6363
td(style='white-space: pre')
6464
| { namespace }
6565
td
66-
a(
67-
href='/#/status/{ cluster_path(this) }'
68-
)
69-
| { name }
66+
a(href='/#/status/{ cluster_path(this) }') { name }
67+
btn.btn-danger(if='{status.PostgresClusterStatus == "CreateFailed"}') Create Failed
7068
td { nodes }
7169
td { cpu } / { cpu_limit }
7270
td { memory } / { memory_limit }
@@ -230,7 +228,7 @@ postgresqls
230228
)
231229

232230
const calcCosts = this.calcCosts = (nodes, cpu, memory, disk) => {
233-
costs = nodes * (toCores(cpu) * opts.config.cost_core + toMemory(memory) * opts.config.cost_memory + toDisk(disk) * opts.config.cost_ebs)
231+
costs = Math.max(nodes, opts.config.min_pods) * (toCores(cpu) * opts.config.cost_core + toMemory(memory) * opts.config.cost_memory + toDisk(disk) * opts.config.cost_ebs)
234232
return costs.toFixed(2)
235233
}
236234

ui/operator_ui/main.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
SUPERUSER_TEAM = getenv('SUPERUSER_TEAM', 'acid')
8888
TARGET_NAMESPACE = getenv('TARGET_NAMESPACE')
8989
GOOGLE_ANALYTICS = getenv('GOOGLE_ANALYTICS', False)
90+
MIN_PODS= getenv('MIN_PODS', 2)
9091

9192
# storage pricing, i.e. https://aws.amazon.com/ebs/pricing/
9293
COST_EBS = float(getenv('COST_EBS', 0.119)) # GB per month
@@ -308,7 +309,8 @@ def index():
308309
'static_network_whitelist': {},
309310
'cost_ebs': COST_EBS,
310311
'cost_core': COST_CORE,
311-
'cost_memory': COST_MEMORY
312+
'cost_memory': COST_MEMORY,
313+
'min_pods': MIN_PODS
312314
}
313315

314316

@@ -320,6 +322,7 @@ def get_config():
320322
config['resources_visible'] = RESOURCES_VISIBLE
321323
config['superuser_team'] = SUPERUSER_TEAM
322324
config['target_namespace'] = TARGET_NAMESPACE
325+
config['min_pods'] = MIN_PODS
323326

324327
config['namespaces'] = (
325328
[TARGET_NAMESPACE]
@@ -493,6 +496,7 @@ def get_postgresqls():
493496
'uid': uid,
494497
'namespaced_name': namespace + '/' + name,
495498
'full_name': namespace + '/' + name + ('/' + uid if uid else ''),
499+
'status': status,
496500
}
497501
for cluster in these(
498502
read_postgresqls(
@@ -506,6 +510,7 @@ def get_postgresqls():
506510
'items',
507511
)
508512
for spec in [cluster.get('spec', {}) if cluster.get('spec', {}) is not None else {"error": "Invalid spec in manifest"}]
513+
for status in [cluster.get('status', {})]
509514
for metadata in [cluster['metadata']]
510515
for namespace in [metadata['namespace']]
511516
for name in [metadata['name']]

ui/operator_ui/spiloutils.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ def read_versions(
302302
if uid == 'wal' or defaulting(lambda: UUID(uid))
303303
]
304304

305+
BACKUP_VERSION_PREFIXES = ['','9.5/', '9.6/', '10/','11/', '12/', '13/']
305306

306307
def read_basebackups(
307308
pg_cluster,
@@ -314,18 +315,24 @@ def read_basebackups(
314315
):
315316
environ['WALE_S3_ENDPOINT'] = s3_endpoint
316317
suffix = '' if uid == 'base' else '/' + uid
317-
return [
318-
{
319-
key: value
320-
for key, value in basebackup.__dict__.items()
321-
if isinstance(value, str) or isinstance(value, int)
322-
}
323-
for basebackup in Attrs.call(
324-
f=configure_backup_cxt,
325-
aws_instance_profile=use_aws_instance_profile,
326-
s3_prefix=f's3://{bucket}/{prefix}{pg_cluster}{suffix}/wal/',
327-
)._backup_list(detail=True)._backup_list(prefix=f"{prefix}{pg_cluster}{suffix}/wal/")
328-
]
318+
backups = []
319+
320+
for vp in BACKUP_VERSION_PREFIXES:
321+
322+
backups = backups + [
323+
{
324+
key: value
325+
for key, value in basebackup.__dict__.items()
326+
if isinstance(value, str) or isinstance(value, int)
327+
}
328+
for basebackup in Attrs.call(
329+
f=configure_backup_cxt,
330+
aws_instance_profile=use_aws_instance_profile,
331+
s3_prefix=f's3://{bucket}/{prefix}{pg_cluster}{suffix}/wal/{vp}',
332+
)._backup_list(detail=True)
333+
]
334+
335+
return backups
329336

330337

331338
def parse_time(s: str):

0 commit comments

Comments
 (0)