github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/client/modelupgrader/register.go (about) 1 // Copyright 2022 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package modelupgrader 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 "github.com/juju/juju/apiserver/common/cloudspec" 14 apiservererrors "github.com/juju/juju/apiserver/errors" 15 "github.com/juju/juju/apiserver/facade" 16 "github.com/juju/juju/docker/registry" 17 "github.com/juju/juju/environs/context" 18 "github.com/juju/juju/state/stateenvirons" 19 ) 20 21 // Register is called to expose a package of facades onto a given registry. 22 func Register(registry facade.FacadeRegistry) { 23 registry.MustRegister("ModelUpgrader", 1, func(ctx facade.Context) (facade.Facade, error) { 24 return newFacadeV1(ctx) 25 }, reflect.TypeOf((*ModelUpgraderAPI)(nil))) 26 } 27 28 // newFacadeV1 is used for API registration. 29 func newFacadeV1(ctx facade.Context) (*ModelUpgraderAPI, error) { 30 st := ctx.State() 31 pool := ctx.StatePool() 32 auth := ctx.Auth() 33 34 model, err := st.Model() 35 if err != nil { 36 return nil, errors.Trace(err) 37 } 38 modelUUID := model.UUID() 39 40 systemState, err := ctx.StatePool().SystemState() 41 if err != nil { 42 return nil, errors.Trace(err) 43 } 44 45 configGetter := stateenvirons.EnvironConfigGetter{Model: model} 46 newEnviron := common.EnvironFuncForModel(model, configGetter) 47 48 urlGetter := common.NewToolsURLGetter(modelUUID, systemState) 49 toolsFinder := common.NewToolsFinder(configGetter, st, urlGetter, newEnviron) 50 environscloudspecGetter := cloudspec.MakeCloudSpecGetter(pool) 51 52 // Since we know this is a user tag (because AuthClient is true), 53 // we just do the type assertion to the UserTag. 54 if !auth.AuthClient() { 55 return nil, apiservererrors.ErrPerm 56 } 57 apiUser, _ := auth.GetAuthTag().(names.UserTag) 58 backend := common.NewUserAwareModelManagerBackend(model, pool, apiUser) 59 return NewModelUpgraderAPI( 60 systemState.ControllerTag(), 61 statePoolShim{StatePool: pool}, 62 toolsFinder, 63 newEnviron, 64 common.NewBlockChecker(backend), 65 auth, 66 context.CallContext(st), 67 registry.New, 68 environscloudspecGetter, 69 ) 70 }