2727import subprocess
2828import urllib .parse
2929from http import HTTPStatus
30- from typing import TYPE_CHECKING , Any , cast
30+ from typing import TYPE_CHECKING , cast
3131
3232import pydantic
3333import requests
4040 details_from_called_process_error ,
4141)
4242from craft_providers .instance_config import InstanceConfiguration
43+ from craft_providers .models import SnapInfo
4344from craft_providers .util import snap_cmd , temp_paths
4445
4546if TYPE_CHECKING :
@@ -126,7 +127,7 @@ def _pack_host_snap(*, snap_name: str, output: pathlib.Path) -> None:
126127 )
127128
128129
129- def get_host_snap_info (snap_name : str ) -> dict [ str , Any ] :
130+ def get_host_snap_info (snap_name : str ) -> SnapInfo :
130131 """Get info about a snap installed on the host."""
131132 quoted_name = urllib .parse .quote (snap_name , safe = "" )
132133 url = f"http+unix://%2Frun%2Fsnapd.socket/v2/snaps/{ quoted_name } "
@@ -137,7 +138,8 @@ def get_host_snap_info(snap_name: str) -> dict[str, Any]:
137138 brief = "Unable to connect to snapd service."
138139 ) from error
139140 snap_info .raise_for_status ()
140- return cast ("dict[str, Any]" , snap_info .json ()["result" ])
141+ result = snap_info .json ()["result" ]
142+ return SnapInfo .model_validate (result )
141143
142144
143145def _get_target_snap_revision_from_snapd (
@@ -294,12 +296,15 @@ def _add_assertions_from_host(executor: Executor, snap_name: str) -> None:
294296 )
295297 snap_info = get_host_snap_info (snap_name )
296298
299+ if not snap_info .publisher :
300+ raise ProviderError ("Can't get assertion for snap with no publisher info." )
301+
297302 try :
298303 with _get_assertions_file (
299304 snap_name = snap_name ,
300- snap_id = snap_info [ "id" ] ,
301- snap_revision = snap_info [ " revision" ] ,
302- snap_publisher_id = snap_info [ " publisher" ][ "id" ] ,
305+ snap_id = snap_info . id ,
306+ snap_revision = snap_info . revision ,
307+ snap_publisher_id = snap_info . publisher . id ,
303308 ) as host_assert_path :
304309 executor .push_file (
305310 source = host_assert_path ,
@@ -352,14 +357,14 @@ def inject_from_host(*, executor: Executor, snap_name: str, classic: bool) -> No
352357 )
353358
354359 host_snap_info = get_host_snap_info (snap_name )
355- host_snap_base = host_snap_info .get ( " base" , None )
360+ host_snap_base = host_snap_info .base
356361 if host_snap_base :
357362 logger .debug (
358363 "Installing base snap %r for %r from host" , host_snap_base , snap_name
359364 )
360365 inject_from_host (executor = executor , snap_name = host_snap_base , classic = False )
361366
362- host_revision = host_snap_info [ " revision" ]
367+ host_revision = host_snap_info . revision
363368 target_revision = _get_snap_revision_ensuring_source (
364369 snap_name = snap_store_name ,
365370 source = SNAP_SRC_HOST ,
0 commit comments