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

     1  // Copyright 2022 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package applicationoffers
     5  
     6  import (
     7  	"reflect"
     8  
     9  	"github.com/juju/errors"
    10  
    11  	"github.com/juju/juju/apiserver/common"
    12  	commoncrossmodel "github.com/juju/juju/apiserver/common/crossmodel"
    13  	"github.com/juju/juju/apiserver/facade"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/state/stateenvirons"
    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("ApplicationOffers", 4, func(ctx facade.Context) (facade.Facade, error) {
    21  		return newOffersAPIV4(ctx)
    22  	}, reflect.TypeOf((*OffersAPIv4)(nil)))
    23  	registry.MustRegister("ApplicationOffers", 5, func(ctx facade.Context) (facade.Facade, error) {
    24  		return newOffersAPI(ctx)
    25  	}, reflect.TypeOf((*OffersAPIv5)(nil)))
    26  }
    27  
    28  // newOffersAPIV4 returns a new application offers OffersAPIV4 facade.
    29  func newOffersAPIV4(ctx facade.Context) (*OffersAPIv4, error) {
    30  	offersAPI, err := newOffersAPI(ctx)
    31  	if err != nil {
    32  		return nil, errors.Trace(err)
    33  	}
    34  	return &OffersAPIv4{
    35  		*offersAPI,
    36  	}, nil
    37  }
    38  
    39  // newOffersAPI returns a new application offers OffersAPI facade.
    40  func newOffersAPI(ctx facade.Context) (*OffersAPIv5, error) {
    41  	environFromModel := func(modelUUID string) (environs.Environ, error) {
    42  		st, err := ctx.StatePool().Get(modelUUID)
    43  		if err != nil {
    44  			return nil, errors.Trace(err)
    45  		}
    46  		defer st.Release()
    47  		model, err := st.Model()
    48  		if err != nil {
    49  			return nil, errors.Trace(err)
    50  		}
    51  		g := stateenvirons.EnvironConfigGetter{Model: model}
    52  		env, err := environs.GetEnviron(g, environs.New)
    53  		if err != nil {
    54  			return nil, errors.Trace(err)
    55  		}
    56  		return env, nil
    57  	}
    58  
    59  	st := ctx.State()
    60  	getControllerInfo := func() ([]string, string, error) {
    61  		return common.StateControllerInfo(st)
    62  	}
    63  
    64  	authContext := ctx.Resources().Get("offerAccessAuthContext").(common.ValueResource).Value
    65  	return createOffersAPI(
    66  		GetApplicationOffers,
    67  		environFromModel,
    68  		getControllerInfo,
    69  		GetStateAccess(st),
    70  		GetStatePool(ctx.StatePool()),
    71  		ctx.Auth(),
    72  		ctx.Resources(),
    73  		authContext.(*commoncrossmodel.AuthContext),
    74  	)
    75  }