1
// Copyright 2011, 2012, 2013 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
9
"github.com/juju/schema"
10
"gopkg.in/juju/environschema.v1"
12
"github.com/juju/juju/environs/config"
15
var configSchema = environschema.Fields{
17
Description: "Use a specific AWS VPC ID (optional). When not specified, Juju requires a default VPC or EC2-Classic features to be available for the account/region.",
18
Example: "vpc-a1b2c3d4",
19
Type: environschema.Tstring,
20
Group: environschema.AccountGroup,
24
Description: "Force Juju to use the AWS VPC ID specified with vpc-id, when it fails the minimum validation criteria. Not accepted without vpc-id",
25
Type: environschema.Tbool,
26
Group: environschema.AccountGroup,
31
var configFields = func() schema.Fields {
32
fs, _, err := configSchema.ValidationSchema()
39
var configDefaults = schema.Defaults{
41
"vpc-id-force": false,
44
type environConfig struct {
46
attrs map[string]interface{}
49
func (c *environConfig) vpcID() string {
50
return c.attrs["vpc-id"].(string)
53
func (c *environConfig) forceVPCID() bool {
54
return c.attrs["vpc-id-force"].(bool)
57
func (p environProvider) newConfig(cfg *config.Config) (*environConfig, error) {
58
valid, err := p.Validate(cfg, nil)
62
return &environConfig{valid, valid.UnknownAttrs()}, nil
65
// Schema returns the configuration schema for an environment.
66
func (environProvider) Schema() environschema.Fields {
67
fields, err := config.Schema(configSchema)
74
func validateConfig(cfg, old *config.Config) (*environConfig, error) {
75
// Check for valid changes for the base config values.
76
if err := config.Validate(cfg, old); err != nil {
79
validated, err := cfg.ValidateUnknownAttrs(configFields, configDefaults)
83
ecfg := &environConfig{cfg, validated}
85
if vpcID := ecfg.vpcID(); isVPCIDSetButInvalid(vpcID) {
86
return nil, fmt.Errorf("vpc-id: %q is not a valid AWS VPC ID", vpcID)
87
} else if !isVPCIDSet(vpcID) && ecfg.forceVPCID() {
88
return nil, fmt.Errorf("cannot use vpc-id-force without specifying vpc-id as well")
92
attrs := old.UnknownAttrs()
94
if vpcID, _ := attrs["vpc-id"].(string); vpcID != ecfg.vpcID() {
95
return nil, fmt.Errorf("cannot change vpc-id from %q to %q", vpcID, ecfg.vpcID())
98
if forceVPCID, _ := attrs["vpc-id-force"].(bool); forceVPCID != ecfg.forceVPCID() {
99
return nil, fmt.Errorf("cannot change vpc-id-force from %v to %v", forceVPCID, ecfg.forceVPCID())
103
// ssl-hostname-verification cannot be disabled
104
if !ecfg.SSLHostnameVerification() {
105
return nil, fmt.Errorf("disabling ssh-hostname-verification is not supported")