github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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  	externalNetwork         string
    36  	firewallMode            string
    37  	err                     string
    38  	sslHostnameVerification bool
    39  	sslHostnameSet          bool
    40  	blockStorageSource      string
    41  }
    42  
    43  var requiredConfig = testing.Attrs{}
    44  
    45  func (t configTest) check(c *gc.C) {
    46  	attrs := testing.FakeConfig().Merge(testing.Attrs{
    47  		"type": "openstack",
    48  	}).Merge(t.config)
    49  
    50  	cfg, err := config.New(config.NoDefaults, attrs)
    51  	c.Assert(err, jc.ErrorIsNil)
    52  
    53  	credential := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{
    54  		"username":    "user",
    55  		"password":    "secret",
    56  		"tenant-name": "sometenant",
    57  	})
    58  	cloudSpec := environs.CloudSpec{
    59  		Type:       "openstack",
    60  		Name:       "openstack",
    61  		Endpoint:   "http://auth",
    62  		Region:     "Configtest",
    63  		Credential: &credential,
    64  	}
    65  
    66  	e, err := environs.New(environs.OpenParams{
    67  		Cloud:  cloudSpec,
    68  		Config: cfg,
    69  	})
    70  	if t.change != nil {
    71  		c.Assert(err, jc.ErrorIsNil)
    72  
    73  		// Testing a change in configuration.
    74  		var old, changed, valid *config.Config
    75  		osenv := e.(*Environ)
    76  		old = osenv.ecfg().Config
    77  		changed, err = old.Apply(t.change)
    78  		c.Assert(err, jc.ErrorIsNil)
    79  
    80  		// Keep err for validation below.
    81  		valid, err = providerInstance.Validate(changed, old)
    82  		if err == nil {
    83  			err = osenv.SetConfig(valid)
    84  		}
    85  	}
    86  	if t.err != "" {
    87  		c.Check(err, gc.ErrorMatches, t.err)
    88  		return
    89  	}
    90  	c.Assert(err, jc.ErrorIsNil)
    91  
    92  	ecfg := e.(*Environ).ecfg()
    93  	c.Assert(ecfg.Name(), gc.Equals, "testmodel")
    94  	if t.firewallMode != "" {
    95  		c.Assert(ecfg.FirewallMode(), gc.Equals, t.firewallMode)
    96  	}
    97  	c.Assert(ecfg.useFloatingIP(), gc.Equals, t.useFloatingIP)
    98  	c.Assert(ecfg.useDefaultSecurityGroup(), gc.Equals, t.useDefaultSecurityGroup)
    99  	c.Assert(ecfg.network(), gc.Equals, t.network)
   100  	c.Assert(ecfg.externalNetwork(), gc.Equals, t.externalNetwork)
   101  	// Default should be true
   102  	expectedHostnameVerification := true
   103  	if t.sslHostnameSet {
   104  		expectedHostnameVerification = t.sslHostnameVerification
   105  	}
   106  	c.Assert(ecfg.SSLHostnameVerification(), gc.Equals, expectedHostnameVerification)
   107  	for name, expect := range t.expect {
   108  		actual, found := ecfg.UnknownAttrs()[name]
   109  		c.Check(found, jc.IsTrue)
   110  		c.Check(actual, gc.Equals, expect)
   111  	}
   112  	if t.blockStorageSource != "" {
   113  		storage, ok := ecfg.StorageDefaultBlockSource()
   114  		c.Assert(ok, jc.IsTrue)
   115  		c.Assert(storage, gc.Equals, t.blockStorageSource)
   116  	}
   117  }
   118  
   119  func (s *ConfigSuite) SetUpTest(c *gc.C) {
   120  	s.BaseSuite.SetUpTest(c)
   121  	s.PatchValue(&authenticateClient, func(authenticator) error { return nil })
   122  }
   123  
   124  var configTests = []configTest{
   125  	{
   126  		summary: "default use floating ip",
   127  		config:  requiredConfig,
   128  		// Do not use floating IP's by default.
   129  		useFloatingIP: false,
   130  	}, {
   131  		summary: "use floating ip",
   132  		config: requiredConfig.Merge(testing.Attrs{
   133  			"use-floating-ip": true,
   134  		}),
   135  		useFloatingIP: true,
   136  	}, {
   137  		summary: "default use default security group",
   138  		config:  requiredConfig,
   139  		// Do not use default security group by default.
   140  		useDefaultSecurityGroup: false,
   141  	}, {
   142  		summary: "use default security group",
   143  		config: requiredConfig.Merge(testing.Attrs{
   144  			"use-default-secgroup": true,
   145  		}),
   146  		useDefaultSecurityGroup: true,
   147  	}, {
   148  		summary: "admin-secret given",
   149  		config: requiredConfig.Merge(testing.Attrs{
   150  			"admin-secret": "Futumpsh",
   151  		}),
   152  	}, {
   153  		summary:      "default firewall-mode",
   154  		config:       requiredConfig,
   155  		firewallMode: config.FwInstance,
   156  	}, {
   157  		summary: "instance firewall-mode",
   158  		config: requiredConfig.Merge(testing.Attrs{
   159  			"firewall-mode": "instance",
   160  		}),
   161  		firewallMode: config.FwInstance,
   162  	}, {
   163  		summary: "global firewall-mode",
   164  		config: requiredConfig.Merge(testing.Attrs{
   165  			"firewall-mode": "global",
   166  		}),
   167  		firewallMode: config.FwGlobal,
   168  	}, {
   169  		summary: "none firewall-mode",
   170  		config: requiredConfig.Merge(testing.Attrs{
   171  			"firewall-mode": "none",
   172  		}),
   173  		firewallMode: config.FwNone,
   174  	}, {
   175  		config: requiredConfig.Merge(testing.Attrs{
   176  			"future": "hammerstein",
   177  		}),
   178  		expect: testing.Attrs{
   179  			"future": "hammerstein",
   180  		},
   181  	}, {
   182  		config: requiredConfig,
   183  		change: testing.Attrs{
   184  			"future": "hammerstein",
   185  		},
   186  		expect: testing.Attrs{
   187  			"future": "hammerstein",
   188  		},
   189  	}, {
   190  		config: requiredConfig,
   191  		change: testing.Attrs{
   192  			"ssl-hostname-verification": false,
   193  		},
   194  		sslHostnameVerification: false,
   195  		sslHostnameSet:          true,
   196  	}, {
   197  		config: requiredConfig,
   198  		change: testing.Attrs{
   199  			"ssl-hostname-verification": true,
   200  		},
   201  		sslHostnameVerification: true,
   202  		sslHostnameSet:          true,
   203  	}, {
   204  		summary: "default network",
   205  		config:  requiredConfig,
   206  		network: "",
   207  	}, {
   208  		summary: "network",
   209  		config: requiredConfig.Merge(testing.Attrs{
   210  			NetworkKey: "a-network-label",
   211  		}),
   212  		network: "a-network-label",
   213  	}, {}, {
   214  		summary:         "default external network",
   215  		config:          requiredConfig,
   216  		externalNetwork: "",
   217  	}, {
   218  		summary: "external network",
   219  		config: requiredConfig.Merge(testing.Attrs{
   220  			"external-network": "a-external-network-label",
   221  		}),
   222  		externalNetwork: "a-external-network-label",
   223  	}, {
   224  		summary: "block storage specified",
   225  		config: requiredConfig.Merge(testing.Attrs{
   226  			"storage-default-block-source": "my-cinder",
   227  		}),
   228  		blockStorageSource: "my-cinder",
   229  	}, {
   230  		summary: "use gbp set, ptg not set",
   231  		config: requiredConfig.Merge(testing.Attrs{
   232  			"use-openstack-gbp": true,
   233  		}),
   234  		err: "policy-target-group must be set when use-openstack-gbp is set",
   235  	}, {
   236  		summary: "use gbp set, ptg set",
   237  		config: requiredConfig.Merge(testing.Attrs{
   238  			"use-openstack-gbp":   true,
   239  			"policy-target-group": "fb19cd79-a25c-4357-9271-b071c5cb726c",
   240  		}),
   241  	}, {
   242  		summary: "use gbp not set, ptg set",
   243  		config: requiredConfig.Merge(testing.Attrs{
   244  			"policy-target-group": "fb19cd79-a25c-4357-9271-b071c5cb726c",
   245  		}),
   246  	}, {
   247  		summary: "use gbp set, ptg set, network set",
   248  		config: requiredConfig.Merge(testing.Attrs{
   249  			"use-openstack-gbp":   true,
   250  			"policy-target-group": "fb19cd79-a25c-4357-9271-b071c5cb726c",
   251  			"network":             "fb19cd79-a25c-4357-9271-b071c5cb726c",
   252  		}),
   253  		err: "cannot use 'network' config setting when use-openstack-gbp is set",
   254  	}, {
   255  		summary: "use gbp set, ptg not an UUID",
   256  		config: requiredConfig.Merge(testing.Attrs{
   257  			"use-openstack-gbp":   true,
   258  			"policy-target-group": "groundcontroltomajortom",
   259  		}),
   260  		err: "policy-target-group has invalid UUID: .*",
   261  	},
   262  }
   263  
   264  func (s *ConfigSuite) TestConfig(c *gc.C) {
   265  	for i, t := range configTests {
   266  		c.Logf("test %d: %s (%v)", i, t.summary, t.config)
   267  		t.check(c)
   268  	}
   269  }
   270  
   271  func (s *ConfigSuite) TestDeprecatedAttributesRemoved(c *gc.C) {
   272  	attrs := testing.FakeConfig().Merge(testing.Attrs{
   273  		"type":                  "openstack",
   274  		"default-image-id":      "id-1234",
   275  		"default-instance-type": "big",
   276  	})
   277  
   278  	cfg, err := config.New(config.NoDefaults, attrs)
   279  	c.Assert(err, jc.ErrorIsNil)
   280  	// Keep err for validation below.
   281  	valid, err := providerInstance.Validate(cfg, nil)
   282  	c.Assert(err, jc.ErrorIsNil)
   283  	// Check deprecated attributes removed.
   284  	allAttrs := valid.AllAttrs()
   285  	for _, attr := range []string{"default-image-id", "default-instance-type"} {
   286  		_, ok := allAttrs[attr]
   287  		c.Assert(ok, jc.IsFalse)
   288  	}
   289  }
   290  
   291  func (s *ConfigSuite) TestPrepareConfigSetsDefaultBlockSource(c *gc.C) {
   292  	attrs := testing.FakeConfig().Merge(testing.Attrs{
   293  		"type": "openstack",
   294  	})
   295  	cfg, err := config.New(config.NoDefaults, attrs)
   296  	c.Assert(err, jc.ErrorIsNil)
   297  	_, ok := cfg.StorageDefaultBlockSource()
   298  	c.Assert(ok, jc.IsFalse)
   299  
   300  	cfg, err = providerInstance.PrepareConfig(prepareConfigParams(cfg))
   301  	c.Assert(err, jc.ErrorIsNil)
   302  	source, ok := cfg.StorageDefaultBlockSource()
   303  	c.Assert(ok, jc.IsTrue)
   304  	c.Assert(source, gc.Equals, "cinder")
   305  }
   306  
   307  func prepareConfigParams(cfg *config.Config) environs.PrepareConfigParams {
   308  	credential := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{
   309  		"username":    "user",
   310  		"password":    "secret",
   311  		"tenant-name": "sometenant",
   312  	})
   313  	return environs.PrepareConfigParams{
   314  		Config: cfg,
   315  		Cloud: environs.CloudSpec{
   316  			Type:       "openstack",
   317  			Name:       "canonistack",
   318  			Region:     "region",
   319  			Endpoint:   "http://auth",
   320  			Credential: &credential,
   321  		},
   322  	}
   323  }
   324  
   325  func (*ConfigSuite) TestSchema(c *gc.C) {
   326  	fields := providerInstance.Schema()
   327  	// Check that all the fields defined in environs/config
   328  	// are in the returned schema.
   329  	globalFields, err := config.Schema(nil)
   330  	c.Assert(err, gc.IsNil)
   331  	for name, field := range globalFields {
   332  		c.Check(fields[name], jc.DeepEquals, field)
   333  	}
   334  }