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 }