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