diff --git a/ceilometerclient/tests/v2/test_samples.py b/ceilometerclient/tests/v2/test_samples.py index 934644f..a9da5fa 100644 --- a/ceilometerclient/tests/v2/test_samples.py +++ b/ceilometerclient/tests/v2/test_samples.py @@ -13,9 +13,26 @@ # License for the specific language governing permissions and limitations # under the License. +import copy + from ceilometerclient.tests import utils import ceilometerclient.v2.samples +GET_SAMPLE = {u'counter_name': u'instance', + u'user_id': u'user-id', + u'resource_id': u'resource-id', + u'timestamp': u'2012-07-02T10:40:00', + u'source': u'test_source', + u'message_id': u'54558a1c-6ef3-11e2-9875-5453ed1bbb5f', + u'counter_unit': u'', + u'counter_volume': 1.0, + u'project_id': u'project1', + u'resource_metadata': {u'tag': u'self.counter', + u'display_name': u'test-server'}, + u'counter_type': u'cumulative'} +CREATE_SAMPLE = copy.deepcopy(GET_SAMPLE) +del CREATE_SAMPLE['message_id'] +del CREATE_SAMPLE['source'] base_url = '/v2/meters/instance' args = 'q.op=&q.op=&q.value=foo&q.value=bar&q.field=resource_id&q.field=source' @@ -24,20 +41,11 @@ fixtures = { { 'GET': ( {}, - [ - {u'counter_name': u'instance', - u'user_id': u'user-id', - u'resource_id': u'resource-id', - u'timestamp': u'2012-07-02T10:40:00', - u'message_id': u'54558a1c-6ef3-11e2-9875-5453ed1bbb5f', - u'source': u'test_source', - u'counter_unit': u'', - u'counter_volume': 1.0, - u'project_id': u'project1', - u'resource_metadata': {u'tag': u'self.counter', - u'display_name': u'test-server'}, - u'counter_type': u'cumulative'}, - ] + [GET_SAMPLE] + ), + 'POST': ( + {}, + [CREATE_SAMPLE], ), }, '%s?%s' % (base_url, args): @@ -77,3 +85,11 @@ class SampleManagerTest(utils.BaseTestCase): expect = [('GET', '%s?%s' % (base_url, args), {}, None)] self.assertEqual(self.api.calls, expect) self.assertEqual(len(samples), 0) + + def test_create(self): + sample = self.mgr.create(**CREATE_SAMPLE) + expect = [ + ('POST', '/v2/meters/instance', {}, [CREATE_SAMPLE]), + ] + self.assertEqual(self.api.calls, expect) + self.assertTrue(sample) diff --git a/ceilometerclient/v2/samples.py b/ceilometerclient/v2/samples.py index 11258a5..20ddbe7 100644 --- a/ceilometerclient/v2/samples.py +++ b/ceilometerclient/v2/samples.py @@ -14,6 +14,17 @@ from ceilometerclient.common import base from ceilometerclient.v2 import options +CREATION_ATTRIBUTES = ('source', + 'counter_name', + 'counter_type', + 'counter_unit', + 'counter_volume', + 'user_id', + 'project_id', + 'resource_id', + 'timestamp', + 'resource_metadata') + class Sample(base.Resource): def __repr__(self): @@ -23,8 +34,20 @@ class Sample(base.Resource): class SampleManager(base.Manager): resource_class = Sample + @staticmethod + def _path(counter_name=None): + return '/v2/meters/%s' % counter_name if counter_name else '/v2/meters' + def list(self, meter_name=None, q=None): - path = '/v2/meters' - if meter_name: - path += '/' + meter_name + path = self._path(counter_name=meter_name) return self._list(options.build_url(path, q)) + + def create(self, **kwargs): + new = dict((key, value) for (key, value) in kwargs.items() + if key in CREATION_ATTRIBUTES) + url = self._path(counter_name=kwargs['counter_name']) + resp, body = self.api.json_request('POST', + url, + body=[new]) + if body: + return [Sample(self, b) for b in body] diff --git a/ceilometerclient/v2/shell.py b/ceilometerclient/v2/shell.py index be68941..23246a2 100644 --- a/ceilometerclient/v2/shell.py +++ b/ceilometerclient/v2/shell.py @@ -16,6 +16,8 @@ # License for the specific language governing permissions and limitations # under the License. +import json + from ceilometerclient.common import utils from ceilometerclient import exc from ceilometerclient.v2 import options @@ -76,6 +78,41 @@ def do_sample_list(cc, args): sortby=0) +@utils.arg('--project-id', metavar='', + help='Tenant to associate with alarm ' + '(only settable by admin users)') +@utils.arg('--user-id', metavar='', + help='User to associate with alarm ' + '(only settable by admin users)') +@utils.arg('-r', '--resource-id', metavar='', + help='ID of the resource.') +@utils.arg('-m', '--meter-name', metavar='', + help='the meter name') +@utils.arg('--meter-type', metavar='', + help='the meter type') +@utils.arg('--meter-unit', metavar='', + help='the meter unit') +@utils.arg('--sample-volume', metavar='', + help='The sample volume') +@utils.arg('--resource-metadata', metavar='', + help='resource metadata') +def do_sample_create(cc, args={}): + '''Create a sample.''' + arg_to_field_mapping = {'meter_name': 'counter_name', + 'meter_unit': 'counter_unit', + 'meter_type': 'counter_type', + 'sample_volume': 'counter_volume'} + fields = {} + for var in vars(args).items(): + k, v = var[0], var[1] + if v is not None: + if k == 'resource_metadata': + fields[k] = json.loads(v) + else: + fields[arg_to_field_mapping.get(k, k)] = v + cc.samples.create(**fields) + + @utils.arg('-q', '--query', metavar='', help='key[op]value; list.') def do_meter_list(cc, args={}):