Hello community,

here is the log from the commit of package python-ceilometerclient for 
openSUSE:13.1 checked in at 2013-10-02 13:32:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:13.1/python-ceilometerclient (Old)
 and      /work/SRC/openSUSE:13.1/.python-ceilometerclient.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-ceilometerclient"

Changes:
--------
--- 
/work/SRC/openSUSE:13.1/python-ceilometerclient/python-ceilometerclient.changes 
    2013-09-26 07:13:16.000000000 +0200
+++ 
/work/SRC/openSUSE:13.1/.python-ceilometerclient.new/python-ceilometerclient.changes
        2013-10-02 13:32:39.000000000 +0200
@@ -1,0 +2,12 @@
+Mon Sep 30 23:38:38 UTC 2013 - [email protected]
+
+- Update to version 1.0.5.2:
+  + Help messages: specify which options are required
+
+-------------------------------------------------------------------
+Thu Sep 26 10:11:49 UTC 2013 - [email protected]
+
+- Update to version 1.0.5.1:
+  + Improve the CM shell client alarm visualisation
+
+-------------------------------------------------------------------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-ceilometerclient.spec ++++++
--- /var/tmp/diff_new_pack.EsmxjZ/_old  2013-10-02 13:32:40.000000000 +0200
+++ /var/tmp/diff_new_pack.EsmxjZ/_new  2013-10-02 13:32:40.000000000 +0200
@@ -20,7 +20,7 @@
 %define component ceilometerclient
 
 Name:           python-%{component}
-Version:        1.0.3.11
+Version:        1.0.5.2
 Release:        0
 Url:            https://github.com/openstack/python-ceilometerclient
 Summary:        OpenStack Metering (Ceilometer) API Client
@@ -71,7 +71,7 @@
 This package contains testsuite files for %{name}.
 
 %prep
-%setup -q -n python-ceilometerclient-1.0.3.11.g2610d6c
+%setup -q -n python-ceilometerclient-1.0.5.2.gb961738
 %openstack_cleanup_prep
 echo %{version} > ceilometerclient/versioninfo
 

++++++ python-ceilometerclient-master.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-ceilometerclient-1.0.3.11.g2610d6c/ChangeLog 
new/python-ceilometerclient-1.0.5.2.gb961738/ChangeLog
--- old/python-ceilometerclient-1.0.3.11.g2610d6c/ChangeLog     2013-09-23 
21:22:05.000000000 +0200
+++ new/python-ceilometerclient-1.0.5.2.gb961738/ChangeLog      2013-09-30 
18:22:39.000000000 +0200
@@ -1,3 +1,36 @@
+commit b961738765976e77711d909eec1ecc402fa8a484
+Author: Cyril Roelandt <[email protected]>
+Date:   Wed Sep 25 12:49:58 2013 +0000
+
+    Help messages: specify which options are required
+    
+    Closes-Bug: #1223283
+    
+    Change-Id: I080fa73bd45a1f9f442dbcdfa65fdc24e30521da
+
+commit ce01f564651bee07f91be8dc7f6dfca561216625
+Author: Mehdi Abaakouk <[email protected]>
+Date:   Tue Sep 24 11:09:05 2013 +0200
+
+    Improve the CM shell client alarm visualisation
+    
+    This change aim to get a better alarm representation in shell.
+    
+    In alarm-list:
+    * it add a short sentence to describe the alarm rule
+    * it remove project_id/user_id because it always show the same id for
+      all alarm for end-user
+    
+    In alarm-show, it show alarm rule attributes as alarm properties instead
+    of a unparsable json in the rule property.
+    
+    example of short sentence for column 'Alarm condition':
+    * combinated states (AND) of 8babd6a2-c457-42d0-9eb5-cdfb3cb50203,
+      d0e11a94-8f59-48a9-8f6d-b0d68aaac8d0
+    * cpu_util >= 50.0 during 1 x 60s
+    
+    Change-Id: If4df2dc08f9f4cb7796fd98308c7d62e311d1138
+
 commit 2610d6c144e0d81cd94a6f18eb899443ce7d64fb
 Merge: 05e4355 5616563
 Author: Jenkins <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-ceilometerclient-1.0.3.11.g2610d6c/PKG-INFO 
