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  }