2525from .errors import JujuError , JujuApplicationConfigError
2626from .bundle import get_charm_series
2727from .placement import parse as parse_placement
28+ from .origin import Channel
2829
2930log = logging .getLogger (__name__ )
3031
@@ -643,6 +644,7 @@ async def refresh(
643644 raise ValueError ("switch and revision are mutually exclusive" )
644645
645646 resources_facade = client .ResourcesFacade .from_connection (self .connection )
647+
646648 app_facade = self ._facade ()
647649
648650 charm_url = self .data ['charm-url' ]
@@ -657,6 +659,30 @@ async def refresh(
657659 # Charmhub charms
658660 charmhub = self .model .charmhub
659661 charm_resources = await charmhub .list_resources (charm_name )
662+
663+ res = await app_facade .GetCharmURLOrigin (application = charm_name )
664+ charm_url = res .url
665+ origin = res .charm_origin
666+
667+ if channel :
668+ ch = Channel .parse (channel ).normalize ()
669+ origin .risk = ch .risk
670+ origin .track = ch .track
671+
672+ charms_facade = client .CharmsFacade .from_connection (self .connection )
673+ resolved_charm = await charms_facade .ResolveCharms (resolve = [client .ResolveCharmWithChannel (
674+ charm_origin = origin ,
675+ switch_charm = False ,
676+ reference = charm_url ,
677+ )])
678+ # TODO: error check here
679+ dest_origin = resolved_charm .results [0 ].charm_origin
680+ charm_url = resolved_charm .results [0 ].url
681+
682+ await charms_facade .AddCharm (url = charm_url ,
683+ force = force ,
684+ charm_origin = dest_origin )
685+
660686 else :
661687 charms_facade = client .CharmsFacade .from_connection (self .connection )
662688 charmstore = self .model .charmstore
@@ -687,7 +713,6 @@ async def refresh(
687713 charm_resources = charmstore_entity ['Meta' ]['resources' ]
688714
689715 # Update resources
690-
691716 request_data = [client .Entity (self .tag )]
692717 response = await resources_facade .ListResources (entities = request_data )
693718 existing_resources = {
@@ -697,31 +722,33 @@ async def refresh(
697722
698723 resources_to_update = [
699724 resource for resource in charm_resources
700- if resource [ 'Name' ] not in existing_resources or
701- existing_resources [resource [ 'Name' ] ].origin != 'upload'
725+ if resource . get ( 'Name' , resource . get ( 'name' )) not in existing_resources or
726+ existing_resources [resource . get ( 'Name' , resource . get ( 'name' )) ].origin != 'upload'
702727 ]
703728
704729 if resources_to_update :
705- request_data = [
706- client .CharmResource (
707- description = resource .get ('Description' ),
708- fingerprint = resource ['Fingerprint' ],
709- name = resource ['Name' ],
710- path = resource ['Path' ],
711- revision = resource ['Revision' ],
712- size = resource ['Size' ],
713- type_ = resource ['Type' ],
730+ request_data = []
731+ for resource in resources_to_update :
732+ request_data .append (client .CharmResource (
733+ description = resource .get ('Description' , resource .get ('description' )),
734+ fingerprint = resource .get ('Fingerprint' , resource .get ('fingerprint' )),
735+ name = resource .get ('Name' , resource .get ('name' )),
736+ path = resource .get ('Path' , resource .get ('filename' )),
737+ # revision=-1,
738+ revision = resource .get ('Revision' , resource .get ('revision' , - 1 )),
739+ size = resource .get ('Size' , resource .get ('size' )),
740+ type_ = resource .get ('Type' , resource .get ('type' )),
714741 origin = 'store' ,
715- ) for resource in resources_to_update
716- ]
742+ ))
717743 response = await resources_facade .AddPendingResources (
718744 application_tag = self .tag ,
719745 charm_url = charm_url ,
720- resources = request_data
746+ resources = request_data ,
747+ charm_origin = dest_origin ,
721748 )
722749 pending_ids = response .pending_ids
723750 resource_ids = {
724- resource [ 'Name' ] : id
751+ resource . get ( 'Name' , resource . get ( 'name' )) : id
725752 for resource , id in zip (resources_to_update , pending_ids )
726753 }
727754 else :
@@ -730,8 +757,8 @@ async def refresh(
730757 # Update application
731758 await app_facade .SetCharm (
732759 application = self .entity_id ,
733- channel = channel ,
734760 charm_url = charm_url ,
761+ charm_origin = dest_origin ,
735762 config_settings = None ,
736763 config_settings_yaml = None ,
737764 force = force ,
0 commit comments