bundlewrap/bundles/postgresql/metadata.py
CroneKorkN 186d5039af
migrate to bundlewrap 5
- pin bundlewrap ~=5.0
- rewrite non-reading and KeyError-driven metadata reactors per
  https://docs.bundlewrap.org/guide/migrate_45/ (defaults / metadata.get
  paths / MetadataUnavailable)
- rename custom Download item methods (cdict/sdict/get_auto_deps ->
  expected_state/actual_state/get_auto_attrs)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 11:56:49 +02:00

106 lines
2.6 KiB
Python

import builtins
root_password = repo.vault.password_for(f'{node.name} postgresql root')
defaults = {
'apt': {
'packages': {
'postgresql': {
'needs': {
'zfs_dataset:tank/postgresql',
},
},
},
},
'backup': {
'paths': {
'/var/lib/postgresql',
},
},
'postgresql': {
'conf': {},
'roles': {
'root': {
'password': root_password,
'superuser': True,
},
},
'databases': {},
},
'grafana_rows': set(),
}
if node.has_bundle('zfs'):
defaults['zfs'] = {
'datasets': {
'tank/postgresql': {
'mountpoint': '/var/lib/postgresql',
'recordsize': '8192',
'atime': 'off',
},
},
}
@metadata_reactor.provides(
'postgresql/conf',
)
def conf(metadata):
conf = {}
def limit(value, min=float('-inf'), max=float('inf'), unit=None):
result = int(builtins.max([builtins.min([max, value]), min]))
return str(result) + unit if unit else result
ram = metadata.get('vm/ram', None)
if ram:
conf['max_connections'] = limit(ram/50, min=100)
conf['shared_buffers'] = limit(ram/20, min=128, unit='MB')
conf['work_mem'] = limit(ram/500, min=4, max=64, unit='MB')
conf['temp_buffers'] = limit(ram/500, min=8, max=64, unit='MB')
conf['effective_cache_size'] = limit(ram/3, min=4096, unit='MB')
conf['maintenance_work_mem'] = limit(ram/50, min=64, unit='MB')
return {
'postgresql': {
'conf': conf,
},
}
@metadata_reactor.provides(
'apt/config/APT/NeverAutoRemove',
)
def apt(metadata):
return {
'apt': {
'config': {
'APT': {
'NeverAutoRemove': {
# https://github.com/credativ/postgresql-common/blob/master/pg_updateaptconfig#L17-L21
f"^postgresql.*-{metadata.get('postgresql/version')}",
},
},
},
},
}
@metadata_reactor.provides(
'telegraf/inputs/postgresql/default',
)
def telegraf(metadata):
return {
'telegraf': {
'inputs': {
'postgresql': {
'default': {
'address': f'postgres://root:{root_password}@localhost:5432/postgres',
'databases': sorted(list(node.metadata.get('postgresql/databases').keys())),
},
},
},
},
}