github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "launchpad.net/gocheck"
    10  
    11  	"github.com/juju/juju/charm"
    12  	jujutesting "github.com/juju/juju/juju/testing"
    13  	"github.com/juju/juju/state"
    14  	"github.com/juju/juju/state/apiserver/charmrevisionupdater"
    15  	"github.com/juju/juju/state/apiserver/charmrevisionupdater/testing"
    16  	"github.com/juju/juju/state/apiserver/common"
    17  	apiservertesting "github.com/juju/juju/state/apiserver/testing"
    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  		LoggedIn:       true,
    48  		EnvironManager: true,
    49  	}
    50  	var err error
    51  	s.charmrevisionupdater, err = charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, s.authoriser)
    52  	c.Assert(err, gc.IsNil)
    53  }
    54  
    55  func (s *charmVersionSuite) TearDownTest(c *gc.C) {
    56  	s.CharmSuite.TearDownTest(c)
    57  	s.JujuConnSuite.TearDownTest(c)
    58  }
    59  
    60  func (s *charmVersionSuite) TestNewCharmRevisionUpdaterAPIAcceptsStateManager(c *gc.C) {
    61  	endPoint, err := charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, s.authoriser)
    62  	c.Assert(err, gc.IsNil)
    63  	c.Assert(endPoint, gc.NotNil)
    64  }
    65  
    66  func (s *charmVersionSuite) TestNewCharmRevisionUpdaterAPIRefusesNonStateManager(c *gc.C) {
    67  	anAuthoriser := s.authoriser
    68  	anAuthoriser.EnvironManager = false
    69  	endPoint, err := charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, anAuthoriser)
    70  	c.Assert(endPoint, gc.IsNil)
    71  	c.Assert(err, gc.ErrorMatches, "permission denied")
    72  }
    73  
    74  func (s *charmVersionSuite) TestUpdateRevisions(c *gc.C) {
    75  	s.AddMachine(c, "0", state.JobManageEnviron)
    76  	s.SetupScenario(c)
    77  
    78  	curl := charm.MustParseURL("cs:quantal/mysql")
    79  	_, err := s.State.LatestPlaceholderCharm(curl)
    80  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
    81  
    82  	curl = charm.MustParseURL("cs:quantal/wordpress")
    83  	_, err = s.State.LatestPlaceholderCharm(curl)
    84  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
    85  
    86  	result, err := s.charmrevisionupdater.UpdateLatestRevisions()
    87  	c.Assert(err, gc.IsNil)
    88  	c.Assert(result.Error, gc.IsNil)
    89  
    90  	curl = charm.MustParseURL("cs:quantal/mysql")
    91  	pending, err := s.State.LatestPlaceholderCharm(curl)
    92  	c.Assert(err, gc.IsNil)
    93  	c.Assert(pending.String(), gc.Equals, "cs:quantal/mysql-23")
    94  
    95  	// Latest wordpress is already deployed, so no pending charm.
    96  	curl = charm.MustParseURL("cs:quantal/wordpress")
    97  	_, err = s.State.LatestPlaceholderCharm(curl)
    98  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
    99  
   100  	// Varnish has an error when updating, so no pending charm.
   101  	curl = charm.MustParseURL("cs:quantal/varnish")
   102  	_, err = s.State.LatestPlaceholderCharm(curl)
   103  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   104  
   105  	// Update mysql version and run update again.
   106  	svc, err := s.State.Service("mysql")
   107  	c.Assert(err, gc.IsNil)
   108  	ch := s.AddCharmWithRevision(c, "mysql", 23)
   109  	err = svc.SetCharm(ch, true)
   110  	c.Assert(err, gc.IsNil)
   111  
   112  	result, err = s.charmrevisionupdater.UpdateLatestRevisions()
   113  	c.Assert(err, gc.IsNil)
   114  	c.Assert(result.Error, gc.IsNil)
   115  
   116  	// Latest mysql is now deployed, so no pending charm.
   117  	curl = charm.MustParseURL("cs:quantal/mysql")
   118  	_, err = s.State.LatestPlaceholderCharm(curl)
   119  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   120  }
   121  
   122  func (s *charmVersionSuite) TestEnvironmentUUIDUsed(c *gc.C) {
   123  	s.AddMachine(c, "0", state.JobManageEnviron)
   124  	s.SetupScenario(c)
   125  	result, err := s.charmrevisionupdater.UpdateLatestRevisions()
   126  	c.Assert(err, gc.IsNil)
   127  	c.Assert(result.Error, gc.IsNil)
   128  
   129  	env, err := s.State.Environment()
   130  	c.Assert(err, gc.IsNil)
   131  	c.Assert(s.Server.Metadata, gc.DeepEquals, []string{"environment_uuid=" + env.UUID()})
   132  }