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  }