Add support for the hashmap threshold API
Change-Id: I970c8844c3af41c7cc3d99ce09e4f69ec337f888
This commit is contained in:
@@ -207,6 +207,38 @@ fixtures = {
|
||||
{},
|
||||
),
|
||||
},
|
||||
# a threshold
|
||||
('/v1/rating/module_config/hashmap/thresholds/'
|
||||
'1f136864-be73-481f-b9be-4fbda2496f72'): {
|
||||
'GET': (
|
||||
{},
|
||||
{
|
||||
'threshold_id': '1f136864-be73-481f-b9be-4fbda2496f72',
|
||||
'service_id': '1329d62f-bd1c-4a88-a75a-07545e41e8d7',
|
||||
'field_id': 'c7c28d87-5103-4a05-af7f-e4d0891cb7fc',
|
||||
'group_id': None,
|
||||
'level': 30,
|
||||
'cost': 5.98,
|
||||
'map_type': 'flat',
|
||||
},
|
||||
),
|
||||
'PUT': (
|
||||
{},
|
||||
{
|
||||
'threshold_id': '1f136864-be73-481f-b9be-4fbda2496f72',
|
||||
'service_id': '1329d62f-bd1c-4a88-a75a-07545e41e8d7',
|
||||
'field_id': 'c7c28d87-5103-4a05-af7f-e4d0891cb7fc',
|
||||
'group_id': None,
|
||||
'level': 30,
|
||||
'cost': 5.99,
|
||||
'type': 'flat',
|
||||
},
|
||||
),
|
||||
'DELETE': (
|
||||
{},
|
||||
{},
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -423,3 +455,59 @@ class GroupTest(utils.BaseTestCase):
|
||||
'?recursive=True')
|
||||
]
|
||||
self.http_client.assert_called(*expect)
|
||||
|
||||
|
||||
class ThresholdManagerTest(utils.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(ThresholdManagerTest, self).setUp()
|
||||
self.http_client = fake_client.FakeHTTPClient(fixtures=fixtures)
|
||||
self.api = client.BaseClient(self.http_client)
|
||||
self.mgr = hashmap.ThresholdManager(self.api)
|
||||
|
||||
def test_get_a_threshold(self):
|
||||
resource = self.mgr.get(
|
||||
threshold_id='1f136864-be73-481f-b9be-4fbda2496f72'
|
||||
)
|
||||
expect = [
|
||||
'GET', ('/v1/rating/module_config/hashmap/thresholds/'
|
||||
'1f136864-be73-481f-b9be-4fbda2496f72')
|
||||
]
|
||||
self.http_client.assert_called(*expect)
|
||||
self.assertEqual(resource.threshold_id,
|
||||
'1f136864-be73-481f-b9be-4fbda2496f72')
|
||||
self.assertEqual(
|
||||
resource.service_id,
|
||||
'1329d62f-bd1c-4a88-a75a-07545e41e8d7'
|
||||
)
|
||||
self.assertEqual(
|
||||
resource.field_id,
|
||||
'c7c28d87-5103-4a05-af7f-e4d0891cb7fc'
|
||||
)
|
||||
self.assertEqual(resource.level, 30)
|
||||
self.assertEqual(resource.cost, 5.98)
|
||||
|
||||
def test_update_a_threshold(self):
|
||||
resource = self.mgr.get(
|
||||
threshold_id='1f136864-be73-481f-b9be-4fbda2496f72'
|
||||
)
|
||||
resource.cost = 5.99
|
||||
self.mgr.update(**resource.dirty_fields)
|
||||
expect = [
|
||||
'PUT', ('/v1/rating/module_config/hashmap/thresholds/'
|
||||
'1f136864-be73-481f-b9be-4fbda2496f72'),
|
||||
{u'threshold_id': u'1f136864-be73-481f-b9be-4fbda2496f72',
|
||||
u'cost': 5.99, u'map_type': u'flat',
|
||||
u'service_id': u'1329d62f-bd1c-4a88-a75a-07545e41e8d7',
|
||||
u'field_id': u'c7c28d87-5103-4a05-af7f-e4d0891cb7fc',
|
||||
u'level': 30}
|
||||
]
|
||||
self.http_client.assert_called(*expect)
|
||||
|
||||
def test_delete_a_threshold(self):
|
||||
self.mgr.delete(threshold_id='1f136864-be73-481f-b9be-4fbda2496f72')
|
||||
expect = [
|
||||
'DELETE', ('/v1/rating/module_config/hashmap/thresholds/'
|
||||
'1f136864-be73-481f-b9be-4fbda2496f72')
|
||||
]
|
||||
self.http_client.assert_called(*expect)
|
||||
|
@@ -110,3 +110,23 @@ class GroupManager(base.CrudManager):
|
||||
if recursive:
|
||||
url += "?recursive=True"
|
||||
return self._delete(url)
|
||||
|
||||
|
||||
class Threshold(base.Resource):
|
||||
key = 'threshold'
|
||||
|
||||
def __repr__(self):
|
||||
return "<hashmap.Threshold %s>" % self._info
|
||||
|
||||
|
||||
class ThresholdManager(base.CrudManager):
|
||||
resource_class = Threshold
|
||||
base_url = '/v1/rating/module_config/hashmap'
|
||||
key = 'threshold'
|
||||
collection_key = 'thresholds'
|
||||
|
||||
def group(self, threshold_id):
|
||||
url = ('%(base_url)s/thresholds/%(threshold_id)s/group' %
|
||||
{'base_url': self.base_url, 'threshold_id': threshold_id})
|
||||
out = self._get(url)
|
||||
return out
|
||||
|
@@ -29,3 +29,4 @@ class Client(object):
|
||||
self.fields = hashmap.FieldManager(self.http_client)
|
||||
self.mappings = hashmap.MappingManager(self.http_client)
|
||||
self.groups = hashmap.GroupManager(self.http_client)
|
||||
self.thresholds = hashmap.ThresholdManager(self.http_client)
|
||||
|
@@ -13,9 +13,15 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import functools
|
||||
|
||||
from oslo.utils import strutils
|
||||
|
||||
from cloudkittyclient.common import utils
|
||||
from cloudkittyclient import exc
|
||||
|
||||
_bool_strict = functools.partial(strutils.bool_from_string, strict=True)
|
||||
|
||||
|
||||
@utils.arg('-n', '--name',
|
||||
help='Service name',
|
||||
@@ -263,3 +269,146 @@ def do_hashmap_group_delete(cc, args={}):
|
||||
recursive=args.recursive)
|
||||
except exc.HTTPNotFound:
|
||||
raise exc.CommandError('Group not found: %s' % args.group_id)
|
||||
|
||||
|
||||
@utils.arg('-l', '--level',
|
||||
help='Threshold level',
|
||||
required=True)
|
||||
@utils.arg('-c', '--cost',
|
||||
help='Threshold cost',
|
||||
required=True)
|
||||
@utils.arg('-m', '--map-type',
|
||||
help='Threshold type (flat, rate)',
|
||||
required=False)
|
||||
@utils.arg('-s', '--service-id',
|
||||
help='Service id',
|
||||
required=False)
|
||||
@utils.arg('-f', '--field-id',
|
||||
help='Field id',
|
||||
required=False)
|
||||
@utils.arg('-g', '--group-id',
|
||||
help='Group id',
|
||||
required=False)
|
||||
def do_hashmap_threshold_create(cc, args={}):
|
||||
"""Create a ampping."""
|
||||
arg_to_field_mapping = {
|
||||
'level': 'level',
|
||||
'cost': 'cost',
|
||||
'map_type': 'map_type',
|
||||
'service_id': 'service_id',
|
||||
'field_id': 'field_id',
|
||||
'group_id': 'group_id',
|
||||
}
|
||||
fields = {}
|
||||
for k, v in vars(args).items():
|
||||
if k in arg_to_field_mapping:
|
||||
if v is not None:
|
||||
fields[arg_to_field_mapping.get(k, k)] = v
|
||||
out = cc.hashmap.thresholds.create(**fields)
|
||||
utils.print_dict(out.to_dict())
|
||||
|
||||
|
||||
@utils.arg('-t', '--threshold-id',
|
||||
help='Threshold id',
|
||||
required=True)
|
||||
@utils.arg('-l', '--level',
|
||||
help='Threshold level',
|
||||
required=False)
|
||||
@utils.arg('-c', '--cost',
|
||||
help='Threshold cost',
|
||||
required=False)
|
||||
@utils.arg('-m', '--map-type',
|
||||
help='Threshold type (flat, rate)',
|
||||
required=False)
|
||||
@utils.arg('-g', '--group-id',
|
||||
help='Group id',
|
||||
required=False)
|
||||
def do_hashmap_threshold_update(cc, args={}):
|
||||
"""Update a threshold."""
|
||||
arg_to_field_mapping = {
|
||||
'threshold_id': 'threshold_id',
|
||||
'cost': 'cost',
|
||||
'level': 'level',
|
||||
'map_type': 'map_type',
|
||||
'group_id': 'group_id',
|
||||
}
|
||||
try:
|
||||
threshold = cc.hashmap.thresholds.get(threshold_id=args.threshold_id)
|
||||
except exc.HTTPNotFound:
|
||||
raise exc.CommandError('Modules not found: %s' % args.counter_name)
|
||||
for k, v in vars(args).items():
|
||||
if k in arg_to_field_mapping:
|
||||
if v is not None:
|
||||
setattr(threshold, k, v)
|
||||
cc.hashmap.thresholds.update(**threshold.dirty_fields)
|
||||
|
||||
|
||||
@utils.arg('-s', '--service-id',
|
||||
help='Service id',
|
||||
required=False)
|
||||
@utils.arg('-f', '--field-id',
|
||||
help='Field id',
|
||||
required=False)
|
||||
@utils.arg('-g', '--group-id',
|
||||
help='Group id',
|
||||
required=False)
|
||||
@utils.arg('--no-group',
|
||||
type=_bool_strict, metavar='{True,False}',
|
||||
help='If True, list only orhpaned thresholds',
|
||||
required=False)
|
||||
def do_hashmap_threshold_list(cc, args={}):
|
||||
"""List thresholds."""
|
||||
if (args.group_id is None and
|
||||
args.service_id is None and args.field_id is None):
|
||||
raise exc.CommandError("Provide either group-id, service-id or "
|
||||
"field-id")
|
||||
try:
|
||||
thresholds = cc.hashmap.thresholds.list(service_id=args.service_id,
|
||||
field_id=args.field_id,
|
||||
group_id=args.group_id,
|
||||
no_group=args.no_group)
|
||||
except exc.HTTPNotFound:
|
||||
raise exc.CommandError('Threshold not found: %s' % args.counter_name)
|
||||
else:
|
||||
field_labels = ['Threshold id', 'Level', 'Cost',
|
||||
'Type', 'Field id',
|
||||
'Service id', 'Group id']
|
||||
fields = ['threshold_id', 'level', 'cost',
|
||||
'map_type', 'field_id',
|
||||
'service_id', 'group_id']
|
||||
utils.print_list(thresholds, fields, field_labels, sortby=0)
|
||||
|
||||
|
||||
@utils.arg('-t', '--threshold-id',
|
||||
help='Threshold uuid',
|
||||
required=True)
|
||||
def do_hashmap_threshold_delete(cc, args={}):
|
||||
"""Delete a threshold."""
|
||||
try:
|
||||
cc.hashmap.thresholds.delete(threshold_id=args.threshold_id)
|
||||
except exc.HTTPNotFound:
|
||||
raise exc.CommandError('Threshold not found: %s' % args.threshold_id)
|
||||
|
||||
|
||||
@utils.arg('-t', '--threshold-id',
|
||||
help='Threshold uuid',
|
||||
required=True)
|
||||
def do_hashmap_threshold_get(cc, args={}):
|
||||
"""Get a threshold."""
|
||||
try:
|
||||
threshold = cc.hashmap.thresholds.get(threshold_id=args.threshold_id)
|
||||
except exc.HTTPNotFound:
|
||||
raise exc.CommandError('Threshold not found: %s' % args.threshold_id)
|
||||
utils.print_dict(threshold.to_dict())
|
||||
|
||||
|
||||
@utils.arg('-t', '--threshold-id',
|
||||
help='Threshold uuid',
|
||||
required=True)
|
||||
def do_hashmap_threshold_group(cc, args={}):
|
||||
"""Get a threshold group."""
|
||||
try:
|
||||
threshold = cc.hashmap.thresholds.group(threshold_id=args.threshold_id)
|
||||
except exc.HTTPNotFound:
|
||||
raise exc.CommandError('Threshold not found: %s' % args.threshold_id)
|
||||
utils.print_dict(threshold.to_dict())
|
||||
|
Reference in New Issue
Block a user