github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/juju/deploy_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package juju_test
     5  
     6  import (
     7  	"fmt"
     8  	stdtesting "testing"
     9  
    10  	"github.com/juju/errors"
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/utils/set"
    13  	gc "gopkg.in/check.v1"
    14  	"gopkg.in/juju/charm.v5"
    15  	"gopkg.in/juju/charm.v5/charmrepo"
    16  
    17  	"github.com/juju/juju/constraints"
    18  	"github.com/juju/juju/instance"
    19  	"github.com/juju/juju/juju"
    20  	"github.com/juju/juju/juju/testing"
    21  	"github.com/juju/juju/state"
    22  	"github.com/juju/juju/testcharms"
    23  	coretesting "github.com/juju/juju/testing"
    24  	"github.com/juju/juju/testing/factory"
    25  )
    26  
    27  func Test(t *stdtesting.T) {
    28  	coretesting.MgoTestPackage(t)
    29  }
    30  
    31  // DeployLocalSuite uses a fresh copy of the same local dummy charm for each
    32  // test, because DeployService demands that a charm already exists in state,
    33  // and that's is the simplest way to get one in there.
    34  type DeployLocalSuite struct {
    35  	testing.JujuConnSuite
    36  	repo        charmrepo.Interface
    37  	charm       *state.Charm
    38  	oldCacheDir string
    39  }
    40  
    41  var _ = gc.Suite(&DeployLocalSuite{})
    42  
    43  func (s *DeployLocalSuite) SetUpSuite(c *gc.C) {
    44  	s.JujuConnSuite.SetUpSuite(c)
    45  	s.repo = &charmrepo.LocalRepository{Path: testcharms.Repo.Path()}
    46  	s.oldCacheDir, charmrepo.CacheDir = charmrepo.CacheDir, c.MkDir()
    47  }
    48  
    49  func (s *DeployLocalSuite) TearDownSuite(c *gc.C) {
    50  	charmrepo.CacheDir = s.oldCacheDir
    51  	s.JujuConnSuite.TearDownSuite(c)
    52  }
    53  
    54  func (s *DeployLocalSuite) SetUpTest(c *gc.C) {
    55  	s.JujuConnSuite.SetUpTest(c)
    56  	curl := charm.MustParseURL("local:quantal/dummy")
    57  	charm, err := testing.PutCharm(s.State, curl, s.repo, false)
    58  	c.Assert(err, jc.ErrorIsNil)
    59  	s.charm = charm
    60  }
    61  
    62  func (s *DeployLocalSuite) TestDeployMinimal(c *gc.C) {
    63  	service, err := juju.DeployService(s.State,
    64  		juju.DeployServiceParams{
    65  			ServiceName: "bob",
    66  			Charm:       s.charm,
    67  		})
    68  	c.Assert(err, jc.ErrorIsNil)
    69  	s.assertCharm(c, service, s.charm.URL())
    70  	s.assertSettings(c, service, charm.Settings{})
    71  	s.assertConstraints(c, service, constraints.Value{})
    72  	s.assertMachines(c, service, constraints.Value{})
    73  	c.Assert(service.GetOwnerTag(), gc.Equals, s.AdminUserTag(c).String())
    74  }
    75  
    76  func (s *DeployLocalSuite) TestDeployOwnerTag(c *gc.C) {
    77  	s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"})
    78  	service, err := juju.DeployService(s.State,
    79  		juju.DeployServiceParams{
    80  			ServiceName:  "bobwithowner",
    81  			Charm:        s.charm,
    82  			ServiceOwner: "user-foobar",
    83  		})
    84  	c.Assert(err, jc.ErrorIsNil)
    85  	c.Assert(service.GetOwnerTag(), gc.Equals, "user-foobar")
    86  }
    87  
    88  func (s *DeployLocalSuite) TestDeploySettings(c *gc.C) {
    89  	service, err := juju.DeployService(s.State,
    90  		juju.DeployServiceParams{
    91  			ServiceName: "bob",
    92  			Charm:       s.charm,
    93  			ConfigSettings: charm.Settings{
    94  				"title":       "banana cupcakes",
    95  				"skill-level": 9901,
    96  			},
    97  		})
    98  	c.Assert(err, jc.ErrorIsNil)
    99  	s.assertSettings(c, service, charm.Settings{
   100  		"title":       "banana cupcakes",
   101  		"skill-level": int64(9901),
   102  	})
   103  }
   104  
   105  func (s *DeployLocalSuite) TestDeploySettingsError(c *gc.C) {
   106  	_, err := juju.DeployService(s.State,
   107  		juju.DeployServiceParams{
   108  			ServiceName: "bob",
   109  			Charm:       s.charm,
   110  			ConfigSettings: charm.Settings{
   111  				"skill-level": 99.01,
   112  			},
   113  		})
   114  	c.Assert(err, gc.ErrorMatches, `option "skill-level" expected int, got 99.01`)
   115  	_, err = s.State.Service("bob")
   116  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   117  }
   118  
   119  func (s *DeployLocalSuite) TestDeployConstraints(c *gc.C) {
   120  	err := s.State.SetEnvironConstraints(constraints.MustParse("mem=2G"))
   121  	c.Assert(err, jc.ErrorIsNil)
   122  	serviceCons := constraints.MustParse("cpu-cores=2")
   123  	service, err := juju.DeployService(s.State,
   124  		juju.DeployServiceParams{
   125  			ServiceName: "bob",
   126  			Charm:       s.charm,
   127  			Constraints: serviceCons,
   128  		})
   129  	c.Assert(err, jc.ErrorIsNil)
   130  	s.assertConstraints(c, service, serviceCons)
   131  }
   132  
   133  func (s *DeployLocalSuite) TestDeployNumUnits(c *gc.C) {
   134  	err := s.State.SetEnvironConstraints(constraints.MustParse("mem=2G"))
   135  	c.Assert(err, jc.ErrorIsNil)
   136  	serviceCons := constraints.MustParse("cpu-cores=2")
   137  	service, err := juju.DeployService(s.State,
   138  		juju.DeployServiceParams{
   139  			ServiceName: "bob",
   140  			Charm:       s.charm,
   141  			Constraints: serviceCons,
   142  			NumUnits:    2,
   143  		})
   144  	c.Assert(err, jc.ErrorIsNil)
   145  	s.assertConstraints(c, service, serviceCons)
   146  	s.assertMachines(c, service, constraints.MustParse("mem=2G cpu-cores=2"), "0", "1")
   147  }
   148  
   149  func (s *DeployLocalSuite) TestDeployWithForceMachineRejectsTooManyUnits(c *gc.C) {
   150  	machine, err := s.State.AddMachine("quantal", state.JobHostUnits)
   151  	c.Assert(err, jc.ErrorIsNil)
   152  	c.Assert(machine.Id(), gc.Equals, "0")
   153  	_, err = juju.DeployService(s.State,
   154  		juju.DeployServiceParams{
   155  			ServiceName:   "bob",
   156  			Charm:         s.charm,
   157  			NumUnits:      2,
   158  			ToMachineSpec: "0",
   159  		})
   160  	c.Assert(err, gc.ErrorMatches, "cannot use --num-units with --to")
   161  }
   162  
   163  func (s *DeployLocalSuite) TestDeployForceMachineId(c *gc.C) {
   164  	machine, err := s.State.AddMachine("quantal", state.JobHostUnits)
   165  	c.Assert(err, jc.ErrorIsNil)
   166  	c.Assert(machine.Id(), gc.Equals, "0")
   167  	err = s.State.SetEnvironConstraints(constraints.MustParse("mem=2G"))
   168  	c.Assert(err, jc.ErrorIsNil)
   169  	serviceCons := constraints.MustParse("cpu-cores=2")
   170  	service, err := juju.DeployService(s.State,
   171  		juju.DeployServiceParams{
   172  			ServiceName:   "bob",
   173  			Charm:         s.charm,
   174  			Constraints:   serviceCons,
   175  			NumUnits:      1,
   176  			ToMachineSpec: "0",
   177  		})
   178  	c.Assert(err, jc.ErrorIsNil)
   179  	s.assertConstraints(c, service, serviceCons)
   180  	s.assertMachines(c, service, constraints.Value{}, "0")
   181  }
   182  
   183  func (s *DeployLocalSuite) TestDeployForceMachineIdWithContainer(c *gc.C) {
   184  	machine, err := s.State.AddMachine("quantal", state.JobHostUnits)
   185  	c.Assert(err, jc.ErrorIsNil)
   186  	c.Assert(machine.Id(), gc.Equals, "0")
   187  	envCons := constraints.MustParse("mem=2G")
   188  	err = s.State.SetEnvironConstraints(envCons)
   189  	c.Assert(err, jc.ErrorIsNil)
   190  	serviceCons := constraints.MustParse("cpu-cores=2")
   191  	service, err := juju.DeployService(s.State,
   192  		juju.DeployServiceParams{
   193  			ServiceName:   "bob",
   194  			Charm:         s.charm,
   195  			Constraints:   serviceCons,
   196  			NumUnits:      1,
   197  			ToMachineSpec: fmt.Sprintf("%s:0", instance.LXC),
   198  		})
   199  	c.Assert(err, jc.ErrorIsNil)
   200  	s.assertConstraints(c, service, serviceCons)
   201  	units, err := service.AllUnits()
   202  	c.Assert(err, jc.ErrorIsNil)
   203  	c.Assert(units, gc.HasLen, 1)
   204  
   205  	// The newly created container will use the constraints.
   206  	id, err := units[0].AssignedMachineId()
   207  	c.Assert(err, jc.ErrorIsNil)
   208  	machine, err = s.State.Machine(id)
   209  	c.Assert(err, jc.ErrorIsNil)
   210  	machineCons, err := machine.Constraints()
   211  	c.Assert(err, jc.ErrorIsNil)
   212  	unitCons, err := units[0].Constraints()
   213  	c.Assert(err, jc.ErrorIsNil)
   214  	c.Assert(machineCons, gc.DeepEquals, *unitCons)
   215  }
   216  
   217  func (s *DeployLocalSuite) assertCharm(c *gc.C, service *state.Service, expect *charm.URL) {
   218  	curl, force := service.CharmURL()
   219  	c.Assert(curl, gc.DeepEquals, expect)
   220  	c.Assert(force, jc.IsFalse)
   221  }
   222  
   223  func (s *DeployLocalSuite) assertSettings(c *gc.C, service *state.Service, expect charm.Settings) {
   224  	settings, err := service.ConfigSettings()
   225  	c.Assert(err, jc.ErrorIsNil)
   226  	c.Assert(settings, gc.DeepEquals, expect)
   227  }
   228  
   229  func (s *DeployLocalSuite) assertConstraints(c *gc.C, service *state.Service, expect constraints.Value) {
   230  	cons, err := service.Constraints()
   231  	c.Assert(err, jc.ErrorIsNil)
   232  	c.Assert(cons, gc.DeepEquals, expect)
   233  }
   234  
   235  func (s *DeployLocalSuite) assertMachines(c *gc.C, service *state.Service, expectCons constraints.Value, expectIds ...string) {
   236  	units, err := service.AllUnits()
   237  	c.Assert(err, jc.ErrorIsNil)
   238  	c.Assert(units, gc.HasLen, len(expectIds))
   239  	unseenIds := set.NewStrings(expectIds...)
   240  	for _, unit := range units {
   241  		id, err := unit.AssignedMachineId()
   242  		c.Assert(err, jc.ErrorIsNil)
   243  		unseenIds.Remove(id)
   244  		machine, err := s.State.Machine(id)
   245  		c.Assert(err, jc.ErrorIsNil)
   246  		cons, err := machine.Constraints()
   247  		c.Assert(err, jc.ErrorIsNil)
   248  		c.Assert(cons, gc.DeepEquals, expectCons)
   249  	}
   250  	c.Assert(unseenIds, gc.DeepEquals, set.NewStrings())
   251  }