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