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

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  // +build go1.3
     5  
     6  package lxd_test
     7  
     8  import (
     9  	"fmt"
    10  
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/utils/series"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/cloud"
    16  	"github.com/juju/juju/environs"
    17  	"github.com/juju/juju/provider/lxd"
    18  	"github.com/juju/juju/provider/lxd/lxdnames"
    19  	"github.com/juju/juju/tools/lxdclient"
    20  )
    21  
    22  // This is a quick hack to make wily pass with it's default, but unsupported,
    23  // version of LXD. Wily is supported until 2016-7-??. AFAIU LXD will not be
    24  // backported to wily... so we have this:|
    25  // TODO(redir): Remove after wiley or in yakkety.
    26  func skipIfWily(c *gc.C) {
    27  	if series.HostSeries() == "wily" {
    28  		cfg, _ := lxdclient.Config{}.WithDefaults()
    29  		_, err := lxdclient.Connect(cfg)
    30  		// We try to create a client here. On wily this should fail, because
    31  		// the default 0.20 lxd version should make juju/tools/lxdclient return
    32  		// an error.
    33  		if err != nil {
    34  			c.Skip(fmt.Sprintf("Skipping LXD tests because %s", err))
    35  		}
    36  	}
    37  }
    38  
    39  var (
    40  	_ = gc.Suite(&providerSuite{})
    41  	_ = gc.Suite(&ProviderFunctionalSuite{})
    42  )
    43  
    44  type providerSuite struct {
    45  	lxd.BaseSuite
    46  
    47  	provider environs.EnvironProvider
    48  }
    49  
    50  func (s *providerSuite) SetUpTest(c *gc.C) {
    51  	s.BaseSuite.SetUpTest(c)
    52  
    53  	provider, err := environs.Provider("lxd")
    54  	c.Assert(err, jc.ErrorIsNil)
    55  	s.provider = provider
    56  }
    57  
    58  func (s *providerSuite) TestDetectRegions(c *gc.C) {
    59  	c.Assert(s.provider, gc.Implements, new(environs.CloudRegionDetector))
    60  	regions, err := s.provider.(environs.CloudRegionDetector).DetectRegions()
    61  	c.Assert(err, jc.ErrorIsNil)
    62  	c.Assert(regions, jc.DeepEquals, []cloud.Region{{Name: lxdnames.DefaultRegion}})
    63  }
    64  
    65  func (s *providerSuite) TestRegistered(c *gc.C) {
    66  	c.Check(s.provider, gc.Equals, lxd.Provider)
    67  }
    68  
    69  func (s *providerSuite) TestValidate(c *gc.C) {
    70  	validCfg, err := s.provider.Validate(s.Config, nil)
    71  	c.Assert(err, jc.ErrorIsNil)
    72  	validAttrs := validCfg.AllAttrs()
    73  
    74  	c.Check(s.Config.AllAttrs(), gc.DeepEquals, validAttrs)
    75  }
    76  
    77  type ProviderFunctionalSuite struct {
    78  	lxd.BaseSuite
    79  
    80  	provider environs.EnvironProvider
    81  }
    82  
    83  func (s *ProviderFunctionalSuite) SetUpTest(c *gc.C) {
    84  	if !s.IsRunningLocally(c) {
    85  		c.Skip("LXD not running locally")
    86  	}
    87  
    88  	// TODO(redir): Remove after wily or in yakkety.
    89  	skipIfWily(c)
    90  
    91  	s.BaseSuite.SetUpTest(c)
    92  
    93  	provider, err := environs.Provider("lxd")
    94  	c.Assert(err, jc.ErrorIsNil)
    95  
    96  	s.provider = provider
    97  }
    98  
    99  func (s *ProviderFunctionalSuite) TestOpen(c *gc.C) {
   100  	env, err := s.provider.Open(environs.OpenParams{
   101  		Cloud:  lxdCloudSpec(),
   102  		Config: s.Config,
   103  	})
   104  	c.Assert(err, jc.ErrorIsNil)
   105  	envConfig := env.Config()
   106  
   107  	c.Check(envConfig.Name(), gc.Equals, "testenv")
   108  }
   109  
   110  func (s *ProviderFunctionalSuite) TestPrepareConfig(c *gc.C) {
   111  	cfg, err := s.provider.PrepareConfig(environs.PrepareConfigParams{
   112  		Cloud:  lxdCloudSpec(),
   113  		Config: s.Config,
   114  	})
   115  	c.Assert(err, jc.ErrorIsNil)
   116  	c.Check(cfg, gc.NotNil)
   117  }
   118  
   119  func (s *ProviderFunctionalSuite) TestPrepareConfigUnsupportedAuthType(c *gc.C) {
   120  	cred := cloud.NewCredential(cloud.CertificateAuthType, nil)
   121  	_, err := s.provider.PrepareConfig(environs.PrepareConfigParams{
   122  		Cloud: environs.CloudSpec{
   123  			Type:       "lxd",
   124  			Name:       "remotehost",
   125  			Credential: &cred,
   126  		},
   127  	})
   128  	c.Assert(err, gc.ErrorMatches, `validating cloud spec: "certificate" auth-type not supported`)
   129  }
   130  
   131  func (s *ProviderFunctionalSuite) TestPrepareConfigNonEmptyEndpoint(c *gc.C) {
   132  	_, err := s.provider.PrepareConfig(environs.PrepareConfigParams{
   133  		Cloud: environs.CloudSpec{
   134  			Type:     "lxd",
   135  			Name:     "remotehost",
   136  			Endpoint: "1.2.3.4",
   137  		},
   138  	})
   139  	c.Assert(err, gc.ErrorMatches, `validating cloud spec: non-empty endpoint "1.2.3.4" not valid`)
   140  }