github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/provider/openstack/config_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package openstack
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/cloud"
    11  	"github.com/juju/juju/environs"
    12  	"github.com/juju/juju/environs/config"
    13  	"github.com/juju/juju/testing"
    14  )
    15  
    16  type ConfigSuite struct {
    17  	testing.BaseSuite
    18  }
    19  
    20  var _ = gc.Suite(&ConfigSuite{})
    21  
    22  // configTest specifies a config parsing test, checking that env when
    23  // parsed as the openstack section of a config file matches
    24  // baseConfigResult when mutated by the mutate function, or that the
    25  // parse matches the given error.
    26  type configTest struct {
    27  	summary                 string
    28  	config                  testing.Attrs
    29  	change                  map[string]interface{}
    30  	expect                  map[string]interface{}
    31  	region                  string
    32  	useFloatingIP           bool
    33  	useDefaultSecurityGroup bool
    34  	network                 string
    35  	firewallMode            string
    36  	err                     string
    37  	sslHostnameVerification bool
    38  	sslHostnameSet          bool
    39  	blockStorageSource      string
    40  }
    41  
    42  var requiredConfig = testing.Attrs{}
    43  
    44  func (t configTest) check(c *gc.C) {
    45  	attrs := testing.FakeConfig().Merge(testing.Attrs{
    46  		"type": "openstack",
    47  	}).Merge(t.config)
    48  
    49  	cfg, err := config.New(config.NoDefaults, attrs)
    50  	c.Assert(err, jc.ErrorIsNil)
    51  
    52  	credential := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{
    53  		"username":    "user",
    54  		"password":    "secret",
    55  		"tenant-name": "sometenant",
    56  	})
    57  	cloudSpec := environs.CloudSpec{
    58  		Type:       "openstack",
    59  		Name:       "openstack",
    60  		Endpoint:   "http://auth",
    61  		Region:     "Configtest",
    62  		Credential: &credential,
    63  	}
    64  
    65  	e, err := environs.New(environs.OpenParams{
    66  		Cloud:  cloudSpec,
    67  		Config: cfg,
    68  	})
    69  	if t.change != nil {
    70  		c.Assert(err, jc.ErrorIsNil)
    71  
    72  		// Testing a change in configuration.
    73  		var old, changed, valid *config.Config
    74  		osenv := e.(*Environ)
    75  		old = osenv.ecfg().Config
    76  		changed, err = old.Apply(t.change)
    77  		c.Assert(err, jc.ErrorIsNil)
    78  
    79  		// Keep err for validation below.
    80  		valid, err = providerInstance.Validate(changed, old)
    81  		if err == nil {
    82  			err = osenv.SetConfig(valid)
    83  		}
    84  	}
    85  	if t.err != "" {
    86  		c.Check(err, gc.ErrorMatches, t.err)
    87  		return
    88  	}
    89  	c.Assert(err, jc.ErrorIsNil)
    90  
    91  	ecfg := e.(*Environ).ecfg()
    92  	c.Assert(ecfg.Name(), gc.Equals, "testenv")
    93  	if t.firewallMode != "" {
    94  		c.Assert(ecfg.FirewallMode(), gc.Equals, t.firewallMode)
    95  	}
    96  	c.Assert(ecfg.useFloatingIP(), gc.Equals, t.useFloatingIP)
    97  	c.Assert(ecfg.useDefaultSecurityGroup(), gc.Equals, t.useDefaultSecurityGroup)
    98  	c.Assert(ecfg.network(), gc.Equals, t.network)
    99  	// Default should be true
   100  	expectedHostnameVerification := true
   101  	if t.sslHostnameSet {
   102  		expectedHostnameVerification = t.sslHostnameVerification
   103  	}
   104  	c.Assert(ecfg.SSLHostnameVerification(), gc.Equals, expectedHostnameVerification)
   105  	for name, expect := range t.expect {
   106  		actual, found := ecfg.UnknownAttrs()[name]
   107  		c.Check(found, jc.IsTrue)
   108  		c.Check(actual, gc.Equals, expect)
   109  	}
   110  	if t.blockStorageSource != "" {
   111  		storage, ok := ecfg.StorageDefaultBlockSource()
   112  		c.Assert(ok, jc.IsTrue)
   113  		c.Assert(storage, gc.Equals, t.blockStorageSource)
   114  	}
   115  }
   116  
   117  func (s *ConfigSuite) SetUpTest(c *gc.C) {
   118  	s.BaseSuite.SetUpTest(c)
   119  	s.PatchValue(&authenticateClient, func(authenticator) error { return nil })
   120  }
   121  
   122  var configTests = []configTest{
   123  	{
   124  		summary: "default use floating ip",
   125  		config:  requiredConfig,
   126  		// Do not use floating IP's by default.
   127  		useFloatingIP: false,
   128  	}, {
   129  		summary: "use floating ip",
   130  		config: requiredConfig.Merge(testing.Attrs{
   131  			"use-floating-ip": true,
   132  		}),
   133  		useFloatingIP: true,
   134  	}, {
   135  		summary: "default use default security group",
   136  		config:  requiredConfig,
   137  		// Do not use default security group by default.
   138  		useDefaultSecurityGroup: false,
   139  	}, {
   140  		summary: "use default security group",
   141  		config: requiredConfig.Merge(testing.Attrs{
   142  			"use-default-secgroup": true,
   143  		}),
   144  		useDefaultSecurityGroup: true,
   145  	}, {
   146  		summary: "admin-secret given",
   147  		config: requiredConfig.Merge(testing.Attrs{
   148  			"admin-secret": "Futumpsh",
   149  		}),
   150  	}, {
   151  		summary:      "default firewall-mode",
   152  		config:       requiredConfig,
   153  		firewallMode: config.FwInstance,
   154  	}, {
   155  		summary: "instance firewall-mode",
   156  		config: requiredConfig.Merge(testing.Attrs{
   157  			"firewall-mode": "instance",
   158  		}),
   159  		firewallMode: config.FwInstance,
   160  	}, {
   161  		summary: "global firewall-mode",
   162  		config: requiredConfig.Merge(testing.Attrs{
   163  			"firewall-mode": "global",
   164  		}),
   165  		firewallMode: config.FwGlobal,
   166  	}, {
   167  		summary: "none firewall-mode",
   168  		config: requiredConfig.Merge(testing.Attrs{
   169  			"firewall-mode": "none",
   170  		}),
   171  		firewallMode: config.FwNone,
   172  	}, {
   173  		config: requiredConfig.Merge(testing.Attrs{
   174  			"future": "hammerstein",
   175  		}),
   176  		expect: testing.Attrs{
   177  			"future": "hammerstein",
   178  		},
   179  	}, {
   180  		config: requiredConfig,
   181  		change: testing.Attrs{
   182  			"future": "hammerstein",
   183  		},
   184  		expect: testing.Attrs{
   185  			"future": "hammerstein",
   186  		},
   187  	}, {
   188  		config: requiredConfig,
   189  		change: testing.Attrs{
   190  			"ssl-hostname-verification": false,
   191  		},
   192  		sslHostnameVerification: false,
   193  		sslHostnameSet:          true,
   194  	}, {
   195  		config: requiredConfig,
   196  		change: testing.Attrs{
   197  			"ssl-hostname-verification": true,
   198  		},
   199  		sslHostnameVerification: true,
   200  		sslHostnameSet:          true,
   201  	}, {
   202  		summary: "default network",
   203  		config:  requiredConfig,
   204  		network: "",
   205  	}, {
   206  		summary: "network",
   207  		config: requiredConfig.Merge(testing.Attrs{
   208  			"network": "a-network-label",
   209  		}),
   210  		network: "a-network-label",
   211  	}, {
   212  		summary: "block storage specified",
   213  		config: requiredConfig.Merge(testing.Attrs{
   214  			"storage-default-block-source": "my-cinder",
   215  		}),
   216  		blockStorageSource: "my-cinder",
   217  	},
   218  }
   219  
   220  func (s *ConfigSuite) TestConfig(c *gc.C) {
   221  	for i, t := range configTests {
   222  		c.Logf("test %d: %s (%v)", i, t.summary, t.config)
   223  		t.check(c)
   224  	}
   225  }
   226  
   227  func (s *ConfigSuite) TestDeprecatedAttributesRemoved(c *gc.C) {
   228  	attrs := testing.FakeConfig().Merge(testing.Attrs{
   229  		"type":                  "openstack",
   230  		"default-image-id":      "id-1234",
   231  		"default-instance-type": "big",
   232  	})
   233  
   234  	cfg, err := config.New(config.NoDefaults, attrs)
   235  	c.Assert(err, jc.ErrorIsNil)
   236  	// Keep err for validation below.
   237  	valid, err := providerInstance.Validate(cfg, nil)
   238  	c.Assert(err, jc.ErrorIsNil)
   239  	// Check deprecated attributes removed.
   240  	allAttrs := valid.AllAttrs()
   241  	for _, attr := range []string{"default-image-id", "default-instance-type"} {
   242  		_, ok := allAttrs[attr]
   243  		c.Assert(ok, jc.IsFalse)
   244  	}
   245  }
   246  
   247  func (s *ConfigSuite) TestPrepareConfigSetsDefaultBlockSource(c *gc.C) {
   248  	attrs := testing.FakeConfig().Merge(testing.Attrs{
   249  		"type": "openstack",
   250  	})
   251  	cfg, err := config.New(config.NoDefaults, attrs)
   252  	c.Assert(err, jc.ErrorIsNil)
   253  	_, ok := cfg.StorageDefaultBlockSource()
   254  	c.Assert(ok, jc.IsFalse)
   255  
   256  	cfg, err = providerInstance.PrepareConfig(prepareConfigParams(cfg))
   257  	c.Assert(err, jc.ErrorIsNil)
   258  	source, ok := cfg.StorageDefaultBlockSource()
   259  	c.Assert(ok, jc.IsTrue)
   260  	c.Assert(source, gc.Equals, "cinder")
   261  }
   262  
   263  func prepareConfigParams(cfg *config.Config) environs.PrepareConfigParams {
   264  	credential := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{
   265  		"username":    "user",
   266  		"password":    "secret",
   267  		"tenant-name": "sometenant",
   268  	})
   269  	return environs.PrepareConfigParams{
   270  		Config: cfg,
   271  		Cloud: environs.CloudSpec{
   272  			Type:       "openstack",
   273  			Name:       "canonistack",
   274  			Region:     "region",
   275  			Endpoint:   "http://auth",
   276  			Credential: &credential,
   277  		},
   278  	}
   279  }
   280  
   281  func (*ConfigSuite) TestSchema(c *gc.C) {
   282  	fields := providerInstance.Schema()
   283  	// Check that all the fields defined in environs/config
   284  	// are in the returned schema.
   285  	globalFields, err := config.Schema(nil)
   286  	c.Assert(err, gc.IsNil)
   287  	for name, field := range globalFields {
   288  		c.Check(fields[name], jc.DeepEquals, field)
   289  	}
   290  }