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  }