new/python-ceilometerclient-1.0.5.2.gb961738/PKG-INFO
--- old/python-ceilometerclient-1.0.3.11.g2610d6c/PKG-INFO      2013-09-23 
21:22:05.000000000 +0200
+++ new/python-ceilometerclient-1.0.5.2.gb961738/PKG-INFO       2013-09-30 
18:22:40.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: python-ceilometerclient
-Version: 1.0.3.11.g2610d6c
+Version: 1.0.5.2.gb961738
 Summary: OpenStack Metering API Client Library
 Home-page: http://www.openstack.org/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-ceilometerclient-1.0.3.11.g2610d6c/ceilometerclient/common/utils.py 
new/python-ceilometerclient-1.0.5.2.gb961738/ceilometerclient/common/utils.py
--- 
old/python-ceilometerclient-1.0.3.11.g2610d6c/ceilometerclient/common/utils.py  
    2013-09-23 21:21:36.000000000 +0200
+++ 
new/python-ceilometerclient-1.0.5.2.gb961738/ceilometerclient/common/utils.py   
    2013-09-30 18:21:46.000000000 +0200
@@ -27,6 +27,13 @@
 # Decorator for cli-args
 def arg(*args, **kwargs):
     def _decorator(func):
+        if 'help' in kwargs:
+            if 'default' in kwargs:
+                kwargs['help'] += " Defaults to %s." % kwargs['default']
+            required = kwargs.get('required', False)
+            if required:
+                kwargs['help'] += " Required."
+
         # Because of the sematics of decorator composition if we just append
         # to the options list positional options will appear to be backwards.
         func.__dict__.setdefault('arguments', []).insert(0, (args, kwargs))
@@ -63,17 +70,19 @@
         # convert dict to str to check length
         if isinstance(v, dict):
             v = str(v)
-        if wrap > 0:
-            v = textwrap.fill(str(v), wrap)
         # if value has a newline, add in multiple rows
         # e.g. fault with stacktrace
         if v and isinstance(v, basestring) and r'\n' in v:
             lines = v.strip().split(r'\n')
             col1 = k
             for line in lines:
+                if wrap > 0:
+                    line = textwrap.fill(str(line), wrap)
                 pt.add_row([col1, line])
                 col1 = ''
         else:
+            if wrap > 0:
+                v = textwrap.fill(str(v), wrap)
             pt.add_row([k, v])
     print pt.get_string()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-ceilometerclient-1.0.3.11.g2610d6c/ceilometerclient/tests/test_utils.py
 
new/python-ceilometerclient-1.0.5.2.gb961738/ceilometerclient/tests/test_utils.py
--- 
old/python-ceilometerclient-1.0.3.11.g2610d6c/ceilometerclient/tests/test_utils.py
  2013-09-23 21:21:36.000000000 +0200
+++ 
new/python-ceilometerclient-1.0.5.2.gb961738/ceilometerclient/tests/test_utils.py
   2013-09-30 18:21:46.000000000 +0200
@@ -74,3 +74,22 @@
                                'statictic': 'avg',
                                'comparison_operator': 'or'},
         })
+
+    def test_arg(self):
+        @utils.arg(help="not_required_no_default.")
+        def not_required_no_default():
+            pass
+        _, args = not_required_no_default.__dict__['arguments'][0]
+        self.assertEqual(args['help'], "not_required_no_default.")
+
+        @utils.arg(required=True, help="required_no_default.")
+        def required_no_default():
+            pass
+        _, args = required_no_default.__dict__['arguments'][0]
+        self.assertEqual(args['help'], "required_no_default. Required.")
+
+        @utils.arg(default=42, help="not_required_default.")
+        def not_required_default():
+            pass
+        _, args = not_required_default.__dict__['arguments'][0]
+        self.assertEqual(args['help'], "not_required_default. Defaults to 42.")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-ceilometerclient-1.0.3.11.g2610d6c/ceilometerclient/v2/shell.py 
new/python-ceilometerclient-1.0.5.2.gb961738/ceilometerclient/v2/shell.py
--- old/python-ceilometerclient-1.0.3.11.g2610d6c/ceilometerclient/v2/shell.py  
2013-09-23 21:21:36.000000000 +0200
+++ new/python-ceilometerclient-1.0.5.2.gb961738/ceilometerclient/v2/shell.py   
2013-09-30 18:21:46.000000000 +0200
@@ -28,11 +28,14 @@
 ALARM_OPERATORS = ['lt', 'le', 'eq', 'ne', 'ge', 'gt']
 ALARM_COMBINATION_OPERATORS = ['and', 'or']
 STATISTICS = ['max', 'min', 'avg', 'sum', 'count']
