mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-15 17:32:56 +00:00
Add /installed_extensions endpoint to collect
statistics about extension usage.
It returns a list of installed extensions in the format:
```json
{
"extensions": [
{
"extname": "extension_name",
"versions": ["1.0", "1.1"],
"n_databases": 5,
}
]
}
```
---------
Co-authored-by: Heikki Linnakangas <heikki@neon.tech>
88 lines
3.1 KiB
Python
88 lines
3.1 KiB
Python
from logging import info
|
|
|
|
from fixtures.neon_fixtures import NeonEnv
|
|
|
|
|
|
def test_installed_extensions(neon_simple_env: NeonEnv):
|
|
"""basic test for the endpoint that returns the list of installed extensions"""
|
|
|
|
env = neon_simple_env
|
|
|
|
env.create_branch("test_installed_extensions")
|
|
|
|
endpoint = env.endpoints.create_start("test_installed_extensions")
|
|
|
|
endpoint.safe_psql("CREATE DATABASE test_installed_extensions")
|
|
endpoint.safe_psql("CREATE DATABASE test_installed_extensions_2")
|
|
|
|
client = endpoint.http_client()
|
|
res = client.installed_extensions()
|
|
|
|
info("Extensions list: %s", res)
|
|
info("Extensions: %s", res["extensions"])
|
|
# 'plpgsql' is a default extension that is always installed.
|
|
assert any(
|
|
ext["extname"] == "plpgsql" and ext["versions"] == ["1.0"] for ext in res["extensions"]
|
|
), "The 'plpgsql' extension is missing"
|
|
|
|
# check that the neon_test_utils extension is not installed
|
|
assert not any(
|
|
ext["extname"] == "neon_test_utils" for ext in res["extensions"]
|
|
), "The 'neon_test_utils' extension is installed"
|
|
|
|
pg_conn = endpoint.connect(dbname="test_installed_extensions")
|
|
with pg_conn.cursor() as cur:
|
|
cur.execute("CREATE EXTENSION neon_test_utils")
|
|
cur.execute(
|
|
"SELECT default_version FROM pg_available_extensions WHERE name = 'neon_test_utils'"
|
|
)
|
|
res = cur.fetchone()
|
|
neon_test_utils_version = res[0]
|
|
|
|
with pg_conn.cursor() as cur:
|
|
cur.execute("CREATE EXTENSION neon version '1.1'")
|
|
|
|
pg_conn_2 = endpoint.connect(dbname="test_installed_extensions_2")
|
|
with pg_conn_2.cursor() as cur:
|
|
cur.execute("CREATE EXTENSION neon version '1.2'")
|
|
|
|
res = client.installed_extensions()
|
|
|
|
info("Extensions list: %s", res)
|
|
info("Extensions: %s", res["extensions"])
|
|
|
|
# check that the neon_test_utils extension is installed only in 1 database
|
|
# and has the expected version
|
|
assert any(
|
|
ext["extname"] == "neon_test_utils"
|
|
and ext["versions"] == [neon_test_utils_version]
|
|
and ext["n_databases"] == 1
|
|
for ext in res["extensions"]
|
|
)
|
|
|
|
# check that the plpgsql extension is installed in all databases
|
|
# this is a default extension that is always installed
|
|
assert any(ext["extname"] == "plpgsql" and ext["n_databases"] == 4 for ext in res["extensions"])
|
|
|
|
# check that the neon extension is installed and has expected versions
|
|
for ext in res["extensions"]:
|
|
if ext["extname"] == "neon":
|
|
assert ext["n_databases"] == 2
|
|
ext["versions"].sort()
|
|
assert ext["versions"] == ["1.1", "1.2"]
|
|
|
|
with pg_conn.cursor() as cur:
|
|
cur.execute("ALTER EXTENSION neon UPDATE TO '1.3'")
|
|
|
|
res = client.installed_extensions()
|
|
|
|
info("Extensions list: %s", res)
|
|
info("Extensions: %s", res["extensions"])
|
|
|
|
# check that the neon_test_utils extension is updated
|
|
for ext in res["extensions"]:
|
|
if ext["extname"] == "neon":
|
|
assert ext["n_databases"] == 2
|
|
ext["versions"].sort()
|
|
assert ext["versions"] == ["1.2", "1.3"]
|