github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/metricsdebug/metricsdebug_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package metricsdebug_test 5 6 import ( 7 "time" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/apiserver/metricsdebug" 13 "github.com/juju/juju/apiserver/params" 14 apiservertesting "github.com/juju/juju/apiserver/testing" 15 jujutesting "github.com/juju/juju/juju/testing" 16 "github.com/juju/juju/state" 17 "github.com/juju/juju/testing/factory" 18 ) 19 20 type metricsDebugSuite struct { 21 jujutesting.JujuConnSuite 22 23 metricsdebug *metricsdebug.MetricsDebugAPI 24 authorizer apiservertesting.FakeAuthorizer 25 unit *state.Unit 26 } 27 28 var _ = gc.Suite(&metricsDebugSuite{}) 29 30 func (s *metricsDebugSuite) SetUpTest(c *gc.C) { 31 s.JujuConnSuite.SetUpTest(c) 32 s.authorizer = apiservertesting.FakeAuthorizer{ 33 Tag: s.AdminUserTag(c), 34 } 35 debug, err := metricsdebug.NewMetricsDebugAPI(s.State, nil, s.authorizer) 36 c.Assert(err, jc.ErrorIsNil) 37 s.metricsdebug = debug 38 } 39 40 func (s *metricsDebugSuite) TestSetMeterStatus(c *gc.C) { 41 testCharm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "metered", URL: "local:quantal/metered"}) 42 testService := s.Factory.MakeService(c, &factory.ServiceParams{Charm: testCharm}) 43 testUnit1 := s.Factory.MakeUnit(c, &factory.UnitParams{Service: testService, SetCharmURL: true}) 44 testUnit2 := s.Factory.MakeUnit(c, &factory.UnitParams{Service: testService, SetCharmURL: true}) 45 46 csCharm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "metered", URL: "cs:quantal/metered"}) 47 csService := s.Factory.MakeService(c, &factory.ServiceParams{Name: "cs-service", Charm: csCharm}) 48 csUnit1 := s.Factory.MakeUnit(c, &factory.UnitParams{Service: csService, SetCharmURL: true}) 49 50 tests := []struct { 51 about string 52 params params.MeterStatusParams 53 err string 54 assert func(*gc.C, params.ErrorResults) 55 }{{ 56 about: "set service meter status", 57 params: params.MeterStatusParams{ 58 Statuses: []params.MeterStatusParam{{ 59 Tag: testService.Tag().String(), 60 Code: "RED", 61 Info: "test", 62 }, 63 }, 64 }, 65 assert: func(c *gc.C, results params.ErrorResults) { 66 err := results.OneError() 67 c.Assert(err, jc.ErrorIsNil) 68 ms1, err := testUnit1.GetMeterStatus() 69 c.Assert(err, jc.ErrorIsNil) 70 c.Assert(ms1, gc.DeepEquals, state.MeterStatus{ 71 Code: state.MeterRed, 72 Info: "test", 73 }) 74 ms2, err := testUnit2.GetMeterStatus() 75 c.Assert(err, jc.ErrorIsNil) 76 c.Assert(ms2, gc.DeepEquals, state.MeterStatus{ 77 Code: state.MeterRed, 78 Info: "test", 79 }) 80 }, 81 }, { 82 about: "set unit meter status", 83 params: params.MeterStatusParams{ 84 Statuses: []params.MeterStatusParam{{ 85 Tag: testUnit1.Tag().String(), 86 Code: "AMBER", 87 Info: "test", 88 }, 89 }, 90 }, 91 assert: func(c *gc.C, results params.ErrorResults) { 92 err := results.OneError() 93 c.Assert(err, jc.ErrorIsNil) 94 ms1, err := testUnit1.GetMeterStatus() 95 c.Assert(err, jc.ErrorIsNil) 96 c.Assert(ms1, gc.DeepEquals, state.MeterStatus{ 97 Code: state.MeterAmber, 98 Info: "test", 99 }) 100 }, 101 }, { 102 about: "not a local charm - service", 103 params: params.MeterStatusParams{ 104 Statuses: []params.MeterStatusParam{{ 105 Tag: csService.Tag().String(), 106 Code: "AMBER", 107 Info: "test", 108 }, 109 }, 110 }, 111 assert: func(c *gc.C, results params.ErrorResults) { 112 err := results.OneError() 113 c.Assert(err, gc.DeepEquals, ¶ms.Error{Message: "not a local charm"}) 114 }, 115 }, { 116 about: "not a local charm - unit", 117 params: params.MeterStatusParams{ 118 Statuses: []params.MeterStatusParam{{ 119 Tag: csUnit1.Tag().String(), 120 Code: "AMBER", 121 Info: "test", 122 }, 123 }, 124 }, 125 assert: func(c *gc.C, results params.ErrorResults) { 126 err := results.OneError() 127 c.Assert(err, gc.DeepEquals, ¶ms.Error{Message: "not a local charm"}) 128 }, 129 }, { 130 about: "invalid meter status", 131 params: params.MeterStatusParams{ 132 Statuses: []params.MeterStatusParam{{ 133 Tag: testUnit1.Tag().String(), 134 Code: "WRONG", 135 Info: "test", 136 }, 137 }, 138 }, 139 assert: func(c *gc.C, results params.ErrorResults) { 140 err := results.OneError() 141 c.Assert(err, gc.DeepEquals, ¶ms.Error{Message: "invalid meter status \"NOT AVAILABLE\""}) 142 }, 143 }, { 144 about: "not such service", 145 params: params.MeterStatusParams{ 146 Statuses: []params.MeterStatusParam{{ 147 Tag: "service-missing", 148 Code: "AMBER", 149 Info: "test", 150 }, 151 }, 152 }, 153 assert: func(c *gc.C, results params.ErrorResults) { 154 err := results.OneError() 155 c.Assert(err, gc.DeepEquals, ¶ms.Error{Message: "service \"missing\" not found", Code: "not found"}) 156 }, 157 }, 158 } 159 160 for i, test := range tests { 161 c.Logf("running test %d: %v", i, test.about) 162 result, err := s.metricsdebug.SetMeterStatus(test.params) 163 if test.err == "" { 164 c.Assert(err, jc.ErrorIsNil) 165 test.assert(c, result) 166 } else { 167 c.Assert(err, gc.ErrorMatches, test.err) 168 } 169 } 170 } 171 172 func (s *metricsDebugSuite) TestGetMetrics(c *gc.C) { 173 meteredCharm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "metered", URL: "local:quantal/metered"}) 174 meteredService := s.Factory.MakeService(c, &factory.ServiceParams{Charm: meteredCharm}) 175 unit := s.Factory.MakeUnit(c, &factory.UnitParams{Service: meteredService, SetCharmURL: true}) 176 newTime := time.Now().Round(time.Second) 177 metricA := state.Metric{"pings", "5", newTime} 178 metricB := state.Metric{"pings", "10.5", newTime} 179 s.Factory.MakeMetric(c, &factory.MetricParams{Unit: unit, Metrics: []state.Metric{metricA}}) 180 s.Factory.MakeMetric(c, &factory.MetricParams{Unit: unit, Metrics: []state.Metric{metricA, metricB}}) 181 args := params.Entities{Entities: []params.Entity{ 182 {"unit-metered/0"}, 183 }} 184 result, err := s.metricsdebug.GetMetrics(args) 185 c.Assert(err, jc.ErrorIsNil) 186 c.Assert(result.Results, gc.HasLen, 1) 187 c.Assert(result.Results[0].Metrics, gc.HasLen, 3) 188 c.Assert(result.Results[0], gc.DeepEquals, params.EntityMetrics{ 189 Metrics: []params.MetricResult{ 190 { 191 Key: "pings", 192 Value: "5", 193 Time: newTime, 194 }, 195 { 196 Key: "pings", 197 Value: "5", 198 Time: newTime, 199 }, 200 { 201 Key: "pings", 202 Value: "10.5", 203 Time: newTime, 204 }, 205 }, 206 Error: nil, 207 }) 208 } 209 210 func (s *metricsDebugSuite) TestGetMultipleMetricsNoMocks(c *gc.C) { 211 meteredCharm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "metered", URL: "local:quantal/metered"}) 212 meteredService := s.Factory.MakeService(c, &factory.ServiceParams{ 213 Charm: meteredCharm, 214 }) 215 unit0 := s.Factory.MakeUnit(c, &factory.UnitParams{Service: meteredService, SetCharmURL: true}) 216 unit1 := s.Factory.MakeUnit(c, &factory.UnitParams{Service: meteredService, SetCharmURL: true}) 217 218 metricUnit0 := s.Factory.MakeMetric(c, &factory.MetricParams{ 219 Unit: unit0, 220 }) 221 metricUnit1 := s.Factory.MakeMetric(c, &factory.MetricParams{ 222 Unit: unit1, 223 }) 224 225 args0 := params.Entities{Entities: []params.Entity{ 226 {"unit-metered/0"}, 227 }} 228 args1 := params.Entities{Entities: []params.Entity{ 229 {"unit-metered/1"}, 230 }} 231 232 metrics0, err := s.metricsdebug.GetMetrics(args0) 233 c.Assert(err, jc.ErrorIsNil) 234 c.Assert(metrics0.Results, gc.HasLen, 1) 235 c.Assert(metrics0.Results[0].Metrics[0].Key, gc.Equals, metricUnit0.Metrics()[0].Key) 236 c.Assert(metrics0.Results[0].Metrics[0].Value, gc.Equals, metricUnit0.Metrics()[0].Value) 237 c.Assert(metrics0.Results[0].Metrics[0].Time, jc.TimeBetween(metricUnit0.Metrics()[0].Time, metricUnit0.Metrics()[0].Time)) 238 239 metrics1, err := s.metricsdebug.GetMetrics(args1) 240 c.Assert(err, jc.ErrorIsNil) 241 c.Assert(metrics1.Results, gc.HasLen, 1) 242 c.Assert(metrics1.Results[0].Metrics[0].Key, gc.Equals, metricUnit1.Metrics()[0].Key) 243 c.Assert(metrics1.Results[0].Metrics[0].Value, gc.Equals, metricUnit1.Metrics()[0].Value) 244 c.Assert(metrics1.Results[0].Metrics[0].Time, jc.TimeBetween(metricUnit1.Metrics()[0].Time, metricUnit1.Metrics()[0].Time)) 245 } 246 247 func (s *metricsDebugSuite) TestGetMultipleMetricsNoMocksWithService(c *gc.C) { 248 meteredCharm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "metered", URL: "local:quantal/metered"}) 249 meteredService := s.Factory.MakeService(c, &factory.ServiceParams{ 250 Charm: meteredCharm, 251 }) 252 unit0 := s.Factory.MakeUnit(c, &factory.UnitParams{Service: meteredService, SetCharmURL: true}) 253 unit1 := s.Factory.MakeUnit(c, &factory.UnitParams{Service: meteredService, SetCharmURL: true}) 254 255 metricUnit0 := s.Factory.MakeMetric(c, &factory.MetricParams{ 256 Unit: unit0, 257 }) 258 metricUnit1 := s.Factory.MakeMetric(c, &factory.MetricParams{ 259 Unit: unit1, 260 }) 261 262 args := params.Entities{Entities: []params.Entity{ 263 {"service-metered"}, 264 }} 265 266 metrics, err := s.metricsdebug.GetMetrics(args) 267 c.Assert(err, jc.ErrorIsNil) 268 c.Assert(metrics.Results, gc.HasLen, 1) 269 c.Assert(metrics.Results[0].Metrics, gc.HasLen, 2) 270 c.Assert(metrics.Results[0].Metrics[0].Key, gc.Equals, metricUnit0.Metrics()[0].Key) 271 c.Assert(metrics.Results[0].Metrics[0].Value, gc.Equals, metricUnit0.Metrics()[0].Value) 272 c.Assert(metrics.Results[0].Metrics[0].Time, jc.TimeBetween(metricUnit0.Metrics()[0].Time, metricUnit0.Metrics()[0].Time)) 273 274 c.Assert(metrics.Results[0].Metrics[1].Key, gc.Equals, metricUnit1.Metrics()[0].Key) 275 c.Assert(metrics.Results[0].Metrics[1].Value, gc.Equals, metricUnit1.Metrics()[0].Value) 276 c.Assert(metrics.Results[0].Metrics[1].Time, jc.TimeBetween(metricUnit1.Metrics()[0].Time, metricUnit1.Metrics()[0].Time)) 277 }