github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/stateenvirons/features.go (about)

     1  // Copyright 2021 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package stateenvirons
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  
     9  	"github.com/juju/juju/caas"
    10  	"github.com/juju/juju/core/assumes"
    11  	"github.com/juju/juju/environs"
    12  	"github.com/juju/juju/state"
    13  )
    14  
    15  var (
    16  	// Overridden by tests
    17  	iaasEnvironGetter = GetNewEnvironFunc(environs.New)
    18  	caasBrokerGetter  = GetNewCAASBrokerFunc(caas.New)
    19  )
    20  
    21  // SupportedFeatures returns the set of features that the model makes available
    22  // for charms to use.
    23  func SupportedFeatures(model Model, newEnviron environs.NewEnvironFunc) (assumes.FeatureSet, error) {
    24  	var fs assumes.FeatureSet
    25  
    26  	// Models always include a feature flag for the current Juju version
    27  	modelConf, err := model.Config()
    28  	if err != nil {
    29  		return fs, errors.Annotate(err, "accessing model config")
    30  	}
    31  
    32  	agentVersion, _ := modelConf.AgentVersion()
    33  	fs.Add(assumes.Feature{
    34  		Name:        "juju",
    35  		Description: assumes.UserFriendlyFeatureDescriptions["juju"],
    36  		Version:     &agentVersion,
    37  	})
    38  
    39  	// Access the environment associated with the model and query any
    40  	// substrate-specific features that might be available.
    41  	var env interface{}
    42  	switch model.Type() {
    43  	case state.ModelTypeIAAS:
    44  		iaasEnv, err := iaasEnvironGetter(model)
    45  		if err != nil {
    46  			return fs, errors.Annotate(err, "accessing model environment")
    47  		}
    48  		env = iaasEnv
    49  	case state.ModelTypeCAAS:
    50  		caasEnv, err := caasBrokerGetter(model)
    51  		if err != nil {
    52  			return fs, errors.Annotate(err, "accessing model environment")
    53  		}
    54  		env = caasEnv
    55  	default:
    56  		return fs, errors.NotSupportedf("model type %q", model.Type())
    57  	}
    58  
    59  	if featureEnumerator, supported := env.(environs.SupportedFeatureEnumerator); supported {
    60  		envFs, err := featureEnumerator.SupportedFeatures()
    61  		if err != nil {
    62  			return fs, errors.Annotate(err, "enumerating features supported by environment")
    63  		}
    64  
    65  		fs.Merge(envFs)
    66  	}
    67  
    68  	return fs, nil
    69  }