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