sts-sponsors team mailing list archive
-
sts-sponsors team
-
Mailing list archive
-
Message #08064
[Merge] ~ack/maas-site-manager:accepted-sites into maas-site-manager:main
Alberto Donato has proposed merging ~ack/maas-site-manager:accepted-sites into maas-site-manager:main.
Commit message:
add accepted and created fields to Site, only return accepted ones in /sites
Requested reviews:
MAAS Committers (maas-committers)
For more details, see:
https://code.launchpad.net/~ack/maas-site-manager/+git/site-manager/+merge/442289
--
Your team MAAS Committers is requested to review the proposed merge of ~ack/maas-site-manager:accepted-sites into maas-site-manager:main.
diff --git a/backend/msm/db/_tables.py b/backend/msm/db/_tables.py
index 41bc816..70affca 100644
--- a/backend/msm/db/_tables.py
+++ b/backend/msm/db/_tables.py
@@ -1,6 +1,8 @@
+from datetime import datetime
from uuid import uuid4
from sqlalchemy import (
+ Boolean,
Column,
ForeignKey,
Integer,
@@ -27,6 +29,8 @@ Site = Table(
Column("street", Text),
Column("timezone", Text),
Column("url", Text),
+ Column("accepted", Boolean, nullable=False, index=True, default=False),
+ Column("created", DateTime, nullable=False, default=datetime.utcnow),
)
@@ -49,7 +53,7 @@ Token = Table(
"value", UUID(as_uuid=True), nullable=False, index=True, default=uuid4
),
Column("expired", DateTime, nullable=False),
- Column("created", DateTime, nullable=False),
+ Column("created", DateTime, nullable=False, default=datetime.utcnow),
)
diff --git a/backend/msm/db/queries.py b/backend/msm/db/queries.py
index e0d0cff..ff5df47 100644
--- a/backend/msm/db/queries.py
+++ b/backend/msm/db/queries.py
@@ -107,6 +107,7 @@ async def get_filtered_sites(
street: list[str] | None = None,
timezone: list[str] | None = None,
url: list[str] | None = None,
+ accepted: bool | None = None,
) -> tuple[int, Iterable[SiteSchema]]:
filters = filters_from_arguments(
Site,
@@ -119,6 +120,8 @@ async def get_filtered_sites(
timezone=timezone,
url=url,
)
+ if accepted is not None:
+ filters.append(Site.c.accepted == accepted)
count = (
await session.execute(
select(func.count())
diff --git a/backend/msm/user_api/_base.py b/backend/msm/user_api/_base.py
index 48fb1b0..1f4d1f1 100644
--- a/backend/msm/user_api/_base.py
+++ b/backend/msm/user_api/_base.py
@@ -52,6 +52,7 @@ async def sites(
session,
offset=pagination_params.offset,
limit=pagination_params.size,
+ accepted=True, # only list accepted sites here
**filter_params._asdict(),
)
return PaginatedSites(
diff --git a/backend/tests/user_api/test_handlers.py b/backend/tests/user_api/test_handlers.py
index 1c9c121..8a5d97c 100644
--- a/backend/tests/user_api/test_handlers.py
+++ b/backend/tests/user_api/test_handlers.py
@@ -62,6 +62,7 @@ async def test_list_sites(
"street": "110 Southwark St",
"timezone": "Europe/London",
"url": "https://londoncalling.example.com",
+ "accepted": True,
}
site2 = site1.copy()
site2.update(
@@ -75,6 +76,9 @@ async def test_list_sites(
sites = await fixture.create("site", [site1, site2])
for site in sites:
site["stats"] = None
+ del site["created"]
+ del site["accepted"]
+
page1 = await authenticated_user_app_client.get("/sites")
assert page1.status_code == 200
assert page1.json() == {
@@ -104,6 +108,48 @@ async def test_list_sites(
@pytest.mark.asyncio
+async def test_list_sites_only_accepted(
+ authenticated_user_app_client: AuthAsyncClient, fixture: Fixture
+) -> None:
+ site1 = {
+ "name": "LondonHQ",
+ "city": "London",
+ "country": "gb",
+ "latitude": "51.509865",
+ "longitude": "-0.118092",
+ "note": "the first site",
+ "region": "Blue Fin Bldg",
+ "street": "110 Southwark St",
+ "timezone": "Europe/London",
+ "url": "https://londoncalling.example.com",
+ "accepted": True,
+ }
+ site2 = site1.copy()
+ site2.update(
+ {
+ "name": "BerlinHQ",
+ "timezone": "Europe/Berlin",
+ "city": "Berlin",
+ "country": "de",
+ "accepted": False,
+ }
+ )
+ created_site, _ = await fixture.create("site", [site1, site2])
+ created_site["stats"] = None
+ del created_site["created"]
+ del created_site["accepted"]
+
+ page1 = await authenticated_user_app_client.get("/sites")
+ assert page1.status_code == 200
+ assert page1.json() == {
+ "page": 1,
+ "size": 20,
+ "total": 1,
+ "items": [created_site],
+ }
+
+
+@pytest.mark.asyncio
async def test_list_sites_filter_timezone(
authenticated_user_app_client: AuthAsyncClient, fixture: Fixture
) -> None:
@@ -118,6 +164,7 @@ async def test_list_sites_filter_timezone(
"street": "110 Southwark St",
"timezone": "Europe/London",
"url": "https://londoncalling.example.com",
+ "accepted": True,
}
site2 = site1.copy()
site2.update(
@@ -130,6 +177,8 @@ async def test_list_sites_filter_timezone(
)
[created_site, _] = await fixture.create("site", [site1, site2])
created_site["stats"] = None
+ del created_site["created"]
+ del created_site["accepted"]
page1 = await authenticated_user_app_client.get(
"/sites?timezone=Europe/London"
)
@@ -160,6 +209,7 @@ async def test_list_sites_with_stats(
"street": "110 Southwark St",
"timezone": "Europe/London",
"url": "https://londoncalling.example.com",
+ "accepted": True,
}
],
)
@@ -180,6 +230,8 @@ async def test_list_sites_with_stats(
del site_data["site_id"]
site_data["last_seen"] = site_data["last_seen"].isoformat()
site["stats"] = site_data
+ del site["created"]
+ del site["accepted"]
page = await authenticated_user_app_client.get("/sites")
assert page.status_code == 200
@@ -291,6 +343,7 @@ async def test_sites_fails_without_login(
"street": "110 Southwark St",
"timezone": "Europe/London",
"url": "https://londoncalling.example.com",
+ "accepted": True,
}
]
await fixture.create("site", site)
diff --git a/test-data/import.sh b/test-data/import.sh
index 8adf22f..da238be 100755
--- a/test-data/import.sh
+++ b/test-data/import.sh
@@ -35,8 +35,8 @@ EOF
fi
(
- copy_cmd sites.csv 'site(id, city, country, latitude, longitude, name, note, region, street, timezone, url)'
+ copy_cmd sites.csv 'site(id, city, country, latitude, longitude, name, note, region, street, timezone, url, accepted, created)'
copy_cmd tokens.csv 'token(site_id, value, expired, created)'
copy_cmd users.csv '"user"(email, full_name, password)'
copy_cmd site_data.csv 'site_data(site_id, allocated_machines, deployed_machines, ready_machines, error_machines, last_seen)'
-) | psql "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
+) | psql --single-transaction "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
diff --git a/test-data/sites.csv b/test-data/sites.csv
index 9798eba..b25a675 100644
--- a/test-data/sites.csv
+++ b/test-data/sites.csv
@@ -1,9 +1,9 @@
-id,city, country, latitude, longitude, name, note, region, street, timezone, url
-1,London,GB,51.501990,-0.092200,Canonical Group Limited,4th Floor,,201 Borough High Street,Europe/London,https://london.canonical.example.com
-2,Austin,US,30.269612,-97.741057,Canonical USA Inc.,Perry Brooks Building - Suite 300,,720 Brazos Street,America/Chicago,https://austin.canonical.example.com
-3,Boston,US,42.358859,-71.059615,Canonical USA Inc. 001,Suite 210,,18 Tremont Street,America/Chicago,https://boston.canonical.example.com
-4,Shanghai,CN,31.187270,121.436829,Canonical China,上海市漕溪北路331号12楼1246室,,No. 331 North Caoxi Road,Asia/Shanghai,https://shanghai.canonical.example.com
-5,Beijing,CN,39.908447,116.448690,Canonical China 001,China World Office 1; 北京市朝阳区建国门外大街1号国贸写字楼1座11层1118-19室 100004,Chaoyang District,1 Jianguomenwai Avenue,Asia/Shanghai,https://shanghai.canonical.example.com
-6,Taipei City,TW,25.058098,121.543406,Canonical Group Limited - Taiwan Branch,105402 台北市松山區民生東路三段100號12樓,Songshan Dist.,"12F.,No. 100,Sec. 3,Minsheng E. Rd.",Asia/Taipei,https://taiwan.canonical.example.com
-7,Douglas,IM,54.153072,-4.481012,Canonical Limited,2nd Floor - Clarendon House,,Victoria Street,Europe/London,https://canonical.example.com
-8,Tokyo,JP,35.673242,139.740669,Canonical Japan K.K,3rd Floor - Sanno Park Tower,,2-11-1 Nagata-cho Chiyoda-ku,Japan,https://japan.canonical.example.com
+id,city,country,latitude,longitude,name,note,region,street,timezone,url,accepted,created
+1,London,GB,51.501990,-0.092200,Canonical Group Limited,4th Floor,,201 Borough High Street,Europe/London,https://london.canonical.example.com,t,2023-04-19 14:01:40.107611
+2,Austin,US,30.269612,-97.741057,Canonical USA Inc.,Perry Brooks Building - Suite 300,,720 Brazos Street,America/Chicago,https://austin.canonical.example.com,t,2023-04-28 14:01:34.229025
+3,Boston,US,42.358859,-71.059615,Canonical USA Inc. 001,Suite 210,,18 Tremont Street,America/Chicago,https://boston.canonical.example.com,t,2023-05-04 14:01:49.706886
+4,Shanghai,CN,31.187270,121.436829,Canonical China,上海市漕溪北路331号12楼1246室,,No. 331 North Caoxi Road,Asia/Shanghai,https://shanghai.canonical.example.com,f,2023-04-03 14:01:27.419476
+5,Beijing,CN,39.908447,116.448690,Canonical China 001,China World Office 1; 北京市朝阳区建国门外大街1号国贸写字楼1座11层1118-19室 100004,Chaoyang District,1 Jianguomenwai Avenue,Asia/Shanghai,https://shanghai.canonical.example.com,t,2023-05-03 15:02:11.107339
+6,Taipei City,TW,25.058098,121.543406,Canonical Group Limited - Taiwan Branch,105402 台北市松山區民生東路三段100號12樓,Songshan Dist.,"12F.,No. 100,Sec. 3,Minsheng E. Rd.",Asia/Taipei,https://taiwan.canonical.example.com,t,2023-05-04 14:02:24.156508
+7,Douglas,IM,54.153072,-4.481012,Canonical Limited,2nd Floor - Clarendon House,,Victoria Street,Europe/London,https://canonical.example.com,f,2023-04-13 14:02:31.611254
+8,Tokyo,JP,35.673242,139.740669,Canonical Japan K.K,3rd Floor - Sanno Park Tower,,2-11-1 Nagata-cho Chiyoda-ku,Japan,https://japan.canonical.example.com,t,2022-05-03 14:02:42.955134
Follow ups