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

     1  // Copyright 2022 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package storage
     5  
     6  import (
     7  	"reflect"
     8  
     9  	"github.com/juju/errors"
    10  
    11  	apiservererrors "github.com/juju/juju/apiserver/errors"
    12  	"github.com/juju/juju/apiserver/facade"
    13  	"github.com/juju/juju/caas"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/environs/context"
    16  	"github.com/juju/juju/state"
    17  	"github.com/juju/juju/state/stateenvirons"
    18  	"github.com/juju/juju/storage"
    19  	"github.com/juju/juju/storage/poolmanager"
    20  )
    21  
    22  // Register is called to expose a package of facades onto a given registry.
    23  func Register(registry facade.FacadeRegistry) {
    24  	registry.MustRegister("Storage", 6, func(ctx facade.Context) (facade.Facade, error) {
    25  		return newStorageAPI(ctx) // modify Remove to support force and maxWait; add DetachStorage to support force and maxWait.
    26  	}, reflect.TypeOf((*StorageAPI)(nil)))
    27  }
    28  
    29  // newStorageAPI returns a new storage API facade.
    30  func newStorageAPI(ctx facade.Context) (*StorageAPI, error) {
    31  	st := ctx.State()
    32  	model, err := st.Model()
    33  	if err != nil {
    34  		return nil, errors.Trace(err)
    35  	}
    36  	storageMetadata := func() (poolmanager.PoolManager, storage.ProviderRegistry, error) {
    37  		model, err := st.Model()
    38  		if err != nil {
    39  			return nil, nil, errors.Trace(err)
    40  		}
    41  		registry, err := stateenvirons.NewStorageProviderRegistryForModel(
    42  			model,
    43  			stateenvirons.GetNewEnvironFunc(environs.New),
    44  			stateenvirons.GetNewCAASBrokerFunc(caas.New))
    45  		if err != nil {
    46  			return nil, nil, errors.Trace(err)
    47  		}
    48  		pm := poolmanager.New(state.NewStateSettings(st), registry)
    49  		return pm, registry, nil
    50  	}
    51  	storageAccessor, err := getStorageAccessor(st)
    52  	if err != nil {
    53  		return nil, errors.Annotate(err, "getting backend")
    54  	}
    55  
    56  	authorizer := ctx.Auth()
    57  	if !authorizer.AuthClient() {
    58  		return nil, apiservererrors.ErrPerm
    59  	}
    60  	return NewStorageAPI(stateShim{st}, model.Type(), storageAccessor, storageMetadata, authorizer, context.CallContext(st)), nil
    61  }