From bacf37e68926c46ed33e9a17afaa0d41923b441d Mon Sep 17 00:00:00 2001 From: "wu.chunyang" Date: Fri, 13 Jun 2025 14:36:03 +0800 Subject: [PATCH] Add support for PostgreSQL 16 & 17 This commit adds healthcheck for postgresql to check health status. Change-Id: I110007516323e3193414e24ed6799e40b7870bd8 Signed-off-by: wu.chunyang --- devstack/plugin.sh | 6 +- ...support-postgresql17-63a0ff685e4fe197.yaml | 5 + .../guestagent/datastore/postgres/service.py | 31 ++++- trove/guestagent/utils/docker.py | 1 + zuul.d/jobs.yaml | 116 ----------------- zuul.d/postgresql_jobs.yaml | 117 ++++++++++++++++++ zuul.d/projects.yaml | 11 +- 7 files changed, 162 insertions(+), 125 deletions(-) create mode 100644 releasenotes/notes/add-support-postgresql17-63a0ff685e4fe197.yaml create mode 100644 zuul.d/postgresql_jobs.yaml diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 26ccaa1a07..4f09b99404 100644 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -527,7 +527,7 @@ function create_registry_container { container=$(sudo docker ps -a --format "{{.Names}}" --filter name=registry) if [ -z $container ]; then sudo docker run -d --net=host -e REGISTRY_HTTP_ADDR=0.0.0.0:4000 --restart=always -v /opt/trove_registry/:/var/lib/registry --name registry quay.io/openstack.trove/registry:2 - for img in {"mysql:8.0","mariadb:11.4","postgres:12"}; + for img in {"mysql:8.0","mariadb:11.4","postgres:17"}; do sudo docker pull quay.io/openstack.trove/${img} && sudo docker tag quay.io/openstack.trove/${img} 127.0.0.1:4000/trove-datastores/${img} && sudo docker push 127.0.0.1:4000/trove-datastores/${img} done @@ -535,10 +535,10 @@ function create_registry_container { # build backup images sudo docker build --network host -t 127.0.0.1:4000/trove-datastores/db-backup-mysql:8.0 --build-arg DATASTORE=mysql --build-arg DATASTORE_VERSION=8.0 . sudo docker build --network host -t 127.0.0.1:4000/trove-datastores/db-backup-mariadb:11.4 --build-arg DATASTORE=mariadb --build-arg DATASTORE_VERSION=11.4 . - sudo docker build --network host -t 127.0.0.1:4000/trove-datastores/db-backup-postgresql:12 --build-arg DATASTORE=postgresql --build-arg BASE_OS_VERSION=20.04 --build-arg DATASTORE_VERSION=12 . + sudo docker build --network host -t 127.0.0.1:4000/trove-datastores/db-backup-postgresql:17 --build-arg DATASTORE=postgresql --build-arg DATASTORE_VERSION=17 . popd # push backup images - for backupimg in {"db-backup-mysql:8.0","db-backup-mariadb:11.4","db-backup-postgresql:12"}; + for backupimg in {"db-backup-mysql:8.0","db-backup-mariadb:11.4","db-backup-postgresql:17"}; do sudo docker push 127.0.0.1:4000/trove-datastores/${backupimg} done diff --git a/releasenotes/notes/add-support-postgresql17-63a0ff685e4fe197.yaml b/releasenotes/notes/add-support-postgresql17-63a0ff685e4fe197.yaml new file mode 100644 index 0000000000..f712526127 --- /dev/null +++ b/releasenotes/notes/add-support-postgresql17-63a0ff685e4fe197.yaml @@ -0,0 +1,5 @@ +--- +features: + - Add the support of PostgreSQL 16 & 17 +deprecations: + - Remove the support of PostgreSQL 12 diff --git a/trove/guestagent/datastore/postgres/service.py b/trove/guestagent/datastore/postgres/service.py index 8d0f9cb0e9..fe7b243a2a 100644 --- a/trove/guestagent/datastore/postgres/service.py +++ b/trove/guestagent/datastore/postgres/service.py @@ -48,7 +48,7 @@ class PgSqlAppStatus(service.BaseDbStatus): def __init__(self, docker_client): super(PgSqlAppStatus, self).__init__(docker_client) - def get_actual_db_status(self): + def _get_container_status(self): """Check database service status.""" status = docker_util.get_container_status(self.docker_client) if status == "running": @@ -74,10 +74,38 @@ class PgSqlAppStatus(service.BaseDbStatus): else: return service_status.ServiceStatuses.UNKNOWN + def get_actual_db_status(self): + health = docker_util.get_container_health(self.docker_client) + LOG.debug('container health status: %s', health) + if health == "healthy": + return service_status.ServiceStatuses.HEALTHY + elif health == "starting": + return service_status.ServiceStatuses.RUNNING + elif health == "unhealthy": + # In case the container was stopped + status = docker_util.get_container_status(self.docker_client) + if status == "exited": + return service_status.ServiceStatuses.SHUTDOWN + else: + return service_status.ServiceStatuses.CRASHED + + # if the health status is one of unkown or None, let's check + # container status. this is for the compatibility with the + # old datastores. + return self._get_container_status() + class PgSqlApp(service.BaseDbApp): _configuration_manager = None + HEALTHCHECK = { + "test": ["CMD", "pg_isready", "-U", "postgres"], + "start_period": 10 * 1000000000, # 10 seconds in nanoseconds + "interval": 10 * 1000000000, + "timeout": 5 * 1000000000, + "retries": 3 + } + @property def configuration_manager(self): if self._configuration_manager: @@ -221,6 +249,7 @@ class PgSqlApp(service.BaseDbApp): "POSTGRES_PASSWORD": postgres_pass, "PGDATA": self.datadir, }, + healthcheck=self.HEALTHCHECK, command=command ) diff --git a/trove/guestagent/utils/docker.py b/trove/guestagent/utils/docker.py index df9c299d78..d9addd2e09 100644 --- a/trove/guestagent/utils/docker.py +++ b/trove/guestagent/utils/docker.py @@ -153,6 +153,7 @@ def start_container(client, image, name="database", f"Creating docker container, image: {image}, " f"volumes: {volumes}, ports: {ports}, user: {user}, " f"network_mode: {network_mode}, environment: {environment}, " + f"health_check: {healthcheck}, " f"command: {command}") kwargs = dict(name=name, restart_policy={"Name": restart_policy}, diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml index 1c5e92f662..7d104501c3 100644 --- a/zuul.d/jobs.yaml +++ b/zuul.d/jobs.yaml @@ -330,122 +330,6 @@ backup_wait_timeout: 1200 default_datastore_versions: mysql:8.0 -- job: - name: trove-tempest-ubuntu-base-postgresql12 - parent: trove-tempest-ubuntu-base - irrelevant-files: - - ^.*\.rst$ - - ^api-ref/.*$ - - ^doc/.*$ - - ^etc/.*$ - - ^releasenotes/.*$ - - ^test-requirements.txt$ - - ^tox.ini$ - - ^LICENSE$ - - ^contrib/ - - ^zuul\.d/ - - ^backup/ - - ^\..+ - - ^trove/guestagent/strategies/replication/ - - ^trove/guestagent/datastore/(mysql.*|mariadb)/.*$ - vars: - devstack_localrc: - TROVE_DATASTORE_TYPE: postgresql - TROVE_DATASTORE_VERSION: 12 - devstack_local_conf: - test-config: - $TEMPEST_CONFIG: - database: - enabled_datastores: "postgresql" - default_datastore_versions: postgresql:12 - -- job: - name: trove-tempest-ubuntu-backup-postgresql12 - parent: trove-tempest-ubuntu-backup - irrelevant-files: - - ^.*\.rst$ - - ^api-ref/.*$ - - ^doc/.*$ - - ^etc/.*$ - - ^releasenotes/.*$ - - ^test-requirements.txt$ - - ^tox.ini$ - - ^LICENSE$ - - ^contrib/ - - ^zuul\.d/ - - ^\..+ - - ^trove/guestagent/strategies/replication/ - - ^trove/guestagent/datastore/(mysql.*|mariadb)/.*$ - vars: - devstack_localrc: - TROVE_DATASTORE_TYPE: postgresql - TROVE_DATASTORE_VERSION: 12 - devstack_local_conf: - test-config: - $TEMPEST_CONFIG: - database: - enabled_datastores: "postgresql" - default_datastore_versions: postgresql:12 - -- job: - name: trove-tempest-ubuntu-replication-postgresql12 - parent: trove-tempest-ubuntu-replication - irrelevant-files: - - ^.*\.rst$ - - ^api-ref/.*$ - - ^doc/.*$ - - ^etc/.*$ - - ^releasenotes/.*$ - - ^test-requirements.txt$ - - ^tox.ini$ - - ^LICENSE$ - - ^contrib/ - - ^zuul\.d/ - - ^backup/ - - ^\..+ - - ^trove/guestagent/datastore/(mysql.*|mariadb)/.*$ - - ^trove/guestagent/strategies/replication/(mariadb.*|mysql.*)\.py$ - vars: - devstack_localrc: - TROVE_DATASTORE_TYPE: postgresql - TROVE_DATASTORE_VERSION: 12 - devstack_local_conf: - test-config: - $TEMPEST_CONFIG: - database: - enabled_datastores: "postgresql" - default_datastore_versions: postgresql:12 - -- job: - name: trove-tempest-cinder-storage-driver-postgresql12 - parent: trove-tempest-snapshot - irrelevant-files: - - ^.*\.rst$ - - ^api-ref/.*$ - - ^doc/.*$ - - ^etc/.*$ - - ^releasenotes/.*$ - - ^test-requirements.txt$ - - ^tox.ini$ - - ^LICENSE$ - - ^contrib/ - - ^zuul\.d/ - - ^backup/ - - ^\..+ - - ^trove/guestagent/datastore/(mysql|mariadb)/.*$ - - ^trove/guestagent/strategies/replication/(mysql.*|mariadb.*)\.py$ - vars: - devstack_localrc: - TROVE_DATASTORE_TYPE: postgresql - TROVE_DATASTORE_VERSION: 12 - devstack_local_conf: - test-config: - $TEMPEST_CONFIG: - database: - backup_wait_timeout: 1200 - enabled_datastores: "postgresql" - default_datastore_versions: postgresql:12 - - job: name: publish-trove-guest-image parent: publish-openstack-artifacts diff --git a/zuul.d/postgresql_jobs.yaml b/zuul.d/postgresql_jobs.yaml new file mode 100644 index 0000000000..3a8cc41e5b --- /dev/null +++ b/zuul.d/postgresql_jobs.yaml @@ -0,0 +1,117 @@ +# PostgreSQL jobs + +- job: + name: trove-tempest-ubuntu-base-postgresql17 + parent: trove-tempest-ubuntu-base + irrelevant-files: + - ^.*\.rst$ + - ^api-ref/.*$ + - ^doc/.*$ + - ^etc/.*$ + - ^releasenotes/.*$ + - ^test-requirements.txt$ + - ^tox.ini$ + - ^LICENSE$ + - ^contrib/ + - ^zuul\.d/ + - ^backup/ + - ^\..+ + - ^trove/guestagent/strategies/replication/ + - ^trove/guestagent/datastore/(mysql.*|mariadb)/.*$ + vars: + devstack_localrc: + TROVE_DATASTORE_TYPE: postgresql + TROVE_DATASTORE_VERSION: 17 + devstack_local_conf: + test-config: + $TEMPEST_CONFIG: + database: + enabled_datastores: "postgresql" + default_datastore_versions: postgresql:17 + +- job: + name: trove-tempest-ubuntu-backup-postgresql17 + parent: trove-tempest-ubuntu-backup + irrelevant-files: + - ^.*\.rst$ + - ^api-ref/.*$ + - ^doc/.*$ + - ^etc/.*$ + - ^releasenotes/.*$ + - ^test-requirements.txt$ + - ^tox.ini$ + - ^LICENSE$ + - ^contrib/ + - ^zuul\.d/ + - ^\..+ + - ^trove/guestagent/strategies/replication/ + - ^trove/guestagent/datastore/(mysql.*|mariadb)/.*$ + vars: + devstack_localrc: + TROVE_DATASTORE_TYPE: postgresql + TROVE_DATASTORE_VERSION: 17 + devstack_local_conf: + test-config: + $TEMPEST_CONFIG: + database: + enabled_datastores: "postgresql" + default_datastore_versions: postgresql:17 + +- job: + name: trove-tempest-ubuntu-replication-postgresql17 + parent: trove-tempest-ubuntu-replication + irrelevant-files: + - ^.*\.rst$ + - ^api-ref/.*$ + - ^doc/.*$ + - ^etc/.*$ + - ^releasenotes/.*$ + - ^test-requirements.txt$ + - ^tox.ini$ + - ^LICENSE$ + - ^contrib/ + - ^zuul\.d/ + - ^backup/ + - ^\..+ + - ^trove/guestagent/datastore/(mysql.*|mariadb)/.*$ + - ^trove/guestagent/strategies/replication/(mariadb.*|mysql.*)\.py$ + vars: + devstack_localrc: + TROVE_DATASTORE_TYPE: postgresql + TROVE_DATASTORE_VERSION: 17 + devstack_local_conf: + test-config: + $TEMPEST_CONFIG: + database: + enabled_datastores: "postgresql" + default_datastore_versions: postgresql:17 + +- job: + name: trove-tempest-cinder-storage-driver-postgresql17 + parent: trove-tempest-snapshot + irrelevant-files: + - ^.*\.rst$ + - ^api-ref/.*$ + - ^doc/.*$ + - ^etc/.*$ + - ^releasenotes/.*$ + - ^test-requirements.txt$ + - ^tox.ini$ + - ^LICENSE$ + - ^contrib/ + - ^zuul\.d/ + - ^backup/ + - ^\..+ + - ^trove/guestagent/datastore/(mysql|mariadb)/.*$ + - ^trove/guestagent/strategies/replication/(mysql.*|mariadb.*)\.py$ + vars: + devstack_localrc: + TROVE_DATASTORE_TYPE: postgresql + TROVE_DATASTORE_VERSION: 17 + devstack_local_conf: + test-config: + $TEMPEST_CONFIG: + database: + backup_wait_timeout: 1200 + enabled_datastores: "postgresql" + default_datastore_versions: postgresql:17 \ No newline at end of file diff --git a/zuul.d/projects.yaml b/zuul.d/projects.yaml index 8723a3efbb..0936b187a3 100644 --- a/zuul.d/projects.yaml +++ b/zuul.d/projects.yaml @@ -26,12 +26,13 @@ voting: false - trove-tempest-cinder-storage-driver-mariadb11.4: voting: false - - trove-tempest-ubuntu-base-postgresql12 - - trove-tempest-ubuntu-backup-postgresql12: + - trove-tempest-ubuntu-base-postgresql17: voting: false - - trove-tempest-ubuntu-replication-postgresql12: + - trove-tempest-ubuntu-backup-postgresql17: voting: false - - trove-tempest-cinder-storage-driver-postgresql12: + - trove-tempest-ubuntu-replication-postgresql17: + voting: false + - trove-tempest-cinder-storage-driver-postgresql17: voting: false - openstack-tox-cover: voting: true @@ -43,7 +44,7 @@ jobs: - trove-tempest-ubuntu-base-mysql8.0 - trove-tempest-ubuntu-base-mariadb11.4 - - trove-tempest-ubuntu-base-postgresql12 + - trove-tempest-ubuntu-base-postgresql17 experimental: jobs: - trove-tempest-ipv6-only