github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/apiserver/charmrevisionupdater/updater_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package charmrevisionupdater_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  	"gopkg.in/juju/charm.v4"
    11  
    12  	"github.com/juju/juju/apiserver/charmrevisionupdater"
    13  	"github.com/juju/juju/apiserver/charmrevisionupdater/testing"
    14  	"github.com/juju/juju/apiserver/common"
    15  	apiservertesting "github.com/juju/juju/apiserver/testing"
    16  	jujutesting "github.com/juju/juju/juju/testing"
    17  	"github.com/juju/juju/state"
    18  )
    19  
    20  type charmVersionSuite struct {
    21  	testing.CharmSuite
    22  	jujutesting.JujuConnSuite
    23  
    24  	charmrevisionupdater *charmrevisionupdater.CharmRevisionUpdaterAPI
    25  	resources            *common.Resources
    26  	authoriser           apiservertesting.FakeAuthorizer
    27  }
    28  
    29  var _ = gc.Suite(&charmVersionSuite{})
    30  
    31  func (s *charmVersionSuite) SetUpSuite(c *gc.C) {
    32  	s.JujuConnSuite.SetUpSuite(c)
    33  	s.CharmSuite.SetUpSuite(c, &s.JujuConnSuite)
    34  }
    35  
    36  func (s *charmVersionSuite) TearDownSuite(c *gc.C) {
    37  	s.CharmSuite.TearDownSuite(c)
    38  	s.JujuConnSuite.TearDownSuite(c)
    39  }
    40  
    41  func (s *charmVersionSuite) SetUpTest(c *gc.C) {
    42  	s.JujuConnSuite.SetUpTest(c)
    43  	s.CharmSuite.SetUpTest(c)
    44  	s.resources = common.NewResources()
    45  	s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() })
    46  	s.authoriser = apiservertesting.FakeAuthorizer{
    47  		EnvironManager: true,
    48  	}
    49  	var err error
    50  	s.charmrevisionupdater, err = charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, s.authoriser)
    51  	c.Assert(err, jc.ErrorIsNil)
    52  }
    53  
    54  func (s *charmVersionSuite) TearDownTest(c *gc.C) {
    55  	s.CharmSuite.TearDownTest(c)
    56  	s.JujuConnSuite.TearDownTest(c)
    57  }
    58  
    59  func (s *charmVersionSuite) TestNewCharmRevisionUpdaterAPIAcceptsStateManager(c *gc.C) {
    60  	endPoint, err := charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, s.authoriser)
    61  	c.Assert(err, jc.ErrorIsNil)
    62  	c.Assert(endPoint, gc.NotNil)
    63  }
    64  
    65  func (s *charmVersionSuite) TestNewCharmRevisionUpdaterAPIRefusesNonStateManager(c *gc.C) {
    66  	anAuthoriser := s.authoriser
    67  	anAuthoriser.EnvironManager = false
    68  	endPoint, err := charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, anAuthoriser)
    69  	c.Assert(endPoint, gc.IsNil)
    70  	c.Assert(err, gc.ErrorMatches, "permission denied")
    71  }
    72  
    73  func (s *charmVersionSuite) TestUpdateRevisions(c *gc.C) {
    74  	s.AddMachine(c, "0", state.JobManageEnviron)
    75  	s.SetupScenario(c)
    76  
    77  	curl := charm.MustParseURL("cs:quantal/mysql")
    78  	_, err := s.State.LatestPlaceholderCharm(curl)
    79  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
    80  
    81  	curl = charm.MustParseURL("cs:quantal/wordpress")
    82  	_, err = s.State.LatestPlaceholderCharm(curl)
    83  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
    84  
    85  	result, err := s.charmrevisionupdater.UpdateLatestRevisions()
    86  	c.Assert(err, jc.ErrorIsNil)
    87  	c.Assert(result.Error, gc.IsNil)
    88  
    89  	curl = charm.MustParseURL("cs:quantal/mysql")
    90  	pending, err := s.State.LatestPlaceholderCharm(curl)
    91  	c.Assert(err, jc.ErrorIsNil)
    92  	c.Assert(pending.String(), gc.Equals, "cs:quantal/mysql-23")
    93  
    94  	// Latest wordpress is already deployed, so no pending charm.
    95  	curl = charm.MustParseURL("cs:quantal/wordpress")
    96  	_, err = s.State.LatestPlaceholderCharm(curl)
    97  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
    98  
    99  	// Varnish has an error when updating, so no pending charm.
   100  	curl = charm.MustParseURL("cs:quantal/varnish")
   101  	_, err = s.State.LatestPlaceholderCharm(curl)
   102  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   103  
   104  	// Update mysql version and run update again.
   105  	svc, err := s.State.Service("mysql")
   106  	c.Assert(err, jc.ErrorIsNil)
   107  	ch := s.AddCharmWithRevision(c, "mysql", 23)
   108  	err = svc.SetCharm(ch, true)
   109  	c.Assert(err, jc.ErrorIsNil)
   110  
   111  	result, err = s.charmrevisionupdater.UpdateLatestRevisions()
   112  	c.Assert(err, jc.ErrorIsNil)
   113  	c.Assert(result.Error, gc.IsNil)
   114  
   115  	// Latest mysql is now deployed, so no pending charm.
   116  	curl = charm.MustParseURL("cs:quantal/mysql")
   117  	_, err = s.State.LatestPlaceholderCharm(curl)
   118  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   119  }
   120  
   121  func (s *charmVersionSuite) TestEnvironmentUUIDUsed(c *gc.C) {
   122  	s.AddMachine(c, "0", state.JobManageEnviron)
   123  	s.SetupScenario(c)
   124  	result, err := s.charmrevisionupdater.UpdateLatestRevisions()
   125  	c.Assert(err, jc.ErrorIsNil)
   126  	c.Assert(result.Error, gc.IsNil)
   127  
   128  	env, err := s.State.Environment()
   129  	c.Assert(err, jc.ErrorIsNil)
   130  	c.Assert(s.Server.Metadata, gc.DeepEquals, []string{"environment_uuid=" + env.UUID()})
   131  }