Add support for creating samples

Change-Id: Ib33a5fd162d760efa23a2fc496c1d11d79484491
This commit is contained in:
Angus Salkeld
2013-07-18 09:41:16 +10:00
parent efd67de3fa
commit 3010ebcc75
3 changed files with 93 additions and 17 deletions

View File

@@ -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)

View File

@@ -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]

View File

@@ -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='<PROJECT_ID>',
help='Tenant to associate with alarm '
'(only settable by admin users)')
@utils.arg('--user-id', metavar='<USER_ID>',
help='User to associate with alarm '
'(only settable by admin users)')
@utils.arg('-r', '--resource-id', metavar='<RESOURCE_ID>',
help='ID of the resource.')
@utils.arg('-m', '--meter-name', metavar='<METER_NAME>',
help='the meter name')
@utils.arg('--meter-type', metavar='<METER_TYPE>',
help='the meter type')
@utils.arg('--meter-unit', metavar='<METER_UNIT>',
help='the meter unit')
@utils.arg('--sample-volume', metavar='<SAMPLE_VOLUME>',
help='The sample volume')
@utils.arg('--resource-metadata', metavar='<RESOURCE_METADATA>',
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='<QUERY>',
help='key[op]value; list.')
def do_meter_list(cc, args={}):