github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/apiserver/metricsmanager/metricsmanager_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package metricsmanager_test 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 "github.com/juju/names" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/apiserver/common" 15 "github.com/juju/juju/apiserver/metricsender" 16 "github.com/juju/juju/apiserver/metricsmanager" 17 "github.com/juju/juju/apiserver/params" 18 apiservertesting "github.com/juju/juju/apiserver/testing" 19 jujutesting "github.com/juju/juju/juju/testing" 20 "github.com/juju/juju/state" 21 "github.com/juju/juju/testing/factory" 22 ) 23 24 type metricsManagerSuite struct { 25 jujutesting.JujuConnSuite 26 27 metricsmanager *metricsmanager.MetricsManagerAPI 28 authorizer apiservertesting.FakeAuthorizer 29 unit *state.Unit 30 } 31 32 var _ = gc.Suite(&metricsManagerSuite{}) 33 34 func (s *metricsManagerSuite) SetUpTest(c *gc.C) { 35 s.JujuConnSuite.SetUpTest(c) 36 s.authorizer = apiservertesting.FakeAuthorizer{ 37 Tag: names.NewMachineTag("0"), 38 EnvironManager: true, 39 } 40 manager, err := metricsmanager.NewMetricsManagerAPI(s.State, nil, s.authorizer) 41 c.Assert(err, jc.ErrorIsNil) 42 s.metricsmanager = manager 43 meteredCharm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "metered", URL: "cs:quantal/metered"}) 44 meteredService := s.Factory.MakeService(c, &factory.ServiceParams{Charm: meteredCharm}) 45 s.unit = s.Factory.MakeUnit(c, &factory.UnitParams{Service: meteredService, SetCharmURL: true}) 46 } 47 48 func (s *metricsManagerSuite) TestNewMetricsManagerAPIRefusesNonMachine(c *gc.C) { 49 tests := []struct { 50 tag names.Tag 51 environManager bool 52 expectedError string 53 }{ 54 {names.NewUnitTag("mysql/0"), true, "permission denied"}, 55 {names.NewLocalUserTag("admin"), true, "permission denied"}, 56 {names.NewMachineTag("0"), false, "permission denied"}, 57 {names.NewMachineTag("0"), true, ""}, 58 } 59 for i, test := range tests { 60 c.Logf("test %d", i) 61 62 anAuthoriser := s.authorizer 63 anAuthoriser.EnvironManager = test.environManager 64 anAuthoriser.Tag = test.tag 65 endPoint, err := metricsmanager.NewMetricsManagerAPI(s.State, nil, anAuthoriser) 66 if test.expectedError == "" { 67 c.Assert(err, jc.ErrorIsNil) 68 c.Assert(endPoint, gc.NotNil) 69 } else { 70 c.Assert(err, gc.ErrorMatches, test.expectedError) 71 c.Assert(endPoint, gc.IsNil) 72 } 73 } 74 } 75 76 func (s *metricsManagerSuite) TestCleanupOldMetrics(c *gc.C) { 77 oldTime := time.Now().Add(-(time.Hour * 25)) 78 newTime := time.Now() 79 metric := state.Metric{"pings", "5", newTime} 80 oldMetric := s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Sent: true, Time: &oldTime, Metrics: []state.Metric{metric}}) 81 newMetric := s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Sent: true, Time: &newTime, Metrics: []state.Metric{metric}}) 82 args := params.Entities{Entities: []params.Entity{ 83 {s.State.EnvironTag().String()}, 84 }} 85 result, err := s.metricsmanager.CleanupOldMetrics(args) 86 c.Assert(err, jc.ErrorIsNil) 87 c.Assert(result.Results, gc.HasLen, 1) 88 c.Assert(result.Results[0], gc.DeepEquals, params.ErrorResult{Error: nil}) 89 _, err = s.State.MetricBatch(oldMetric.UUID()) 90 c.Assert(err, jc.Satisfies, errors.IsNotFound) 91 _, err = s.State.MetricBatch(newMetric.UUID()) 92 c.Assert(err, jc.ErrorIsNil) 93 } 94 95 func (s *metricsManagerSuite) TestCleanupOldMetricsInvalidArg(c *gc.C) { 96 args := params.Entities{Entities: []params.Entity{ 97 {"invalid"}, 98 }} 99 result, err := s.metricsmanager.CleanupOldMetrics(args) 100 c.Assert(result.Results, gc.HasLen, 1) 101 c.Assert(err, jc.ErrorIsNil) 102 expectedError := common.ServerError(common.ErrPerm) 103 c.Assert(result.Results[0], gc.DeepEquals, params.ErrorResult{Error: expectedError}) 104 } 105 106 func (s *metricsManagerSuite) TestCleanupArgsIndependent(c *gc.C) { 107 args := params.Entities{Entities: []params.Entity{ 108 {"invalid"}, 109 {s.State.EnvironTag().String()}, 110 }} 111 result, err := s.metricsmanager.CleanupOldMetrics(args) 112 c.Assert(result.Results, gc.HasLen, 2) 113 c.Assert(err, jc.ErrorIsNil) 114 expectedError := common.ServerError(common.ErrPerm) 115 c.Assert(result.Results[0], gc.DeepEquals, params.ErrorResult{Error: expectedError}) 116 c.Assert(result.Results[1], gc.DeepEquals, params.ErrorResult{Error: nil}) 117 } 118 119 func (s *metricsManagerSuite) TestSendMetrics(c *gc.C) { 120 var sender metricsender.MockSender 121 metricsmanager.PatchSender(&sender) 122 now := time.Now() 123 metric := state.Metric{"pings", "5", now} 124 s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Sent: true, Time: &now, Metrics: []state.Metric{metric}}) 125 unsent := s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Sent: false, Time: &now, Metrics: []state.Metric{metric}}) 126 args := params.Entities{Entities: []params.Entity{ 127 {s.State.EnvironTag().String()}, 128 }} 129 result, err := s.metricsmanager.SendMetrics(args) 130 c.Assert(err, jc.ErrorIsNil) 131 c.Assert(result.Results, gc.HasLen, 1) 132 c.Assert(result.Results[0], gc.DeepEquals, params.ErrorResult{Error: nil}) 133 c.Assert(sender.Data, gc.HasLen, 1) 134 m, err := s.State.MetricBatch(unsent.UUID()) 135 c.Assert(err, jc.ErrorIsNil) 136 c.Assert(m.Sent(), jc.IsTrue) 137 } 138 139 func (s *metricsManagerSuite) TestSendOldMetricsInvalidArg(c *gc.C) { 140 args := params.Entities{Entities: []params.Entity{ 141 {"invalid"}, 142 }} 143 result, err := s.metricsmanager.SendMetrics(args) 144 c.Assert(result.Results, gc.HasLen, 1) 145 c.Assert(err, jc.ErrorIsNil) 146 expectedError := common.ServerError(common.ErrPerm) 147 c.Assert(result.Results[0], gc.DeepEquals, params.ErrorResult{Error: expectedError}) 148 } 149 150 func (s *metricsManagerSuite) TestSendArgsIndependent(c *gc.C) { 151 args := params.Entities{Entities: []params.Entity{ 152 {"invalid"}, 153 {s.State.EnvironTag().String()}, 154 }} 155 result, err := s.metricsmanager.SendMetrics(args) 156 c.Assert(result.Results, gc.HasLen, 2) 157 c.Assert(err, jc.ErrorIsNil) 158 expectedError := common.ServerError(common.ErrPerm) 159 c.Assert(result.Results[0], gc.DeepEquals, params.ErrorResult{Error: expectedError}) 160 c.Assert(result.Results[1], gc.DeepEquals, params.ErrorResult{Error: nil}) 161 }