@@ -441,7 +441,10 @@ class LocalDeployType:
441441 """LocalDeployType deals with local only deployments.
442442 """
443443
444- async def resolve (self , url , architecture , app_name = None , channel = None , series = None , revision = None , entity_url = None , force = False ):
444+ async def resolve (self , url , architecture ,
445+ app_name = None , channel = None , series = None ,
446+ revision = None , entity_url = None , force = False ,
447+ model_conf = None ):
445448 """resolve attempts to resolve a local charm or bundle using the url
446449 and architecture. If information is missing, it will attempt to backfill
447450 that information, before sending the result back.
@@ -485,6 +488,7 @@ async def resolve(self, url, architecture, app_name=None, channel=None, series=N
485488 is_bundle = is_bundle ,
486489 )
487490
491+
488492class CharmhubDeployType :
489493 """CharmhubDeployType defines a class for resolving and deploying charmhub
490494 charms and bundles.
@@ -493,7 +497,10 @@ class CharmhubDeployType:
493497 def __init__ (self , charm_resolver ):
494498 self .charm_resolver = charm_resolver
495499
496- async def resolve (self , url , architecture , app_name = None , channel = None , series = None , revision = None , entity_url = None , force = False ):
500+ async def resolve (self , url , architecture ,
501+ app_name = None , channel = None , series = None ,
502+ revision = None , entity_url = None , force = False ,
503+ model_conf = None ):
497504 """resolve attempts to resolve charmhub charms or bundles. A request to
498505 the charmhub API is required to correctly determine the charm url and
499506 underlying origin.
@@ -515,16 +522,14 @@ async def resolve(self, url, architecture, app_name=None, channel=None, series=N
515522 track = ch .track ,
516523 base = base ,
517524 revision = revision ,
518- series = series
519525 )
520526
527+ charm_url , origin = await self .charm_resolver (url , origin , force , series , model_conf )
528+
521529 is_bundle = origin .type_ == "bundle"
522530 if is_bundle and revision and channel :
523531 raise JujuError ('revision and channel are mutually exclusive when deploying a bundle. Please choose one.' )
524532
525-
526- charm_url , origin = await self .charm_resolver (url , origin , force )
527-
528533 if app_name is None :
529534 app_name = url .name
530535
@@ -1679,7 +1684,12 @@ async def deploy(
16791684 if str (url .schema ) not in self .deploy_types :
16801685 raise JujuError ("unknown deploy type {}, expected charmhub or local" .format (url .schema ))
16811686
1682- res = await self .deploy_types [str (url .schema )].resolve (url , architecture , application_name , channel , series , revision , entity_url , force )
1687+ model_conf = await self .get_config ()
1688+ res = await self .deploy_types [str (url .schema )].resolve (url , architecture ,
1689+ application_name , channel ,
1690+ series , revision ,
1691+ entity_url , force ,
1692+ model_conf )
16831693
16841694 if res .identifier is None :
16851695 raise JujuError ('unknown charm or bundle {}' .format (entity_url ))
@@ -1790,7 +1800,7 @@ async def _add_charm(self, charm_url, origin):
17901800 client_facade = client .ClientFacade .from_connection (self .connection ())
17911801 return await client_facade .AddCharm (channel = str (origin .risk ), url = charm_url , force = False )
17921802
1793- async def _resolve_charm (self , url , origin , force = False ):
1803+ async def _resolve_charm (self , url , origin , force = False , series = None , model_config = None ):
17941804 """Calls Charms.ResolveCharms to resolve all the fields of the
17951805 charm_origin and also the url and the supported_series
17961806
@@ -1817,8 +1827,7 @@ async def _resolve_charm(self, url, origin, force=False):
18171827
18181828 resolve_origin = {'source' : source , 'architecture' : origin .architecture ,
18191829 'track' : origin .track , 'risk' : origin .risk ,
1820- 'base' : origin .base , 'series' : origin .series ,
1821- 'revision' : origin .revision ,
1830+ 'base' : origin .base , 'revision' : origin .revision ,
18221831 }
18231832
18241833 resp = await charms_facade .ResolveCharms (resolve = [{
@@ -1833,15 +1842,13 @@ async def _resolve_charm(self, url, origin, force=False):
18331842 raise JujuError (result .error .message )
18341843
18351844 supported_series = result .supported_series
1845+ resolved_origin = result .charm_origin
18361846 charm_url = URL .parse (result .url )
1837- if origin .series :
1838- # Check whether the charm supports this series
1839- # or we force it
1840- if origin .series in supported_series or force :
1841- result .charm_origin .series = origin .series
1842- charm_url .series = origin .series
1843- else :
1844- raise JujuError ("Series {} not supported for {}. Only {}" .format (origin .series , result .url , supported_series ))
1847+
1848+ # run the series selector to get a series for the base
1849+ selected_series = utils .series_selector (series , url , model_config , supported_series , force )
1850+ result .charm_origin .base = utils .get_base_from_origin_or_channel (resolved_origin , selected_series )
1851+ charm_url .series = selected_series
18451852
18461853 return result .url , result .charm_origin
18471854
0 commit comments