Skip to content
Snippets Groups Projects
Unverified Commit ccb52c09 authored by Ida Novindasari's avatar Ida Novindasari Committed by GitHub
Browse files

[UI] Remove deprecated WAL-E library and enable WAL-G backup support in UI backend (#2915)

parent 68c4b496
No related branches found
No related tags found
No related merge requests found
...@@ -62,8 +62,6 @@ podAnnotations: ...@@ -62,8 +62,6 @@ podAnnotations:
extraEnvs: extraEnvs:
[] []
# Exemple of settings to make snapshot view working in the ui when using AWS # Exemple of settings to make snapshot view working in the ui when using AWS
# - name: WALE_S3_ENDPOINT
# value: https+path://s3.us-east-1.amazonaws.com:443
# - name: SPILO_S3_BACKUP_PREFIX # - name: SPILO_S3_BACKUP_PREFIX
# value: spilo/ # value: spilo/
# - name: AWS_ACCESS_KEY_ID # - name: AWS_ACCESS_KEY_ID
...@@ -83,8 +81,6 @@ extraEnvs: ...@@ -83,8 +81,6 @@ extraEnvs:
# key: AWS_DEFAULT_REGION # key: AWS_DEFAULT_REGION
# - name: SPILO_S3_BACKUP_BUCKET # - name: SPILO_S3_BACKUP_BUCKET
# value: <s3 bucket used by the operator> # value: <s3 bucket used by the operator>
# - name: "USE_AWS_INSTANCE_PROFILE"
# value: "true"
# configure UI service # configure UI service
service: service:
......
...@@ -81,8 +81,6 @@ spec: ...@@ -81,8 +81,6 @@ spec:
] ]
} }
# Exemple of settings to make snapshot view working in the ui when using AWS # Exemple of settings to make snapshot view working in the ui when using AWS
# - name: WALE_S3_ENDPOINT
# value: https+path://s3.us-east-1.amazonaws.com:443
# - name: SPILO_S3_BACKUP_PREFIX # - name: SPILO_S3_BACKUP_PREFIX
# value: spilo/ # value: spilo/
# - name: AWS_ACCESS_KEY_ID # - name: AWS_ACCESS_KEY_ID
...@@ -102,5 +100,3 @@ spec: ...@@ -102,5 +100,3 @@ spec:
# key: AWS_DEFAULT_REGION # key: AWS_DEFAULT_REGION
# - name: SPILO_S3_BACKUP_BUCKET # - name: SPILO_S3_BACKUP_BUCKET
# value: <s3 bucket used by the operator> # value: <s3 bucket used by the operator>
# - name: "USE_AWS_INSTANCE_PROFILE"
# value: "true"
...@@ -95,14 +95,6 @@ DEFAULT_MEMORY_LIMIT = getenv('DEFAULT_MEMORY_LIMIT', '300Mi') ...@@ -95,14 +95,6 @@ DEFAULT_MEMORY_LIMIT = getenv('DEFAULT_MEMORY_LIMIT', '300Mi')
DEFAULT_CPU = getenv('DEFAULT_CPU', '10m') DEFAULT_CPU = getenv('DEFAULT_CPU', '10m')
DEFAULT_CPU_LIMIT = getenv('DEFAULT_CPU_LIMIT', '300m') DEFAULT_CPU_LIMIT = getenv('DEFAULT_CPU_LIMIT', '300m')
WALE_S3_ENDPOINT = getenv(
'WALE_S3_ENDPOINT',
'https+path://s3.eu-central-1.amazonaws.com:443',
)
USE_AWS_INSTANCE_PROFILE = (
getenv('USE_AWS_INSTANCE_PROFILE', 'false').lower() != 'false'
)
AWS_ENDPOINT = getenv('AWS_ENDPOINT') AWS_ENDPOINT = getenv('AWS_ENDPOINT')
...@@ -784,8 +776,6 @@ def get_versions(pg_cluster: str): ...@@ -784,8 +776,6 @@ def get_versions(pg_cluster: str):
bucket=SPILO_S3_BACKUP_BUCKET, bucket=SPILO_S3_BACKUP_BUCKET,
pg_cluster=pg_cluster, pg_cluster=pg_cluster,
prefix=SPILO_S3_BACKUP_PREFIX, prefix=SPILO_S3_BACKUP_PREFIX,
s3_endpoint=WALE_S3_ENDPOINT,
use_aws_instance_profile=USE_AWS_INSTANCE_PROFILE,
), ),
) )
...@@ -797,9 +787,8 @@ def get_basebackups(pg_cluster: str, uid: str): ...@@ -797,9 +787,8 @@ def get_basebackups(pg_cluster: str, uid: str):
bucket=SPILO_S3_BACKUP_BUCKET, bucket=SPILO_S3_BACKUP_BUCKET,
pg_cluster=pg_cluster, pg_cluster=pg_cluster,
prefix=SPILO_S3_BACKUP_PREFIX, prefix=SPILO_S3_BACKUP_PREFIX,
s3_endpoint=WALE_S3_ENDPOINT,
uid=uid, uid=uid,
use_aws_instance_profile=USE_AWS_INSTANCE_PROFILE, postgresql_versions=OPERATOR_UI_CONFIG.get('postgresql_versions', DEFAULT_UI_CONFIG['postgresql_versions']),
), ),
) )
...@@ -991,8 +980,6 @@ def main(port, debug, clusters: list): ...@@ -991,8 +980,6 @@ def main(port, debug, clusters: list):
logger.info(f'Superuser team: {SUPERUSER_TEAM}') logger.info(f'Superuser team: {SUPERUSER_TEAM}')
logger.info(f'Target namespace: {TARGET_NAMESPACE}') logger.info(f'Target namespace: {TARGET_NAMESPACE}')
logger.info(f'Teamservice URL: {TEAM_SERVICE_URL}') logger.info(f'Teamservice URL: {TEAM_SERVICE_URL}')
logger.info(f'Use AWS instance_profile: {USE_AWS_INSTANCE_PROFILE}')
logger.info(f'WAL-E S3 endpoint: {WALE_S3_ENDPOINT}')
logger.info(f'AWS S3 endpoint: {AWS_ENDPOINT}') logger.info(f'AWS S3 endpoint: {AWS_ENDPOINT}')
if TARGET_NAMESPACE is None: if TARGET_NAMESPACE is None:
......
...@@ -6,9 +6,8 @@ from os import environ, getenv ...@@ -6,9 +6,8 @@ from os import environ, getenv
from requests import Session from requests import Session
from urllib.parse import urljoin from urllib.parse import urljoin
from uuid import UUID from uuid import UUID
from wal_e.cmd import configure_backup_cxt
from .utils import Attrs, defaulting, these from .utils import defaulting, these
from operator_ui.adapters.logger import logger from operator_ui.adapters.logger import logger
session = Session() session = Session()
...@@ -284,10 +283,8 @@ def read_stored_clusters(bucket, prefix, delimiter='/'): ...@@ -284,10 +283,8 @@ def read_stored_clusters(bucket, prefix, delimiter='/'):
def read_versions( def read_versions(
pg_cluster, pg_cluster,
bucket, bucket,
s3_endpoint,
prefix, prefix,
delimiter='/', delimiter='/',
use_aws_instance_profile=False,
): ):
return [ return [
'base' if uid == 'wal' else uid 'base' if uid == 'wal' else uid
...@@ -305,35 +302,72 @@ def read_versions( ...@@ -305,35 +302,72 @@ def read_versions(
if uid == 'wal' or defaulting(lambda: UUID(uid)) if uid == 'wal' or defaulting(lambda: UUID(uid))
] ]
BACKUP_VERSION_PREFIXES = ['', '10/', '11/', '12/', '13/', '14/', '15/', '16/', '17/'] def lsn_to_wal_segment_stop(finish_lsn, start_segment, wal_segment_size=16 * 1024 * 1024):
timeline = int(start_segment[:8], 16)
log_id = finish_lsn >> 32
seg_id = (finish_lsn & 0xFFFFFFFF) // wal_segment_size
return f"{timeline:08X}{log_id:08X}{seg_id:08X}"
def lsn_to_offset_hex(lsn, wal_segment_size=16 * 1024 * 1024):
return f"{lsn % wal_segment_size:08X}"
def read_basebackups( def read_basebackups(
pg_cluster, pg_cluster,
uid, uid,
bucket, bucket,
s3_endpoint,
prefix, prefix,
delimiter='/', postgresql_versions,
use_aws_instance_profile=False,
): ):
environ['WALE_S3_ENDPOINT'] = s3_endpoint
suffix = '' if uid == 'base' else '/' + uid suffix = '' if uid == 'base' else '/' + uid
backups = [] backups = []
for vp in BACKUP_VERSION_PREFIXES: for vp in postgresql_versions:
backup_prefix = f'{prefix}{pg_cluster}{suffix}/wal/{vp}/basebackups_005/'
backups = backups + [ logger.info(f"{bucket}/{backup_prefix}")
{
key: value paginator = client('s3').get_paginator('list_objects_v2')
for key, value in basebackup.__dict__.items() pages = paginator.paginate(Bucket=bucket, Prefix=backup_prefix)
if isinstance(value, str) or isinstance(value, int)
} for page in pages:
for basebackup in Attrs.call( for obj in page.get("Contents", []):
f=configure_backup_cxt, key = obj["Key"]
aws_instance_profile=use_aws_instance_profile, if not key.endswith("backup_stop_sentinel.json"):
s3_prefix=f's3://{bucket}/{prefix}{pg_cluster}{suffix}/wal/{vp}', continue
)._backup_list(detail=True)
] response = client('s3').get_object(Bucket=bucket, Key=key)
backup_info = loads(response["Body"].read().decode("utf-8"))
last_modified = response["LastModified"].astimezone(timezone.utc).isoformat()
backup_name = key.split("/")[-1].replace("_backup_stop_sentinel.json", "")
start_seg, start_offset = backup_name.split("_")[1], backup_name.split("_")[-1] if "_" in backup_name else None
if "LSN" in backup_info and "FinishLSN" in backup_info:
# WAL-G
lsn = backup_info["LSN"]
finish_lsn = backup_info["FinishLSN"]
backups.append({
"expanded_size_bytes": backup_info.get("UncompressedSize"),
"last_modified": last_modified,
"name": backup_name,
"wal_segment_backup_start": start_seg,
"wal_segment_backup_stop": lsn_to_wal_segment_stop(finish_lsn, start_seg),
"wal_segment_offset_backup_start": lsn_to_offset_hex(lsn),
"wal_segment_offset_backup_stop": lsn_to_offset_hex(finish_lsn),
})
elif "wal_segment_backup_stop" in backup_info:
# WAL-E
stop_seg = backup_info["wal_segment_backup_stop"]
stop_offset = backup_info["wal_segment_offset_backup_stop"]
backups.append({
"expanded_size_bytes": backup_info.get("expanded_size_bytes"),
"last_modified": last_modified,
"name": backup_name,
"wal_segment_backup_start": start_seg,
"wal_segment_backup_stop": stop_seg,
"wal_segment_offset_backup_start": start_offset,
"wal_segment_offset_backup_stop": stop_offset,
})
return backups return backups
......
...@@ -11,5 +11,4 @@ kubernetes==11.0.0 ...@@ -11,5 +11,4 @@ kubernetes==11.0.0
python-json-logger==2.0.7 python-json-logger==2.0.7
requests==2.32.2 requests==2.32.2
stups-tokens>=1.1.19 stups-tokens>=1.1.19
wal_e==1.1.1
werkzeug==3.0.6 werkzeug==3.0.6
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment