github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/metricsadder/metricsadder_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package metricsadder_test 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 jc "github.com/juju/testing/checkers" 11 "github.com/juju/utils" 12 gc "gopkg.in/check.v1" 13 "gopkg.in/juju/names.v2" 14 15 "github.com/juju/juju/apiserver/common" 16 "github.com/juju/juju/apiserver/metricsadder" 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 jujuFactory "github.com/juju/juju/testing/factory" 22 ) 23 24 var _ = gc.Suite(&metricsAdderSuite{}) 25 26 type metricsAdderSuite struct { 27 jujutesting.JujuConnSuite 28 29 authorizer apiservertesting.FakeAuthorizer 30 resources *common.Resources 31 32 factory *jujuFactory.Factory 33 34 machine0 *state.Machine 35 machine1 *state.Machine 36 mysqlService *state.Application 37 mysql *state.Application 38 mysqlUnit *state.Unit 39 meteredService *state.Application 40 meteredCharm *state.Charm 41 meteredUnit *state.Unit 42 43 adder metricsadder.MetricsAdder 44 } 45 46 func (s *metricsAdderSuite) SetUpTest(c *gc.C) { 47 s.JujuConnSuite.SetUpTest(c) 48 49 s.factory = jujuFactory.NewFactory(s.State) 50 s.machine0 = s.factory.MakeMachine(c, &jujuFactory.MachineParams{ 51 Series: "quantal", 52 Jobs: []state.MachineJob{state.JobHostUnits, state.JobManageModel}, 53 }) 54 s.machine1 = s.factory.MakeMachine(c, &jujuFactory.MachineParams{ 55 Series: "quantal", 56 Jobs: []state.MachineJob{state.JobHostUnits}, 57 }) 58 mysqlCharm := s.factory.MakeCharm(c, &jujuFactory.CharmParams{ 59 Name: "mysql", 60 }) 61 s.mysql = s.factory.MakeApplication(c, &jujuFactory.ApplicationParams{ 62 Name: "mysql", 63 Charm: mysqlCharm, 64 }) 65 s.mysqlUnit = s.factory.MakeUnit(c, &jujuFactory.UnitParams{ 66 Application: s.mysql, 67 Machine: s.machine0, 68 }) 69 70 s.meteredCharm = s.factory.MakeCharm(c, &jujuFactory.CharmParams{ 71 Name: "metered", 72 URL: "cs:quantal/metered", 73 }) 74 s.meteredService = s.factory.MakeApplication(c, &jujuFactory.ApplicationParams{ 75 Charm: s.meteredCharm, 76 }) 77 s.meteredUnit = s.factory.MakeUnit(c, &jujuFactory.UnitParams{ 78 Application: s.meteredService, 79 SetCharmURL: true, 80 Machine: s.machine1, 81 }) 82 83 // Create a FakeAuthorizer so we can check permissions, 84 // set up assuming unit 0 has logged in. 85 s.authorizer = apiservertesting.FakeAuthorizer{ 86 Tag: names.NewMachineTag("1"), 87 } 88 89 // Create the resource registry separately to track invocations to 90 // Register. 91 s.resources = common.NewResources() 92 s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() }) 93 94 adder, err := metricsadder.NewMetricsAdderAPI(s.State, s.resources, s.authorizer) 95 c.Assert(err, jc.ErrorIsNil) 96 s.adder = adder 97 } 98 99 func (s *metricsAdderSuite) TestAddMetricsBatch(c *gc.C) { 100 metrics := []params.Metric{{Key: "pings", Value: "5", Time: time.Now().UTC()}} 101 uuid := utils.MustNewUUID().String() 102 103 result, err := s.adder.AddMetricBatches(params.MetricBatchParams{ 104 Batches: []params.MetricBatchParam{{ 105 Tag: s.meteredUnit.Tag().String(), 106 Batch: params.MetricBatch{ 107 UUID: uuid, 108 CharmURL: s.meteredCharm.URL().String(), 109 Created: time.Now(), 110 Metrics: metrics, 111 }}}}, 112 ) 113 c.Assert(err, jc.ErrorIsNil) 114 c.Assert(result, gc.DeepEquals, params.ErrorResults{ 115 Results: []params.ErrorResult{{nil}}, 116 }) 117 118 batches, err := s.State.AllMetricBatches() 119 c.Assert(err, jc.ErrorIsNil) 120 c.Assert(batches, gc.HasLen, 1) 121 batch := batches[0] 122 c.Assert(batch.UUID(), gc.Equals, uuid) 123 c.Assert(batch.CharmURL(), gc.Equals, s.meteredCharm.URL().String()) 124 c.Assert(batch.Unit(), gc.Equals, s.meteredUnit.Name()) 125 storedMetrics := batch.Metrics() 126 c.Assert(storedMetrics, gc.HasLen, 1) 127 c.Assert(storedMetrics[0].Key, gc.Equals, metrics[0].Key) 128 c.Assert(storedMetrics[0].Value, gc.Equals, metrics[0].Value) 129 } 130 131 func (s *metricsAdderSuite) TestAddMetricsBatchNoCharmURL(c *gc.C) { 132 metrics := []params.Metric{{Key: "pings", Value: "5", Time: time.Now().UTC()}} 133 uuid := utils.MustNewUUID().String() 134 135 result, err := s.adder.AddMetricBatches(params.MetricBatchParams{ 136 Batches: []params.MetricBatchParam{{ 137 Tag: s.meteredUnit.Tag().String(), 138 Batch: params.MetricBatch{ 139 UUID: uuid, 140 CharmURL: s.meteredCharm.URL().String(), 141 Created: time.Now(), 142 Metrics: metrics, 143 }}}}) 144 c.Assert(err, jc.ErrorIsNil) 145 c.Assert(result, gc.DeepEquals, params.ErrorResults{ 146 Results: []params.ErrorResult{{nil}}, 147 }) 148 149 batches, err := s.State.AllMetricBatches() 150 c.Assert(err, jc.ErrorIsNil) 151 c.Assert(batches, gc.HasLen, 1) 152 batch := batches[0] 153 c.Assert(batch.UUID(), gc.Equals, uuid) 154 c.Assert(batch.CharmURL(), gc.Equals, s.meteredCharm.URL().String()) 155 c.Assert(batch.Unit(), gc.Equals, s.meteredUnit.Name()) 156 storedMetrics := batch.Metrics() 157 c.Assert(storedMetrics, gc.HasLen, 1) 158 c.Assert(storedMetrics[0].Key, gc.Equals, metrics[0].Key) 159 c.Assert(storedMetrics[0].Value, gc.Equals, metrics[0].Value) 160 } 161 162 func (s *metricsAdderSuite) TestAddMetricsBatchDiffTag(c *gc.C) { 163 metrics := []params.Metric{{Key: "pings", Value: "5", Time: time.Now().UTC()}} 164 uuid := utils.MustNewUUID().String() 165 166 tests := []struct { 167 about string 168 tag string 169 expect string 170 }{{ 171 about: "unknown unit", 172 tag: names.NewUnitTag("unknownservice/11").String(), 173 expect: "unit \"unknownservice/11\" not found", 174 }, { 175 about: "user tag", 176 tag: names.NewLocalUserTag("admin").String(), 177 expect: `"user-admin@local" is not a valid unit tag`, 178 }, { 179 about: "machine tag", 180 tag: names.NewMachineTag("0").String(), 181 expect: `"machine-0" is not a valid unit tag`, 182 }} 183 184 for i, test := range tests { 185 c.Logf("test %d: %s -> %s", i, test.about, test.tag) 186 result, err := s.adder.AddMetricBatches(params.MetricBatchParams{ 187 Batches: []params.MetricBatchParam{{ 188 Tag: test.tag, 189 Batch: params.MetricBatch{ 190 UUID: uuid, 191 CharmURL: s.meteredCharm.URL().String(), 192 Created: time.Now(), 193 Metrics: metrics, 194 }}}}) 195 c.Assert(err, jc.ErrorIsNil) 196 if test.expect == "" { 197 c.Assert(result.OneError(), jc.ErrorIsNil) 198 } else { 199 c.Assert(result.OneError(), gc.ErrorMatches, test.expect) 200 } 201 202 batches, err := s.State.AllMetricBatches() 203 c.Assert(err, jc.ErrorIsNil) 204 c.Assert(batches, gc.HasLen, 0) 205 206 _, err = s.State.MetricBatch(uuid) 207 c.Assert(err, jc.Satisfies, errors.IsNotFound) 208 } 209 } 210 211 func (s *metricsAdderSuite) TestNewMetricsAdderAPIRefusesNonAgent(c *gc.C) { 212 tests := []struct { 213 tag names.Tag 214 environManager bool 215 expectedError string 216 }{ 217 // TODO(cmars): unit agent should get permission denied when callers are 218 // moved to machine agent. 219 {names.NewUnitTag("mysql/0"), false, ""}, 220 221 {names.NewLocalUserTag("admin"), true, "permission denied"}, 222 {names.NewMachineTag("0"), false, ""}, 223 {names.NewMachineTag("0"), true, ""}, 224 } 225 for i, test := range tests { 226 c.Logf("test %d", i) 227 228 anAuthoriser := s.authorizer 229 anAuthoriser.EnvironManager = test.environManager 230 anAuthoriser.Tag = test.tag 231 endPoint, err := metricsadder.NewMetricsAdderAPI(s.State, nil, anAuthoriser) 232 if test.expectedError == "" { 233 c.Assert(err, jc.ErrorIsNil) 234 c.Assert(endPoint, gc.NotNil) 235 } else { 236 c.Assert(err, gc.ErrorMatches, test.expectedError) 237 c.Assert(endPoint, gc.IsNil) 238 } 239 } 240 }