+OPERATORS_STRING = dict(gt='>', ge='>=',
+                        lt='<', le="<=",
+                        eq='==', ne='!=')
 
 
 @utils.arg('-q', '--query', metavar='<QUERY>',
            help='key[op]value; list.')
[email protected]('-m', '--meter', metavar='<NAME>',
[email protected]('-m', '--meter', metavar='<NAME>', required=True,
            help='Name of meter to show samples for.')
 @utils.arg('-p', '--period', metavar='<PERIOD>',
            help='Period in seconds over which to group samples.')
@@ -41,8 +44,6 @@
     fields = {'meter_name': args.meter,
               'q': options.cli_to_array(args.query),
               'period': args.period}
-    if args.meter is None:
-        raise exc.CommandError('Meter name not provided (-m <meter name>)')
     try:
         statistics = cc.statistics.list(**fields)
     except exc.HTTPNotFound:
@@ -59,14 +60,12 @@
 
 @utils.arg('-q', '--query', metavar='<QUERY>',
            help='key[op]value; list.')
[email protected]('-m', '--meter', metavar='<NAME>',
[email protected]('-m', '--meter', metavar='<NAME>', required=True,
            help='Name of meter to show samples for.')
 def do_sample_list(cc, args):
     '''List the samples for this meters.'''
     fields = {'meter_name': args.meter,
               'q': options.cli_to_array(args.query)}
-    if args.meter is None:
-        raise exc.CommandError('Meter name not provided (-m <meter name>)')
     try:
         samples = cc.samples.list(**fields)
     except exc.HTTPNotFound:
@@ -86,15 +85,15 @@
 @utils.arg('--user-id', metavar='<USER_ID>',
            help='User to associate with sample '
                 '(only settable by admin users)')
[email protected]('-r', '--resource-id', metavar='<RESOURCE_ID>',
[email protected]('-r', '--resource-id', metavar='<RESOURCE_ID>', required=True,
            help='ID of the resource.')
 @utils.arg('-m', '--meter-name', metavar='<METER_NAME>',
            help='the meter name')
[email protected]('--meter-type', metavar='<METER_TYPE>',
[email protected]('--meter-type', metavar='<METER_TYPE>', required=True,
            help='the meter type')
[email protected]('--meter-unit', metavar='<METER_UNIT>',
[email protected]('--meter-unit', metavar='<METER_UNIT>', required=True,
            help='the meter unit')
[email protected]('--sample-volume', metavar='<SAMPLE_VOLUME>',
[email protected]('--sample-volume', metavar='<SAMPLE_VOLUME>', required=True,
            help='The sample volume')
 @utils.arg('--resource-metadata', metavar='<RESOURCE_METADATA>',
            help='resource metadata')
@@ -128,6 +127,28 @@
                      sortby=0)
 
 
+def alarm_rule_formatter(alarm):
+    if alarm.type == 'threshold':
+        return ('%(meter_name)s %(comparison_operator)s '
+                '%(threshold)s during %(evaluation_periods)s x %(period)ss' %
+                {
+                    'meter_name': alarm.rule['meter_name'],
+                    'threshold': alarm.rule['threshold'],
+                    'evaluation_periods': alarm.rule['evaluation_periods'],
+                    'period': alarm.rule['period'],
+                    'comparison_operator': OPERATORS_STRING.get(
+                        alarm.rule['comparison_operator'])
+                })
+    elif alarm.type == 'combination':
+        return ('combinated states (%(operator)s) of %(alarms)s' % {
+            'operator': alarm.rule['operator'].upper(),
+            'alarms': ", ".join(alarm.rule['alarm_ids'])})
+    else:
+        # just dump all
+        return "\n".join(["%s: %s" % (f, v)
+                          for f, v in alarm.rule.iteritems()])
+
+
 @utils.arg('-q', '--query', metavar='<QUERY>',
            help='key[op]value; list.')
 def do_alarm_list(cc, args={}):
@@ -135,29 +156,38 @@
     alarms = cc.alarms.list(q=options.cli_to_array(args.query))
     # omit action initially to keep output width sane
     # (can switch over to vertical formatting when available from CLIFF)
-    field_labels = ['Name', 'Description', 'State', 'Enabled', 'Continuous',
-                    'Alarm ID', 'User ID', 'Project ID']
-    fields = ['name', 'description', 'state', 'enabled', 'repeat_actions',
-              'alarm_id', 'user_id', 'project_id']
+    field_labels = ['Alarm ID', 'Name', 'State', 'Enabled', 'Continuous',
+                    'Alarm condition']
+    fields = ['alarm_id', 'name', 'state', 'enabled', 'repeat_actions',
+              'rule']
     utils.print_list(alarms, fields, field_labels,
-                     sortby=0)
+                     formatters={'rule': alarm_rule_formatter}, sortby=0)
+
+
+def alarm_query_formater(alarm):
+    qs = []
+    for q in alarm.rule['query']:
+        qs.append('%s %s %s' % (
+            q['field'], OPERATORS_STRING.get(q['op']), q['value']))
+    return r' AND\n'.join(qs)
 
 
 def _display_alarm(alarm):
-    fields = ['name', 'description', 'type', 'rule',
+    fields = ['name', 'description', 'type',
               'state', 'enabled', 'alarm_id', 'user_id', 'project_id',
               'alarm_actions', 'ok_actions', 'insufficient_data_actions',
               'repeat_actions']
     data = dict([(f, getattr(alarm, f, '')) for f in fields])
+    data.update(alarm.rule)
+    if alarm.type == 'threshold':
+        data['query'] = alarm_query_formater(alarm)
     utils.print_dict(data, wrap=72)
 
 
[email protected]('-a', '--alarm_id', metavar='<ALARM_ID>',
[email protected]('-a', '--alarm_id', metavar='<ALARM_ID>', required=True,
            help='ID of the alarm to show.')
 def do_alarm_show(cc, args={}):
     '''Show an alarm.'''
-    if args.alarm_id is None:
-        raise exc.CommandError('Alarm ID not provided (-a <alarm id>)')
     try:
         alarm = cc.alarms.get(args.alarm_id)
     except exc.HTTPNotFound:
@@ -380,8 +410,6 @@
            help='ID of the alarm to delete.')
 def do_alarm_delete(cc, args={}):
     '''Delete an alarm.'''
-    if args.alarm_id is None:
-        raise exc.CommandError('Alarm ID not provided (-a <alarm id>)')
     try:
         cc.alarms.delete(args.alarm_id)
     except exc.HTTPNotFound:
@@ -426,12 +454,10 @@
                      sortby=1)
 
 
[email protected]('-r', '--resource_id', metavar='<RESOURCE_ID>',
[email protected]('-r', '--resource_id', metavar='<RESOURCE_ID>', required=True,
            help='ID of the resource to show.')
 def do_resource_show(cc, args={}):
     '''Show the resource.'''
-    if args.resource_id is None:
-        raise exc.CommandError('Resource id not provided (-r <resource id>)')
     try:
         resource = cc.resources.get(args.resource_id)
     except exc.HTTPNotFound:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-ceilometerclient-1.0.3.11.g2610d6c/python_ceilometerclient.egg-info/PKG-INFO
 
new/python-ceilometerclient-1.0.5.2.gb961738/python_ceilometerclient.egg-info/PKG-INFO
--- 
old/python-ceilometerclient-1.0.3.11.g2610d6c/python_ceilometerclient.egg-info/PKG-INFO
     2013-09-23 21:22:05.000000000 +0200
+++ 
new/python-ceilometerclient-1.0.5.2.gb961738/python_ceilometerclient.egg-info/PKG-INFO
      2013-09-30 18:22:39.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: python-ceilometerclient
-Version: 1.0.3.11.g2610d6c
+Version: 1.0.5.2.gb961738
 Summary: OpenStack Metering API Client Library
 Home-page: http://www.openstack.org/
 Author: OpenStack

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to