github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/client/applicationoffers/register.go (about) 1 // Copyright 2022 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package applicationoffers 5 6 import ( 7 "reflect" 8 9 "github.com/juju/errors" 10 11 "github.com/juju/juju/apiserver/common" 12 commoncrossmodel "github.com/juju/juju/apiserver/common/crossmodel" 13 "github.com/juju/juju/apiserver/facade" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/state/stateenvirons" 16 ) 17 18 // Register is called to expose a package of facades onto a given registry. 19 func Register(registry facade.FacadeRegistry) { 20 registry.MustRegister("ApplicationOffers", 4, func(ctx facade.Context) (facade.Facade, error) { 21 return newOffersAPIV4(ctx) 22 }, reflect.TypeOf((*OffersAPIv4)(nil))) 23 registry.MustRegister("ApplicationOffers", 5, func(ctx facade.Context) (facade.Facade, error) { 24 return newOffersAPI(ctx) 25 }, reflect.TypeOf((*OffersAPIv5)(nil))) 26 } 27 28 // newOffersAPIV4 returns a new application offers OffersAPIV4 facade. 29 func newOffersAPIV4(ctx facade.Context) (*OffersAPIv4, error) { 30 offersAPI, err := newOffersAPI(ctx) 31 if err != nil { 32 return nil, errors.Trace(err) 33 } 34 return &OffersAPIv4{ 35 *offersAPI, 36 }, nil 37 } 38 39 // newOffersAPI returns a new application offers OffersAPI facade. 40 func newOffersAPI(ctx facade.Context) (*OffersAPIv5, error) { 41 environFromModel := func(modelUUID string) (environs.Environ, error) { 42 st, err := ctx.StatePool().Get(modelUUID) 43 if err != nil { 44 return nil, errors.Trace(err) 45 } 46 defer st.Release() 47 model, err := st.Model() 48 if err != nil { 49 return nil, errors.Trace(err) 50 } 51 g := stateenvirons.EnvironConfigGetter{Model: model} 52 env, err := environs.GetEnviron(g, environs.New) 53 if err != nil { 54 return nil, errors.Trace(err) 55 } 56 return env, nil 57 } 58 59 st := ctx.State() 60 getControllerInfo := func() ([]string, string, error) { 61 return common.StateControllerInfo(st) 62 } 63 64 authContext := ctx.Resources().Get("offerAccessAuthContext").(common.ValueResource).Value 65 return createOffersAPI( 66 GetApplicationOffers, 67 environFromModel, 68 getControllerInfo, 69 GetStateAccess(st), 70 GetStatePool(ctx.StatePool()), 71 ctx.Auth(), 72 ctx.Resources(), 73 authContext.(*commoncrossmodel.AuthContext), 74 ) 75 }