[UI] reflect new backup paths and cluster status (#1260)
* [UI] reflect new backup paths and cluster status
This commit is contained in:
parent
77252e316c
commit
636ba9b846
|
|
@ -74,11 +74,13 @@ postgresql
|
||||||
|
|
||||||
.alert.alert-info(if='{ !progress.requestStatus }') PostgreSQL cluster requested
|
.alert.alert-info(if='{ !progress.requestStatus }') PostgreSQL cluster requested
|
||||||
.alert.alert-danger(if='{ progress.requestStatus !== "OK" }') Create request failed
|
.alert.alert-danger(if='{ progress.requestStatus !== "OK" }') Create request failed
|
||||||
.alert.alert-success(if='{ progress.requestStatus === "OK" }') Create request successful ({ new Date(progress.createdTimestamp).toLocaleString() })
|
.alert.alert-success(if='{ progress.requestStatus === "OK" }') Manifest creation successful ({ new Date(progress.createdTimestamp).toLocaleString() })
|
||||||
|
|
||||||
.alert.alert-info(if='{ !progress.postgresql }') PostgreSQL cluster manifest pending
|
.alert.alert-info(if='{ !progress.postgresql }') PostgreSQL cluster manifest pending
|
||||||
.alert.alert-success(if='{ progress.postgresql }') PostgreSQL cluster manifest created
|
.alert.alert-success(if='{ progress.postgresql }') PostgreSQL cluster manifest created
|
||||||
|
|
||||||
|
.alert.alert-danger(if='{progress.status && progress.status.PostgresClusterStatus == "CreateFailed"}') Cluster creation failed: Check events and cluster name!
|
||||||
|
|
||||||
.alert.alert-info(if='{ !progress.statefulSet }') StatefulSet pending
|
.alert.alert-info(if='{ !progress.statefulSet }') StatefulSet pending
|
||||||
.alert.alert-success(if='{ progress.statefulSet }') StatefulSet created
|
.alert.alert-success(if='{ progress.statefulSet }') StatefulSet created
|
||||||
|
|
||||||
|
|
@ -127,6 +129,8 @@ postgresql
|
||||||
this.progress.pooler = false
|
this.progress.pooler = false
|
||||||
this.progress.postgresql = true
|
this.progress.postgresql = true
|
||||||
this.progress.postgresqlManifest = data
|
this.progress.postgresqlManifest = data
|
||||||
|
// copy status as we delete later for edit
|
||||||
|
this.progress.status = data.status
|
||||||
this.progress.createdTimestamp = data.metadata.creationTimestamp
|
this.progress.createdTimestamp = data.metadata.creationTimestamp
|
||||||
this.progress.poolerEnabled = data.spec.enableConnectionPooler
|
this.progress.poolerEnabled = data.spec.enableConnectionPooler
|
||||||
this.uid = this.progress.postgresqlManifest.metadata.uid
|
this.uid = this.progress.postgresqlManifest.metadata.uid
|
||||||
|
|
@ -203,6 +207,7 @@ postgresql
|
||||||
delete manifest.metadata.annotations[last_applied]
|
delete manifest.metadata.annotations[last_applied]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete manifest.metadata.managedFields
|
||||||
delete manifest.metadata.creationTimestamp
|
delete manifest.metadata.creationTimestamp
|
||||||
delete manifest.metadata.deletionGracePeriodSeconds
|
delete manifest.metadata.deletionGracePeriodSeconds
|
||||||
delete manifest.metadata.deletionTimestamp
|
delete manifest.metadata.deletionTimestamp
|
||||||
|
|
|
||||||
|
|
@ -63,10 +63,8 @@ postgresqls
|
||||||
td(style='white-space: pre')
|
td(style='white-space: pre')
|
||||||
| { namespace }
|
| { namespace }
|
||||||
td
|
td
|
||||||
a(
|
a(href='/#/status/{ cluster_path(this) }') { name }
|
||||||
href='/#/status/{ cluster_path(this) }'
|
btn.btn-danger(if='{status.PostgresClusterStatus == "CreateFailed"}') Create Failed
|
||||||
)
|
|
||||||
| { name }
|
|
||||||
td { nodes }
|
td { nodes }
|
||||||
td { cpu } / { cpu_limit }
|
td { cpu } / { cpu_limit }
|
||||||
td { memory } / { memory_limit }
|
td { memory } / { memory_limit }
|
||||||
|
|
@ -230,7 +228,7 @@ postgresqls
|
||||||
)
|
)
|
||||||
|
|
||||||
const calcCosts = this.calcCosts = (nodes, cpu, memory, disk) => {
|
const calcCosts = this.calcCosts = (nodes, cpu, memory, disk) => {
|
||||||
costs = nodes * (toCores(cpu) * opts.config.cost_core + toMemory(memory) * opts.config.cost_memory + toDisk(disk) * opts.config.cost_ebs)
|
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)
|
||||||
return costs.toFixed(2)
|
return costs.toFixed(2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,7 @@ SPILO_S3_BACKUP_PREFIX = getenv('SPILO_S3_BACKUP_PREFIX', 'spilo/')
|
||||||
SUPERUSER_TEAM = getenv('SUPERUSER_TEAM', 'acid')
|
SUPERUSER_TEAM = getenv('SUPERUSER_TEAM', 'acid')
|
||||||
TARGET_NAMESPACE = getenv('TARGET_NAMESPACE')
|
TARGET_NAMESPACE = getenv('TARGET_NAMESPACE')
|
||||||
GOOGLE_ANALYTICS = getenv('GOOGLE_ANALYTICS', False)
|
GOOGLE_ANALYTICS = getenv('GOOGLE_ANALYTICS', False)
|
||||||
|
MIN_PODS= getenv('MIN_PODS', 2)
|
||||||
|
|
||||||
# storage pricing, i.e. https://aws.amazon.com/ebs/pricing/
|
# storage pricing, i.e. https://aws.amazon.com/ebs/pricing/
|
||||||
COST_EBS = float(getenv('COST_EBS', 0.119)) # GB per month
|
COST_EBS = float(getenv('COST_EBS', 0.119)) # GB per month
|
||||||
|
|
@ -308,7 +309,8 @@ DEFAULT_UI_CONFIG = {
|
||||||
'static_network_whitelist': {},
|
'static_network_whitelist': {},
|
||||||
'cost_ebs': COST_EBS,
|
'cost_ebs': COST_EBS,
|
||||||
'cost_core': COST_CORE,
|
'cost_core': COST_CORE,
|
||||||
'cost_memory': COST_MEMORY
|
'cost_memory': COST_MEMORY,
|
||||||
|
'min_pods': MIN_PODS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -320,6 +322,7 @@ def get_config():
|
||||||
config['resources_visible'] = RESOURCES_VISIBLE
|
config['resources_visible'] = RESOURCES_VISIBLE
|
||||||
config['superuser_team'] = SUPERUSER_TEAM
|
config['superuser_team'] = SUPERUSER_TEAM
|
||||||
config['target_namespace'] = TARGET_NAMESPACE
|
config['target_namespace'] = TARGET_NAMESPACE
|
||||||
|
config['min_pods'] = MIN_PODS
|
||||||
|
|
||||||
config['namespaces'] = (
|
config['namespaces'] = (
|
||||||
[TARGET_NAMESPACE]
|
[TARGET_NAMESPACE]
|
||||||
|
|
@ -493,6 +496,7 @@ def get_postgresqls():
|
||||||
'uid': uid,
|
'uid': uid,
|
||||||
'namespaced_name': namespace + '/' + name,
|
'namespaced_name': namespace + '/' + name,
|
||||||
'full_name': namespace + '/' + name + ('/' + uid if uid else ''),
|
'full_name': namespace + '/' + name + ('/' + uid if uid else ''),
|
||||||
|
'status': status,
|
||||||
}
|
}
|
||||||
for cluster in these(
|
for cluster in these(
|
||||||
read_postgresqls(
|
read_postgresqls(
|
||||||
|
|
@ -506,6 +510,7 @@ def get_postgresqls():
|
||||||
'items',
|
'items',
|
||||||
)
|
)
|
||||||
for spec in [cluster.get('spec', {}) if cluster.get('spec', {}) is not None else {"error": "Invalid spec in manifest"}]
|
for spec in [cluster.get('spec', {}) if cluster.get('spec', {}) is not None else {"error": "Invalid spec in manifest"}]
|
||||||
|
for status in [cluster.get('status', {})]
|
||||||
for metadata in [cluster['metadata']]
|
for metadata in [cluster['metadata']]
|
||||||
for namespace in [metadata['namespace']]
|
for namespace in [metadata['namespace']]
|
||||||
for name in [metadata['name']]
|
for name in [metadata['name']]
|
||||||
|
|
|
||||||
|
|
@ -302,6 +302,7 @@ def read_versions(
|
||||||
if uid == 'wal' or defaulting(lambda: UUID(uid))
|
if uid == 'wal' or defaulting(lambda: UUID(uid))
|
||||||
]
|
]
|
||||||
|
|
||||||
|
BACKUP_VERSION_PREFIXES = ['','9.5/', '9.6/', '10/','11/', '12/', '13/']
|
||||||
|
|
||||||
def read_basebackups(
|
def read_basebackups(
|
||||||
pg_cluster,
|
pg_cluster,
|
||||||
|
|
@ -314,18 +315,24 @@ def read_basebackups(
|
||||||
):
|
):
|
||||||
environ['WALE_S3_ENDPOINT'] = s3_endpoint
|
environ['WALE_S3_ENDPOINT'] = s3_endpoint
|
||||||
suffix = '' if uid == 'base' else '/' + uid
|
suffix = '' if uid == 'base' else '/' + uid
|
||||||
return [
|
backups = []
|
||||||
{
|
|
||||||
key: value
|
for vp in BACKUP_VERSION_PREFIXES:
|
||||||
for key, value in basebackup.__dict__.items()
|
|
||||||
if isinstance(value, str) or isinstance(value, int)
|
backups = backups + [
|
||||||
}
|
{
|
||||||
for basebackup in Attrs.call(
|
key: value
|
||||||
f=configure_backup_cxt,
|
for key, value in basebackup.__dict__.items()
|
||||||
aws_instance_profile=use_aws_instance_profile,
|
if isinstance(value, str) or isinstance(value, int)
|
||||||
s3_prefix=f's3://{bucket}/{prefix}{pg_cluster}{suffix}/wal/',
|
}
|
||||||
)._backup_list(detail=True)._backup_list(prefix=f"{prefix}{pg_cluster}{suffix}/wal/")
|
for basebackup in Attrs.call(
|
||||||
]
|
f=configure_backup_cxt,
|
||||||
|
aws_instance_profile=use_aws_instance_profile,
|
||||||
|
s3_prefix=f's3://{bucket}/{prefix}{pg_cluster}{suffix}/wal/{vp}',
|
||||||
|
)._backup_list(detail=True)
|
||||||
|
]
|
||||||
|
|
||||||
|
return backups
|
||||||
|
|
||||||
|
|
||||||
def parse_time(s: str):
|
def parse_time(s: str):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue