github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/client/application/get.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package application 5 6 import ( 7 "github.com/juju/juju/core/application" 8 "github.com/juju/schema" 9 "gopkg.in/juju/charm.v6" 10 "gopkg.in/juju/environschema.v1" 11 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/caas" 14 "github.com/juju/juju/core/constraints" 15 ) 16 17 // Get returns the charm configuration for an application. 18 func (api *APIBase) Get(args params.ApplicationGet) (params.ApplicationGetResults, error) { 19 return api.getConfig(args, describe) 20 } 21 22 // Get returns the charm configuration for an application. 23 // It zeros out any application config as that was not supported in v5. 24 func (api *APIv5) Get(args params.ApplicationGet) (params.ApplicationGetResults, error) { 25 results, err := api.getConfig(args, describe) 26 if err != nil { 27 return params.ApplicationGetResults{}, err 28 } 29 results.ApplicationConfig = nil 30 return results, nil 31 } 32 33 // Get returns the charm configuration for an application. 34 // This used the confusing "default" boolean to mean the value was set from 35 // the charm defaults. Needs to be kept for backwards compatibility. 36 func (api *APIv4) Get(args params.ApplicationGet) (params.ApplicationGetResults, error) { 37 results, err := api.getConfig(args, describeV4) 38 if err != nil { 39 return params.ApplicationGetResults{}, err 40 } 41 results.ApplicationConfig = nil 42 return results, nil 43 } 44 45 // Get returns the charm configuration for an application. 46 func (api *APIBase) getConfig( 47 args params.ApplicationGet, 48 describe func(settings charm.Settings, config *charm.Config) map[string]interface{}, 49 ) (params.ApplicationGetResults, error) { 50 if err := api.checkCanRead(); err != nil { 51 return params.ApplicationGetResults{}, err 52 } 53 app, err := api.backend.Application(args.ApplicationName) 54 if err != nil { 55 return params.ApplicationGetResults{}, err 56 } 57 settings, err := app.CharmConfig() 58 if err != nil { 59 return params.ApplicationGetResults{}, err 60 } 61 charm, _, err := app.Charm() 62 if err != nil { 63 return params.ApplicationGetResults{}, err 64 } 65 configInfo := describe(settings, charm.Config()) 66 appConfig, err := app.ApplicationConfig() 67 if err != nil { 68 return params.ApplicationGetResults{}, err 69 } 70 71 providerSchema, providerDefaults, err := applicationConfigSchema(api.modelType) 72 if err != nil { 73 return params.ApplicationGetResults{}, err 74 } 75 appConfigInfo := describeAppConfig(appConfig, providerSchema, caas.ConfigDefaults(providerDefaults)) 76 var constraints constraints.Value 77 if app.IsPrincipal() { 78 constraints, err = app.Constraints() 79 if err != nil { 80 return params.ApplicationGetResults{}, err 81 } 82 } 83 return params.ApplicationGetResults{ 84 Application: args.ApplicationName, 85 Charm: charm.Meta().Name, 86 CharmConfig: configInfo, 87 ApplicationConfig: appConfigInfo, 88 Constraints: constraints, 89 Series: app.Series(), 90 Channel: string(app.Channel()), 91 }, nil 92 } 93 94 func describeAppConfig( 95 appConfig application.ConfigAttributes, 96 schema environschema.Fields, 97 defaults schema.Defaults, 98 ) map[string]interface{} { 99 results := make(map[string]interface{}) 100 for name, field := range schema { 101 defaultValue := defaults[name] 102 info := map[string]interface{}{ 103 "description": field.Description, 104 "type": field.Type, 105 "source": "unset", 106 } 107 set := false 108 if value := appConfig[name]; value != nil && defaultValue != value { 109 set = true 110 info["value"] = value 111 info["source"] = "user" 112 } 113 if defaultValue != nil { 114 info["default"] = defaultValue 115 if !set { 116 info["value"] = defaultValue 117 info["source"] = "default" 118 } 119 } 120 results[name] = info 121 } 122 return results 123 } 124 125 func describe(settings charm.Settings, config *charm.Config) map[string]interface{} { 126 results := make(map[string]interface{}) 127 for name, option := range config.Options { 128 info := map[string]interface{}{ 129 "description": option.Description, 130 "type": option.Type, 131 "source": "unset", 132 } 133 set := false 134 if value := settings[name]; value != nil && option.Default != value { 135 set = true 136 info["value"] = value 137 info["source"] = "user" 138 } 139 if option.Default != nil { 140 info["default"] = option.Default 141 if !set { 142 info["value"] = option.Default 143 info["source"] = "default" 144 } 145 } 146 results[name] = info 147 } 148 return results 149 } 150 151 func describeV4(settings charm.Settings, config *charm.Config) map[string]interface{} { 152 results := make(map[string]interface{}) 153 for name, option := range config.Options { 154 info := map[string]interface{}{ 155 "description": option.Description, 156 "type": option.Type, 157 } 158 if value := settings[name]; value != nil && option.Default != value { 159 info["value"] = value 160 } else { 161 if option.Default != nil { 162 info["value"] = option.Default 163 } 164 info["default"] = true 165 } 166 results[name] = info 167 } 168 return results 169 }