summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRamanjaneya <ramanjieee@gmail.com>2015-07-07 18:59:28 +0530
committerJohn Schwarz <jschwarz@redhat.com>2015-08-26 16:32:21 +0300
commit31df9de28fe089af0c492b6becca5eb3d8f2676d (patch)
treec0f64c17625107bf1681923e3c3eddf00ab60b3d
parent002a0c73759d86d3b93d9d53ce5f832a1bb434b3 (diff)
downloadpython-neutronclient-31df9de28fe089af0c492b6becca5eb3d8f2676d.tar.gz
Support CLI changes for QoS (2/2).
This patch adds the command line support for QoS rules. DocImpact APIImpact Partially-Implements: blueprint quantum-qos-api Change-Id: Iea4dfa742f8005057f6caee8ab734649c0262d75 Co-Authored-By: vikram.choudhary <vikram.choudhary@huawei.com> Co-Authored-By: John Schwarz <jschwarz@redhat.com>
-rw-r--r--neutronclient/neutron/v2_0/qos/bandwidth_limit_rule.py107
-rwxr-xr-xneutronclient/neutron/v2_0/qos/policy.py10
-rw-r--r--neutronclient/neutron/v2_0/qos/rule.py58
-rw-r--r--neutronclient/shell.py18
-rw-r--r--neutronclient/tests/unit/qos/test_cli20_rule.py146
-rw-r--r--neutronclient/tests/unit/test_cli20.py2
-rw-r--r--neutronclient/v2_0/client.py44
7 files changed, 384 insertions, 1 deletions
diff --git a/neutronclient/neutron/v2_0/qos/bandwidth_limit_rule.py b/neutronclient/neutron/v2_0/qos/bandwidth_limit_rule.py
new file mode 100644
index 0000000..b0e1569
--- /dev/null
+++ b/neutronclient/neutron/v2_0/qos/bandwidth_limit_rule.py
@@ -0,0 +1,107 @@
+# Copyright 2015 Huawei Technologies India Pvt Ltd, Inc.
+# All Rights Reserved
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+
+from neutronclient.common import exceptions
+from neutronclient.i18n import _
+from neutronclient.neutron import v2_0 as neutronv20
+from neutronclient.neutron.v2_0.qos import rule as qos_rule
+
+
+BANDWIDTH_LIMIT_RULE_RESOURCE = 'bandwidth_limit_rule'
+
+
+def add_bandwidth_limit_arguments(parser):
+ parser.add_argument(
+ '--max-kbps',
+ help=_('max bandwidth in kbps.'))
+ parser.add_argument(
+ '--max-burst-kbps',
+ help=_('max burst bandwidth in kbps.'))
+
+
+def update_bandwidth_limit_args2body(parsed_args, body):
+ max_kbps = parsed_args.max_kbps
+ max_burst_kbps = parsed_args.max_burst_kbps
+ if not (max_kbps or max_burst_kbps):
+ raise exceptions.CommandError(_("Must provide max_kbps"
+ " or max_burst_kbps option."))
+ neutronv20.update_dict(parsed_args, body,
+ ['max_kbps', 'max_burst_kbps', 'tenant_id'])
+
+
+class CreateQoSBandwidthLimitRule(qos_rule.QosRuleMixin,
+ neutronv20.CreateCommand):
+ """Create a qos bandwidth limit rule."""
+
+ resource = BANDWIDTH_LIMIT_RULE_RESOURCE
+
+ def add_known_arguments(self, parser):
+ super(CreateQoSBandwidthLimitRule, self).add_known_arguments(parser)
+ add_bandwidth_limit_arguments(parser)
+
+ def args2body(self, parsed_args):
+ body = {}
+ update_bandwidth_limit_args2body(parsed_args, body)
+ return {'bandwidth_limit_rule': body}
+
+
+class ListQoSBandwidthLimitRules(qos_rule.QosRuleMixin,
+ neutronv20.ListCommand):
+ """List all qos bandwidth limit rules belonging to the specified policy."""
+
+ resource = BANDWIDTH_LIMIT_RULE_RESOURCE
+
+ _formatters = {}
+ pagination_support = True
+ sorting_support = True
+
+ def args2body(self, parsed_args):
+ body = {}
+ qos_rule.update_policy_args2body(parsed_args, body)
+ return {'qos_rule': body}
+
+
+class ShowQoSBandwidthLimitRule(qos_rule.QosRuleMixin, neutronv20.ShowCommand):
+ """Show information about the given qos bandwidth limit rule."""
+
+ resource = BANDWIDTH_LIMIT_RULE_RESOURCE
+ allow_names = False
+
+
+class UpdateQoSBandwidthLimitRule(qos_rule.QosRuleMixin,
+ neutronv20.UpdateCommand):
+ """Update the given qos bandwidth limit rule."""
+
+ resource = BANDWIDTH_LIMIT_RULE_RESOURCE
+ allow_names = False
+
+ def add_known_arguments(self, parser):
+ super(UpdateQoSBandwidthLimitRule, self).add_known_arguments(parser)
+ add_bandwidth_limit_arguments(parser)
+
+ def args2body(self, parsed_args):
+ body = {}
+ update_bandwidth_limit_args2body(parsed_args, body)
+ return {'bandwidth_limit_rule': body}
+
+
+class DeleteQoSBandwidthLimitRule(qos_rule.QosRuleMixin,
+ neutronv20.DeleteCommand):
+ """Delete a given qos bandwidth limit rule."""
+
+ resource = BANDWIDTH_LIMIT_RULE_RESOURCE
+ allow_names = False
diff --git a/neutronclient/neutron/v2_0/qos/policy.py b/neutronclient/neutron/v2_0/qos/policy.py
index fd6ffb1..6c680d2 100755
--- a/neutronclient/neutron/v2_0/qos/policy.py
+++ b/neutronclient/neutron/v2_0/qos/policy.py
@@ -14,6 +14,8 @@
# under the License.
#
+import os
+
from neutronclient.i18n import _
from neutronclient.neutron import v2_0 as neutronv20
@@ -72,6 +74,14 @@ class ShowQoSPolicy(neutronv20.ShowCommand):
resource = 'policy'
shadow_resource = 'qos_policy'
+ def format_output_data(self, data):
+ rules = []
+ for rule in data['policy'].get('rules', []):
+ rules.append("%s (type: %s)" % (rule['id'], rule['type']))
+ data['policy']['rules'] = os.linesep.join(rules)
+
+ super(ShowQoSPolicy, self).format_output_data(data)
+
class CreateQoSPolicy(neutronv20.CreateCommand):
"""Create a qos policy."""
diff --git a/neutronclient/neutron/v2_0/qos/rule.py b/neutronclient/neutron/v2_0/qos/rule.py
new file mode 100644
index 0000000..3b6510d
--- /dev/null
+++ b/neutronclient/neutron/v2_0/qos/rule.py
@@ -0,0 +1,58 @@
+# Copyright 2015 Huawei Technologies India Pvt Ltd, Inc.
+# All Rights Reserved
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+
+from neutronclient.i18n import _
+from neutronclient.neutron import v2_0 as neutronv20
+from neutronclient.neutron.v2_0.qos import policy as qos_policy
+
+
+def add_policy_argument(parser):
+ parser.add_argument(
+ 'policy', metavar='QOS_POLICY',
+ help=_('ID or name of the QoS policy.'))
+
+
+def add_rule_argument(parser):
+ parser.add_argument(
+ 'rule', metavar='QOS_RULE',
+ help=_('ID of the QoS rule.'))
+
+
+def update_policy_args2body(parsed_args, body):
+ neutronv20.update_dict(parsed_args, body, ['policy'])
+
+
+def update_rule_args2body(parsed_args, body):
+ neutronv20.update_dict(parsed_args, body, ['rule'])
+
+
+class QosRuleMixin(object):
+ def add_known_arguments(self, parser):
+ add_policy_argument(parser)
+
+ def set_extra_attrs(self, parsed_args):
+ self.parent_id = qos_policy.get_qos_policy_id(self.get_client(),
+ parsed_args.policy)
+
+
+class ListQoSRuleTypes(neutronv20.ListCommand):
+ """List available qos rule types."""
+
+ resource = 'rule_type'
+ shadow_resource = 'qos_rule_type'
+ pagination_support = True
+ sorting_support = True
diff --git a/neutronclient/shell.py b/neutronclient/shell.py
index 8554b28..cc50a95 100644
--- a/neutronclient/shell.py
+++ b/neutronclient/shell.py
@@ -72,7 +72,9 @@ from neutronclient.neutron.v2_0.nsx import networkgateway
from neutronclient.neutron.v2_0.nsx import qos_queue
from neutronclient.neutron.v2_0 import policyprofile
from neutronclient.neutron.v2_0 import port
+from neutronclient.neutron.v2_0.qos import bandwidth_limit_rule
from neutronclient.neutron.v2_0.qos import policy as qos_policy
+from neutronclient.neutron.v2_0.qos import rule as qos_rule
from neutronclient.neutron.v2_0 import quota
from neutronclient.neutron.v2_0 import rbac
from neutronclient.neutron.v2_0 import router
@@ -378,6 +380,22 @@ COMMAND_V2 = {
'qos-policy-create': qos_policy.CreateQoSPolicy,
'qos-policy-update': qos_policy.UpdateQoSPolicy,
'qos-policy-delete': qos_policy.DeleteQoSPolicy,
+ 'qos-bandwidth-limit-rule-create': (
+ bandwidth_limit_rule.CreateQoSBandwidthLimitRule
+ ),
+ 'qos-bandwidth-limit-rule-show': (
+ bandwidth_limit_rule.ShowQoSBandwidthLimitRule
+ ),
+ 'qos-bandwidth-limit-rule-list': (
+ bandwidth_limit_rule.ListQoSBandwidthLimitRules
+ ),
+ 'qos-bandwidth-limit-rule-update': (
+ bandwidth_limit_rule.UpdateQoSBandwidthLimitRule
+ ),
+ 'qos-bandwidth-limit-rule-delete': (
+ bandwidth_limit_rule.DeleteQoSBandwidthLimitRule
+ ),
+ 'qos-available-rule-types': qos_rule.ListQoSRuleTypes,
}
COMMANDS = {'2.0': COMMAND_V2}
diff --git a/neutronclient/tests/unit/qos/test_cli20_rule.py b/neutronclient/tests/unit/qos/test_cli20_rule.py
new file mode 100644
index 0000000..c2fe921
--- /dev/null
+++ b/neutronclient/tests/unit/qos/test_cli20_rule.py
@@ -0,0 +1,146 @@
+# Copyright 2015 Huawei Technologies India Pvt Ltd.
+# All Rights Reserved
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+import sys
+
+from neutronclient.neutron.v2_0.qos import bandwidth_limit_rule as bw_rule
+from neutronclient.neutron.v2_0.qos import rule as qos_rule
+from neutronclient.tests.unit import test_cli20
+
+
+class CLITestV20QoSRuleJSON(test_cli20.CLITestV20Base):
+ def setUp(self):
+ super(CLITestV20QoSRuleJSON, self).setUp()
+ self.res = 'bandwidth_limit_rule'
+ self.cmd_res = 'qos_bandwidth_limit_rule'
+ self.ress = 'bandwidth_limit_rules'
+ self.cmd_ress = 'qos_bandwidth_limit_rules'
+
+ def test_create_bandwidth_limit_rule_with_max_kbps(self):
+ cmd = bw_rule.CreateQoSBandwidthLimitRule(test_cli20.MyApp(sys.stdout),
+ None)
+ my_id = 'my-id'
+ max_kbps = '1337'
+ policy_id = 'policy_id'
+ args = ['--max-kbps', max_kbps, policy_id]
+ position_names = ['max_kbps']
+ position_values = [max_kbps]
+ self._test_create_resource(self.res, cmd, '', my_id, args,
+ position_names, position_values,
+ cmd_resource=self.cmd_res,
+ parent_id=policy_id)
+
+ def test_create_bandwidth_limit_rule_with_max_burst_kbps(self):
+ cmd = bw_rule.CreateQoSBandwidthLimitRule(test_cli20.MyApp(sys.stdout),
+ None)
+ my_id = 'my-id'
+ max_burst_kbps = '1337'
+ policy_id = 'policy_id'
+ args = ['--max-burst-kbps', max_burst_kbps, policy_id]
+ position_names = ['max_burst_kbps']
+ position_values = [max_burst_kbps]
+ self._test_create_resource(self.res, cmd, '', my_id, args,
+ position_names, position_values,
+ cmd_resource=self.cmd_res,
+ parent_id=policy_id)
+
+ def test_create_bandwidth_limit_rule_with_all_params(self):
+ cmd = bw_rule.CreateQoSBandwidthLimitRule(test_cli20.MyApp(sys.stdout),
+ None)
+ my_id = 'my-id'
+ max_kbps = '1337'
+ max_burst_kbps = '1337'
+ policy_id = 'policy_id'
+ args = ['--max-kbps', max_kbps,
+ '--max-burst-kbps', max_burst_kbps,
+ policy_id]
+ position_names = ['max_kbps', 'max_burst_kbps']
+ position_values = [max_kbps, max_burst_kbps]
+ self._test_create_resource(self.res, cmd, '', my_id, args,
+ position_names, position_values,
+ cmd_resource=self.cmd_res,
+ parent_id=policy_id)
+
+ def test_update_bandwidth_limit_rule_with_max_kbps(self):
+ cmd = bw_rule.UpdateQoSBandwidthLimitRule(test_cli20.MyApp(sys.stdout),
+ None)
+ my_id = 'my-id'
+ max_kbps = '1337'
+ policy_id = 'policy_id'
+ args = ['--max-kbps', max_kbps, my_id, policy_id]
+ self._test_update_resource(self.res, cmd, my_id, args,
+ {'max_kbps': max_kbps, },
+ cmd_resource=self.cmd_res,
+ parent_id=policy_id)
+
+ def test_update_bandwidth_limit_rule_with_max_burst_kbps(self):
+ cmd = bw_rule.UpdateQoSBandwidthLimitRule(test_cli20.MyApp(sys.stdout),
+ None)
+ my_id = 'my-id'
+ max_burst_kbps = '1337'
+ policy_id = 'policy_id'
+ args = ['--max-burst-kbps', max_burst_kbps,
+ my_id, policy_id]
+ self._test_update_resource(self.res, cmd, my_id, args,
+ {'max_burst_kbps': max_burst_kbps},
+ cmd_resource=self.cmd_res,
+ parent_id=policy_id)
+
+ def test_update_bandwidth_limit_rule_with_all_params(self):
+ cmd = bw_rule.UpdateQoSBandwidthLimitRule(test_cli20.MyApp(sys.stdout),
+ None)
+ my_id = 'my-id'
+ max_kbps = '1337'
+ max_burst_kbps = '1337'
+ policy_id = 'policy_id'
+ args = ['--max-kbps', max_kbps,
+ '--max-burst-kbps', max_burst_kbps,
+ my_id, policy_id]
+ self._test_update_resource(self.res, cmd, my_id, args,
+ {'max_kbps': max_kbps,
+ 'max_burst_kbps': max_burst_kbps},
+ cmd_resource=self.cmd_res,
+ parent_id=policy_id)
+
+ def test_delete_bandwidth_limit_rule(self):
+ cmd = bw_rule.DeleteQoSBandwidthLimitRule(test_cli20.MyApp(sys.stdout),
+ None)
+ my_id = 'my-id'
+ policy_id = 'policy_id'
+ args = [my_id, policy_id]
+ self._test_delete_resource(self.res, cmd, my_id, args,
+ cmd_resource=self.cmd_res,
+ parent_id=policy_id)
+
+ def test_show_bandwidth_limit_rule(self):
+ cmd = bw_rule.ShowQoSBandwidthLimitRule(test_cli20.MyApp(sys.stdout),
+ None)
+ policy_id = 'policy_id'
+ args = [self.test_id, policy_id]
+ self._test_show_resource(self.res, cmd, self.test_id, args,
+ [], cmd_resource=self.cmd_res,
+ parent_id=policy_id)
+
+ def test_list_qos_rule_types(self):
+ """qos_rule_types."""
+ resources = 'rule_types'
+ cmd_resources = 'qos_rule_types'
+ response_contents = [{'type': 'bandwidth_limit'}]
+ cmd = qos_rule.ListQoSRuleTypes(test_cli20.MyApp(sys.stdout),
+ None)
+ self._test_list_resources(resources, cmd, True,
+ response_contents=response_contents,
+ cmd_resources=cmd_resources)
diff --git a/neutronclient/tests/unit/test_cli20.py b/neutronclient/tests/unit/test_cli20.py
index 9e09d7a..94d979c 100644
--- a/neutronclient/tests/unit/test_cli20.py
+++ b/neutronclient/tests/unit/test_cli20.py
@@ -48,7 +48,7 @@ non_admin_status_resources = ['subnet', 'floatingip', 'security_group',
'metering_label_rule', 'net_partition',
'fox_socket', 'subnetpool',
'rbac_policy', 'address_scope',
- 'policy']
+ 'policy', 'bandwidth_limit_rule']
@contextlib.contextmanager
diff --git a/neutronclient/v2_0/client.py b/neutronclient/v2_0/client.py
index e521420..facc6d1 100644
--- a/neutronclient/v2_0/client.py
+++ b/neutronclient/v2_0/client.py
@@ -433,6 +433,10 @@ class Client(ClientBase):
rbac_policy_path = "/rbac-policies/%s"
qos_policies_path = "/qos/policies"
qos_policy_path = "/qos/policies/%s"
+ qos_bandwidth_limit_rules_path = "/qos/policies/%s/bandwidth_limit_rules"
+ qos_bandwidth_limit_rule_path = "/qos/policies/%s/bandwidth_limit_rules/%s"
+ qos_rule_types_path = "/qos/rule-types"
+ qos_rule_type_path = "/qos/rule-types/%s"
# API has no way to report plurals, so we have to hard code them
EXTED_PLURALS = {'routers': 'router',
@@ -468,6 +472,8 @@ class Client(ClientBase):
'address_scopes': 'address_scope',
'qos_policies': 'qos_policy',
'policies': 'policy',
+ 'bandwidth_limit_rules': 'bandwidth_limit_rule',
+ 'rule_types': 'rule_type',
}
@APIParamsCall
@@ -1693,6 +1699,44 @@ class Client(ClientBase):
"""Deletes the specified qos policy."""
return self.delete(self.qos_policy_path % qos_policy)
+ @APIParamsCall
+ def list_qos_rule_types(self, retrieve_all=True, **_params):
+ """List available qos rule types."""
+ return self.list('rule_types', self.qos_rule_types_path,
+ retrieve_all, **_params)
+
+ @APIParamsCall
+ def list_bandwidth_limit_rules(self, policy_id,
+ retrieve_all=True, **_params):
+ """Fetches a list of all qos rules for the given policy."""
+ return self.list('bandwidth_limit_rules',
+ self.qos_bandwidth_limit_rules_path % policy_id,
+ retrieve_all, **_params)
+
+ @APIParamsCall
+ def show_bandwidth_limit_rule(self, rule, policy, body=None):
+ """Creates a new bandwidth limit rule."""
+ return self.get(self.qos_bandwidth_limit_rule_path %
+ (policy, rule), body=body)
+
+ @APIParamsCall
+ def create_bandwidth_limit_rule(self, policy, body=None):
+ """Creates a new bandwidth limit rule."""
+ return self.post(self.qos_bandwidth_limit_rules_path % policy,
+ body=body)
+
+ @APIParamsCall
+ def update_bandwidth_limit_rule(self, rule, policy, body=None):
+ """Updates a bandwidth limit rule."""
+ return self.put(self.qos_bandwidth_limit_rule_path %
+ (policy, rule), body=body)
+
+ @APIParamsCall
+ def delete_bandwidth_limit_rule(self, rule, policy):
+ """Deletes a bandwidth limit rule."""
+ return self.delete(self.qos_bandwidth_limit_rule_path %
+ (policy, rule))
+
def __init__(self, **kwargs):
"""Initialize a new client for the Neutron v2.0 API."""
super(Client, self).__init__(**kwargs)