github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/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  	gc "launchpad.net/gocheck"
     8  
     9  	"launchpad.net/juju-core/charm"
    10  	"launchpad.net/juju-core/errors"
    11  	"launchpad.net/juju-core/state"
    12  	"launchpad.net/juju-core/state/apiserver/charmrevisionupdater"
    13  	"launchpad.net/juju-core/state/apiserver/charmrevisionupdater/testing"
    14  	"launchpad.net/juju-core/state/apiserver/common"
    15  	apiservertesting "launchpad.net/juju-core/state/apiserver/testing"
    16  	jc "launchpad.net/juju-core/testing/checkers"
    17  )
    18  
    19  type charmVersionSuite struct {
    20  	testing.CharmSuite
    21  
    22  	charmrevisionupdater *charmrevisionupdater.CharmRevisionUpdaterAPI
    23  	resources            *common.Resources
    24  	authoriser           apiservertesting.FakeAuthorizer
    25  }
    26  
    27  var _ = gc.Suite(&charmVersionSuite{})
    28  
    29  func (s *charmVersionSuite) SetUpSuite(c *gc.C) {
    30  	s.CharmSuite.SetUpSuite(c)
    31  }
    32  
    33  func (s *charmVersionSuite) SetUpTest(c *gc.C) {
    34  	s.CharmSuite.SetUpTest(c)
    35  	s.resources = common.NewResources()
    36  	s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() })
    37  	s.authoriser = apiservertesting.FakeAuthorizer{
    38  		LoggedIn:       true,
    39  		EnvironManager: true,
    40  	}
    41  	var err error
    42  	s.charmrevisionupdater, err = charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, s.authoriser)
    43  	c.Assert(err, gc.IsNil)
    44  }
    45  
    46  func (s *charmVersionSuite) TestNewCharmRevisionUpdaterAPIAcceptsStateManager(c *gc.C) {
    47  	endPoint, err := charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, s.authoriser)
    48  	c.Assert(err, gc.IsNil)
    49  	c.Assert(endPoint, gc.NotNil)
    50  }
    51  
    52  func (s *charmVersionSuite) TestNewCharmRevisionUpdaterAPIRefusesNonStateManager(c *gc.C) {
    53  	anAuthoriser := s.authoriser
    54  	anAuthoriser.EnvironManager = false
    55  	endPoint, err := charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, anAuthoriser)
    56  	c.Assert(endPoint, gc.IsNil)
    57  	c.Assert(err, gc.ErrorMatches, "permission denied")
    58  }
    59  
    60  func (s *charmVersionSuite) TestUpdateRevisions(c *gc.C) {
    61  	s.AddMachine(c, "0", state.JobManageEnviron)
    62  	s.SetupScenario(c)
    63  
    64  	curl := charm.MustParseURL("cs:quantal/mysql")
    65  	_, err := s.State.LatestPlaceholderCharm(curl)
    66  	c.Assert(err, jc.Satisfies, errors.IsNotFoundError)
    67  
    68  	curl = charm.MustParseURL("cs:quantal/wordpress")
    69  	_, err = s.State.LatestPlaceholderCharm(curl)
    70  	c.Assert(err, jc.Satisfies, errors.IsNotFoundError)
    71  
    72  	result, err := s.charmrevisionupdater.UpdateLatestRevisions()
    73  	c.Assert(err, gc.IsNil)
    74  	c.Assert(result.Error, gc.IsNil)
    75  
    76  	curl = charm.MustParseURL("cs:quantal/mysql")
    77  	pending, err := s.State.LatestPlaceholderCharm(curl)
    78  	c.Assert(err, gc.IsNil)
    79  	c.Assert(pending.String(), gc.Equals, "cs:quantal/mysql-23")
    80  
    81  	// Latest wordpress is already deployed, so no pending charm.
    82  	curl = charm.MustParseURL("cs:quantal/wordpress")
    83  	_, err = s.State.LatestPlaceholderCharm(curl)
    84  	c.Assert(err, jc.Satisfies, errors.IsNotFoundError)
    85  
    86  	// Varnish has an error when updating, so no pending charm.
    87  	curl = charm.MustParseURL("cs:quantal/varnish")
    88  	_, err = s.State.LatestPlaceholderCharm(curl)
    89  	c.Assert(err, jc.Satisfies, errors.IsNotFoundError)
    90  
    91  	// Update mysql version and run update again.
    92  	svc, err := s.State.Service("mysql")
    93  	c.Assert(err, gc.IsNil)
    94  	ch := s.AddCharmWithRevision(c, "mysql", 23)
    95  	err = svc.SetCharm(ch, true)
    96  	c.Assert(err, gc.IsNil)
    97  
    98  	result, err = s.charmrevisionupdater.UpdateLatestRevisions()
    99  	c.Assert(err, gc.IsNil)
   100  	c.Assert(result.Error, gc.IsNil)
   101  
   102  	// Latest mysql is now deployed, so no pending charm.
   103  	curl = charm.MustParseURL("cs:quantal/mysql")
   104  	_, err = s.State.LatestPlaceholderCharm(curl)
   105  	c.Assert(err, jc.Satisfies, errors.IsNotFoundError)
   106  }
   107  
   108  func (s *charmVersionSuite) TestEnvironmentUUIDUsed(c *gc.C) {
   109  	s.AddMachine(c, "0", state.JobManageEnviron)
   110  	s.SetupScenario(c)
   111  	result, err := s.charmrevisionupdater.UpdateLatestRevisions()
   112  	c.Assert(err, gc.IsNil)
   113  	c.Assert(result.Error, gc.IsNil)
   114  
   115  	env, err := s.State.Environment()
   116  	c.Assert(err, gc.IsNil)
   117  	c.Assert(s.Server.Metadata, gc.DeepEquals, []string{"environment_uuid=" + env.UUID()})
   118  }