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, &params.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, &params.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, &params.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, &params.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  }