github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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/network"
    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) TestAddMetrics(c *gc.C) {
   297  	s.testAddMetrics(c, s.meteredUniter)
   298  }
   299  
   300  func (s *uniterV1Suite) TestAddMetricsIncorrectTag(c *gc.C) {
   301  	s.testAddMetricsIncorrectTag(c, s.uniter)
   302  }
   303  
   304  func (s *uniterV1Suite) TestAddMetricsUnauthenticated(c *gc.C) {
   305  	s.testAddMetricsUnauthenticated(c, s.uniter)
   306  }
   307  
   308  func (s *uniterV1Suite) TestGetMeterStatus(c *gc.C) {
   309  	s.testGetMeterStatus(c, s.uniter)
   310  }
   311  
   312  func (s *uniterV1Suite) TestGetMeterStatusUnauthenticated(c *gc.C) {
   313  	s.testGetMeterStatusUnauthenticated(c, s.uniter)
   314  }
   315  
   316  func (s *uniterV1Suite) TestGetMeterStatusBadTag(c *gc.C) {
   317  	s.testGetMeterStatusBadTag(c, s.uniter)
   318  }
   319  
   320  func (s *uniterV1Suite) TestWatchMeterStatus(c *gc.C) {
   321  	s.testWatchMeterStatus(c, s.uniter)
   322  }
   323  
   324  func (s *uniterV1Suite) TestGetOwnerTagV1NotImplemented(c *gc.C) {
   325  	apiservertesting.AssertNotImplemented(c, s.uniter, "GetOwnerTag")
   326  }
   327  
   328  func (s *uniterV1Suite) TestServiceOwner(c *gc.C) {
   329  	args := params.Entities{Entities: []params.Entity{
   330  		{Tag: "unit-mysql-0"},
   331  		{Tag: "service-wordpress"},
   332  		{Tag: "unit-wordpress-0"},
   333  		{Tag: "unit-foo-42"},
   334  		{Tag: "machine-0"},
   335  		{Tag: "service-foo"},
   336  	}}
   337  	result, err := s.uniter.ServiceOwner(args)
   338  	c.Assert(err, jc.ErrorIsNil)
   339  	c.Assert(result, jc.DeepEquals, params.StringResults{
   340  		Results: []params.StringResult{
   341  			{Error: apiservertesting.ErrUnauthorized},
   342  			{Result: s.AdminUserTag(c).String()},
   343  			{Error: apiservertesting.ErrUnauthorized},
   344  			{Error: apiservertesting.ErrUnauthorized},
   345  			{Error: apiservertesting.ErrUnauthorized},
   346  			{Error: apiservertesting.ErrUnauthorized},
   347  		},
   348  	})
   349  }
   350  
   351  func (s *uniterV1Suite) TestAssignedMachine(c *gc.C) {
   352  	args := params.Entities{Entities: []params.Entity{
   353  		{Tag: "unit-mysql-0"},
   354  		{Tag: "unit-wordpress-0"},
   355  		{Tag: "unit-foo-42"},
   356  		{Tag: "service-mysql"},
   357  		{Tag: "service-wordpress"},
   358  		{Tag: "machine-0"},
   359  		{Tag: "machine-1"},
   360  		{Tag: "machine-42"},
   361  		{Tag: "service-foo"},
   362  		{Tag: "relation-svc1.rel1#svc2.rel2"},
   363  	}}
   364  	result, err := s.uniter.AssignedMachine(args)
   365  	c.Assert(err, jc.ErrorIsNil)
   366  	c.Assert(result, jc.DeepEquals, params.StringResults{
   367  		Results: []params.StringResult{
   368  			{Error: apiservertesting.ErrUnauthorized},
   369  			{Result: "machine-0"},
   370  			{Error: apiservertesting.ErrUnauthorized},
   371  			{Error: apiservertesting.ErrUnauthorized},
   372  			{Error: apiservertesting.ErrUnauthorized},
   373  			{Error: apiservertesting.ErrUnauthorized},
   374  			{Error: apiservertesting.ErrUnauthorized},
   375  			{Error: apiservertesting.ErrUnauthorized},
   376  			{Error: apiservertesting.ErrUnauthorized},
   377  			{Error: apiservertesting.ErrUnauthorized},
   378  		},
   379  	})
   380  }
   381  
   382  func (s *uniterV1Suite) TestAllMachinePorts(c *gc.C) {
   383  	// Verify no ports are opened yet on the machine or unit.
   384  	machinePorts, err := s.machine0.AllPorts()
   385  	c.Assert(err, jc.ErrorIsNil)
   386  	c.Assert(machinePorts, gc.HasLen, 0)
   387  	unitPorts, err := s.wordpressUnit.OpenedPorts()
   388  	c.Assert(err, jc.ErrorIsNil)
   389  	c.Assert(unitPorts, gc.HasLen, 0)
   390  
   391  	// Add another mysql unit on machine 0.
   392  	mysqlUnit1, err := s.mysql.AddUnit()
   393  	c.Assert(err, jc.ErrorIsNil)
   394  	err = mysqlUnit1.AssignToMachine(s.machine0)
   395  	c.Assert(err, jc.ErrorIsNil)
   396  
   397  	// Open some ports on both units.
   398  	err = s.wordpressUnit.OpenPorts("tcp", 100, 200)
   399  	c.Assert(err, jc.ErrorIsNil)
   400  	err = s.wordpressUnit.OpenPorts("udp", 10, 20)
   401  	c.Assert(err, jc.ErrorIsNil)
   402  	err = mysqlUnit1.OpenPorts("tcp", 201, 250)
   403  	c.Assert(err, jc.ErrorIsNil)
   404  	err = mysqlUnit1.OpenPorts("udp", 1, 8)
   405  	c.Assert(err, jc.ErrorIsNil)
   406  
   407  	args := params.Entities{Entities: []params.Entity{
   408  		{Tag: "unit-mysql-0"},
   409  		{Tag: "machine-0"},
   410  		{Tag: "machine-1"},
   411  		{Tag: "unit-foo-42"},
   412  		{Tag: "machine-42"},
   413  		{Tag: "service-wordpress"},
   414  	}}
   415  	expectPorts := []params.MachinePortRange{
   416  		{UnitTag: "unit-wordpress-0", PortRange: network.PortRange{100, 200, "tcp"}},
   417  		{UnitTag: "unit-mysql-1", PortRange: network.PortRange{201, 250, "tcp"}},
   418  		{UnitTag: "unit-mysql-1", PortRange: network.PortRange{1, 8, "udp"}},
   419  		{UnitTag: "unit-wordpress-0", PortRange: network.PortRange{10, 20, "udp"}},
   420  	}
   421  	result, err := s.uniter.AllMachinePorts(args)
   422  	c.Assert(err, jc.ErrorIsNil)
   423  	c.Assert(result, gc.DeepEquals, params.MachinePortsResults{
   424  		Results: []params.MachinePortsResult{
   425  			{Error: apiservertesting.ErrUnauthorized},
   426  			{Ports: expectPorts},
   427  			{Error: apiservertesting.ErrUnauthorized},
   428  			{Error: apiservertesting.ErrUnauthorized},
   429  			{Error: apiservertesting.ErrUnauthorized},
   430  			{Error: apiservertesting.ErrUnauthorized},
   431  		},
   432  	})
   433  }
   434  
   435  func (s *uniterV1Suite) TestRequestReboot(c *gc.C) {
   436  	args := params.Entities{Entities: []params.Entity{
   437  		{Tag: s.machine0.Tag().String()},
   438  		{Tag: s.machine1.Tag().String()},
   439  		{Tag: "bogus"},
   440  		{Tag: "nasty-tag"},
   441  	}}
   442  	errResult, err := s.uniter.RequestReboot(args)
   443  	c.Assert(err, jc.ErrorIsNil)
   444  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   445  		Results: []params.ErrorResult{
   446  			{Error: nil},
   447  			{Error: apiservertesting.ErrUnauthorized},
   448  			{Error: apiservertesting.ErrUnauthorized},
   449  			{Error: apiservertesting.ErrUnauthorized},
   450  		}})
   451  
   452  	rFlag, err := s.machine0.GetRebootFlag()
   453  	c.Assert(err, jc.ErrorIsNil)
   454  	c.Assert(rFlag, jc.IsTrue)
   455  
   456  	rFlag, err = s.machine1.GetRebootFlag()
   457  	c.Assert(err, jc.ErrorIsNil)
   458  	c.Assert(rFlag, jc.IsFalse)
   459  }