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

     1  // Copyright 2022 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package charms
     5  
     6  import (
     7  	"reflect"
     8  
     9  	"github.com/juju/errors"
    10  
    11  	charmscommon "github.com/juju/juju/apiserver/common/charms"
    12  	apiservererrors "github.com/juju/juju/apiserver/errors"
    13  	"github.com/juju/juju/apiserver/facade"
    14  	charmsinterfaces "github.com/juju/juju/apiserver/facades/client/charms/interfaces"
    15  	"github.com/juju/juju/apiserver/facades/client/charms/services"
    16  	corecharm "github.com/juju/juju/core/charm"
    17  	"github.com/juju/juju/state/storage"
    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("Charms", 5, func(ctx facade.Context) (facade.Facade, error) {
    23  		return newFacadeV5(ctx)
    24  	}, reflect.TypeOf((*APIv5)(nil)))
    25  	registry.MustRegister("Charms", 6, func(ctx facade.Context) (facade.Facade, error) {
    26  		return newFacadeV6(ctx)
    27  	}, reflect.TypeOf((*APIv6)(nil)))
    28  	registry.MustRegister("Charms", 7, func(ctx facade.Context) (facade.Facade, error) {
    29  		return newFacadeV7(ctx)
    30  	}, reflect.TypeOf((*APIv7)(nil)))
    31  }
    32  
    33  func newFacadeV7(ctx facade.Context) (*APIv7, error) {
    34  	api, err := newFacadeBase(ctx)
    35  	if err != nil {
    36  		return nil, errors.Trace(err)
    37  	}
    38  	return &APIv7{api}, nil
    39  }
    40  
    41  func newFacadeV6(ctx facade.Context) (*APIv6, error) {
    42  	api, err := newFacadeV7(ctx)
    43  	if err != nil {
    44  		return nil, errors.Trace(err)
    45  	}
    46  	return &APIv6{api}, nil
    47  }
    48  
    49  func newFacadeV5(ctx facade.Context) (*APIv5, error) {
    50  	api, err := newFacadeV6(ctx)
    51  	if err != nil {
    52  		return nil, errors.Trace(err)
    53  	}
    54  	return &APIv5{api}, nil
    55  }
    56  
    57  // newFacadeBase provides the signature required for facade registration.
    58  func newFacadeBase(ctx facade.Context) (*API, error) {
    59  	authorizer := ctx.Auth()
    60  	if !authorizer.AuthClient() {
    61  		return nil, apiservererrors.ErrPerm
    62  	}
    63  
    64  	st := ctx.State()
    65  	m, err := st.Model()
    66  	if err != nil {
    67  		return nil, errors.Trace(err)
    68  	}
    69  
    70  	commonState := &charmscommon.StateShim{st}
    71  	charmInfoAPI, err := charmscommon.NewCharmInfoAPI(commonState, authorizer)
    72  	if err != nil {
    73  		return nil, errors.Trace(err)
    74  	}
    75  
    76  	return &API{
    77  		charmInfoAPI:       charmInfoAPI,
    78  		authorizer:         authorizer,
    79  		backendState:       newStateShim(st),
    80  		backendModel:       m,
    81  		charmhubHTTPClient: ctx.HTTPClient(facade.CharmhubHTTPClient),
    82  		newStorage: func(modelUUID string) services.Storage {
    83  			return storage.NewStorage(modelUUID, st.MongoSession())
    84  		},
    85  		newRepoFactory: func(cfg services.CharmRepoFactoryConfig) corecharm.RepositoryFactory {
    86  			return services.NewCharmRepoFactory(cfg)
    87  		},
    88  		newDownloader: func(cfg services.CharmDownloaderConfig) (charmsinterfaces.Downloader, error) {
    89  			return services.NewCharmDownloader(cfg)
    90  		},
    91  		tag:             m.ModelTag(),
    92  		requestRecorder: ctx.RequestRecorder(),
    93  	}, nil
    94  }