github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/client/charms/register.go (about) 1 // Copyright 2022 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package charms 5 6 import ( 7 "reflect" 8 9 "github.com/juju/errors" 10 11 charmscommon "github.com/juju/juju/apiserver/common/charms" 12 apiservererrors "github.com/juju/juju/apiserver/errors" 13 "github.com/juju/juju/apiserver/facade" 14 charmsinterfaces "github.com/juju/juju/apiserver/facades/client/charms/interfaces" 15 "github.com/juju/juju/apiserver/facades/client/charms/services" 16 corecharm "github.com/juju/juju/core/charm" 17 "github.com/juju/juju/state/storage" 18 ) 19 20 // Register is called to expose a package of facades onto a given registry. 21 func Register(registry facade.FacadeRegistry) { 22 registry.MustRegister("Charms", 5, func(ctx facade.Context) (facade.Facade, error) { 23 return newFacadeV5(ctx) 24 }, reflect.TypeOf((*APIv5)(nil))) 25 registry.MustRegister("Charms", 6, func(ctx facade.Context) (facade.Facade, error) { 26 return newFacadeV6(ctx) 27 }, reflect.TypeOf((*APIv6)(nil))) 28 registry.MustRegister("Charms", 7, func(ctx facade.Context) (facade.Facade, error) { 29 return newFacadeV7(ctx) 30 }, reflect.TypeOf((*APIv7)(nil))) 31 } 32 33 func newFacadeV7(ctx facade.Context) (*APIv7, error) { 34 api, err := newFacadeBase(ctx) 35 if err != nil { 36 return nil, errors.Trace(err) 37 } 38 return &APIv7{api}, nil 39 } 40 41 func newFacadeV6(ctx facade.Context) (*APIv6, error) { 42 api, err := newFacadeV7(ctx) 43 if err != nil { 44 return nil, errors.Trace(err) 45 } 46 return &APIv6{api}, nil 47 } 48 49 func newFacadeV5(ctx facade.Context) (*APIv5, error) { 50 api, err := newFacadeV6(ctx) 51 if err != nil { 52 return nil, errors.Trace(err) 53 } 54 return &APIv5{api}, nil 55 } 56 57 // newFacadeBase provides the signature required for facade registration. 58 func newFacadeBase(ctx facade.Context) (*API, error) { 59 authorizer := ctx.Auth() 60 if !authorizer.AuthClient() { 61 return nil, apiservererrors.ErrPerm 62 } 63 64 st := ctx.State() 65 m, err := st.Model() 66 if err != nil { 67 return nil, errors.Trace(err) 68 } 69 70 commonState := &charmscommon.StateShim{st} 71 charmInfoAPI, err := charmscommon.NewCharmInfoAPI(commonState, authorizer) 72 if err != nil { 73 return nil, errors.Trace(err) 74 } 75 76 return &API{ 77 charmInfoAPI: charmInfoAPI, 78 authorizer: authorizer, 79 backendState: newStateShim(st), 80 backendModel: m, 81 charmhubHTTPClient: ctx.HTTPClient(facade.CharmhubHTTPClient), 82 newStorage: func(modelUUID string) services.Storage { 83 return storage.NewStorage(modelUUID, st.MongoSession()) 84 }, 85 newRepoFactory: func(cfg services.CharmRepoFactoryConfig) corecharm.RepositoryFactory { 86 return services.NewCharmRepoFactory(cfg) 87 }, 88 newDownloader: func(cfg services.CharmDownloaderConfig) (charmsinterfaces.Downloader, error) { 89 return services.NewCharmDownloader(cfg) 90 }, 91 tag: m.ModelTag(), 92 requestRecorder: ctx.RequestRecorder(), 93 }, nil 94 }