github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/client/modelmanager/register.go (about) 1 // Copyright 2022 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package modelmanager 5 6 import ( 7 "reflect" 8 9 "github.com/juju/errors" 10 "github.com/juju/names/v5" 11 12 "github.com/juju/juju/apiserver/common" 13 apiservererrors "github.com/juju/juju/apiserver/errors" 14 "github.com/juju/juju/apiserver/facade" 15 "github.com/juju/juju/caas" 16 "github.com/juju/juju/environs/context" 17 "github.com/juju/juju/state/stateenvirons" 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("ModelManager", 10, func(ctx facade.Context) (facade.Facade, error) { 23 return newFacadeV10(ctx) 24 }, reflect.TypeOf((*ModelManagerAPI)(nil))) 25 registry.MustRegister("ModelManager", 9, func(ctx facade.Context) (facade.Facade, error) { 26 return newFacadeV9(ctx) 27 }, reflect.TypeOf((*ModelManagerAPIV9)(nil))) 28 } 29 30 // newFacadeV9 is used for API registration. 31 func newFacadeV9(ctx facade.Context) (*ModelManagerAPIV9, error) { 32 api, err := newFacadeV10(ctx) 33 if err != nil { 34 return nil, errors.Trace(err) 35 } 36 return &ModelManagerAPIV9{api}, nil 37 } 38 39 // newFacadeV10 is used for API registration. 40 func newFacadeV10(ctx facade.Context) (*ModelManagerAPI, error) { 41 st := ctx.State() 42 pool := ctx.StatePool() 43 ctlrSt, err := pool.SystemState() 44 if err != nil { 45 return nil, errors.Trace(err) 46 } 47 auth := ctx.Auth() 48 49 model, err := st.Model() 50 if err != nil { 51 return nil, errors.Trace(err) 52 } 53 modelUUID := model.UUID() 54 55 systemState, err := ctx.StatePool().SystemState() 56 if err != nil { 57 return nil, errors.Trace(err) 58 } 59 60 configGetter := stateenvirons.EnvironConfigGetter{Model: model} 61 newEnviron := common.EnvironFuncForModel(model, configGetter) 62 63 ctrlModel, err := ctlrSt.Model() 64 if err != nil { 65 return nil, err 66 } 67 urlGetter := common.NewToolsURLGetter(modelUUID, systemState) 68 toolsFinder := common.NewToolsFinder(configGetter, st, urlGetter, newEnviron) 69 70 // Since we know this is a user tag (because AuthClient is true), 71 // we just do the type assertion to the UserTag. 72 if !auth.AuthClient() { 73 return nil, apiservererrors.ErrPerm 74 } 75 apiUser, _ := auth.GetAuthTag().(names.UserTag) 76 backend := common.NewUserAwareModelManagerBackend(model, pool, apiUser) 77 return NewModelManagerAPI( 78 backend, 79 common.NewModelManagerBackend(ctrlModel, pool), 80 toolsFinder, 81 caas.New, 82 common.NewBlockChecker(backend), 83 auth, 84 model, 85 context.CallContext(st), 86 ) 87 }