github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/apiserver/uniter/uniter_v1_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package uniter_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/apiserver/common"
    11  	commontesting "github.com/juju/juju/apiserver/common/testing"
    12  	meterstatustesting "github.com/juju/juju/apiserver/meterstatus/testing"
    13  	"github.com/juju/juju/apiserver/params"
    14  	apiservertesting "github.com/juju/juju/apiserver/testing"
    15  	"github.com/juju/juju/apiserver/uniter"
    16  	"github.com/juju/juju/state"
    17  )
    18  
    19  type uniterV1Suite struct {
    20  	uniterBaseSuite
    21  	*commontesting.EnvironWatcherTest
    22  
    23  	uniter        *uniter.UniterAPIV1
    24  	meteredUniter *uniter.UniterAPIV1
    25  }
    26  
    27  var _ = gc.Suite(&uniterV1Suite{})
    28  
    29  func (s *uniterV1Suite) SetUpTest(c *gc.C) {
    30  	s.uniterBaseSuite.setUpTest(c)
    31  
    32  	uniterAPIV1, err := uniter.NewUniterAPIV1(
    33  		s.State,
    34  		s.resources,
    35  		s.authorizer,
    36  	)
    37  	c.Assert(err, jc.ErrorIsNil)
    38  	s.uniter = uniterAPIV1
    39  
    40  	meteredAuthorizer := apiservertesting.FakeAuthorizer{
    41  		Tag: s.meteredUnit.Tag(),
    42  	}
    43  	s.meteredUniter, err = uniter.NewUniterAPIV1(
    44  		s.State,
    45  		s.resources,
    46  		meteredAuthorizer,
    47  	)
    48  	c.Assert(err, jc.ErrorIsNil)
    49  
    50  	s.EnvironWatcherTest = commontesting.NewEnvironWatcherTest(
    51  		s.uniter,
    52  		s.State,
    53  		s.resources,
    54  		commontesting.NoSecrets,
    55  	)
    56  }
    57  
    58  func (s *uniterV1Suite) TestUniterFailsWithNonUnitAgentUser(c *gc.C) {
    59  	factory := func(st *state.State, res *common.Resources, auth common.Authorizer) error {
    60  		_, err := uniter.NewUniterAPIV1(st, res, auth)
    61  		return err
    62  	}
    63  	s.testUniterFailsWithNonUnitAgentUser(c, factory)
    64  }
    65  
    66  func (s *uniterV1Suite) TestSetStatus(c *gc.C) {
    67  	s.testSetStatus(c, s.uniter)
    68  }
    69  
    70  func (s *uniterV1Suite) TestLife(c *gc.C) {
    71  	s.testLife(c, s.uniter)
    72  }
    73  
    74  func (s *uniterV1Suite) TestEnsureDead(c *gc.C) {
    75  	s.testEnsureDead(c, s.uniter)
    76  }
    77  
    78  func (s *uniterV1Suite) TestWatch(c *gc.C) {
    79  	s.testWatch(c, s.uniter)
    80  }
    81  
    82  func (s *uniterV1Suite) TestPublicAddress(c *gc.C) {
    83  	s.testPublicAddress(c, s.uniter)
    84  }
    85  
    86  func (s *uniterV1Suite) TestAvailabilityZone(c *gc.C) {
    87  	s.testAvailabilityZone(c, s.uniter)
    88  }
    89  
    90  func (s *uniterV1Suite) TestPrivateAddress(c *gc.C) {
    91  	s.testPrivateAddress(c, s.uniter)
    92  }
    93  
    94  func (s *uniterV1Suite) TestResolved(c *gc.C) {
    95  	s.testResolved(c, s.uniter)
    96  }
    97  
    98  func (s *uniterV1Suite) TestClearResolved(c *gc.C) {
    99  	s.testClearResolved(c, s.uniter)
   100  }
   101  
   102  func (s *uniterV1Suite) TestGetPrincipal(c *gc.C) {
   103  	factory := func(
   104  		st *state.State,
   105  		resources *common.Resources,
   106  		authorizer common.Authorizer,
   107  	) (getPrincipal, error) {
   108  		return uniter.NewUniterAPIV1(st, resources, authorizer)
   109  	}
   110  	s.testGetPrincipal(c, s.uniter, factory)
   111  }
   112  
   113  func (s *uniterV1Suite) TestHasSubordinates(c *gc.C) {
   114  	s.testHasSubordinates(c, s.uniter)
   115  }
   116  
   117  func (s *uniterV1Suite) TestDestroy(c *gc.C) {
   118  	s.testDestroy(c, s.uniter)
   119  }
   120  
   121  func (s *uniterV1Suite) TestDestroyAllSubordinates(c *gc.C) {
   122  	s.testDestroyAllSubordinates(c, s.uniter)
   123  }
   124  
   125  func (s *uniterV1Suite) TestCharmURL(c *gc.C) {
   126  	s.testCharmURL(c, s.uniter)
   127  }
   128  
   129  func (s *uniterV1Suite) TestSetCharmURL(c *gc.C) {
   130  	s.testSetCharmURL(c, s.uniter)
   131  }
   132  
   133  func (s *uniterV1Suite) TestOpenPorts(c *gc.C) {
   134  	s.testOpenPorts(c, s.uniter)
   135  }
   136  
   137  func (s *uniterV1Suite) TestClosePorts(c *gc.C) {
   138  	s.testClosePorts(c, s.uniter)
   139  }
   140  
   141  func (s *uniterV1Suite) TestOpenPort(c *gc.C) {
   142  	s.testOpenPort(c, s.uniter)
   143  }
   144  
   145  func (s *uniterV1Suite) TestClosePort(c *gc.C) {
   146  	s.testClosePort(c, s.uniter)
   147  }
   148  
   149  func (s *uniterV1Suite) TestWatchConfigSettings(c *gc.C) {
   150  	s.testWatchConfigSettings(c, s.uniter)
   151  }
   152  
   153  func (s *uniterV1Suite) TestWatchActionNotifications(c *gc.C) {
   154  	s.testWatchActionNotifications(c, s.uniter)
   155  }
   156  
   157  func (s *uniterV1Suite) TestWatchPreexistingActions(c *gc.C) {
   158  	s.testWatchPreexistingActions(c, s.uniter)
   159  }
   160  
   161  func (s *uniterV1Suite) TestWatchActionNotificationsMalformedTag(c *gc.C) {
   162  	s.testWatchActionNotificationsMalformedTag(c, s.uniter)
   163  }
   164  
   165  func (s *uniterV1Suite) TestWatchActionNotificationsMalformedUnitName(c *gc.C) {
   166  	s.testWatchActionNotificationsMalformedUnitName(c, s.uniter)
   167  }
   168  
   169  func (s *uniterV1Suite) TestWatchActionNotificationsNotUnit(c *gc.C) {
   170  	s.testWatchActionNotificationsNotUnit(c, s.uniter)
   171  }
   172  
   173  func (s *uniterV1Suite) TestWatchActionNotificationsPermissionDenied(c *gc.C) {
   174  	s.testWatchActionNotificationsPermissionDenied(c, s.uniter)
   175  }
   176  
   177  func (s *uniterV1Suite) TestConfigSettings(c *gc.C) {
   178  	s.testConfigSettings(c, s.uniter)
   179  }
   180  
   181  func (s *uniterV1Suite) TestWatchServiceRelations(c *gc.C) {
   182  	s.testWatchServiceRelations(c, s.uniter)
   183  }
   184  
   185  func (s *uniterV1Suite) TestCharmArchiveSha256(c *gc.C) {
   186  	s.testCharmArchiveSha256(c, s.uniter)
   187  }
   188  
   189  func (s *uniterV1Suite) TestCharmArchiveURLs(c *gc.C) {
   190  	s.testCharmArchiveURLs(c, s.uniter)
   191  }
   192  
   193  func (s *uniterV1Suite) TestCurrentEnvironUUID(c *gc.C) {
   194  	s.testCurrentEnvironUUID(c, s.uniter)
   195  }
   196  
   197  func (s *uniterV1Suite) TestCurrentEnvironment(c *gc.C) {
   198  	s.testCurrentEnvironment(c, s.uniter)
   199  }
   200  
   201  func (s *uniterV1Suite) TestActions(c *gc.C) {
   202  	s.testActions(c, s.uniter)
   203  }
   204  
   205  func (s *uniterV1Suite) TestActionsNotPresent(c *gc.C) {
   206  	s.testActionsNotPresent(c, s.uniter)
   207  }
   208  
   209  func (s *uniterV1Suite) TestActionsWrongUnit(c *gc.C) {
   210  	factory := func(
   211  		st *state.State,
   212  		resources *common.Resources,
   213  		authorizer common.Authorizer,
   214  	) (actions, error) {
   215  		return uniter.NewUniterAPIV1(st, resources, authorizer)
   216  	}
   217  	s.testActionsWrongUnit(c, factory)
   218  }
   219  
   220  func (s *uniterV1Suite) TestActionsPermissionDenied(c *gc.C) {
   221  	s.testActionsPermissionDenied(c, s.uniter)
   222  }
   223  
   224  func (s *uniterV1Suite) TestFinishActionsSuccess(c *gc.C) {
   225  	s.testFinishActionsSuccess(c, s.uniter)
   226  }
   227  
   228  func (s *uniterV1Suite) TestFinishActionsFailure(c *gc.C) {
   229  	s.testFinishActionsFailure(c, s.uniter)
   230  }
   231  
   232  func (s *uniterV1Suite) TestFinishActionsAuthAccess(c *gc.C) {
   233  	s.testFinishActionsAuthAccess(c, s.uniter)
   234  }
   235  
   236  func (s *uniterV1Suite) TestBeginActions(c *gc.C) {
   237  	s.testBeginActions(c, s.uniter)
   238  }
   239  
   240  func (s *uniterV1Suite) TestRelation(c *gc.C) {
   241  	s.testRelation(c, s.uniter)
   242  }
   243  
   244  func (s *uniterV1Suite) TestRelationById(c *gc.C) {
   245  	s.testRelationById(c, s.uniter)
   246  }
   247  
   248  func (s *uniterV1Suite) TestProviderType(c *gc.C) {
   249  	s.testProviderType(c, s.uniter)
   250  }
   251  
   252  func (s *uniterV1Suite) TestEnterScope(c *gc.C) {
   253  	s.testEnterScope(c, s.uniter)
   254  }
   255  
   256  func (s *uniterV1Suite) TestLeaveScope(c *gc.C) {
   257  	s.testLeaveScope(c, s.uniter)
   258  }
   259  
   260  func (s *uniterV1Suite) TestJoinedRelations(c *gc.C) {
   261  	s.testJoinedRelations(c, s.uniter)
   262  }
   263  
   264  func (s *uniterV1Suite) TestReadSettings(c *gc.C) {
   265  	s.testReadSettings(c, s.uniter)
   266  }
   267  
   268  func (s *uniterV1Suite) TestReadSettingsWithNonStringValuesFails(c *gc.C) {
   269  	s.testReadSettingsWithNonStringValuesFails(c, s.uniter)
   270  }
   271  
   272  func (s *uniterV1Suite) TestReadRemoteSettings(c *gc.C) {
   273  	s.testReadRemoteSettings(c, s.uniter)
   274  }
   275  
   276  func (s *uniterV1Suite) TestReadRemoteSettingsWithNonStringValuesFails(c *gc.C) {
   277  	s.testReadRemoteSettingsWithNonStringValuesFails(c, s.uniter)
   278  }
   279  
   280  func (s *uniterV1Suite) TestUpdateSettings(c *gc.C) {
   281  	s.testUpdateSettings(c, s.uniter)
   282  }
   283  
   284  func (s *uniterV1Suite) TestWatchRelationUnits(c *gc.C) {
   285  	s.testWatchRelationUnits(c, s.uniter)
   286  }
   287  
   288  func (s *uniterV1Suite) TestAPIAddresses(c *gc.C) {
   289  	s.testAPIAddresses(c, s.uniter)
   290  }
   291  
   292  func (s *uniterV1Suite) TestWatchUnitAddresses(c *gc.C) {
   293  	s.testWatchUnitAddresses(c, s.uniter)
   294  }
   295  
   296  func (s *uniterV1Suite) TestGetMeterStatus(c *gc.C) {
   297  	meterstatustesting.TestGetMeterStatus(c, s.uniter, s.wordpressUnit)
   298  }
   299  
   300  func (s *uniterV1Suite) TestGetMeterStatusUnauthenticated(c *gc.C) {
   301  	s.testGetMeterStatusUnauthenticated(c, s.uniter)
   302  }
   303  
   304  func (s *uniterV1Suite) TestGetMeterStatusBadTag(c *gc.C) {
   305  	s.testGetMeterStatusBadTag(c, s.uniter)
   306  }
   307  
   308  func (s *uniterV1Suite) TestWatchMeterStatus(c *gc.C) {
   309  	meterstatustesting.TestWatchMeterStatus(c, s.uniter, s.wordpressUnit, s.State, s.resources)
   310  }
   311  
   312  func (s *uniterV1Suite) TestGetOwnerTagV1NotImplemented(c *gc.C) {
   313  	apiservertesting.AssertNotImplemented(c, s.uniter, "GetOwnerTag")
   314  }
   315  
   316  func (s *uniterV1Suite) TestServiceOwner(c *gc.C) {
   317  	args := params.Entities{Entities: []params.Entity{
   318  		{Tag: "unit-mysql-0"},
   319  		{Tag: "service-wordpress"},
   320  		{Tag: "unit-wordpress-0"},
   321  		{Tag: "unit-foo-42"},
   322  		{Tag: "machine-0"},
   323  		{Tag: "service-foo"},
   324  	}}
   325  	result, err := s.uniter.ServiceOwner(args)
   326  	c.Assert(err, jc.ErrorIsNil)
   327  	c.Assert(result, jc.DeepEquals, params.StringResults{
   328  		Results: []params.StringResult{
   329  			{Error: apiservertesting.ErrUnauthorized},
   330  			{Result: s.AdminUserTag(c).String()},
   331  			{Error: apiservertesting.ErrUnauthorized},
   332  			{Error: apiservertesting.ErrUnauthorized},
   333  			{Error: apiservertesting.ErrUnauthorized},
   334  			{Error: apiservertesting.ErrUnauthorized},
   335  		},
   336  	})
   337  }
   338  
   339  func (s *uniterV1Suite) TestAssignedMachine(c *gc.C) {
   340  	args := params.Entities{Entities: []params.Entity{
   341  		{Tag: "unit-mysql-0"},
   342  		{Tag: "unit-wordpress-0"},
   343  		{Tag: "unit-foo-42"},
   344  		{Tag: "service-mysql"},
   345  		{Tag: "service-wordpress"},
   346  		{Tag: "machine-0"},
   347  		{Tag: "machine-1"},
   348  		{Tag: "machine-42"},
   349  		{Tag: "service-foo"},
   350  		{Tag: "relation-svc1.rel1#svc2.rel2"},
   351  	}}
   352  	result, err := s.uniter.AssignedMachine(args)
   353  	c.Assert(err, jc.ErrorIsNil)
   354  	c.Assert(result, jc.DeepEquals, params.StringResults{
   355  		Results: []params.StringResult{
   356  			{Error: apiservertesting.ErrUnauthorized},
   357  			{Result: "machine-0"},
   358  			{Error: apiservertesting.ErrUnauthorized},
   359  			{Error: apiservertesting.ErrUnauthorized},
   360  			{Error: apiservertesting.ErrUnauthorized},
   361  			{Error: apiservertesting.ErrUnauthorized},
   362  			{Error: apiservertesting.ErrUnauthorized},
   363  			{Error: apiservertesting.ErrUnauthorized},
   364  			{Error: apiservertesting.ErrUnauthorized},
   365  			{Error: apiservertesting.ErrUnauthorized},
   366  		},
   367  	})
   368  }
   369  
   370  func (s *uniterV1Suite) TestAllMachinePorts(c *gc.C) {
   371  	// Verify no ports are opened yet on the machine or unit.
   372  	machinePorts, err := s.machine0.AllPorts()
   373  	c.Assert(err, jc.ErrorIsNil)
   374  	c.Assert(machinePorts, gc.HasLen, 0)
   375  	unitPorts, err := s.wordpressUnit.OpenedPorts()
   376  	c.Assert(err, jc.ErrorIsNil)
   377  	c.Assert(unitPorts, gc.HasLen, 0)
   378  
   379  	// Add another mysql unit on machine 0.
   380  	mysqlUnit1, err := s.mysql.AddUnit()
   381  	c.Assert(err, jc.ErrorIsNil)
   382  	err = mysqlUnit1.AssignToMachine(s.machine0)
   383  	c.Assert(err, jc.ErrorIsNil)
   384  
   385  	// Open some ports on both units.
   386  	err = s.wordpressUnit.OpenPorts("tcp", 100, 200)
   387  	c.Assert(err, jc.ErrorIsNil)
   388  	err = s.wordpressUnit.OpenPorts("udp", 10, 20)
   389  	c.Assert(err, jc.ErrorIsNil)
   390  	err = mysqlUnit1.OpenPorts("tcp", 201, 250)
   391  	c.Assert(err, jc.ErrorIsNil)
   392  	err = mysqlUnit1.OpenPorts("udp", 1, 8)
   393  	c.Assert(err, jc.ErrorIsNil)
   394  
   395  	args := params.Entities{Entities: []params.Entity{
   396  		{Tag: "unit-mysql-0"},
   397  		{Tag: "machine-0"},
   398  		{Tag: "machine-1"},
   399  		{Tag: "unit-foo-42"},
   400  		{Tag: "machine-42"},
   401  		{Tag: "service-wordpress"},
   402  	}}
   403  	expectPorts := []params.MachinePortRange{
   404  		{UnitTag: "unit-wordpress-0", PortRange: params.PortRange{100, 200, "tcp"}},
   405  		{UnitTag: "unit-mysql-1", PortRange: params.PortRange{201, 250, "tcp"}},
   406  		{UnitTag: "unit-mysql-1", PortRange: params.PortRange{1, 8, "udp"}},
   407  		{UnitTag: "unit-wordpress-0", PortRange: params.PortRange{10, 20, "udp"}},
   408  	}
   409  	result, err := s.uniter.AllMachinePorts(args)
   410  	c.Assert(err, jc.ErrorIsNil)
   411  	c.Assert(result, gc.DeepEquals, params.MachinePortsResults{
   412  		Results: []params.MachinePortsResult{
   413  			{Error: apiservertesting.ErrUnauthorized},
   414  			{Ports: expectPorts},
   415  			{Error: apiservertesting.ErrUnauthorized},
   416  			{Error: apiservertesting.ErrUnauthorized},
   417  			{Error: apiservertesting.ErrUnauthorized},
   418  			{Error: apiservertesting.ErrUnauthorized},
   419  		},
   420  	})
   421  }
   422  
   423  func (s *uniterV1Suite) TestRequestReboot(c *gc.C) {
   424  	args := params.Entities{Entities: []params.Entity{
   425  		{Tag: s.machine0.Tag().String()},
   426  		{Tag: s.machine1.Tag().String()},
   427  		{Tag: "bogus"},
   428  		{Tag: "nasty-tag"},
   429  	}}
   430  	errResult, err := s.uniter.RequestReboot(args)
   431  	c.Assert(err, jc.ErrorIsNil)
   432  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   433  		Results: []params.ErrorResult{
   434  			{Error: nil},
   435  			{Error: apiservertesting.ErrUnauthorized},
   436  			{Error: apiservertesting.ErrUnauthorized},
   437  			{Error: apiservertesting.ErrUnauthorized},
   438  		}})
   439  
   440  	rFlag, err := s.machine0.GetRebootFlag()
   441  	c.Assert(err, jc.ErrorIsNil)
   442  	c.Assert(rFlag, jc.IsTrue)
   443  
   444  	rFlag, err = s.machine1.GetRebootFlag()
   445  	c.Assert(err, jc.ErrorIsNil)
   446  	c.Assert(rFlag, jc.IsFalse)
   447  }