github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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 "net/http" 8 "net/http/httptest" 9 10 "github.com/juju/errors" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 "gopkg.in/juju/charm.v6-unstable" 14 "gopkg.in/juju/charmrepo.v1" 15 16 "github.com/juju/juju/apiserver/charmrevisionupdater" 17 "github.com/juju/juju/apiserver/charmrevisionupdater/testing" 18 "github.com/juju/juju/apiserver/common" 19 apiservertesting "github.com/juju/juju/apiserver/testing" 20 jujutesting "github.com/juju/juju/juju/testing" 21 "github.com/juju/juju/state" 22 ) 23 24 type charmVersionSuite struct { 25 testing.CharmSuite 26 jujutesting.JujuConnSuite 27 28 charmrevisionupdater *charmrevisionupdater.CharmRevisionUpdaterAPI 29 resources *common.Resources 30 authoriser apiservertesting.FakeAuthorizer 31 } 32 33 var _ = gc.Suite(&charmVersionSuite{}) 34 35 func (s *charmVersionSuite) SetUpSuite(c *gc.C) { 36 s.JujuConnSuite.SetUpSuite(c) 37 s.CharmSuite.SetUpSuite(c, &s.JujuConnSuite) 38 } 39 40 func (s *charmVersionSuite) TearDownSuite(c *gc.C) { 41 s.CharmSuite.TearDownSuite(c) 42 s.JujuConnSuite.TearDownSuite(c) 43 } 44 45 func (s *charmVersionSuite) SetUpTest(c *gc.C) { 46 s.JujuConnSuite.SetUpTest(c) 47 s.CharmSuite.SetUpTest(c) 48 s.resources = common.NewResources() 49 s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() }) 50 s.authoriser = apiservertesting.FakeAuthorizer{ 51 EnvironManager: true, 52 } 53 var err error 54 s.charmrevisionupdater, err = charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, s.authoriser) 55 c.Assert(err, jc.ErrorIsNil) 56 } 57 58 func (s *charmVersionSuite) TearDownTest(c *gc.C) { 59 s.CharmSuite.TearDownTest(c) 60 s.JujuConnSuite.TearDownTest(c) 61 } 62 63 func (s *charmVersionSuite) TestNewCharmRevisionUpdaterAPIAcceptsStateManager(c *gc.C) { 64 endPoint, err := charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, s.authoriser) 65 c.Assert(err, jc.ErrorIsNil) 66 c.Assert(endPoint, gc.NotNil) 67 } 68 69 func (s *charmVersionSuite) TestNewCharmRevisionUpdaterAPIRefusesNonStateManager(c *gc.C) { 70 anAuthoriser := s.authoriser 71 anAuthoriser.EnvironManager = false 72 endPoint, err := charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, anAuthoriser) 73 c.Assert(endPoint, gc.IsNil) 74 c.Assert(err, gc.ErrorMatches, "permission denied") 75 } 76 77 func (s *charmVersionSuite) TestUpdateRevisions(c *gc.C) { 78 s.AddMachine(c, "0", state.JobManageEnviron) 79 s.SetupScenario(c) 80 81 curl := charm.MustParseURL("cs:quantal/mysql") 82 _, err := s.State.LatestPlaceholderCharm(curl) 83 c.Assert(err, jc.Satisfies, errors.IsNotFound) 84 85 curl = charm.MustParseURL("cs:quantal/wordpress") 86 _, err = s.State.LatestPlaceholderCharm(curl) 87 c.Assert(err, jc.Satisfies, errors.IsNotFound) 88 89 result, err := s.charmrevisionupdater.UpdateLatestRevisions() 90 c.Assert(err, jc.ErrorIsNil) 91 c.Assert(result.Error, gc.IsNil) 92 93 curl = charm.MustParseURL("cs:quantal/mysql") 94 pending, err := s.State.LatestPlaceholderCharm(curl) 95 c.Assert(err, jc.ErrorIsNil) 96 c.Assert(pending.String(), gc.Equals, "cs:quantal/mysql-23") 97 98 // Latest wordpress is already deployed, so no pending charm. 99 curl = charm.MustParseURL("cs:quantal/wordpress") 100 _, err = s.State.LatestPlaceholderCharm(curl) 101 c.Assert(err, jc.Satisfies, errors.IsNotFound) 102 103 // Varnish has an error when updating, so no pending charm. 104 curl = charm.MustParseURL("cs:quantal/varnish") 105 _, err = s.State.LatestPlaceholderCharm(curl) 106 c.Assert(err, jc.Satisfies, errors.IsNotFound) 107 108 // Update mysql version and run update again. 109 svc, err := s.State.Service("mysql") 110 c.Assert(err, jc.ErrorIsNil) 111 ch := s.AddCharmWithRevision(c, "mysql", 23) 112 err = svc.SetCharm(ch, true) 113 c.Assert(err, jc.ErrorIsNil) 114 115 result, err = s.charmrevisionupdater.UpdateLatestRevisions() 116 c.Assert(err, jc.ErrorIsNil) 117 c.Assert(result.Error, gc.IsNil) 118 119 // Latest mysql is now deployed, so no pending charm. 120 curl = charm.MustParseURL("cs:quantal/mysql") 121 _, err = s.State.LatestPlaceholderCharm(curl) 122 c.Assert(err, jc.Satisfies, errors.IsNotFound) 123 } 124 125 func (s *charmVersionSuite) TestWordpressCharmNoReadAccessIsntVisible(c *gc.C) { 126 s.AddMachine(c, "0", state.JobManageEnviron) 127 s.SetupScenario(c) 128 129 // Disallow read access to the wordpress charm in the charm store. 130 err := s.Client.Put("/quantal/wordpress/meta/perm/read", nil) 131 c.Assert(err, jc.ErrorIsNil) 132 133 // Run the revision updater and check that the public charm updates are 134 // still properly notified. 135 result, err := s.charmrevisionupdater.UpdateLatestRevisions() 136 c.Assert(err, jc.ErrorIsNil) 137 c.Assert(result.Error, gc.IsNil) 138 139 curl := charm.MustParseURL("cs:quantal/mysql") 140 pending, err := s.State.LatestPlaceholderCharm(curl) 141 c.Assert(err, jc.ErrorIsNil) 142 c.Assert(pending.String(), gc.Equals, "cs:quantal/mysql-23") 143 144 // No pending charm for wordpress. 145 curl = charm.MustParseURL("cs:quantal/wordpress") 146 _, err = s.State.LatestPlaceholderCharm(curl) 147 c.Assert(err, jc.Satisfies, errors.IsNotFound) 148 } 149 150 func (s *charmVersionSuite) TestEnvironmentUUIDUsed(c *gc.C) { 151 s.AddMachine(c, "0", state.JobManageEnviron) 152 s.SetupScenario(c) 153 154 // Set up a charm store server that stores the request header. 155 var header http.Header 156 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 157 header = r.Header 158 s.Handler.ServeHTTP(w, r) 159 })) 160 defer srv.Close() 161 162 // Point the charm repo initializer to the testing server. 163 s.PatchValue(&charmrevisionupdater.NewCharmStore, func(p charmrepo.NewCharmStoreParams) charmrepo.Interface { 164 p.URL = srv.URL 165 return charmrepo.NewCharmStore(p) 166 }) 167 168 result, err := s.charmrevisionupdater.UpdateLatestRevisions() 169 c.Assert(err, jc.ErrorIsNil) 170 c.Assert(result.Error, gc.IsNil) 171 172 env, err := s.State.Environment() 173 c.Assert(err, jc.ErrorIsNil) 174 c.Assert(header.Get(charmrepo.JujuMetadataHTTPHeader), gc.Equals, "environment_uuid="+env.UUID()) 175 }