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 }