github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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  	"github.com/juju/utils"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	"github.com/juju/juju/cloudconfig/instancecfg"
    19  	"github.com/juju/juju/constraints"
    20  	"github.com/juju/juju/environs"
    21  	"github.com/juju/juju/environs/imagemetadata"
    22  	"github.com/juju/juju/instance"
    23  	"github.com/juju/juju/testing"
    24  	"github.com/juju/juju/tools"
    25  	"github.com/juju/juju/version"
    26  )
    27  
    28  type clientSuite struct {
    29  	testing.BaseSuite
    30  }
    31  
    32  var _ = gc.Suite(&clientSuite{})
    33  
    34  func (s *clientSuite) SetUpSuite(c *gc.C) {
    35  	s.BaseSuite.SetUpSuite(c)
    36  	mock.Start()
    37  }
    38  
    39  func (s *clientSuite) TearDownSuite(c *gc.C) {
    40  	mock.Stop()
    41  	s.BaseSuite.TearDownSuite(c)
    42  }
    43  
    44  func (s *clientSuite) SetUpTest(c *gc.C) {
    45  	s.BaseSuite.SetUpTest(c)
    46  
    47  	ll := logger.LogLevel()
    48  	logger.SetLogLevel(loggo.TRACE)
    49  	s.AddCleanup(func(*gc.C) { logger.SetLogLevel(ll) })
    50  
    51  	mock.Reset()
    52  }
    53  
    54  func (s *clientSuite) TearDownTest(c *gc.C) {
    55  	s.BaseSuite.TearDownTest(c)
    56  }
    57  
    58  func testNewClient(c *gc.C, endpoint, username, password string) (*environClient, error) {
    59  	ecfg := &environConfig{
    60  		Config: newConfig(c, testing.Attrs{"name": "client-test", "uuid": "f54aac3a-9dcd-4a0c-86b5-24091478478c"}),
    61  		attrs: map[string]interface{}{
    62  			"region":   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-environment": "%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, jujuMetaInstanceStateServer, "alien")
    90  	addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c")
    91  	addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c")
    92  	suuid := addTestClientServer(c, jujuMetaInstanceStateServer, "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.getStateServerIds()
   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, jujuMetaInstanceStateServer, "alien")
   118  	addTestClientServer(c, jujuMetaInstanceServer, "client-test")
   119  	suuid := addTestClientServer(c, jujuMetaInstanceStateServer, "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.getStateServerIds()
   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.getStateServerIds()
   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  			Tools: &tools.Tools{
   185  				Version: version.Binary{
   186  					Series: "trusty",
   187  				},
   188  			},
   189  		},
   190  	}
   191  	img := &imagemetadata.ImageMetadata{
   192  		Id: "invalid-id",
   193  	}
   194  	server, drive, arch, err := cli.newInstance(params, img, nil)
   195  	c.Check(server, gc.IsNil)
   196  	c.Check(arch, gc.Equals, "")
   197  	c.Check(drive, gc.IsNil)
   198  	c.Check(err, gc.ErrorMatches, "Failed to query drive template: 404 Not Found, notexist, notfound")
   199  }
   200  
   201  func (s *clientSuite) TestClientNewInstance(c *gc.C) {
   202  	cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword)
   203  	c.Assert(err, gc.IsNil)
   204  
   205  	cli.conn.OperationTimeout(1 * time.Second)
   206  
   207  	params := environs.StartInstanceParams{
   208  		Constraints: constraints.Value{},
   209  		InstanceConfig: &instancecfg.InstanceConfig{
   210  			Bootstrap: true,
   211  			Tools: &tools.Tools{
   212  				Version: version.Binary{
   213  					Series: "trusty",
   214  				},
   215  			},
   216  		},
   217  	}
   218  	img := &imagemetadata.ImageMetadata{
   219  		Id: validImageId,
   220  	}
   221  	cs := newConstraints(params.InstanceConfig.Bootstrap, params.Constraints, img)
   222  	c.Assert(cs, gc.NotNil)
   223  	c.Check(err, gc.IsNil)
   224  
   225  	templateDrive := &data.Drive{
   226  		Resource: data.Resource{URI: "uri", UUID: cs.driveTemplate},
   227  		LibraryDrive: data.LibraryDrive{
   228  			Arch:      "64",
   229  			ImageType: "image-type",
   230  			OS:        "os",
   231  			Paid:      true,
   232  		},
   233  		Size:   2200 * gosigma.Megabyte,
   234  		Status: "unmounted",
   235  	}
   236  	mock.ResetDrives()
   237  	mock.LibDrives.Add(templateDrive)
   238  
   239  	server, drive, arch, err := cli.newInstance(params, img, utils.Gzip([]byte{}))
   240  	c.Check(server, gc.NotNil)
   241  	c.Check(drive, gc.NotNil)
   242  	c.Check(arch, gc.NotNil)
   243  	c.Check(err, gc.IsNil)
   244  }