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  }