github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/controller/usersecretsdrain/register.go (about)

     1  // Copyright 2023 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package usersecretsdrain
     5  
     6  import (
     7  	"reflect"
     8  
     9  	"github.com/juju/errors"
    10  
    11  	commonsecrets "github.com/juju/juju/apiserver/common/secrets"
    12  	apiservererrors "github.com/juju/juju/apiserver/errors"
    13  	"github.com/juju/juju/apiserver/facade"
    14  	"github.com/juju/juju/secrets/provider"
    15  	"github.com/juju/juju/state"
    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("UserSecretsDrain", 1, func(ctx facade.Context) (facade.Facade, error) {
    21  		return newUserSecretsDrainAPI(ctx)
    22  	}, reflect.TypeOf((*SecretsDrainAPI)(nil)))
    23  }
    24  
    25  // newUserSecretsDrainAPI creates a SecretsDrainAPI for draining user secrets.
    26  func newUserSecretsDrainAPI(context facade.Context) (*SecretsDrainAPI, error) {
    27  	if !context.Auth().AuthController() {
    28  		return nil, apiservererrors.ErrPerm
    29  	}
    30  	leadershipChecker, err := context.LeadershipChecker()
    31  	if err != nil {
    32  		return nil, errors.Trace(err)
    33  	}
    34  	model, err := context.State().Model()
    35  	if err != nil {
    36  		return nil, errors.Trace(err)
    37  	}
    38  	authTag := model.ModelTag()
    39  	commonDrainAPI, err := commonsecrets.NewSecretsDrainAPI(
    40  		authTag,
    41  		context.Auth(),
    42  		context.Resources(),
    43  		leadershipChecker,
    44  		commonsecrets.SecretsModel(model),
    45  		state.NewSecrets(context.State()),
    46  		context.State(),
    47  	)
    48  	if err != nil {
    49  		return nil, errors.Trace(err)
    50  	}
    51  
    52  	secretBackendConfigGetter := func(backendIDs []string, wantAll bool) (*provider.ModelBackendConfigInfo, error) {
    53  		return commonsecrets.BackendConfigInfo(commonsecrets.SecretsModel(model), true, backendIDs, wantAll, authTag, leadershipChecker)
    54  	}
    55  	secretBackendDrainConfigGetter := func(backendID string) (*provider.ModelBackendConfigInfo, error) {
    56  		return commonsecrets.DrainBackendConfigInfo(backendID, commonsecrets.SecretsModel(model), authTag, leadershipChecker)
    57  	}
    58  
    59  	return &SecretsDrainAPI{
    60  		SecretsDrainAPI:     commonDrainAPI,
    61  		drainConfigGetter:   secretBackendDrainConfigGetter,
    62  		backendConfigGetter: secretBackendConfigGetter,
    63  		secretsState:        state.NewSecrets(context.State()),
    64  	}, nil
    65  }