github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/provider/cloudsigma/client_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package cloudsigma
     5  
     6  import (
     7  	"fmt"
     8  	"strings"
     9  	"time"
    10  
    11  	"github.com/altoros/gosigma"
    12  	"github.com/altoros/gosigma/data"
    13  	"github.com/altoros/gosigma/mock"
    14  	"github.com/juju/loggo"
    15  	jc "github.com/juju/testing/checkers"
    16  	"github.com/juju/utils"
    17  	"github.com/juju/version"
    18  	gc "gopkg.in/check.v1"
    19  
    20  	"github.com/juju/juju/cloudconfig/instancecfg"
    21  	"github.com/juju/juju/constraints"
    22  	"github.com/juju/juju/environs"
    23  	"github.com/juju/juju/environs/imagemetadata"
    24  	"github.com/juju/juju/instance"
    25  	"github.com/juju/juju/testing"
    26  	"github.com/juju/juju/tools"
    27  )
    28  
    29  type clientSuite struct {
    30  	testing.BaseSuite
    31  }
    32  
    33  var _ = gc.Suite(&clientSuite{})
    34  
    35  func (s *clientSuite) SetUpSuite(c *gc.C) {
    36  	s.BaseSuite.SetUpSuite(c)
    37  	mock.Start()
    38  	s.AddCleanup(func(*gc.C) {
    39  		mock.Stop()
    40  	})
    41  }
    42  
    43  func (s *clientSuite) SetUpTest(c *gc.C) {
    44  	s.BaseSuite.SetUpTest(c)
    45  
    46  	ll := logger.LogLevel()
    47  	logger.SetLogLevel(loggo.TRACE)
    48  	s.AddCleanup(func(*gc.C) { logger.SetLogLevel(ll) })
    49  
    50  	mock.Reset()
    51  }
    52  
    53  func (s *clientSuite) TearDownTest(c *gc.C) {
    54  	s.BaseSuite.TearDownTest(c)
    55  }
    56  
    57  func testNewClient(c *gc.C, endpoint, username, password string) (*environClient, error) {
    58  	ecfg := &environConfig{
    59  		Config: newConfig(c, testing.Attrs{"name": "client-test", "uuid": "f54aac3a-9dcd-4a0c-86b5-24091478478c"}),
    60  		attrs: map[string]interface{}{
    61  			"region":   "testregion",
    62  			"endpoint": endpoint,
    63  			"username": username,
    64  			"password": password,
    65  		},
    66  	}
    67  	return newClient(ecfg)
    68  }
    69  
    70  func addTestClientServer(c *gc.C, instance, env string) string {
    71  	json := `{"meta": {`
    72  	if instance != "" {
    73  		json += fmt.Sprintf(`"juju-instance": "%s"`, instance)
    74  		if env != "" {
    75  			json += fmt.Sprintf(`, "juju-model": "%s"`, env)
    76  		}
    77  	}
    78  	json += `}, "status": "running"}`
    79  	r := strings.NewReader(json)
    80  	s, err := data.ReadServer(r)
    81  	c.Assert(err, gc.IsNil)
    82  	mock.AddServer(s)
    83  	return s.UUID
    84  }
    85  
    86  func (s *clientSuite) TestClientInstances(c *gc.C) {
    87  	addTestClientServer(c, "", "")
    88  	addTestClientServer(c, jujuMetaInstanceServer, "alien")
    89  	addTestClientServer(c, jujuMetaInstanceController, "alien")
    90  	addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c")
    91  	addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c")
    92  	suuid := addTestClientServer(c, jujuMetaInstanceController, "f54aac3a-9dcd-4a0c-86b5-24091478478c")
    93  
    94  	cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword)
    95  	c.Assert(err, gc.IsNil)
    96  
    97  	ss, err := cli.instances()
    98  	c.Assert(err, gc.IsNil)
    99  	c.Assert(ss, gc.NotNil)
   100  	c.Check(ss, gc.HasLen, 3)
   101  
   102  	sm, err := cli.instanceMap()
   103  	c.Assert(err, gc.IsNil)
   104  	c.Assert(sm, gc.NotNil)
   105  	c.Check(sm, gc.HasLen, 3)
   106  
   107  	ids, err := cli.getControllerIds()
   108  	c.Check(err, gc.IsNil)
   109  	c.Check(len(ids), gc.Equals, 1)
   110  	c.Check(string(ids[0]), gc.Equals, suuid)
   111  }
   112  
   113  func (s *clientSuite) TestClientStopStateInstance(c *gc.C) {
   114  	addTestClientServer(c, "", "")
   115  
   116  	addTestClientServer(c, jujuMetaInstanceServer, "alien")
   117  	addTestClientServer(c, jujuMetaInstanceController, "alien")
   118  	addTestClientServer(c, jujuMetaInstanceServer, "client-test")
   119  	suuid := addTestClientServer(c, jujuMetaInstanceController, "client-test")
   120  
   121  	cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword)
   122  	c.Assert(err, gc.IsNil)
   123  
   124  	err = cli.stopInstance(instance.Id(suuid))
   125  	c.Assert(err, gc.IsNil)
   126  
   127  	_, err = cli.getControllerIds()
   128  	c.Check(err, gc.Equals, environs.ErrNotBootstrapped)
   129  }
   130  
   131  func (s *clientSuite) TestClientInvalidStopInstance(c *gc.C) {
   132  	cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword)
   133  	c.Assert(err, gc.IsNil)
   134  
   135  	var id instance.Id
   136  	err = cli.stopInstance(id)
   137  	c.Check(err, gc.ErrorMatches, "invalid instance id")
   138  
   139  	err = cli.stopInstance("1234")
   140  	c.Check(err, gc.ErrorMatches, "404 Not Found.*")
   141  }
   142  
   143  func (s *clientSuite) TestClientInvalidServer(c *gc.C) {
   144  	cli, err := testNewClient(c, "https://testing.invalid", mock.TestUser, mock.TestPassword)
   145  	c.Assert(err, gc.IsNil)
   146  
   147  	cli.conn.ConnectTimeout(10 * time.Millisecond)
   148  
   149  	err = cli.stopInstance("1234")
   150  	c.Check(err, gc.ErrorMatches, "broken connection")
   151  
   152  	_, err = cli.instanceMap()
   153  	c.Check(err, gc.ErrorMatches, "broken connection")
   154  
   155  	_, err = cli.getControllerIds()
   156  	c.Check(err, gc.ErrorMatches, "broken connection")
   157  }
   158  
   159  func (s *clientSuite) TestClientNewInstanceInvalidParams(c *gc.C) {
   160  	cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword)
   161  	c.Assert(err, gc.IsNil)
   162  
   163  	params := environs.StartInstanceParams{
   164  		Constraints: constraints.Value{},
   165  	}
   166  	img := &imagemetadata.ImageMetadata{
   167  		Id: validImageId,
   168  	}
   169  	server, drive, arch, err := cli.newInstance(params, img, nil)
   170  	c.Check(server, gc.IsNil)
   171  	c.Check(arch, gc.Equals, "")
   172  	c.Check(drive, gc.IsNil)
   173  	c.Check(err, gc.ErrorMatches, "invalid configuration for new instance: InstanceConfig is nil")
   174  }
   175  
   176  func (s *clientSuite) TestClientNewInstanceInvalidTemplate(c *gc.C) {
   177  	cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword)
   178  	c.Assert(err, gc.IsNil)
   179  
   180  	params := environs.StartInstanceParams{
   181  		Constraints: constraints.Value{},
   182  		InstanceConfig: &instancecfg.InstanceConfig{
   183  			Bootstrap: true,
   184  		},
   185  	}
   186  	err = params.InstanceConfig.SetTools(tools.List{
   187  		&tools.Tools{
   188  			Version: version.Binary{
   189  				Series: "trusty",
   190  			},
   191  			URL: "https://0.1.2.3:2000/x.y.z.tgz",
   192  		},
   193  	})
   194  	c.Assert(err, jc.ErrorIsNil)
   195  	img := &imagemetadata.ImageMetadata{
   196  		Id: "invalid-id",
   197  	}
   198  	server, drive, arch, err := cli.newInstance(params, img, nil)
   199  	c.Check(server, gc.IsNil)
   200  	c.Check(arch, gc.Equals, "")
   201  	c.Check(drive, gc.IsNil)
   202  	c.Check(err, gc.ErrorMatches, "Failed to query drive template: 404 Not Found, notexist, notfound")
   203  }
   204  
   205  func (s *clientSuite) TestClientNewInstance(c *gc.C) {
   206  	cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword)
   207  	c.Assert(err, gc.IsNil)
   208  
   209  	cli.conn.OperationTimeout(1 * time.Second)
   210  
   211  	params := environs.StartInstanceParams{
   212  		Constraints: constraints.Value{},
   213  		InstanceConfig: &instancecfg.InstanceConfig{
   214  			Bootstrap: true,
   215  		},
   216  	}
   217  	err = params.InstanceConfig.SetTools(tools.List{
   218  		&tools.Tools{
   219  			Version: version.Binary{
   220  				Series: "trusty",
   221  			},
   222  			URL: "https://0.1.2.3:2000/x.y.z.tgz",
   223  		},
   224  	})
   225  	c.Assert(err, jc.ErrorIsNil)
   226  	img := &imagemetadata.ImageMetadata{
   227  		Id: validImageId,
   228  	}
   229  	cs := newConstraints(params.InstanceConfig.Bootstrap, params.Constraints, img)
   230  	c.Assert(cs, gc.NotNil)
   231  	c.Check(err, gc.IsNil)
   232  
   233  	templateDrive := &data.Drive{
   234  		Resource: data.Resource{URI: "uri", UUID: cs.driveTemplate},
   235  		LibraryDrive: data.LibraryDrive{
   236  			Arch:      "64",
   237  			ImageType: "image-type",
   238  			OS:        "os",
   239  			Paid:      true,
   240  		},
   241  		Size:   2200 * gosigma.Megabyte,
   242  		Status: "unmounted",
   243  	}
   244  	mock.ResetDrives()
   245  	mock.LibDrives.Add(templateDrive)
   246  
   247  	server, drive, arch, err := cli.newInstance(params, img, utils.Gzip([]byte{}))
   248  	c.Check(server, gc.NotNil)
   249  	c.Check(drive, gc.NotNil)
   250  	c.Check(arch, gc.NotNil)
   251  	c.Check(err, gc.IsNil)
   252  }