Add support for creating samples
Change-Id: Ib33a5fd162d760efa23a2fc496c1d11d79484491
This commit is contained in:
		@@ -13,9 +13,26 @@
 | 
				
			|||||||
#    License for the specific language governing permissions and limitations
 | 
					#    License for the specific language governing permissions and limitations
 | 
				
			||||||
#    under the License.
 | 
					#    under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import copy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ceilometerclient.tests import utils
 | 
					from ceilometerclient.tests import utils
 | 
				
			||||||
import ceilometerclient.v2.samples
 | 
					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'
 | 
					base_url = '/v2/meters/instance'
 | 
				
			||||||
args = 'q.op=&q.op=&q.value=foo&q.value=bar&q.field=resource_id&q.field=source'
 | 
					args = 'q.op=&q.op=&q.value=foo&q.value=bar&q.field=resource_id&q.field=source'
 | 
				
			||||||
@@ -24,20 +41,11 @@ fixtures = {
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        'GET': (
 | 
					        'GET': (
 | 
				
			||||||
            {},
 | 
					            {},
 | 
				
			||||||
            [
 | 
					            [GET_SAMPLE]
 | 
				
			||||||
                {u'counter_name': u'instance',
 | 
					        ),
 | 
				
			||||||
                 u'user_id': u'user-id',
 | 
					        'POST': (
 | 
				
			||||||
                 u'resource_id': u'resource-id',
 | 
					            {},
 | 
				
			||||||
                 u'timestamp': u'2012-07-02T10:40:00',
 | 
					            [CREATE_SAMPLE],
 | 
				
			||||||
                 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'},
 | 
					 | 
				
			||||||
            ]
 | 
					 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    '%s?%s' % (base_url, args):
 | 
					    '%s?%s' % (base_url, args):
 | 
				
			||||||
@@ -77,3 +85,11 @@ class SampleManagerTest(utils.BaseTestCase):
 | 
				
			|||||||
        expect = [('GET', '%s?%s' % (base_url, args), {}, None)]
 | 
					        expect = [('GET', '%s?%s' % (base_url, args), {}, None)]
 | 
				
			||||||
        self.assertEqual(self.api.calls, expect)
 | 
					        self.assertEqual(self.api.calls, expect)
 | 
				
			||||||
        self.assertEqual(len(samples), 0)
 | 
					        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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,17 @@
 | 
				
			|||||||
from ceilometerclient.common import base
 | 
					from ceilometerclient.common import base
 | 
				
			||||||
from ceilometerclient.v2 import options
 | 
					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):
 | 
					class Sample(base.Resource):
 | 
				
			||||||
    def __repr__(self):
 | 
					    def __repr__(self):
 | 
				
			||||||
@@ -23,8 +34,20 @@ class Sample(base.Resource):
 | 
				
			|||||||
class SampleManager(base.Manager):
 | 
					class SampleManager(base.Manager):
 | 
				
			||||||
    resource_class = Sample
 | 
					    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):
 | 
					    def list(self, meter_name=None, q=None):
 | 
				
			||||||
        path = '/v2/meters'
 | 
					        path = self._path(counter_name=meter_name)
 | 
				
			||||||
        if meter_name:
 | 
					 | 
				
			||||||
            path += '/' + meter_name
 | 
					 | 
				
			||||||
        return self._list(options.build_url(path, q))
 | 
					        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]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,8 @@
 | 
				
			|||||||
#    License for the specific language governing permissions and limitations
 | 
					#    License for the specific language governing permissions and limitations
 | 
				
			||||||
#    under the License.
 | 
					#    under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ceilometerclient.common import utils
 | 
					from ceilometerclient.common import utils
 | 
				
			||||||
from ceilometerclient import exc
 | 
					from ceilometerclient import exc
 | 
				
			||||||
from ceilometerclient.v2 import options
 | 
					from ceilometerclient.v2 import options
 | 
				
			||||||
@@ -76,6 +78,41 @@ def do_sample_list(cc, args):
 | 
				
			|||||||
                         sortby=0)
 | 
					                         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>',
 | 
					@utils.arg('-q', '--query', metavar='<QUERY>',
 | 
				
			||||||
           help='key[op]value; list.')
 | 
					           help='key[op]value; list.')
 | 
				
			||||||
def do_meter_list(cc, args={}):
 | 
					def do_meter_list(cc, args={}):
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user