Remove the CLI code from the Neutron client.
This project no longer provides CLI support. All code has been removed. Please use openstack CLI instead This patch removes entry point for neutron CLI too, bash completion script and CLI related functional and unit tests but it still keeps neutronclient/neutron/v2_0 module as this is used by e.g. Nova. Co-Authored-By: Slawek Kaplonski <skaplons@redhat.com> Closes-Bug: #2003861 Change-Id: I5b6c735d1ff931d7991a42b262e7faa47b75edeb
This commit is contained in:
parent
3071dfbd0f
commit
52653c95e0
52
.zuul.yaml
52
.zuul.yaml
@ -7,12 +7,6 @@
|
||||
- lib-forward-testing-python3
|
||||
- release-notes-jobs-python3
|
||||
- openstackclient-plugin-jobs
|
||||
check:
|
||||
jobs:
|
||||
- neutronclient-functional
|
||||
gate:
|
||||
jobs:
|
||||
- neutronclient-functional
|
||||
experimental:
|
||||
jobs:
|
||||
- neutronclient-grenade-neutron-lib:
|
||||
@ -20,52 +14,6 @@
|
||||
- ^(test-|)requirements.txt$
|
||||
- ^setup.cfg$
|
||||
|
||||
- job:
|
||||
name: neutronclient-functional
|
||||
parent: devstack-tox-functional
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- ^releasenotes/.*$
|
||||
required-projects:
|
||||
- openstack/python-neutronclient
|
||||
- openstack/neutron
|
||||
- openstack/neutron-vpnaas
|
||||
vars:
|
||||
tox_envlist: functional
|
||||
devstack_services:
|
||||
# NOTE: neutronclient.tests.functional.base.ClientTestBase does not
|
||||
# support HTTPS endpoints now, so tls-proxy needs to be disabled.
|
||||
tls-proxy: false
|
||||
# Disable OVN services
|
||||
br-ex-tcpdump: false
|
||||
br-int-flows: false
|
||||
ovn-controller: false
|
||||
ovn-northd: false
|
||||
ovs-vswitchd: false
|
||||
ovsdb-server: false
|
||||
q-ovn-metadata-agent: false
|
||||
# Neutron services
|
||||
q-agt: true
|
||||
q-dhcp: true
|
||||
q-l3: true
|
||||
q-meta: true
|
||||
neutron-network-segment-range: true
|
||||
neutron-segments: true
|
||||
q-metering: true
|
||||
q-qos: true
|
||||
neutron-tag-ports-during-bulk-creation: true
|
||||
neutron-conntrack-helper: true
|
||||
devstack_localrc:
|
||||
USE_PYTHON3: true
|
||||
LIBS_FROM_GIT: python-neutronclient
|
||||
Q_AGENT: openvswitch
|
||||
Q_ML2_TENANT_NETWORK_TYPE: vxlan
|
||||
Q_ML2_PLUGIN_MECHANISM_DRIVERS: openvswitch
|
||||
devstack_plugins:
|
||||
neutron: https://opendev.org/openstack/neutron
|
||||
neutron-vpnaas: https://opendev.org/openstack/neutron-vpnaas
|
||||
|
||||
- job:
|
||||
name: neutronclient-grenade-neutron-lib
|
||||
parent: grenade
|
||||
|
@ -15,8 +15,7 @@ Python bindings to the Neutron API
|
||||
:alt: Latest Version
|
||||
|
||||
This is a client library for Neutron built on the Neutron API. It
|
||||
provides a Python API (the ``neutronclient`` module) and a command-line tool
|
||||
(``neutron``).
|
||||
provides a Python API (the ``neutronclient`` module).
|
||||
|
||||
* License: Apache License, Version 2.0
|
||||
* `PyPi`_ - package installation
|
||||
|
@ -24,10 +24,9 @@
|
||||
Using CLI
|
||||
=========
|
||||
|
||||
There are two CLIs which support the Networking API:
|
||||
`OpenStackClient (OSC)
|
||||
There is `OpenStackClient (OSC)
|
||||
<https://docs.openstack.org/python-openstackclient/latest/>`__
|
||||
and :doc:`neutron CLI <neutron>` (deprecated).
|
||||
which support the Networking API
|
||||
|
||||
OpenStackClient
|
||||
---------------
|
||||
@ -49,15 +48,8 @@ neutron CLI
|
||||
|
||||
.. warning::
|
||||
|
||||
neutron CLI is now deprecated and will be removed in the future.
|
||||
Use openstack CLI instead. See `openstack CLI command list
|
||||
neutron CLI is removed. Use openstack CLI instead. See `openstack CLI command list
|
||||
<https://docs.openstack.org/python-openstackclient/latest/cli/command-list.html>`__
|
||||
and :doc:`its extensions for advanced networking services <osc_plugins>`.
|
||||
The command mapping from neutron CLI to openstack CLI is available
|
||||
`here <https://docs.openstack.org/python-openstackclient/latest/cli/decoder.html#neutron-cli>`__.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
neutron CLI guide <neutron>
|
||||
neutron CLI reference <neutron-reference>
|
||||
|
@ -1,48 +0,0 @@
|
||||
..
|
||||
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.
|
||||
|
||||
|
||||
Convention for heading levels in Neutron devref:
|
||||
======= Heading 0 (reserved for the title in a document)
|
||||
------- Heading 1
|
||||
~~~~~~~ Heading 2
|
||||
+++++++ Heading 3
|
||||
''''''' Heading 4
|
||||
(Avoid deeper levels because they do not render well.)
|
||||
|
||||
=====================
|
||||
neutron CLI reference
|
||||
=====================
|
||||
|
||||
.. warning::
|
||||
|
||||
neutron CLI is now deprecated and will be removed in the future.
|
||||
Use openstack CLI instead. See `openstack CLI command list
|
||||
<https://docs.openstack.org/python-openstackclient/latest/cli/command-list.html>`__
|
||||
and :doc:`its extensions for advanced networking services <osc_plugins>`.
|
||||
The command mapping from neutron CLI to openstack CLI is available
|
||||
`here <https://docs.openstack.org/python-openstackclient/latest/cli/decoder.html#neutron-cli>`__.
|
||||
|
||||
neutron usage
|
||||
-------------
|
||||
|
||||
.. autoprogram-cliff:: neutronclient.shell.NeutronShell
|
||||
:application: neutron
|
||||
:arguments: 2.0
|
||||
|
||||
neutron API v2.0 commands
|
||||
-------------------------
|
||||
|
||||
.. autoprogram-cliff:: neutron.cli.v2
|
||||
:application: neutron
|
||||
|
@ -1,412 +0,0 @@
|
||||
..
|
||||
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.
|
||||
|
||||
|
||||
Convention for heading levels in Neutron devref:
|
||||
======= Heading 0 (reserved for the title in a document)
|
||||
------- Heading 1
|
||||
~~~~~~~ Heading 2
|
||||
+++++++ Heading 3
|
||||
''''''' Heading 4
|
||||
(Avoid deeper levels because they do not render well.)
|
||||
|
||||
Using neutron CLI
|
||||
=================
|
||||
|
||||
The **neutron** shell utility interacts with OpenStack Networking API from the
|
||||
command-line. It supports the entire features of OpenStack Networking API.
|
||||
|
||||
.. warning::
|
||||
|
||||
neutron CLI is now deprecated and will be removed in the future.
|
||||
Use openstack CLI instead. See `openstack CLI command list
|
||||
<https://docs.openstack.org/python-openstackclient/latest/cli/command-list.html>`__
|
||||
and :doc:`its extensions for advanced networking services <osc_plugins>`.
|
||||
The command mapping from neutron CLI to openstack CLI is available
|
||||
`here <https://docs.openstack.org/python-openstackclient/latest/cli/decoder.html#neutron-cli>`__.
|
||||
|
||||
Basic Usage
|
||||
-----------
|
||||
|
||||
In order to use the CLI, you must provide your OpenStack username, password,
|
||||
project, domain information for both user and project, and auth endpoint. Use
|
||||
the corresponding configuration options (``--os-username``, ``--os-password``,
|
||||
``--os-project-name``, ``--os-user-domain-id``, ``os-project-domain-id``, and
|
||||
``--os-auth-url``), but it is easier to set them in environment variables.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
export OS_USERNAME=user
|
||||
export OS_PASSWORD=pass
|
||||
export OS_PROJECT_NAME=project
|
||||
export OS_USER_DOMAIN_ID=default
|
||||
export OS_PROJECT_DOMAIN_ID=default
|
||||
export OS_AUTH_URL=http://auth.example.com:5000/v3
|
||||
|
||||
If you are using Identity v2.0 API (DEPRECATED), you don't need to pass domain
|
||||
information.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
export OS_USERNAME=user
|
||||
export OS_PASSWORD=pass
|
||||
export OS_TENANT_NAME=tenant
|
||||
export OS_AUTH_URL=http://auth.example.com:5000/v2.0
|
||||
|
||||
Once you've configured your authentication parameters, you can run **neutron**
|
||||
commands. All commands take the form of:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
neutron <command> [arguments...]
|
||||
|
||||
Run **neutron help** to get a full list of all possible commands, and run
|
||||
**neutron help <command>** to get detailed help for that command.
|
||||
|
||||
Using with os-client-config
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
`os-client-config <https://docs.openstack.org/os-client-config/latest/>`_
|
||||
provides more convenient way to manage a collection of client configurations
|
||||
and you can easily switch multiple OpenStack-based configurations.
|
||||
|
||||
To use os-client-config, you first need to prepare
|
||||
``~/.config/openstack/clouds.yaml`` like the following.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
clouds:
|
||||
devstack:
|
||||
auth:
|
||||
auth_url: http://auth.example.com:5000
|
||||
password: your-secret
|
||||
project_domain_id: default
|
||||
project_name: demo
|
||||
user_domain_id: default
|
||||
username: demo
|
||||
identity_api_version: '3'
|
||||
region_name: RegionOne
|
||||
devstack-admin:
|
||||
auth:
|
||||
auth_url: http://auth.example.com:35357
|
||||
password: another-secret
|
||||
project_domain_id: default
|
||||
project_name: admin
|
||||
user_domain_id: default
|
||||
username: admin
|
||||
identity_api_version: '3'
|
||||
region_name: RegionOne
|
||||
|
||||
Then, you need to specify a configuration name defined in the above clouds.yaml.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
export OS_CLOUD=devstack
|
||||
|
||||
For more detail information, see the
|
||||
`os-client-config <https://docs.openstack.org/os-client-config/latest/>`_
|
||||
documentation.
|
||||
|
||||
Using with keystone token
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The command-line tool will attempt to re-authenticate using your provided
|
||||
credentials for every request. You can override this behavior by manually
|
||||
supplying an auth token using ``--os-url`` and ``--os-auth-token``. You can
|
||||
alternatively set these environment variables.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
export OS_URL=http://neutron.example.org:9696/
|
||||
export OS_TOKEN=3bcc3d3a03f44e3d8377f9247b0ad155
|
||||
|
||||
Using noauth mode
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
If neutron server does not require authentication, besides these two arguments
|
||||
or environment variables (We can use any value as token.), we need manually
|
||||
supply ``--os-auth-strategy`` or set the environment variable.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
export OS_AUTH_STRATEGY=noauth
|
||||
|
||||
Display options
|
||||
---------------
|
||||
|
||||
Filtering
|
||||
~~~~~~~~~
|
||||
|
||||
Neutron API supports filtering in the listing operation.
|
||||
**neutron** CLI supports this feature too.
|
||||
|
||||
To specify a filter in ``*-list`` command, you need to pass a pair of an
|
||||
attribute name and an expected value with the format of ``--<attribute> <value>``.
|
||||
The example below retrieves ports owned by compute instances.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ neutron port-list --device_owner network:dhcp
|
||||
+--------------------------------------+------+-------------------+-------------------------------------------------------------------------------------------------------------+
|
||||
| id | name | mac_address | fixed_ips |
|
||||
+--------------------------------------+------+-------------------+-------------------------------------------------------------------------------------------------------------+
|
||||
| 8953d683-29ad-4be3-b73f-060727c7849b | | fa:16:3e:4b:9e:0a | {"subnet_id": "6b832dfe-f271-443c-abad-629961414a73", "ip_address": "10.0.0.2"} |
|
||||
| | | | {"subnet_id": "cdcc616b-0cff-482f-96f5-06fc63d21247", "ip_address": "fd12:877c:1d66:0:f816:3eff:fe4b:9e0a"} |
|
||||
+--------------------------------------+------+-------------------+-------------------------------------------------------------------------------------------------------------+
|
||||
|
||||
You can also specify multiple filters.
|
||||
The example below retrieves security group rules applied to IPv4 traffic
|
||||
which belongs to a security group bfa493f9-2b03-46d2-8399-b9b038a53bc1.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ neutron security-group-rule-list --security-group-id bfa493f9-2b03-46d2-8399-b9b038a53bc1 --ethertype IPv4
|
||||
+--------------------------------------+----------------+-----------+-----------+---------------+-----------------+
|
||||
| id | security_group | direction | ethertype | protocol/port | remote |
|
||||
+--------------------------------------+----------------+-----------+-----------+---------------+-----------------+
|
||||
| 65489805-0400-4bce-9bd9-16a81952263c | default | egress | IPv4 | any | any |
|
||||
| 9429f336-4947-4643-bbd9-24528cc65648 | default | ingress | IPv4 | any | default (group) |
|
||||
+--------------------------------------+----------------+-----------+-----------+---------------+-----------------+
|
||||
|
||||
.. note::
|
||||
|
||||
Looking up UUID from name is not supported when specifying a filter.
|
||||
You need to use UUID to specify a specific resource.
|
||||
|
||||
.. note::
|
||||
|
||||
Filtering for dictionary or list attributes is not supported.
|
||||
|
||||
Changing displayed columns
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you want displayed columns in a list operation, ``-c`` option can be used.
|
||||
``-c`` can be specified multiple times and the column order will be same as
|
||||
the order of ``-c`` options.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ neutron port-list -c id -c device_owner -c fixed_ips
|
||||
+--------------------------------------+--------------------------+-------------------------------------------------------------------------------------------------------------+
|
||||
| id | device_owner | fixed_ips |
|
||||
+--------------------------------------+--------------------------+-------------------------------------------------------------------------------------------------------------+
|
||||
| 41ca1b9b-4bbd-4aa8-bcaa-31d3d5704205 | network:router_interface | {"subnet_id": "6b832dfe-f271-443c-abad-629961414a73", "ip_address": "10.0.0.1"} |
|
||||
| 8953d683-29ad-4be3-b73f-060727c7849b | network:dhcp | {"subnet_id": "6b832dfe-f271-443c-abad-629961414a73", "ip_address": "10.0.0.2"} |
|
||||
| | | {"subnet_id": "cdcc616b-0cff-482f-96f5-06fc63d21247", "ip_address": "fd12:877c:1d66:0:f816:3eff:fe4b:9e0a"} |
|
||||
| a9da29f8-4504-4526-a5ce-cd3624fbd173 | neutron:LOADBALANCER | {"subnet_id": "6b832dfe-f271-443c-abad-629961414a73", "ip_address": "10.0.0.3"} |
|
||||
| | | {"subnet_id": "cdcc616b-0cff-482f-96f5-06fc63d21247", "ip_address": "fd12:877c:1d66:0:f816:3eff:feb1:ab71"} |
|
||||
| d6a1ff96-0a99-416f-a4d6-65d9614cf64e | compute:nova | {"subnet_id": "6b832dfe-f271-443c-abad-629961414a73", "ip_address": "10.0.0.4"} |
|
||||
| | | {"subnet_id": "cdcc616b-0cff-482f-96f5-06fc63d21247", "ip_address": "fd12:877c:1d66:0:f816:3eff:fe2c:348e"} |
|
||||
| f4789225-26d0-409f-8047-82d2c7a87a95 | network:router_interface | {"subnet_id": "cdcc616b-0cff-482f-96f5-06fc63d21247", "ip_address": "fd12:877c:1d66::1"} |
|
||||
+--------------------------------------+--------------------------+-------------------------------------------------------------------------------------------------------------+
|
||||
|
||||
.. _cli_extra_arguments:
|
||||
|
||||
Extra arguments for create/update operation
|
||||
-------------------------------------------
|
||||
|
||||
**neutron** CLI has a mechanism called the *extra arguments* for ``*-create``
|
||||
and ``*-update`` commands. It allows users to specify a set of *unknown
|
||||
options* which are not defined as options and not shown in the help text.
|
||||
**Unknown options MUST be placed at the end of the command line.**
|
||||
*unknown options* will be directly passed to the API layer. By this mechanism,
|
||||
you can pass an attribute which is not defined in the upstream **neutron**
|
||||
CLI. For example, when you are developing a new feature which add a new
|
||||
attribute to an existing resource, it is useful because we can test your
|
||||
feature without changing the existing neutron CLI.
|
||||
|
||||
For example, if you run the following command::
|
||||
|
||||
neutron resource-update <ID> --key1 value1 --key2 value2
|
||||
|
||||
where ``resource`` is some resource name and ``--key1`` and ``--key2`` are
|
||||
unknown options, then the following JSON will be sent to the neutron API::
|
||||
|
||||
PUT /v2.0/resources/<ID>
|
||||
|
||||
{
|
||||
"resource": {
|
||||
"key2": "value2",
|
||||
"key1": "value1"
|
||||
}
|
||||
}
|
||||
|
||||
Key interpretation
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This means an option name (``--key1`` in this case) must be one of valid
|
||||
resources of a corresponding resource. An option name ``--foo_bar`` is
|
||||
recognized as an attribute name ``foo_bar``. ``--foo-bar`` is also interpreted
|
||||
as an attribute name ``foo_bar``.
|
||||
|
||||
Value interpretation
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
By default, if the number of values is 1, the option value is interpreted as a
|
||||
string and is passed to the API layer as specified in a command-line.
|
||||
|
||||
If the number of values is greater than 1, the option value is interpreted as a
|
||||
list and the result in the API layer will be same as when specifying a list as
|
||||
described below.
|
||||
|
||||
neutron resource-update <ID> --key1 val1 val2 val3 --key2 val4
|
||||
|
||||
In the above example, a value of ``key1`` is interpreted as
|
||||
``["val1", "val2", "val3"]`` and a value of ``key2`` is interpreted
|
||||
as ``val4``.
|
||||
|
||||
The extra argument mechanism supports more complex value like a list or a dict.
|
||||
|
||||
Specify a list value
|
||||
++++++++++++++++++++
|
||||
|
||||
A command-line::
|
||||
|
||||
neutron resource-update <ID> --key list=true val1 val2 val3
|
||||
|
||||
will send the following in the API layer::
|
||||
|
||||
{
|
||||
"key": [
|
||||
"val1",
|
||||
"val2",
|
||||
"val3"
|
||||
]
|
||||
}
|
||||
|
||||
.. note::
|
||||
|
||||
If you want to specify a list value, it is recommended to specify
|
||||
``list=true``. When ``list=true`` is specified, specified values are
|
||||
interpreted as a list even regardless of the number of values.
|
||||
|
||||
If ``list=true`` is not specified, specified values are interpreted
|
||||
depends on the number of values how. If the number of values is more than 2,
|
||||
the specified values are interpreted as a list. If 1, the value
|
||||
is interpreted as a string.
|
||||
|
||||
Specify a dict value
|
||||
++++++++++++++++++++
|
||||
|
||||
A command-line::
|
||||
|
||||
neutron resource-update <ID> --key type=dict key1=val1,key2=val2,key3=val3
|
||||
|
||||
will send the following in the API layer::
|
||||
|
||||
{
|
||||
"key": {
|
||||
"key1": "val1",
|
||||
"key2": "val2",
|
||||
"key3": "val3"
|
||||
}
|
||||
}
|
||||
|
||||
.. note::
|
||||
|
||||
``type=bool True/False`` and ``type=int 10`` are also supported.
|
||||
|
||||
Specify a list of dicts
|
||||
+++++++++++++++++++++++
|
||||
|
||||
A command-line::
|
||||
|
||||
neutron resource-update <ID> --key type=dict list=true key1=val1 key2=val2 key3=val3
|
||||
|
||||
will send the following in the API layer::
|
||||
|
||||
{
|
||||
"key": [
|
||||
{"key1": "val1"},
|
||||
{"key2": "val2"},
|
||||
{"key3": "val3"}
|
||||
]
|
||||
}
|
||||
|
||||
Passing None as a value
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
There is a case where we would like to pass ``None`` (``null`` in JSON)
|
||||
in the API layer. To do this::
|
||||
|
||||
neutron resource-update <ID> --key action=clear
|
||||
|
||||
The following body will be in the API layer::
|
||||
|
||||
{"key": null}
|
||||
|
||||
.. note::
|
||||
|
||||
If ``action=clear`` is specified, ``list=true`` or ``type=dict`` is ignored.
|
||||
It means when ``action=clear`` is specified ``None`` is always sent.
|
||||
|
||||
Debugging
|
||||
---------
|
||||
|
||||
Display API-level communication
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
``-v`` (or ``--verbose``, ``--debug``) option displays a detail interaction
|
||||
with your neutron server. It is useful to debug what happens in the API level.
|
||||
|
||||
Here is an sample output of ``net-show`` command.
|
||||
|
||||
The first line show what parameters are recognized by neutronclient.
|
||||
It is sometimes useful to check if command-line parameters you specify are recognized properly.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ neutron -v net-show mynetwork
|
||||
DEBUG: neutronclient.neutron.v2_0.network.ShowNetwork get_data(Namespace(columns=[], fields=[], formatter='table', id=u'mynetwork', max_width=0, noindent=False, prefix='', request_format='json', show_details=False, variables=[]))
|
||||
|
||||
Next, neutronclient sends an authentication request to keystone to get a token
|
||||
which is used in further operations.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
DEBUG: keystoneauth.session REQ: curl -g -i -X GET http://172.16.18.47:5000 -H "Accept: application/json" -H "User-Agent: keystoneauth1"
|
||||
DEBUG: keystoneauth.session RESP: [300] Content-Length: 593 Vary: X-Auth-Token Keep-Alive: timeout=5, max=100 Server: Apache/2.4.7 (Ubuntu) Connection: Keep-Alive Date: Fri, 27 Nov 2015 20:10:54 GMT Content-Type: application/json
|
||||
RESP BODY: {"versions": {"values": [{"status": "stable", "updated": "2015-03-30T00:00:00Z", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}], "id": "v3.4", "links": [{"href": "http://172.16.18.47:5000/v3/", "rel": "self"}]}, {"status": "stable", "updated": "2014-04-17T00:00:00Z", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v2.0+json"}], "id": "v2.0", "links": [{"href": "http://172.16.18.47:5000/v2.0/", "rel": "self"}, {"href": "http://docs.openstack.org/", "type": "text/html", "rel": "describedby"}]}]}}
|
||||
|
||||
DEBUG: keystoneauth.identity.v3.base Making authentication request to http://172.16.18.47:5000/v3/auth/tokens
|
||||
|
||||
Neutronclient looks up a network ID corresponding to a given network name.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
DEBUG: keystoneauth.session REQ: curl -g -i -X GET http://172.16.18.47:9696/v2.0/networks.json?fields=id&name=mynetwork -H "User-Agent: python-neutronclient" -H "Accept: application/json" -H "X-Auth-Token: {SHA1}39300e7398d53a02afd183f13cb6afaef95ec4e5"
|
||||
DEBUG: keystoneauth.session RESP: [200] Date: Fri, 27 Nov 2015 20:10:55 GMT Connection: keep-alive Content-Type: application/json; charset=UTF-8 Content-Length: 62 X-Openstack-Request-Id: req-ccebf6e4-4f52-4874-a1ab-5499abcba378
|
||||
RESP BODY: {"networks": [{"id": "3698d3c7-d581-443e-bf86-53c4e3a738f7"}]}
|
||||
|
||||
Finally, neutronclient retrieves a detail of a given network using the resolved ID.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
DEBUG: keystoneauth.session REQ: curl -g -i -X GET http://172.16.18.47:9696/v2.0/networks/3698d3c7-d581-443e-bf86-53c4e3a738f7.json -H "User-Agent: python-neutronclient" -H "Accept: application/json" -H "X-Auth-Token: {SHA1}39300e7398d53a02afd183f13cb6afaef95ec4e5"
|
||||
DEBUG: keystoneauth.session RESP: [200] Date: Fri, 27 Nov 2015 20:10:55 GMT Connection: keep-alive Content-Type: application/json; charset=UTF-8 Content-Length: 272 X-Openstack-Request-Id: req-261add00-d6d3-4ea7-becc-105b60ac7369
|
||||
RESP BODY: {"network": {"status": "ACTIVE", "subnets": [], "name": "mynetwork", "admin_state_up": true, "tenant_id": "8f0ebf767043483a987736c8c684178d", "mtu": 0, "router:external": false, "shared": false, "port_security_enabled": true, "id": "3698d3c7-d581-443e-bf86-53c4e3a738f7"}}
|
||||
|
||||
+-----------------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+-----------------------+--------------------------------------+
|
||||
| admin_state_up | True |
|
||||
| id | 3698d3c7-d581-443e-bf86-53c4e3a738f7 |
|
||||
| mtu | 0 |
|
||||
| name | mynetwork |
|
||||
| port_security_enabled | True |
|
||||
| router:external | False |
|
||||
| shared | False |
|
||||
| status | ACTIVE |
|
||||
| subnets | |
|
||||
| tenant_id | 8f0ebf767043483a987736c8c684178d |
|
||||
+-----------------------+--------------------------------------+
|
@ -1,263 +0,0 @@
|
||||
..
|
||||
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.
|
||||
|
||||
|
||||
Convention for heading levels in Neutron devref:
|
||||
======= Heading 0 (reserved for the title in a document)
|
||||
------- Heading 1
|
||||
~~~~~~~ Heading 2
|
||||
+++++++ Heading 3
|
||||
''''''' Heading 4
|
||||
(Avoid deeper levels because they do not render well.)
|
||||
|
||||
CLI Option Guideline
|
||||
====================
|
||||
|
||||
This document describes the conventions of neutron CLI options.
|
||||
|
||||
General conventions
|
||||
-------------------
|
||||
|
||||
#. Option names should be delimited by a hyphen instead of a underscore.
|
||||
This is the common guidelines across all OpenStack CLIs.
|
||||
|
||||
* Good: ``--ip-version``
|
||||
* Not Good: ``--ip_version``
|
||||
|
||||
#. Use at least one required option for ``*-create`` command. If all options
|
||||
are optional, we typically use ``name`` field as a required option.
|
||||
|
||||
#. When you need to specify an ID of a resource, it is better to provide
|
||||
another way to specify the resource like ``name`` or other reasonable field.
|
||||
|
||||
#. If an attribute name in API is ``foo_id``, the corresponding option
|
||||
should be ``--foo`` instead of ``--foo-id``.
|
||||
|
||||
* It is because we usually support ID and ``name`` to specify a resource.
|
||||
|
||||
#. Do not use ``nargs='?'`` without a special reason.
|
||||
|
||||
* The behavior of ``nargs='?'`` option for python argparse is
|
||||
bit tricky and may lead to unexpected option parsing different
|
||||
from the help message. The detail is described in the
|
||||
:ref:`Background section <background-nargs>` below.
|
||||
|
||||
#. (option) Avoid using positional options as much as possible.
|
||||
|
||||
* Positional arguments should be limited to attributes which will
|
||||
be required in the long future.
|
||||
|
||||
#. We honor existing options and should keep compatibilities when adding or
|
||||
changing options.
|
||||
|
||||
Options for boolean value
|
||||
-------------------------
|
||||
|
||||
Use the form of ``--option-name {True|False}``.
|
||||
|
||||
* For a new option, it is recommended.
|
||||
* It is suggested to use ``common.utils.add_boolean_argument`` in an
|
||||
implementation. It allows ``true``/``false`` in addition to ``True``/``False``.
|
||||
* For existing options, migration to the recommended form is not necessarily
|
||||
required. All backward-compatibility should be kept without reasonable
|
||||
reasons.
|
||||
|
||||
Options for dict value
|
||||
----------------------
|
||||
|
||||
Some API attributes take a dictionary.
|
||||
|
||||
``--foo key1=val1,key2=val2`` is usually used.
|
||||
|
||||
This means ``{"key1": "val1", "key2": "val2"}`` is passed in the API layer.
|
||||
|
||||
Examples:
|
||||
|
||||
* ``--host-route destination=CIDR,nexthop=IP_ADDR`` for a subnet
|
||||
* ``--fixed-ip subnet_id=SUBNET,ip_address=IP_ADDR`` for a port.
|
||||
|
||||
Options for list value
|
||||
----------------------
|
||||
|
||||
Some attributes take a list.
|
||||
|
||||
In this case, we usually use:
|
||||
|
||||
* Define an option per element (Use a singular form as an option name)
|
||||
* Allow to specify the option multiple times
|
||||
|
||||
For Example, **port-create** has ``--security-group`` option.
|
||||
``--security-group SG1 --security-group SG2`` generates
|
||||
``{"security_groups: ["SG1", "SG2"]}`` in the API layer.
|
||||
|
||||
This convention applies to a case of a list of dict.
|
||||
``--allocation-pool`` and ``--host-route`` for a subnet are examples.
|
||||
|
||||
Compatibility with extra arguments
|
||||
----------------------------------
|
||||
|
||||
*extra arguments* supports various types of option specifications.
|
||||
At least the following patterns needs to be considered when defining
|
||||
a new option. For more detail, see :ref:`cli_extra_arguments`.
|
||||
|
||||
* Normal options with value
|
||||
* Boolean options : ``--foo True``, ``--bar=False``
|
||||
* List options : ``--bars list=true val1 val2``, ``--bars val1 val2``
|
||||
* Dict options : ``--foo type=dict key1=va1,key2=val2``
|
||||
* List of Dict options : ``--bars list=true type=dict key1=val1,key2=val2 key3=val3,key4=val4``
|
||||
* ``action=clear``
|
||||
|
||||
For normal options with value, there are four patterns to specify an option
|
||||
as extra arguments.
|
||||
|
||||
* ``--admin-state-up True`` (a space between option name and value)
|
||||
* ``--admin-state-up=True`` (= between option name and value)
|
||||
* ``--admin_state_up True`` (underscore is used as delimiter)
|
||||
* ``--admin_state_up=True`` (underscore is used as delimiter)
|
||||
|
||||
.. _background:
|
||||
|
||||
Background
|
||||
----------
|
||||
|
||||
There are a lot of opinions on which form of options are better or not.
|
||||
This section tries to capture the reason of the current choice.
|
||||
|
||||
Use at least one required option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
As a convention, **neutron** CLI requires one required argument.
|
||||
|
||||
If all options are optional in the API level and we have ``name`` field,
|
||||
we usually use ``name`` as a required parameter.
|
||||
Requiring at least one argument has the following benefits:
|
||||
|
||||
* If we run ``neutron *-create`` without a required argument, we will have a
|
||||
brief help message without detail option help. It is convenient.
|
||||
* We can avoid miss operation by just hitting ``neutron *-create``.
|
||||
Requiring at least one parameter is a good balance.
|
||||
|
||||
Even though we can change this convention to allow to create a resource
|
||||
without ``name`` field, it will bring confusions to existing users.
|
||||
|
||||
There may be opinion that it is inconsistent with API level requirement
|
||||
or Horizon behavior, but even if neutron CLI requires ``name`` field
|
||||
there is no bad impact on regular users. Considering possible confusion
|
||||
if we change it, it looks better to keep it as-is.
|
||||
|
||||
Options for Boolean value
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* ``--enable-foo``/``--disable-foo`` or similar patterns (including
|
||||
``--admin-state-down``) is not suggested because we need two exclusive
|
||||
options for one attribute in REST API. It is meaningless.
|
||||
|
||||
* It is not recommended to have an option only to specify non-default value.
|
||||
For example, we have ``--shared`` or ``--admin-state-down`` options for
|
||||
net-create. This form only works for ``*-create`` and does not work for
|
||||
``*-update``. It leads to having different options for ``*-create`` and
|
||||
``*-update``.
|
||||
|
||||
* A flag option like ``--enable-dhcp`` (without value) also has a problem when
|
||||
considering the compatibility with *extra argument*. We can specify
|
||||
``-enable-dhcp True/False`` or ``--enable-dhcp=True/False`` in the *extra
|
||||
argument* mechanism. If we introduce ``--enable-dhcp`` (without value),
|
||||
the form of ``-enable-dhcp True/False`` cannot be used now.
|
||||
This is another reason we don't use a flag style option for a boolean parameter.
|
||||
|
||||
.. _background-nargs:
|
||||
|
||||
Avoid using nargs in positional or optional arguments
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The behavior of ``nargs='?'`` option for python argparse is bit tricky.
|
||||
When we use ``nargs='?'`` and if the order of command-line options is
|
||||
changed then the command-line parser may fail to parse the arguments
|
||||
correctly. Two examples of such failures are provided below.
|
||||
|
||||
Example 1:
|
||||
This example shows how the actual behavior can differ from the provided
|
||||
help message. In the below block, help message at ``[5]`` says ``--bb CC``
|
||||
is a valid format but the argument parsing for the same format fails at ``[7]``.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
In [1]: import argparse
|
||||
In [2]: parser = argparse.ArgumentParser()
|
||||
In [3]: parser.add_argument('--bb', nargs='?')
|
||||
In [4]: parser.add_argument('cc')
|
||||
|
||||
In [5]: parser.print_help()
|
||||
usage: ipython [-h] [--bb [BB]] cc
|
||||
|
||||
positional arguments:
|
||||
cc
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--bb [BB]
|
||||
|
||||
In [6]: parser.parse_args('--bb 1 X'.split())
|
||||
Out[6]: Namespace(bb='1', cc='X')
|
||||
|
||||
In [7]: parser.parse_args('--bb X'.split())
|
||||
usage: ipython [-h] [--bb [BB]] cc
|
||||
ipython: error: too few arguments
|
||||
An exception has occurred, use %tb to see the full traceback.
|
||||
|
||||
SystemExit: 2
|
||||
|
||||
|
||||
Example 2:
|
||||
This example shows how fragile ``nargs='?'`` can be when user specifies
|
||||
options in different order from the help message.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
In [1]: import argparse
|
||||
In [2]: parser = argparse.ArgumentParser()
|
||||
In [3]: parser.add_argument('--a', help='option a')
|
||||
In [4]: parser.add_argument('--b', help='option b')
|
||||
In [5]: parser.add_argument('x', help='positional arg X')
|
||||
In [6]: parser.add_argument('y', nargs='?', help='positional arg Y')
|
||||
In [7]: parser.print_help()
|
||||
usage: ipython [-h] [--a A] [--b B] x [y]
|
||||
|
||||
positional arguments:
|
||||
x positional arg X
|
||||
y positional arg Y
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--a A option a
|
||||
--b B option b
|
||||
|
||||
In [8]: parser.parse_args('--a 1 --b 2 X Y'.split())
|
||||
Out[8]: Namespace(a='1', b='2', x='X', y='Y')
|
||||
|
||||
In [9]: parser.parse_args('X Y --a 1 --b 2'.split())
|
||||
Out[9]: Namespace(a='1', b='2', x='X', y='Y')
|
||||
|
||||
In [10]: parser.parse_args('X --a 1 --b 2 Y'.split())
|
||||
usage: ipython [-h] [--a A] [--b B] x [y]
|
||||
ipython: error: unrecognized arguments: Y
|
||||
An exception has occurred, use %tb to see the full traceback.
|
||||
|
||||
SystemExit: 2
|
||||
|
||||
To exit: use 'exit', 'quit', or Ctrl-D.
|
||||
To exit: use 'exit', 'quit', or Ctrl-D.
|
||||
|
||||
Note: Most CLI users don't care about the order of the command-line
|
||||
options. Hence, such fragile behavior should be avoided.
|
||||
|
@ -1,97 +0,0 @@
|
||||
..
|
||||
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.
|
||||
|
||||
|
||||
Convention for heading levels in Neutron devref:
|
||||
======= Heading 0 (reserved for the title in a document)
|
||||
------- Heading 1
|
||||
~~~~~~~ Heading 2
|
||||
+++++++ Heading 3
|
||||
''''''' Heading 4
|
||||
(Avoid deeper levels because they do not render well.)
|
||||
|
||||
Client command extension support
|
||||
=================================
|
||||
|
||||
The client command extension adds support for extending the neutron client while
|
||||
considering ease of creation.
|
||||
Extensions strongly conform to preexisting neutron commands (/neutron/v2_0/).
|
||||
|
||||
A sample extension can be seen at:
|
||||
neutronclient/neutron/v2_0/contrib/_fox_sockets.py
|
||||
|
||||
Minimum requirements from an extension
|
||||
--------------------------------------
|
||||
|
||||
* NeutronClientExtension subclasses must have a shell_command class variable
|
||||
if the command is to be available to the CLI (shell.py)
|
||||
|
||||
Example: neutronclient.neutron.v2_0.contrib._fox_sockets.FoxInSocketsList
|
||||
|
||||
Minimum requirements to use canonical neutron CRUD commands framework
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Neutron commands are cliff commands, commands in extension can use their
|
||||
own way to finish their tasks. But if they want to make use of the canonical
|
||||
neutron CRUD commands framework, the extension should:
|
||||
|
||||
* have a class that subclasses NeutronClientExtension to provide the
|
||||
requisite resource name, version support, and resource collection and
|
||||
object paths for a resource the commands will process.
|
||||
|
||||
Example: neutronclient.neutron.v2_0.contrib._fox_sockets.FoxInSocket
|
||||
|
||||
* have a class that subclasses from the ClientExtensionList to provide
|
||||
resource object list function. This is because most commands
|
||||
need the list function to get object ID via
|
||||
neutronclient.neutron.v2_0.__init__.find_resource_by_id.
|
||||
|
||||
Example: neutronclient.neutron.v2_0.contrib._fox_sockets.FoxInSocketsList
|
||||
|
||||
* if needed, subclass ClientExtensionUpdate to implement update of the resource
|
||||
object.
|
||||
|
||||
Example: neutronclient.neutron.v2_0.contrib._fox_sockets.FoxInSocketsUpdate
|
||||
|
||||
* if needed, subclass ClientExtensionDelete to implement deletion of the resource
|
||||
object.
|
||||
|
||||
Example: neutronclient.neutron.v2_0.contrib._fox_sockets.FoxInSocketsDelete
|
||||
|
||||
* if needed, subclass ClientExtensionShow to get the detail of the resource
|
||||
object.
|
||||
|
||||
Example: neutronclient.neutron.v2_0.contrib._fox_sockets.FoxInSocketsShow
|
||||
|
||||
Precedence of command loading
|
||||
------------------------------
|
||||
|
||||
* hard coded commands are loaded first
|
||||
* external commands (installed in the environment) are loaded then
|
||||
|
||||
Commands that have the same name will be overwritten by commands that are
|
||||
loaded later. To change the execution of a command for your particular
|
||||
extension you only need to override the execute method.
|
||||
|
||||
Currently this extension support is limited to top-level resources.
|
||||
Parent/child relationships may be added if desired.
|
||||
|
||||
neutronclient.extension entry_point
|
||||
-----------------------------------
|
||||
|
||||
To activate the commands in a specific extension module, add an entry in
|
||||
setup.cfg under neutronclient.extension. For example::
|
||||
|
||||
[entry_points]
|
||||
neutronclient.extension =
|
||||
fox_sockets = neutronclient.neutron.v2_0.contrib._fox_sockets
|
@ -31,6 +31,4 @@ OpenStack client.
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
client_command_extensions
|
||||
cli_option_guideline
|
||||
transition_to_osc
|
||||
|
@ -105,7 +105,7 @@ Transition Steps
|
||||
In addition, no new features will be added to the CLI, though fixes to
|
||||
the CLI will be assessed on a case by case basis.
|
||||
|
||||
8. **Not Started:** Remove the ``neutron`` CLI after two deprecation cycles
|
||||
8. **Done** Remove the ``neutron`` CLI after two deprecation cycles
|
||||
once the criteria below have been met.
|
||||
|
||||
* The networking support provide by the ``openstack`` CLI is functionally
|
||||
@ -122,32 +122,8 @@ Transition Steps
|
||||
|
||||
Developer Guide
|
||||
---------------
|
||||
The ``neutron`` CLI version 6.x, without extensions, supports over 200
|
||||
commands while the ``openstack`` CLI version 3.3.0 supports over 70
|
||||
networking commands. Of the 70 commands, some do not have all of the options
|
||||
or arguments of their ``neutron`` CLI equivalent. With this large functional
|
||||
gap, a few critical questions for developers during this transition are "Which
|
||||
CLI do I change?", "Where does my CLI belong?", and "Which Python library do I change?"
|
||||
The answer depends on the state of a command and the state of the overall transition.
|
||||
Details are outlined in the tables below. Early stages of the transition will require
|
||||
dual maintenance.
|
||||
|
||||
**Which CLI do I change?**
|
||||
|
||||
+----------------------+------------------------+-------------------------------------------------+
|
||||
| ``neutron`` Command | ``openstack`` Command | CLI to Change |
|
||||
+======================+========================+=================================================+
|
||||
| Exists | Doesn't Exist | ``neutron`` |
|
||||
+----------------------+------------------------+-------------------------------------------------+
|
||||
| Exists | In Progress | ``neutron`` and ``openstack`` |
|
||||
| | | (update related blueprint or bug) |
|
||||
+----------------------+------------------------+-------------------------------------------------+
|
||||
| Exists | Exists | ``openstack`` |
|
||||
| | | (assumes command parity resulting in |
|
||||
| | | ``neutron`` being deprecated) |
|
||||
+----------------------+------------------------+-------------------------------------------------+
|
||||
| Doesn't Exist | Doesn't Exist | ``openstack`` |
|
||||
+----------------------+------------------------+-------------------------------------------------+
|
||||
The ``neutron`` CLI tool is now removed and all new CLI changes should be done
|
||||
in the ``OpenStackClient (OSC)`` and, if needed, also in the ``OpenStack SDK``.
|
||||
|
||||
**Where does my CLI belong?**
|
||||
|
||||
@ -186,8 +162,6 @@ is not required as the neutronclient is already deprecated on its own.
|
||||
+=================================================+===============================================+
|
||||
| python-openstackclient | openstacksdk |
|
||||
+-------------------------------------------------+-----------------------------------------------+
|
||||
| python-neutronclient | python-neutronclient |
|
||||
+-------------------------------------------------+-----------------------------------------------+
|
||||
| Other | Applicable project owning network resource |
|
||||
+-------------------------------------------------+-----------------------------------------------+
|
||||
|
||||
|
@ -24,15 +24,11 @@ python-neutronclient documentation
|
||||
==================================
|
||||
|
||||
This is a client for OpenStack Networking API. It provides
|
||||
:doc:`Python API bindings <reference/index>` (the neutronclient module) and
|
||||
:doc:`command-line interface (CLI) <cli/index>`.
|
||||
:doc:`Python API bindings <reference/index>` (the neutronclient module).
|
||||
|
||||
There are two CLIs which support the Networking API:
|
||||
:doc:`neutron CLI <cli/neutron>` and
|
||||
There is
|
||||
`OpenStack Client (OSC) <https://docs.openstack.org/python-openstackclient/latest/>`__.
|
||||
OpenStack Client provides the basic network commands and
|
||||
python-neutronclient provides extensions (aka OSC plugins)
|
||||
for advanced networking services.
|
||||
CLI which support the Networking API.
|
||||
|
||||
User Documentation
|
||||
------------------
|
||||
|
165
neutron_test.sh
165
neutron_test.sh
@ -1,165 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -x
|
||||
function die() {
|
||||
local exitcode=$?
|
||||
set +o xtrace
|
||||
echo $@
|
||||
cleanup
|
||||
exit $exitcode
|
||||
}
|
||||
|
||||
net_name=mynet1
|
||||
subnet_name=mysubnet1
|
||||
port_name=myport1
|
||||
function cleanup() {
|
||||
echo Removing test port, subnet and net...
|
||||
neutron port-delete $port_name
|
||||
neutron subnet-delete $subnet_name
|
||||
neutron net-delete $net_name
|
||||
}
|
||||
|
||||
noauth_tenant_id=me
|
||||
if [ "$1" == "noauth" ]; then
|
||||
NOAUTH="--tenant_id $noauth_tenant_id"
|
||||
else
|
||||
NOAUTH=
|
||||
fi
|
||||
|
||||
echo "NOTE: User should be admin in order to perform all operations."
|
||||
sleep 3
|
||||
|
||||
# test the CRUD of network
|
||||
network=$net_name
|
||||
neutron net-create $NOAUTH $network || die "fail to create network $network"
|
||||
temp=`neutron net-list -- --name $network --fields id | wc -l`
|
||||
echo $temp
|
||||
if [ $temp -ne 5 ]; then
|
||||
die "networks with name $network is not unique or found"
|
||||
fi
|
||||
network_id=`neutron net-list -- --name $network --fields id | tail -n 2 | head -n 1 | cut -d' ' -f 2`
|
||||
echo "ID of network with name $network is $network_id"
|
||||
|
||||
neutron net-show $network || die "fail to show network $network"
|
||||
neutron net-show $network_id || die "fail to show network $network_id"
|
||||
|
||||
neutron net-update $network --admin_state_up False || die "fail to update network $network"
|
||||
neutron net-update $network_id --admin_state_up True || die "fail to update network $network_id"
|
||||
|
||||
neutron net-list -c id -- --id fakeid || die "fail to list networks with column selection on empty list"
|
||||
|
||||
# test the CRUD of subnet
|
||||
subnet=$subnet_name
|
||||
cidr=10.0.1.0/24
|
||||
neutron subnet-create $NOAUTH $network $cidr --name $subnet || die "fail to create subnet $subnet"
|
||||
tempsubnet=`neutron subnet-list -- --name $subnet --fields id | wc -l`
|
||||
echo $tempsubnet
|
||||
if [ $tempsubnet -ne 5 ]; then
|
||||
die "subnets with name $subnet is not unique or found"
|
||||
fi
|
||||
subnet_id=`neutron subnet-list -- --name $subnet --fields id | tail -n 2 | head -n 1 | cut -d' ' -f 2`
|
||||
echo "ID of subnet with name $subnet is $subnet_id"
|
||||
neutron subnet-show $subnet || die "fail to show subnet $subnet"
|
||||
neutron subnet-show $subnet_id || die "fail to show subnet $subnet_id"
|
||||
|
||||
neutron subnet-update $subnet --dns_nameservers list=true 1.1.1.11 1.1.1.12 || die "fail to update subnet $subnet"
|
||||
neutron subnet-update $subnet_id --dns_nameservers list=true 2.2.2.21 2.2.2.22 || die "fail to update subnet $subnet_id"
|
||||
|
||||
# test the crud of ports
|
||||
port=$port_name
|
||||
neutron port-create $NOAUTH $network --name $port || die "fail to create port $port"
|
||||
tempport=`neutron port-list -- --name $port --fields id | wc -l`
|
||||
echo $tempport
|
||||
if [ $tempport -ne 5 ]; then
|
||||
die "ports with name $port is not unique or found"
|
||||
fi
|
||||
port_id=`neutron port-list -- --name $port --fields id | tail -n 2 | head -n 1 | cut -d' ' -f 2`
|
||||
echo "ID of port with name $port is $port_id"
|
||||
neutron port-show $port || die "fail to show port $port"
|
||||
neutron port-show $port_id || die "fail to show port $port_id"
|
||||
neutron port-update $port --device_id deviceid1 || die "fail to update port $port"
|
||||
neutron port-update $port_id --device_id deviceid2 || die "fail to update port $port_id"
|
||||
neutron port-update $port_id --allowed-address-pair ip_address=1.1.1.11,mac_address=10:00:00:00:00:00 --allowed-address-pair ip_address=1.1.1.12,mac_address=10:00:00:00:00:01 || die "fail to update port $port_id --allowed-address-pair"
|
||||
neutron port-show $port || die "fail to show port $port"
|
||||
neutron port-show $port_id || die "fail to show port $port_id"
|
||||
neutron port-update $port_id --no-allowed-address-pairs || die "fail to update port $port_id --no-allowed-address-pairs"
|
||||
neutron port-show $port || die "fail to show port $port"
|
||||
neutron port-show $port_id || die "fail to show port $port_id"
|
||||
neutron port-delete $port_id
|
||||
|
||||
# test the create port with allowed-address-pairs
|
||||
port=$port_name
|
||||
neutron port-create $NOAUTH $network --name $port -- --allowed-address-pairs type=dict list=true ip_address=1.1.1.11,mac_address=10:00:00:00:00:00 ip_address=1.1.1.12,mac_address=10:00:00:00:00:01 || die "fail to create port $port"
|
||||
tempport=`neutron port-list -- --name $port --fields id | wc -l`
|
||||
echo $tempport
|
||||
if [ $tempport -ne 5 ]; then
|
||||
die "ports with name $port is not unique or found"
|
||||
fi
|
||||
port_id=`neutron port-list -- --name $port --fields id | tail -n 2 | head -n 1 | cut -d' ' -f 2`
|
||||
echo "ID of port with name $port is $port_id"
|
||||
neutron port-show $port || die "fail to show port $port"
|
||||
neutron port-show $port_id || die "fail to show port $port_id"
|
||||
neutron port-update $port_id --no-allowed-address-pairs || die "fail to update port $port_id --no-allowed-address-pairs"
|
||||
neutron port-show $port_id
|
||||
|
||||
# test quota commands RUD
|
||||
DEFAULT_NETWORKS=10
|
||||
DEFAULT_PORTS=50
|
||||
tenant_id=tenant_a
|
||||
tenant_id_b=tenant_b
|
||||
neutron quota-update --tenant_id $tenant_id --network 30 || die "fail to update quota for tenant $tenant_id"
|
||||
neutron quota-update --tenant_id $tenant_id_b --network 20 || die "fail to update quota for tenant $tenant_id"
|
||||
networks=`neutron quota-list -c network -c tenant_id | grep $tenant_id | awk '{print $2}'`
|
||||
if [ $networks -ne 30 ]; then
|
||||
die "networks quota should be 30"
|
||||
fi
|
||||
networks=`neutron quota-list -c network -c tenant_id | grep $tenant_id_b | awk '{print $2}'`
|
||||
if [ $networks -ne 20 ]; then
|
||||
die "networks quota should be 20"
|
||||
fi
|
||||
networks=`neutron quota-show --tenant_id $tenant_id | grep network | awk -F'|' '{print $3}'`
|
||||
if [ $networks -ne 30 ]; then
|
||||
die "networks quota should be 30"
|
||||
fi
|
||||
neutron quota-delete --tenant_id $tenant_id || die "fail to delete quota for tenant $tenant_id"
|
||||
networks=`neutron quota-show --tenant_id $tenant_id | grep network | awk -F'|' '{print $3}'`
|
||||
if [ $networks -ne $DEFAULT_NETWORKS ]; then
|
||||
die "networks quota should be $DEFAULT_NETWORKS"
|
||||
fi
|
||||
# update self
|
||||
if [ "t$NOAUTH" = "t" ]; then
|
||||
# with auth
|
||||
neutron quota-update --port 99 || die "fail to update quota for self"
|
||||
ports=`neutron quota-show | grep port | awk -F'|' '{print $3}'`
|
||||
if [ $ports -ne 99 ]; then
|
||||
die "ports quota should be 99"
|
||||
fi
|
||||
|
||||
ports=`neutron quota-list -c port | grep 99 | awk '{print $2}'`
|
||||
if [ $ports -ne 99 ]; then
|
||||
die "ports quota should be 99"
|
||||
fi
|
||||
neutron quota-delete || die "fail to delete quota for tenant self"
|
||||
ports=`neutron quota-show | grep port | awk -F'|' '{print $3}'`
|
||||
if [ $ports -ne $DEFAULT_PORTS ]; then
|
||||
die "ports quota should be $DEFAULT_PORTS"
|
||||
fi
|
||||
else
|
||||
# without auth
|
||||
neutron quota-update --port 100
|
||||
if [ $? -eq 0 ]; then
|
||||
die "without valid context on server, quota update command should fail."
|
||||
fi
|
||||
neutron quota-show
|
||||
if [ $? -eq 0 ]; then
|
||||
die "without valid context on server, quota show command should fail."
|
||||
fi
|
||||
neutron quota-delete
|
||||
if [ $? -eq 0 ]; then
|
||||
die "without valid context on server, quota delete command should fail."
|
||||
fi
|
||||
neutron quota-list || die "fail to update quota for self"
|
||||
fi
|
||||
|
||||
cleanup
|
||||
echo "Success! :)"
|
||||
|
@ -1,654 +0,0 @@
|
||||
# Copyright 2012 OpenStack Foundation.
|
||||
# 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.
|
||||
#
|
||||
|
||||
"""
|
||||
Command-line interface to the Neutron APIs
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import inspect
|
||||
import itertools
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
|
||||
from keystoneauth1 import session
|
||||
import os_client_config
|
||||
from oslo_utils import encodeutils
|
||||
from oslo_utils import netutils
|
||||
|
||||
from cliff import app
|
||||
from cliff import command
|
||||
from cliff import commandmanager
|
||||
|
||||
from neutronclient._i18n import _
|
||||
from neutronclient.common import clientmanager
|
||||
from neutronclient.common import exceptions as exc
|
||||
from neutronclient.common import extension as client_extension
|
||||
from neutronclient.neutron.v2_0 import subnet
|
||||
from neutronclient.version import __version__
|
||||
|
||||
|
||||
VERSION = '2.0'
|
||||
NEUTRON_API_VERSION = '2.0'
|
||||
|
||||
NAMESPACE_MAP = {NEUTRON_API_VERSION: 'neutron.cli.v2'}
|
||||
|
||||
|
||||
def run_command(cmd, cmd_parser, sub_argv):
|
||||
_argv = sub_argv
|
||||
index = -1
|
||||
values_specs = []
|
||||
if '--' in sub_argv:
|
||||
index = sub_argv.index('--')
|
||||
_argv = sub_argv[:index]
|
||||
values_specs = sub_argv[index:]
|
||||
known_args, _values_specs = cmd_parser.parse_known_args(_argv)
|
||||
if(isinstance(cmd, subnet.CreateSubnet) and not known_args.cidr):
|
||||
cidr = get_first_valid_cidr(_values_specs)
|
||||
if cidr:
|
||||
known_args.cidr = cidr
|
||||
_values_specs.remove(cidr)
|
||||
cmd.values_specs = (index == -1 and _values_specs or values_specs)
|
||||
return cmd.run(known_args)
|
||||
|
||||
|
||||
def get_first_valid_cidr(value_specs):
|
||||
# Bug 1442771, argparse does not allow optional positional parameter
|
||||
# to be separated from previous positional parameter.
|
||||
# When cidr was separated from network, the value will not be able
|
||||
# to be parsed into known_args, but saved to _values_specs instead.
|
||||
for value in value_specs:
|
||||
if netutils.is_valid_cidr(value):
|
||||
return value
|
||||
|
||||
|
||||
def env(*_vars, **kwargs):
|
||||
"""Search for the first defined of possibly many env vars.
|
||||
|
||||
Returns the first environment variable defined in vars, or
|
||||
returns the default defined in kwargs.
|
||||
|
||||
"""
|
||||
for v in _vars:
|
||||
value = os.environ.get(v, None)
|
||||
if value:
|
||||
return value
|
||||
return kwargs.get('default', '')
|
||||
|
||||
|
||||
def check_non_negative_int(value):
|
||||
try:
|
||||
value = int(value)
|
||||
except ValueError:
|
||||
raise argparse.ArgumentTypeError(_("invalid int value: %r") % value)
|
||||
if value < 0:
|
||||
raise argparse.ArgumentTypeError(_("input value %d is negative") %
|
||||
value)
|
||||
return value
|
||||
|
||||
|
||||
COMMANDS = {}
|
||||
|
||||
|
||||
# NOTE(amotoki): This is only to provide compatibility
|
||||
# to existing neutron CLI extensions. See bug 1706573 for detail.
|
||||
def _set_commands_dict_for_compat(apiversion, command_manager):
|
||||
global COMMANDS
|
||||
COMMANDS = {apiversion: dict((cmd, command_manager.find_command([cmd])[0])
|
||||
for cmd in command_manager.commands)}
|
||||
|
||||
|
||||
class BashCompletionCommand(command.Command):
|
||||
"""Prints all of the commands and options for bash-completion."""
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
pass
|
||||
|
||||
|
||||
class HelpAction(argparse.Action):
|
||||
"""Print help message including sub-commands
|
||||
|
||||
Provide a custom action so the -h and --help options
|
||||
to the main app will print a list of the commands.
|
||||
|
||||
The commands are determined by checking the CommandManager
|
||||
instance, passed in as the "default" value for the action.
|
||||
"""
|
||||
def __call__(self, parser, namespace, values, option_string=None):
|
||||
outputs = []
|
||||
max_len = 0
|
||||
app = self.default
|
||||
parser.print_help(app.stdout)
|
||||
app.stdout.write(_('\nCommands for API v%s:\n') % app.api_version)
|
||||
command_manager = app.command_manager
|
||||
for name, ep in sorted(command_manager):
|
||||
factory = ep.load()
|
||||
cmd = factory(self, None)
|
||||
one_liner = cmd.get_description().split('\n')[0]
|
||||
outputs.append((name, one_liner))
|
||||
max_len = max(len(name), max_len)
|
||||
for (name, one_liner) in outputs:
|
||||
app.stdout.write(' %s %s\n' % (name.ljust(max_len), one_liner))
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
class NeutronShell(app.App):
|
||||
|
||||
# verbose logging levels
|
||||
WARNING_LEVEL = 0
|
||||
INFO_LEVEL = 1
|
||||
DEBUG_LEVEL = 2
|
||||
CONSOLE_MESSAGE_FORMAT = '%(message)s'
|
||||
DEBUG_MESSAGE_FORMAT = '%(levelname)s: %(name)s %(message)s'
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
def __init__(self, apiversion):
|
||||
namespace = NAMESPACE_MAP[apiversion]
|
||||
description = (__doc__.strip() +
|
||||
" (neutron CLI version: %s)" % __version__)
|
||||
super(NeutronShell, self).__init__(
|
||||
description=description,
|
||||
version=VERSION,
|
||||
command_manager=commandmanager.CommandManager(namespace), )
|
||||
|
||||
self._register_extensions(VERSION)
|
||||
|
||||
# Pop the 'complete' to correct the outputs of 'neutron help'.
|
||||
self.command_manager.commands.pop('complete')
|
||||
|
||||
# This is instantiated in initialize_app() only when using
|
||||
# password flow auth
|
||||
self.auth_client = None
|
||||
self.api_version = apiversion
|
||||
|
||||
_set_commands_dict_for_compat(apiversion, self.command_manager)
|
||||
|
||||
def build_option_parser(self, description, version):
|
||||
"""Return an argparse option parser for this application.
|
||||
|
||||
Subclasses may override this method to extend
|
||||
the parser with more global options.
|
||||
|
||||
:param description: full description of the application
|
||||
:paramtype description: str
|
||||
:param version: version number for the application
|
||||
:paramtype version: str
|
||||
"""
|
||||
parser = argparse.ArgumentParser(
|
||||
description=description,
|
||||
add_help=False, )
|
||||
parser.add_argument(
|
||||
'--version',
|
||||
action='version',
|
||||
version=__version__, )
|
||||
parser.add_argument(
|
||||
'-v', '--verbose', '--debug',
|
||||
action='count',
|
||||
dest='verbose_level',
|
||||
default=self.DEFAULT_VERBOSE_LEVEL,
|
||||
help=_('Increase verbosity of output and show tracebacks on'
|
||||
' errors. You can repeat this option.'))
|
||||
parser.add_argument(
|
||||
'-q', '--quiet',
|
||||
action='store_const',
|
||||
dest='verbose_level',
|
||||
const=0,
|
||||
help=_('Suppress output except warnings and errors.'))
|
||||
parser.add_argument(
|
||||
'-h', '--help',
|
||||
action=HelpAction,
|
||||
nargs=0,
|
||||
default=self, # tricky
|
||||
help=_("Show this help message and exit."))
|
||||
parser.add_argument(
|
||||
'-r', '--retries',
|
||||
metavar="NUM",
|
||||
type=check_non_negative_int,
|
||||
default=0,
|
||||
help=_("How many times the request to the Neutron server should "
|
||||
"be retried if it fails. Defaults to 0."))
|
||||
# FIXME(bklei): this method should come from keystoneauth1
|
||||
self._append_global_identity_args(parser)
|
||||
|
||||
return parser
|
||||
|
||||
def _append_global_identity_args(self, parser):
|
||||
# FIXME(bklei): these are global identity (Keystone) arguments which
|
||||
# should be consistent and shared by all service clients. Therefore,
|
||||
# they should be provided by keystoneauth1. We will need to
|
||||
# refactor this code once this functionality is available in
|
||||
# keystoneauth1.
|
||||
#
|
||||
# Note: At that time we'll need to decide if we can just abandon
|
||||
# the deprecated args (--service-type and --endpoint-type).
|
||||
|
||||
parser.add_argument(
|
||||
'--os-service-type', metavar='<os-service-type>',
|
||||
default=env('OS_NETWORK_SERVICE_TYPE', default='network'),
|
||||
help=_('Defaults to env[OS_NETWORK_SERVICE_TYPE] or "network".'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os-endpoint-type', metavar='<os-endpoint-type>',
|
||||
default=env('OS_ENDPOINT_TYPE', default='public'),
|
||||
help=_('Defaults to env[OS_ENDPOINT_TYPE] or "public".'))
|
||||
|
||||
# FIXME(bklei): --service-type is deprecated but kept in for
|
||||
# backward compatibility.
|
||||
parser.add_argument(
|
||||
'--service-type', metavar='<service-type>',
|
||||
default=env('OS_NETWORK_SERVICE_TYPE', default='network'),
|
||||
help=_('DEPRECATED! Use --os-service-type.'))
|
||||
|
||||
# FIXME(bklei): --endpoint-type is deprecated but kept in for
|
||||
# backward compatibility.
|
||||
parser.add_argument(
|
||||
'--endpoint-type', metavar='<endpoint-type>',
|
||||
default=env('OS_ENDPOINT_TYPE', default='public'),
|
||||
help=_('DEPRECATED! Use --os-endpoint-type.'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os-auth-strategy', metavar='<auth-strategy>',
|
||||
default=env('OS_AUTH_STRATEGY', default='keystone'),
|
||||
help=_('DEPRECATED! Only keystone is supported.'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os_auth_strategy',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--os-cloud', metavar='<cloud>',
|
||||
help=_('Defaults to env[OS_CLOUD].'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os-auth-url', metavar='<auth-url>',
|
||||
help=_('Authentication URL, defaults to env[OS_AUTH_URL].'))
|
||||
parser.add_argument(
|
||||
'--os_auth_url',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
project_name_group = parser.add_mutually_exclusive_group()
|
||||
project_name_group.add_argument(
|
||||
'--os-tenant-name', metavar='<auth-tenant-name>',
|
||||
help=_('Authentication tenant name, defaults to '
|
||||
'env[OS_TENANT_NAME].'))
|
||||
project_name_group.add_argument(
|
||||
'--os-project-name',
|
||||
metavar='<auth-project-name>',
|
||||
help=_('Another way to specify tenant name. '
|
||||
'This option is mutually exclusive with '
|
||||
' --os-tenant-name. '
|
||||
'Defaults to env[OS_PROJECT_NAME].'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os_tenant_name',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
project_id_group = parser.add_mutually_exclusive_group()
|
||||
project_id_group.add_argument(
|
||||
'--os-tenant-id', metavar='<auth-tenant-id>',
|
||||
help=_('Authentication tenant ID, defaults to '
|
||||
'env[OS_TENANT_ID].'))
|
||||
project_id_group.add_argument(
|
||||
'--os-project-id',
|
||||
metavar='<auth-project-id>',
|
||||
help=_('Another way to specify tenant ID. '
|
||||
'This option is mutually exclusive with '
|
||||
' --os-tenant-id. '
|
||||
'Defaults to env[OS_PROJECT_ID].'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os-username', metavar='<auth-username>',
|
||||
help=_('Authentication username, defaults to env[OS_USERNAME].'))
|
||||
parser.add_argument(
|
||||
'--os_username',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--os-user-id', metavar='<auth-user-id>',
|
||||
help=_('Authentication user ID (Env: OS_USER_ID)'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os_user_id',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--os-user-domain-id',
|
||||
metavar='<auth-user-domain-id>',
|
||||
help=_('OpenStack user domain ID. '
|
||||
'Defaults to env[OS_USER_DOMAIN_ID].'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os_user_domain_id',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--os-user-domain-name',
|
||||
metavar='<auth-user-domain-name>',
|
||||
help=_('OpenStack user domain name. '
|
||||
'Defaults to env[OS_USER_DOMAIN_NAME].'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os_user_domain_name',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--os_project_id',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--os_project_name',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--os-project-domain-id',
|
||||
metavar='<auth-project-domain-id>',
|
||||
help=_('Defaults to env[OS_PROJECT_DOMAIN_ID].'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os-project-domain-name',
|
||||
metavar='<auth-project-domain-name>',
|
||||
help=_('Defaults to env[OS_PROJECT_DOMAIN_NAME].'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os-cert',
|
||||
metavar='<certificate>',
|
||||
help=_("Path of certificate file to use in SSL "
|
||||
"connection. This file can optionally be "
|
||||
"prepended with the private key. Defaults "
|
||||
"to env[OS_CERT]."))
|
||||
|
||||
parser.add_argument(
|
||||
'--os-cacert',
|
||||
metavar='<ca-certificate>',
|
||||
help=_("Specify a CA bundle file to use in "
|
||||
"verifying a TLS (https) server certificate. "
|
||||
"Defaults to env[OS_CACERT]."))
|
||||
|
||||
parser.add_argument(
|
||||
'--os-key',
|
||||
metavar='<key>',
|
||||
help=_("Path of client key to use in SSL "
|
||||
"connection. This option is not necessary "
|
||||
"if your key is prepended to your certificate "
|
||||
"file. Defaults to env[OS_KEY]."))
|
||||
|
||||
parser.add_argument(
|
||||
'--os-password', metavar='<auth-password>',
|
||||
help=_('Authentication password, defaults to env[OS_PASSWORD].'))
|
||||
parser.add_argument(
|
||||
'--os_password',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--os-region-name', metavar='<auth-region-name>',
|
||||
help=_('Authentication region name, defaults to '
|
||||
'env[OS_REGION_NAME].'))
|
||||
parser.add_argument(
|
||||
'--os_region_name',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--os-token', metavar='<token>',
|
||||
help=_('Authentication token, defaults to env[OS_TOKEN].'))
|
||||
parser.add_argument(
|
||||
'--os_token',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--http-timeout', metavar='<seconds>',
|
||||
default=env('OS_NETWORK_TIMEOUT', default=None), type=float,
|
||||
help=_('Timeout in seconds to wait for an HTTP response. Defaults '
|
||||
'to env[OS_NETWORK_TIMEOUT] or None if not specified.'))
|
||||
|
||||
parser.add_argument(
|
||||
'--os-url', metavar='<url>',
|
||||
help=_('Defaults to env[OS_URL].'))
|
||||
parser.add_argument(
|
||||
'--os_url',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument(
|
||||
'--insecure',
|
||||
action='store_true',
|
||||
default=env('NEUTRONCLIENT_INSECURE', default=False),
|
||||
help=_("Explicitly allow neutronclient to perform \"insecure\" "
|
||||
"SSL (https) requests. The server's certificate will "
|
||||
"not be verified against any certificate authorities. "
|
||||
"This option should be used with caution."))
|
||||
|
||||
def _bash_completion(self):
|
||||
"""Prints all of the commands and options for bash-completion."""
|
||||
commands = set()
|
||||
options = set()
|
||||
for option, _action in self.parser._option_string_actions.items():
|
||||
options.add(option)
|
||||
for _name, _command in self.command_manager:
|
||||
commands.add(_name)
|
||||
cmd_factory = _command.load()
|
||||
cmd = cmd_factory(self, None)
|
||||
cmd_parser = cmd.get_parser('')
|
||||
for option, _action in cmd_parser._option_string_actions.items():
|
||||
options.add(option)
|
||||
print(' '.join(commands | options))
|
||||
|
||||
def _register_extensions(self, version):
|
||||
for name, module in itertools.chain(
|
||||
client_extension._discover_via_entry_points()):
|
||||
self._extend_shell_commands(name, module, version)
|
||||
|
||||
def _extend_shell_commands(self, name, module, version):
|
||||
classes = inspect.getmembers(module, inspect.isclass)
|
||||
for cls_name, cls in classes:
|
||||
if (issubclass(cls, client_extension.NeutronClientExtension) and
|
||||
hasattr(cls, 'shell_command')):
|
||||
cmd = cls.shell_command
|
||||
if hasattr(cls, 'versions'):
|
||||
if version not in cls.versions:
|
||||
continue
|
||||
try:
|
||||
name_prefix = "[%s]" % name
|
||||
cls.__doc__ = ("%s %s" % (name_prefix, cls.__doc__) if
|
||||
cls.__doc__ else name_prefix)
|
||||
self.command_manager.add_command(cmd, cls)
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
def run(self, argv):
|
||||
"""Equivalent to the main program for the application.
|
||||
|
||||
:param argv: input arguments and options
|
||||
:paramtype argv: list of str
|
||||
"""
|
||||
try:
|
||||
index = 0
|
||||
command_pos = -1
|
||||
help_pos = -1
|
||||
help_command_pos = -1
|
||||
for arg in argv:
|
||||
if arg == 'bash-completion' and help_command_pos == -1:
|
||||
self._bash_completion()
|
||||
return 0
|
||||
if arg in ('-h', '--help'):
|
||||
if help_pos == -1:
|
||||
help_pos = index
|
||||
# self.command_manager.commands contains 'help',
|
||||
# so we need to check this first.
|
||||
elif arg == 'help':
|
||||
if help_command_pos == -1:
|
||||
help_command_pos = index
|
||||
elif arg in self.command_manager.commands:
|
||||
if command_pos == -1:
|
||||
command_pos = index
|
||||
index = index + 1
|
||||
if command_pos > -1 and help_pos > command_pos:
|
||||
argv = ['help', argv[command_pos]]
|
||||
if help_command_pos > -1 and command_pos == -1:
|
||||
argv[help_command_pos] = '--help'
|
||||
self.options, remainder = self.parser.parse_known_args(argv)
|
||||
self.configure_logging()
|
||||
self.interactive_mode = not remainder
|
||||
self.initialize_app(remainder)
|
||||
except Exception as err:
|
||||
if self.options.verbose_level >= self.DEBUG_LEVEL:
|
||||
self.log.exception(err)
|
||||
raise
|
||||
else:
|
||||
self.log.error(err)
|
||||
return 1
|
||||
if self.interactive_mode:
|
||||
_argv = [sys.argv[0]]
|
||||
sys.argv = _argv
|
||||
return self.interact()
|
||||
return self.run_subcommand(remainder)
|
||||
|
||||
def run_subcommand(self, argv):
|
||||
subcommand = self.command_manager.find_command(argv)
|
||||
cmd_factory, cmd_name, sub_argv = subcommand
|
||||
cmd = cmd_factory(self, self.options)
|
||||
try:
|
||||
self.prepare_to_run_command(cmd)
|
||||
full_name = (cmd_name
|
||||
if self.interactive_mode
|
||||
else ' '.join([self.NAME, cmd_name])
|
||||
)
|
||||
cmd_parser = cmd.get_parser(full_name)
|
||||
return run_command(cmd, cmd_parser, sub_argv)
|
||||
except SystemExit:
|
||||
print(_("Try 'neutron help %s' for more information.") %
|
||||
cmd_name, file=sys.stderr)
|
||||
raise
|
||||
except Exception as e:
|
||||
if self.options.verbose_level >= self.DEBUG_LEVEL:
|
||||
self.log.exception("%s", e)
|
||||
raise
|
||||
self.log.error("%s", e)
|
||||
return 1
|
||||
|
||||
def authenticate_user(self):
|
||||
"""Confirm user authentication
|
||||
|
||||
Make sure the user has provided all of the authentication
|
||||
info we need.
|
||||
"""
|
||||
cloud_config = os_client_config.OpenStackConfig().get_one_cloud(
|
||||
cloud=self.options.os_cloud, argparse=self.options,
|
||||
network_api_version=self.api_version,
|
||||
verify=not self.options.insecure)
|
||||
verify, cert = cloud_config.get_requests_verify_args()
|
||||
|
||||
# TODO(singhj): Remove dependancy on HTTPClient
|
||||
# for the case of token-endpoint authentication
|
||||
|
||||
# When using token-endpoint authentication legacy
|
||||
# HTTPClient will be used, otherwise SessionClient
|
||||
# will be used.
|
||||
if self.options.os_token and self.options.os_url:
|
||||
auth = None
|
||||
auth_session = None
|
||||
else:
|
||||
auth = cloud_config.get_auth()
|
||||
|
||||
auth_session = session.Session(
|
||||
auth=auth, verify=verify, cert=cert,
|
||||
timeout=self.options.http_timeout)
|
||||
|
||||
interface = self.options.os_endpoint_type or self.endpoint_type
|
||||
if interface.endswith('URL'):
|
||||
interface = interface[:-3]
|
||||
self.client_manager = clientmanager.ClientManager(
|
||||
retries=self.options.retries,
|
||||
raise_errors=False,
|
||||
session=auth_session,
|
||||
url=self.options.os_url,
|
||||
token=self.options.os_token,
|
||||
region_name=cloud_config.get_region_name(),
|
||||
api_version=cloud_config.get_api_version('network'),
|
||||
service_type=cloud_config.get_service_type('network'),
|
||||
service_name=cloud_config.get_service_name('network'),
|
||||
endpoint_type=interface,
|
||||
auth=auth,
|
||||
insecure=not verify,
|
||||
log_credentials=True)
|
||||
return
|
||||
|
||||
def initialize_app(self, argv):
|
||||
"""Global app init bits:
|
||||
|
||||
* set up API versions
|
||||
* validate authentication info
|
||||
"""
|
||||
|
||||
super(NeutronShell, self).initialize_app(argv)
|
||||
|
||||
# If the user is not asking for help, make sure they
|
||||
# have given us auth.
|
||||
cmd_name = None
|
||||
if argv:
|
||||
cmd_info = self.command_manager.find_command(argv)
|
||||
cmd_factory, cmd_name, sub_argv = cmd_info
|
||||
if self.interactive_mode or cmd_name != 'help':
|
||||
self.authenticate_user()
|
||||
|
||||
def configure_logging(self):
|
||||
"""Create logging handlers for any log output."""
|
||||
root_logger = logging.getLogger('')
|
||||
|
||||
# Set up logging to a file
|
||||
root_logger.setLevel(logging.DEBUG)
|
||||
|
||||
# Send higher-level messages to the console via stderr
|
||||
console = logging.StreamHandler(self.stderr)
|
||||
console_level = {self.WARNING_LEVEL: logging.WARNING,
|
||||
self.INFO_LEVEL: logging.INFO,
|
||||
self.DEBUG_LEVEL: logging.DEBUG,
|
||||
}.get(self.options.verbose_level, logging.DEBUG)
|
||||
# The default log level is INFO, in this situation, set the
|
||||
# log level of the console to WARNING, to avoid displaying
|
||||
# useless messages. This equals using "--quiet"
|
||||
if console_level == logging.INFO:
|
||||
console.setLevel(logging.WARNING)
|
||||
else:
|
||||
console.setLevel(console_level)
|
||||
if logging.DEBUG == console_level:
|
||||
formatter = logging.Formatter(self.DEBUG_MESSAGE_FORMAT)
|
||||
else:
|
||||
formatter = logging.Formatter(self.CONSOLE_MESSAGE_FORMAT)
|
||||
logging.getLogger('iso8601.iso8601').setLevel(logging.WARNING)
|
||||
logging.getLogger('urllib3.connectionpool').setLevel(logging.WARNING)
|
||||
console.setFormatter(formatter)
|
||||
root_logger.addHandler(console)
|
||||
return
|
||||
|
||||
|
||||
def main(argv=sys.argv[1:]):
|
||||
try:
|
||||
print(_("neutron CLI is deprecated and will be removed "
|
||||
"in the Z cycle. Use openstack CLI instead."), file=sys.stderr)
|
||||
return NeutronShell(NEUTRON_API_VERSION).run(
|
||||
list(map(encodeutils.safe_decode, argv)))
|
||||
except KeyboardInterrupt:
|
||||
print(_("... terminating neutron client"), file=sys.stderr)
|
||||
return 130
|
||||
except exc.NeutronClientException:
|
||||
return 1
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main(sys.argv[1:]))
|
@ -1,42 +0,0 @@
|
||||
# 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.tests.functional import base
|
||||
|
||||
|
||||
class SimpleReadOnlyNeutronFwv1ClientTest(base.ClientTestBase):
|
||||
|
||||
"""Tests for FWaaS v1 based client commands that are read only"""
|
||||
|
||||
def setUp(self):
|
||||
super(SimpleReadOnlyNeutronFwv1ClientTest, self).setUp()
|
||||
if not self.is_extension_enabled('fwaas'):
|
||||
self.skipTest('FWaaS is not enabled')
|
||||
|
||||
def test_neutron_firewall_list(self):
|
||||
firewall_list = self.parser.listing(self.neutron
|
||||
('firewall-list'))
|
||||
self.assertTableStruct(firewall_list, ['id', 'name',
|
||||
'firewall_policy_id'])
|
||||
|
||||
def test_neutron_firewall_policy_list(self):
|
||||
firewall_policy = self.parser.listing(self.neutron
|
||||
('firewall-policy-list'))
|
||||
self.assertTableStruct(firewall_policy, ['id', 'name',
|
||||
'firewall_rules'])
|
||||
|
||||
def test_neutron_firewall_rule_list(self):
|
||||
firewall_rule = self.parser.listing(self.neutron
|
||||
('firewall-rule-list'))
|
||||
self.assertTableStruct(firewall_rule, ['id', 'name',
|
||||
'firewall_policy_id',
|
||||
'summary', 'enabled'])
|
@ -1,57 +0,0 @@
|
||||
# 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.tests.functional import base
|
||||
|
||||
|
||||
class SimpleReadOnlyNeutronVpnClientTest(base.ClientTestBase):
|
||||
|
||||
"""Tests for vpn based client commands that are read only
|
||||
|
||||
This is a first pass at a simple read only python-neutronclient test.
|
||||
This only exercises vpn based client commands that are read only.
|
||||
This should test commands:
|
||||
* as a regular user
|
||||
* as a admin user
|
||||
* with and without optional parameters
|
||||
* initially just check return codes, and later test command outputs
|
||||
"""
|
||||
def setUp(self):
|
||||
super(SimpleReadOnlyNeutronVpnClientTest, self).setUp()
|
||||
if not self.is_extension_enabled('vpnaas'):
|
||||
self.skipTest('VPNaaS is not enabled')
|
||||
|
||||
def test_neutron_vpn_ikepolicy_list(self):
|
||||
ikepolicy = self.parser.listing(self.neutron('vpn-ikepolicy-list'))
|
||||
self.assertTableStruct(ikepolicy, ['id', 'name',
|
||||
'auth_algorithm',
|
||||
'encryption_algorithm',
|
||||
'ike_version', 'pfs'])
|
||||
|
||||
def test_neutron_vpn_ipsecpolicy_list(self):
|
||||
ipsecpolicy = self.parser.listing(self.neutron('vpn-ipsecpolicy-list'))
|
||||
self.assertTableStruct(ipsecpolicy, ['id', 'name',
|
||||
'auth_algorithm',
|
||||
'encryption_algorithm',
|
||||
'pfs'])
|
||||
|
||||
def test_neutron_vpn_service_list(self):
|
||||
vpn_list = self.parser.listing(self.neutron('vpn-service-list'))
|
||||
self.assertTableStruct(vpn_list, ['id', 'name',
|
||||
'router_id', 'status'])
|
||||
|
||||
def test_neutron_ipsec_site_connection_list(self):
|
||||
ipsec_site = self.parser.listing(self.neutron
|
||||
('ipsec-site-connection-list'))
|
||||
self.assertTableStruct(ipsec_site, ['id', 'name',
|
||||
'peer_address',
|
||||
'auth_mode', 'status'])
|
@ -1,80 +0,0 @@
|
||||
# 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 os
|
||||
|
||||
import os_client_config
|
||||
from tempest.lib.cli import base
|
||||
|
||||
|
||||
def credentials(cloud='devstack-admin'):
|
||||
"""Retrieves credentials to run functional tests
|
||||
|
||||
Credentials are either read via os-client-config from the environment
|
||||
or from a config file ('clouds.yaml'). Environment variables override
|
||||
those from the config file.
|
||||
|
||||
devstack produces a clouds.yaml with two named clouds - one named
|
||||
'devstack' which has user privs and one named 'devstack-admin' which
|
||||
has admin privs. This function will default to getting the devstack-admin
|
||||
cloud as that is the current expected behavior.
|
||||
"""
|
||||
return get_cloud_config(cloud=cloud).get_auth_args()
|
||||
|
||||
|
||||
def get_cloud_config(cloud='devstack-admin'):
|
||||
return os_client_config.OpenStackConfig().get_one_cloud(cloud=cloud)
|
||||
|
||||
|
||||
class ClientTestBase(base.ClientTestBase):
|
||||
"""This is a first pass at a simple read only python-neutronclient test.
|
||||
|
||||
This only exercises client commands that are read only.
|
||||
This should test commands:
|
||||
* as a regular user
|
||||
* as an admin user
|
||||
* with and without optional parameters
|
||||
* initially just check return codes, and later test command outputs
|
||||
|
||||
"""
|
||||
|
||||
def _get_clients_from_os_cloud_config(self, cloud='devstack-admin'):
|
||||
creds = credentials(cloud)
|
||||
cli_dir = os.environ.get(
|
||||
'OS_NEUTRONCLIENT_EXEC_DIR',
|
||||
os.path.join(os.path.abspath('.'), '.tox/functional/bin'))
|
||||
|
||||
return base.CLIClient(
|
||||
username=creds['username'],
|
||||
password=creds['password'],
|
||||
tenant_name=creds['project_name'],
|
||||
project_domain_id=creds['project_domain_id'],
|
||||
user_domain_id=creds['user_domain_id'],
|
||||
uri=creds['auth_url'],
|
||||
cli_dir=cli_dir)
|
||||
|
||||
def _get_clients(self):
|
||||
return self._get_clients_from_os_cloud_config()
|
||||
|
||||
def neutron(self, *args, **kwargs):
|
||||
return self.clients.neutron(*args, **kwargs)
|
||||
|
||||
def neutron_non_admin(self, *args, **kwargs):
|
||||
if not hasattr(self, '_non_admin_clients'):
|
||||
self._non_admin_clients = self._get_clients_from_os_cloud_config(
|
||||
cloud='devstack')
|
||||
return self._non_admin_clients.neutron(*args, **kwargs)
|
||||
|
||||
def is_extension_enabled(self, extension_alias):
|
||||
extensions = self.parser.listing(self.neutron('ext-list'))
|
||||
aliases = [e['alias'] for e in extensions]
|
||||
return extension_alias in aliases
|
@ -1,59 +0,0 @@
|
||||
# Copyright 2016 NEC Corporation
|
||||
#
|
||||
# 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 oslo_serialization import jsonutils
|
||||
from oslo_utils import uuidutils
|
||||
import yaml
|
||||
|
||||
from neutronclient.tests.functional import base
|
||||
|
||||
|
||||
class TestCLIFormatter(base.ClientTestBase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestCLIFormatter, self).setUp()
|
||||
self.net_name = 'net-%s' % uuidutils.generate_uuid()
|
||||
self.addCleanup(self.neutron, 'net-delete %s' % self.net_name)
|
||||
|
||||
def _create_net(self, fmt, col_attrs):
|
||||
params = ['-c %s' % attr for attr in col_attrs]
|
||||
params.append('-f %s' % fmt)
|
||||
params.append(self.net_name)
|
||||
param_string = ' '.join(params)
|
||||
return self.neutron('net-create', params=param_string)
|
||||
|
||||
def test_net_create_with_json_formatter(self):
|
||||
result = self._create_net('json', ['name', 'admin_state_up'])
|
||||
self.assertDictEqual({'name': self.net_name,
|
||||
'admin_state_up': True},
|
||||
jsonutils.loads(result))
|
||||
|
||||
def test_net_create_with_yaml_formatter(self):
|
||||
result = self._create_net('yaml', ['name', 'admin_state_up'])
|
||||
self.assertDictEqual({'name': self.net_name,
|
||||
'admin_state_up': True},
|
||||
yaml.safe_load(result))
|
||||
|
||||
def test_net_create_with_value_formatter(self):
|
||||
# NOTE(amotoki): In 'value' formatter, there is no guarantee
|
||||
# in the order of attribute, so we use one attribute in this test.
|
||||
result = self._create_net('value', ['name'])
|
||||
self.assertEqual(self.net_name, result.strip())
|
||||
|
||||
def test_net_create_with_shell_formatter(self):
|
||||
result = self._create_net('shell', ['name', 'admin_state_up'])
|
||||
result_lines = set(result.strip().split('\n'))
|
||||
self.assertSetEqual(set(['name="%s"' % self.net_name,
|
||||
'admin_state_up="True"']),
|
||||
result_lines)
|
@ -1,61 +0,0 @@
|
||||
# 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 keystoneauth1 import session
|
||||
from oslo_utils import uuidutils
|
||||
from tempest.lib import base
|
||||
import testtools
|
||||
|
||||
from neutronclient.common import exceptions
|
||||
from neutronclient.tests.functional import base as func_base
|
||||
from neutronclient.v2_0 import client as v2_client
|
||||
|
||||
|
||||
class LibraryTestCase(base.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(LibraryTestCase, self).setUp()
|
||||
self.client = self._get_client()
|
||||
|
||||
def _get_client(self):
|
||||
cloud_config = func_base.get_cloud_config()
|
||||
keystone_auth = cloud_config.get_auth()
|
||||
(verify, cert) = cloud_config.get_requests_verify_args()
|
||||
|
||||
ks_session = session.Session(
|
||||
auth=keystone_auth,
|
||||
verify=verify,
|
||||
cert=cert)
|
||||
return v2_client.Client(session=ks_session)
|
||||
|
||||
def test_list_network(self):
|
||||
nets = self.client.list_networks()
|
||||
self.assertIsInstance(nets['networks'], list)
|
||||
|
||||
def test_post_put_delete_network(self):
|
||||
name = uuidutils.generate_uuid()
|
||||
net = self.client.create_network({'network': {'name': name}})
|
||||
net_id = net['network']['id']
|
||||
self.assertEqual(name, net['network']['name'])
|
||||
name2 = uuidutils.generate_uuid()
|
||||
net = self.client.update_network(net_id, {'network': {'name': name2}})
|
||||
self.assertEqual(name2, net['network']['name'])
|
||||
self.client.delete_network(net_id)
|
||||
with testtools.ExpectedException(exceptions.NetworkNotFoundClient):
|
||||
self.client.show_network(net_id)
|
||||
|
||||
def test_get_auth_ref(self):
|
||||
# Call some API call to ensure the client is authenticated.
|
||||
self.client.list_networks()
|
||||
auth_ref = self.client.httpclient.get_auth_ref()
|
||||
self.assertIsNotNone(auth_ref)
|
||||
self.assertIsNotNone(auth_ref.role_names)
|
@ -1,33 +0,0 @@
|
||||
# Copyright 2016 NEC Corporation
|
||||
#
|
||||
# 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.tests.functional import base
|
||||
|
||||
|
||||
class CLICommonFeatureTest(base.ClientTestBase):
|
||||
|
||||
def test_tenant_id_shown_in_list_by_admin(self):
|
||||
nets = self.parser.table(self.neutron('net-list'))
|
||||
self.assertIn('tenant_id', nets['headers'])
|
||||
|
||||
def test_tenant_id_not_shown_in_list_with_columns(self):
|
||||
nets = self.parser.table(self.neutron('net-list -c id -c name'))
|
||||
self.assertNotIn('tenant_id', nets['headers'])
|
||||
self.assertListEqual(['id', 'name'], nets['headers'])
|
||||
|
||||
def test_tenant_id_not_shown_in_list_by_non_admin(self):
|
||||
output = self.neutron_non_admin('net-list')
|
||||
self.assertNotIn('tenant_id', self.parser.table(output)['headers'])
|
||||
self.assertTableStruct(self.parser.listing(output),
|
||||
['id', 'name'])
|
@ -1,174 +0,0 @@
|
||||
# Copyright 2016 Cisco Systems
|
||||
# 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.tests.functional import base
|
||||
|
||||
from tempest.lib import exceptions
|
||||
|
||||
|
||||
class PurgeNeutronClientCLITest(base.ClientTestBase):
|
||||
|
||||
def _safe_cleanup(self, delete_command):
|
||||
try:
|
||||
self.neutron(delete_command)
|
||||
except exceptions.CommandFailed:
|
||||
# This resource was already purged successfully
|
||||
pass
|
||||
|
||||
def _create_subnet(self, name, tenant_id, cidr):
|
||||
params = ('%(name)s --name %(name)s --tenant-id %(tenant)s '
|
||||
'%(cidr)s' % {'name': name,
|
||||
'tenant': tenant_id,
|
||||
'cidr': cidr})
|
||||
subnet = self.parser.listing(self.neutron('subnet-create',
|
||||
params=params))
|
||||
for row in subnet:
|
||||
if row['Field'] == 'id':
|
||||
return row['Value']
|
||||
|
||||
def _create_router(self, name, tenant_id):
|
||||
params = ('%(name)s --tenant_id %(tenant)s' % {'name': name,
|
||||
'tenant': tenant_id})
|
||||
router = self.parser.listing(self.neutron('router-create',
|
||||
params=params))
|
||||
for row in router:
|
||||
if row['Field'] == 'id':
|
||||
return row['Value']
|
||||
|
||||
def _create_floatingip(self, network, tenant_id):
|
||||
params = ('%(network)s --tenant-id %(tenant)s' %
|
||||
{'network': network, 'tenant': tenant_id})
|
||||
floatingip = self.parser.listing(self.neutron('floatingip-create',
|
||||
params=params))
|
||||
for row in floatingip:
|
||||
if row['Field'] == 'id':
|
||||
return row['Value']
|
||||
|
||||
def _create_resources(self, name, tenant_id, shared_tenant_id=None):
|
||||
# If no shared_tenant_id is provided, create the resources for the
|
||||
# current tenant to test that they will be deleted when not in use.
|
||||
if not shared_tenant_id:
|
||||
shared_tenant_id = tenant_id
|
||||
|
||||
self.neutron('net-create',
|
||||
params=('%(name)s --router:external True '
|
||||
'--tenant-id %(tenant)s' % {'name': name,
|
||||
'tenant': tenant_id}))
|
||||
self.addCleanup(self._safe_cleanup, 'net-delete %s' % name)
|
||||
|
||||
self.neutron('net-create',
|
||||
params=('%(name)s-shared --shared '
|
||||
'--tenant-id %(tenant)s' %
|
||||
{'name': name, 'tenant': shared_tenant_id}))
|
||||
self.addCleanup(self._safe_cleanup,
|
||||
'net-delete %s-shared' % name)
|
||||
|
||||
subnet = self._create_subnet(name, tenant_id, '192.168.71.0/24')
|
||||
self.addCleanup(self._safe_cleanup, 'subnet-delete %s' % name)
|
||||
|
||||
subnet = self._create_subnet('%s-shared' % name, tenant_id,
|
||||
'192.168.81.0/24')
|
||||
self.addCleanup(self._safe_cleanup, 'subnet-delete %s-shared' % name)
|
||||
|
||||
router = self._create_router(name, tenant_id)
|
||||
self.addCleanup(self._safe_cleanup, 'router-delete %s' % name)
|
||||
|
||||
self.neutron('router-interface-add',
|
||||
params=('%(router)s %(subnet)s '
|
||||
'--tenant-id %(tenant)s' % {'router': router,
|
||||
'subnet': subnet,
|
||||
'tenant': tenant_id}))
|
||||
|
||||
self.neutron('port-create',
|
||||
params=('%(name)s --name %(name)s '
|
||||
'--tenant-id %(tenant)s' % {'name': name,
|
||||
'tenant': tenant_id}))
|
||||
self.addCleanup(self._safe_cleanup, 'port-delete %s' % name)
|
||||
|
||||
self.neutron('port-create',
|
||||
params=('%(name)s-shared --name %(name)s-shared '
|
||||
'--tenant-id %(tenant)s' % {'name': name,
|
||||
'tenant': tenant_id}))
|
||||
self.addCleanup(self._safe_cleanup, 'port-delete %s-shared' % name)
|
||||
|
||||
self.neutron('security-group-create',
|
||||
params=('%(name)s --tenant-id %(tenant)s' %
|
||||
{'name': name, 'tenant': tenant_id}))
|
||||
self.addCleanup(self._safe_cleanup, 'security-group-delete %s' % name)
|
||||
|
||||
floatingip = self._create_floatingip(name, tenant_id)
|
||||
self.addCleanup(self._safe_cleanup, ('floatingip-delete '
|
||||
'%s' % floatingip))
|
||||
return floatingip
|
||||
|
||||
def _verify_deletion(self, resources, resource_type):
|
||||
purged = True
|
||||
no_purge_purged = True
|
||||
router_interface_owners = ['network:router_interface',
|
||||
'network:router_interface_distributed']
|
||||
for row in resources:
|
||||
if resource_type == 'port' and row.get('id', None):
|
||||
port = self.parser.listing(self.neutron('port-show',
|
||||
params=row['id']))
|
||||
port_dict = {}
|
||||
for row in port:
|
||||
port_dict[row['Field']] = row['Value']
|
||||
if port_dict['device_owner'] in router_interface_owners:
|
||||
if port_dict['tenant_id'] == 'purge-tenant':
|
||||
purged = False
|
||||
elif port_dict['tenant_id'] == 'no-purge-tenant':
|
||||
no_purge_purged = False
|
||||
if not purged or not no_purge_purged:
|
||||
self.addCleanup(self.neutron,
|
||||
('router-interface-delete %(router)s '
|
||||
'port=%(port)s' %
|
||||
{'router': port_dict['device_id'],
|
||||
'port': port_dict['id']}))
|
||||
if (row.get('name') == 'purge-me' or
|
||||
row.get('id') == self.purge_floatingip):
|
||||
purged = False
|
||||
elif ('no-purge' in row.get('name', '') or
|
||||
row.get('id') == self.no_purge_floatingip):
|
||||
no_purge_purged = False
|
||||
|
||||
if not purged:
|
||||
self.fail('%s not deleted by neutron purge' % resource_type)
|
||||
|
||||
if no_purge_purged:
|
||||
self.fail('%s owned by another tenant incorrectly deleted '
|
||||
'by neutron purge' % resource_type)
|
||||
|
||||
def test_purge(self):
|
||||
self.purge_floatingip = self._create_resources('purge-me',
|
||||
'purge-tenant')
|
||||
self.no_purge_floatingip = self._create_resources('no-purge',
|
||||
'no-purge-tenant',
|
||||
'purge-tenant')
|
||||
|
||||
purge_output = self.neutron('purge', params='purge-tenant').strip()
|
||||
if not purge_output:
|
||||
self.fail('Purge command did not return feedback')
|
||||
|
||||
networks = self.parser.listing(self.neutron('net-list'))
|
||||
subnets = self.parser.listing(self.neutron('subnet-list'))
|
||||
routers = self.parser.listing(self.neutron('router-list'))
|
||||
ports = self.parser.listing(self.neutron('port-list'))
|
||||
floatingips = self.parser.listing(self.neutron('floatingip-list'))
|
||||
|
||||
self._verify_deletion(networks, 'network')
|
||||
self._verify_deletion(subnets, 'subnet')
|
||||
self._verify_deletion(ports, 'port')
|
||||
self._verify_deletion(routers, 'router')
|
||||
self._verify_deletion(floatingips, 'floatingip')
|
@ -1,136 +0,0 @@
|
||||
# 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 re
|
||||
|
||||
from tempest.lib import exceptions
|
||||
|
||||
from neutronclient.tests.functional import base
|
||||
|
||||
|
||||
class SimpleReadOnlyNeutronClientTest(base.ClientTestBase):
|
||||
|
||||
"""This is a first pass at a simple read only python-neutronclient test.
|
||||
|
||||
This only exercises client commands that are read only.
|
||||
This should test commands:
|
||||
* as a regular user
|
||||
* as a admin user
|
||||
* with and without optional parameters
|
||||
* initially just check return codes, and later test command outputs
|
||||
"""
|
||||
|
||||
def test_admin_fake_action(self):
|
||||
self.assertRaises(exceptions.CommandFailed,
|
||||
self.neutron,
|
||||
'this-does-neutron-exist')
|
||||
|
||||
# NOTE(mestery): Commands in order listed in 'neutron help'
|
||||
|
||||
# Optional arguments:
|
||||
|
||||
def test_neutron_fake_action(self):
|
||||
self.assertRaises(exceptions.CommandFailed,
|
||||
self.neutron,
|
||||
'this-does-not-exist')
|
||||
|
||||
def test_neutron_net_list(self):
|
||||
net_list = self.parser.listing(self.neutron('net-list'))
|
||||
self.assertTableStruct(net_list, ['id', 'name', 'subnets'])
|
||||
|
||||
def test_neutron_ext_list(self):
|
||||
ext = self.parser.listing(self.neutron('ext-list'))
|
||||
self.assertTableStruct(ext, ['alias', 'name'])
|
||||
|
||||
def test_neutron_dhcp_agent_list_hosting_net(self):
|
||||
self.neutron('dhcp-agent-list-hosting-net',
|
||||
params='private')
|
||||
|
||||
def test_neutron_agent_list(self):
|
||||
agents = self.parser.listing(self.neutron('agent-list'))
|
||||
field_names = ['id', 'agent_type', 'host', 'alive', 'admin_state_up']
|
||||
self.assertTableStruct(agents, field_names)
|
||||
|
||||
def test_neutron_floatingip_list(self):
|
||||
self.neutron('floatingip-list')
|
||||
|
||||
def test_neutron_meter_label_list(self):
|
||||
if not self.is_extension_enabled('metering'):
|
||||
self.skipTest('metering is not enabled')
|
||||
self.neutron('meter-label-list')
|
||||
|
||||
def test_neutron_meter_label_rule_list(self):
|
||||
if not self.is_extension_enabled('metering'):
|
||||
self.skipTest('metering is not enabled')
|
||||
self.neutron('meter-label-rule-list')
|
||||
|
||||
def test_neutron_net_external_list(self):
|
||||
net_ext_list = self.parser.listing(self.neutron('net-external-list'))
|
||||
self.assertTableStruct(net_ext_list, ['id', 'name', 'subnets'])
|
||||
|
||||
def test_neutron_port_list(self):
|
||||
port_list = self.parser.listing(self.neutron('port-list'))
|
||||
self.assertTableStruct(port_list, ['id', 'name', 'mac_address',
|
||||
'fixed_ips'])
|
||||
|
||||
def test_neutron_quota_list(self):
|
||||
self.neutron('quota-list')
|
||||
|
||||
def test_neutron_router_list(self):
|
||||
router_list = self.parser.listing(self.neutron('router-list'))
|
||||
self.assertTableStruct(router_list, ['id', 'name',
|
||||
'external_gateway_info'])
|
||||
|
||||
def test_neutron_security_group_list(self):
|
||||
security_grp = self.parser.listing(self.neutron('security-group-list'))
|
||||
self.assertTableStruct(security_grp, ['id', 'name',
|
||||
'security_group_rules'])
|
||||
|
||||
def test_neutron_security_group_rule_list(self):
|
||||
security_grp = self.parser.listing(self.neutron
|
||||
('security-group-rule-list'))
|
||||
self.assertTableStruct(security_grp, ['id', 'security_group',
|
||||
'direction', 'ethertype',
|
||||
'port/protocol', 'remote'])
|
||||
|
||||
def test_neutron_subnet_list(self):
|
||||
subnet_list = self.parser.listing(self.neutron('subnet-list'))
|
||||
self.assertTableStruct(subnet_list, ['id', 'name', 'cidr',
|
||||
'allocation_pools'])
|
||||
|
||||
def test_neutron_help(self):
|
||||
help_text = self.neutron('help')
|
||||
lines = help_text.split('\n')
|
||||
self.assertFirstLineStartsWith(lines, 'usage: neutron')
|
||||
|
||||
commands = []
|
||||
cmds_start = lines.index('Commands for API v2.0:')
|
||||
command_pattern = re.compile(r'^ {2}([a-z0-9\-\_]+)')
|
||||
for line in lines[cmds_start:]:
|
||||
match = command_pattern.match(line)
|
||||
if match:
|
||||
commands.append(match.group(1))
|
||||
commands = set(commands)
|
||||
wanted_commands = set(('net-create', 'subnet-list', 'port-delete',
|
||||
'router-show', 'agent-update', 'help'))
|
||||
self.assertFalse(wanted_commands - commands)
|
||||
|
||||
# Optional arguments:
|
||||
|
||||
def test_neutron_version(self):
|
||||
self.neutron('', flags='--version')
|
||||
|
||||
def test_neutron_debug_net_list(self):
|
||||
self.neutron('net-list', flags='--debug')
|
||||
|
||||
def test_neutron_quiet_net_list(self):
|
||||
self.neutron('net-list', flags='--quiet')
|
@ -1,36 +0,0 @@
|
||||
# Copyright 2015 Hewlett-Packard Development Company, L.P
|
||||
#
|
||||
# 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.tests.functional import base
|
||||
|
||||
|
||||
class SubnetCreateNeutronClientCLITest(base.ClientTestBase):
|
||||
|
||||
def test_create_subnet_net_name_first(self):
|
||||
self.neutron('net-create', params='netwrk-1')
|
||||
self.addCleanup(self.neutron, 'net-delete netwrk-1')
|
||||
self.neutron('subnet-create netwrk-1',
|
||||
params='--name fake --gateway 192.168.51.1 '
|
||||
'192.168.51.0/24')
|
||||
self.addCleanup(self.neutron, 'subnet-delete fake')
|
||||
subnet_list = self.parser.listing(self.neutron('subnet-list'))
|
||||
self.assertTableStruct(subnet_list, ['id', 'name', 'cidr',
|
||||
'allocation_pools'])
|
||||
found = False
|
||||
for row in subnet_list:
|
||||
if row.get('name') == 'fake':
|
||||
found = True
|
||||
break
|
||||
if not found:
|
||||
self.fail('Created subnet not found in list')
|
@ -1,2 +0,0 @@
|
||||
enable_plugin neutron-fwaas https://opendev.org/openstack/neutron-fwaas
|
||||
enable_service q-fwaas
|
@ -1,42 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -ex
|
||||
|
||||
VENV=${1:-"functional"}
|
||||
|
||||
GATE_DEST=$BASE/new
|
||||
NEUTRONCLIENT_PATH=$GATE_DEST/python-neutronclient
|
||||
GATE_HOOKS=$NEUTRONCLIENT_PATH/neutronclient/tests/functional/hooks
|
||||
DEVSTACK_PATH=$GATE_DEST/devstack
|
||||
LOCAL_CONF=$DEVSTACK_PATH/late-local.conf
|
||||
DSCONF=/tmp/devstack-tools/bin/dsconf
|
||||
|
||||
# Install devstack-tools used to produce local.conf; we can't rely on
|
||||
# test-requirements.txt because the gate hook is triggered before neutronclient
|
||||
# is installed
|
||||
sudo -H pip install virtualenv
|
||||
virtualenv /tmp/devstack-tools
|
||||
/tmp/devstack-tools/bin/pip install -U devstack-tools==0.4.0
|
||||
|
||||
# Inject config from hook into localrc
|
||||
function load_rc_hook {
|
||||
local hook="$1"
|
||||
local tmpfile
|
||||
local config
|
||||
tmpfile=$(tempfile)
|
||||
config=$(cat $GATE_HOOKS/$hook)
|
||||
echo "[[local|localrc]]" > $tmpfile
|
||||
$DSCONF setlc_raw $tmpfile "$config"
|
||||
$DSCONF merge_lc $LOCAL_CONF $tmpfile
|
||||
rm -f $tmpfile
|
||||
}
|
||||
|
||||
|
||||
if [ "$VENV" == "functional-adv-svcs" ]
|
||||
then
|
||||
load_rc_hook fwaas
|
||||
load_rc_hook vpnaas
|
||||
fi
|
||||
|
||||
export DEVSTACK_LOCALCONF=$(cat $LOCAL_CONF)
|
||||
$BASE/new/devstack-gate/devstack-vm-gate.sh
|
@ -1,68 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
|
||||
# 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.
|
||||
|
||||
# This script is executed inside post_test_hook function in devstack gate.
|
||||
|
||||
SCRIPTS_DIR="/usr/os-testr-env/bin/"
|
||||
|
||||
function generate_test_logs {
|
||||
local path="$1"
|
||||
# Compress all $path/*.txt files and move the directories holding those
|
||||
# files to /opt/stack/logs. Files with .log suffix have their
|
||||
# suffix changed to .txt (so browsers will know to open the compressed
|
||||
# files and not download them).
|
||||
if [ -d "$path" ]
|
||||
then
|
||||
sudo find $path -iname "*.log" -type f -exec mv {} {}.txt \; -exec gzip -9 {}.txt \;
|
||||
sudo mv $path/* /opt/stack/logs/
|
||||
fi
|
||||
}
|
||||
|
||||
function generate_testr_results {
|
||||
# Give job user rights to access tox logs
|
||||
sudo -H -u $USER chmod o+rw .
|
||||
sudo -H -u $USER chmod o+rw -R .stestr
|
||||
if [ -f ".stestr/0" ] ; then
|
||||
.tox/$VENV/bin/subunit-1to2 < .stestr/0 > ./stestr.subunit
|
||||
$SCRIPTS_DIR/subunit2html ./stestr.subunit testr_results.html
|
||||
gzip -9 ./stestr.subunit
|
||||
gzip -9 ./testr_results.html
|
||||
sudo mv ./*.gz /opt/stack/logs/
|
||||
fi
|
||||
|
||||
if [ "$venv" == "functional" ] || [ "$venv" == "functional-adv-svcs" ]
|
||||
then
|
||||
generate_test_logs "/tmp/${venv}-logs"
|
||||
fi
|
||||
}
|
||||
|
||||
export NEUTRONCLIENT_DIR="$BASE/new/python-neutronclient"
|
||||
|
||||
sudo chown -R $USER:stack $NEUTRONCLIENT_DIR
|
||||
|
||||
# Go to the neutronclient dir
|
||||
cd $NEUTRONCLIENT_DIR
|
||||
|
||||
# Run tests
|
||||
VENV=${1:-"functional"}
|
||||
echo "Running neutronclient functional test suite"
|
||||
set +e
|
||||
# Preserve env for OS_ credentials
|
||||
sudo -E -H -u $USER tox -e $VENV
|
||||
EXIT_CODE=$?
|
||||
set -e
|
||||
|
||||
# Collect and parse result
|
||||
generate_testr_results
|
||||
exit $EXIT_CODE
|
@ -1 +0,0 @@
|
||||
enable_plugin neutron-vpnaas https://opendev.org/openstack/neutron-vpnaas
|
@ -1,66 +0,0 @@
|
||||
# Copyright 2016 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.bgp import dragentscheduler as bgp_drsched
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
from neutronclient.tests.unit import test_cli20_agentschedulers as test_as
|
||||
|
||||
|
||||
BGP_DRAGENT_ID = 'bgp_dragent_id1'
|
||||
BGP_SPEAKER = 'bgp_speaker_id1'
|
||||
|
||||
|
||||
class CLITestV20DRAgentScheduler(test_as.CLITestV20AgentScheduler):
|
||||
|
||||
def test_add_bgp_speaker_to_dragent(self):
|
||||
resource = 'agent'
|
||||
cmd = bgp_drsched.AddBGPSpeakerToDRAgent(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
args = (BGP_DRAGENT_ID, BGP_SPEAKER)
|
||||
body = {'bgp_speaker_id': BGP_SPEAKER}
|
||||
result = {'bgp_speaker_id': 'bgp_speaker_id', }
|
||||
self._test_add_to_agent(resource, cmd, args,
|
||||
self.client.BGP_DRINSTANCES,
|
||||
body, result)
|
||||
|
||||
def test_remove_bgp_speaker_from_dragent(self):
|
||||
resource = 'agent'
|
||||
cmd = bgp_drsched.RemoveBGPSpeakerFromDRAgent(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
args = (BGP_DRAGENT_ID, BGP_SPEAKER)
|
||||
self._test_remove_from_agent(resource, cmd, args,
|
||||
self.client.BGP_DRINSTANCES)
|
||||
|
||||
def test_list_bgp_speakers_on_dragent(self):
|
||||
resources = 'bgp_speakers'
|
||||
cmd = bgp_drsched.ListBGPSpeakersOnDRAgent(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
path = ((self.client.agent_path + self.client.BGP_DRINSTANCES) %
|
||||
BGP_DRAGENT_ID)
|
||||
self._test_list_resources(resources, cmd, base_args=[BGP_DRAGENT_ID],
|
||||
path=path)
|
||||
|
||||
def test_list_dragents_hosting_bgp_speaker(self):
|
||||
resources = 'agent'
|
||||
cmd = bgp_drsched.ListDRAgentsHostingBGPSpeaker(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
path = ((self.client.bgp_speaker_path + self.client.BGP_DRAGENTS) %
|
||||
BGP_DRAGENT_ID)
|
||||
contents = {self.id_field: 'myid1', 'alive': True}
|
||||
self._test_list_resources(resources, cmd, base_args=[BGP_DRAGENT_ID],
|
||||
path=path, response_contents=contents)
|
@ -1,224 +0,0 @@
|
||||
# Copyright 2016 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.common import exceptions
|
||||
from neutronclient.neutron.v2_0.bgp import peer as bgp_peer
|
||||
from neutronclient.neutron.v2_0.bgp import speaker as bgp_speaker
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20BGPPeerJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
non_admin_status_resources = ['bgp_peer']
|
||||
|
||||
def test_create_bgp_peer_with_mandatory_params(self):
|
||||
# Create BGP peer with mandatory params.
|
||||
resource = 'bgp_peer'
|
||||
cmd = bgp_peer.CreatePeer(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
peerip = '1.1.1.1'
|
||||
remote_asnum = '1'
|
||||
args = [name,
|
||||
'--peer-ip', peerip,
|
||||
'--remote-as', remote_asnum, ]
|
||||
position_names = ['name', 'peer_ip', 'remote_as',
|
||||
'auth_type']
|
||||
position_values = [name, peerip, remote_asnum, 'none']
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_bgp_peer_with_all_params(self):
|
||||
# Create BGP peer with all params.
|
||||
resource = 'bgp_peer'
|
||||
cmd = bgp_peer.CreatePeer(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
peerip = '1.1.1.1'
|
||||
remote_asnum = '65535'
|
||||
authType = 'md5'
|
||||
password = 'abc'
|
||||
args = [name,
|
||||
'--peer-ip', peerip,
|
||||
'--remote-as', remote_asnum,
|
||||
'--auth-type', authType,
|
||||
'--password', password]
|
||||
position_names = ['name', 'peer_ip', 'remote_as',
|
||||
'auth_type', 'password']
|
||||
position_values = [name, peerip, remote_asnum, authType, password]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_bgp_peer_with_invalid_min_remote_asnum(self):
|
||||
# Create BGP peer with invalid minimum remote-asnum.
|
||||
resource = 'bgp_peer'
|
||||
cmd = bgp_peer.CreatePeer(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
peerip = '1.1.1.1'
|
||||
remote_asnum = '0'
|
||||
args = [name,
|
||||
'--peer-ip', peerip,
|
||||
'--remote-as', remote_asnum, ]
|
||||
position_names = ['name', 'peer_ip', 'remote_as', ]
|
||||
position_values = [name, peerip, remote_asnum, ]
|
||||
exc = self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_resource,
|
||||
resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
self.assertEqual('remote-as "0" should be an integer [%s:%s].' %
|
||||
(bgp_speaker.MIN_AS_NUM, bgp_speaker.MAX_AS_NUM),
|
||||
str(exc))
|
||||
|
||||
def test_create_bgp_peer_with_invalid_max_remote_asnum(self):
|
||||
# Create BGP peer with invalid maximum remote-asnum.
|
||||
resource = 'bgp_peer'
|
||||
cmd = bgp_peer.CreatePeer(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
peerip = '1.1.1.1'
|
||||
remote_asnum = '4294967296'
|
||||
args = [name,
|
||||
'--peer-ip', peerip,
|
||||
'--remote-as', remote_asnum, ]
|
||||
position_names = ['name', 'peer_ip', 'remote_as',
|
||||
'auth_type', 'password']
|
||||
position_values = [name, peerip, remote_asnum, 'none', '']
|
||||
exc = self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_resource,
|
||||
resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
self.assertEqual('remote-as "4294967296" should be an '
|
||||
'integer [%s:%s].' %
|
||||
(bgp_speaker.MIN_AS_NUM, bgp_speaker.MAX_AS_NUM),
|
||||
str(exc))
|
||||
|
||||
def test_create_authenticated_bgp_peer_without_authtype(self):
|
||||
# Create authenticated BGP peer without auth-type.
|
||||
resource = 'bgp_peer'
|
||||
cmd = bgp_peer.CreatePeer(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
peerip = '1.1.1.1'
|
||||
remote_asnum = '2048'
|
||||
password = 'abc'
|
||||
args = [name,
|
||||
'--peer-ip', peerip,
|
||||
'--remote-as', remote_asnum,
|
||||
'--password', password]
|
||||
position_names = ['name', 'peer_ip', 'remote_as', 'password']
|
||||
position_values = [name, peerip, remote_asnum, password]
|
||||
exc = self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_resource,
|
||||
resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
self.assertEqual('Must provide auth-type if password is specified.',
|
||||
str(exc))
|
||||
|
||||
def test_create_authenticated_bgp_peer_without_password(self):
|
||||
# Create authenticated BGP peer without password.
|
||||
resource = 'bgp_peer'
|
||||
cmd = bgp_peer.CreatePeer(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
peerip = '1.1.1.1'
|
||||
remote_asnum = '2048'
|
||||
authType = 'md5'
|
||||
args = [name,
|
||||
'--peer-ip', peerip,
|
||||
'--remote-as', remote_asnum,
|
||||
'--auth-type', authType]
|
||||
position_names = ['name', 'peer_ip', 'remote_as', 'auth_type']
|
||||
position_values = [name, peerip, remote_asnum, authType]
|
||||
exc = self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_resource,
|
||||
resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
self.assertEqual('Must provide password if auth-type is specified.',
|
||||
str(exc))
|
||||
|
||||
def test_update_bgp_peer(self):
|
||||
# Update BGP peer:
|
||||
# myid --advertise-tenant-networks True
|
||||
# --advertise-floating-ip-host-routes False
|
||||
resource = 'bgp_peer'
|
||||
cmd = bgp_peer.UpdatePeer(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--name', 'new-name',
|
||||
'--password', 'abc'],
|
||||
{'name': 'new-name', 'password': 'abc'})
|
||||
|
||||
def test_update_bgp_peer_exception(self):
|
||||
# Update BGP peer: myid.
|
||||
resource = 'bgp_peer'
|
||||
cmd = bgp_peer.UpdatePeer(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self.assertRaises(exceptions.CommandError,
|
||||
self._test_update_resource,
|
||||
resource, cmd, 'myid', ['myid'], {})
|
||||
|
||||
def test_list_bgp_peer(self):
|
||||
# List all BGP peers.
|
||||
resources = "bgp_peers"
|
||||
cmd = bgp_peer.ListPeers(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
# TODO(Vikram): Add test_list_bgp_peer_pagination
|
||||
|
||||
def test_list_bgp_peer_sort(self):
|
||||
# sorted list: bgp-peer-list --sort-key name --sort-key id
|
||||
# --sort-key asc --sort-key desc
|
||||
resources = "bgp_peers"
|
||||
cmd = bgp_peer.ListPeers(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_list_bgp_peer_limit(self):
|
||||
# size (1000) limited list: bgp-peer-list -P.
|
||||
resources = "bgp_peers"
|
||||
cmd = bgp_peer.ListPeers(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000)
|
||||
|
||||
def test_show_bgp_peer(self):
|
||||
# Show BGP peer: --fields id --fields name myid.
|
||||
resource = 'bgp_peer'
|
||||
cmd = bgp_peer.ShowPeer(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args,
|
||||
['id', 'name'])
|
||||
|
||||
def test_delete_bgp_peer(self):
|
||||
# Delete BGP peer: bgp_peer_id.
|
||||
resource = 'bgp_peer'
|
||||
cmd = bgp_peer.DeletePeer(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
myid = 'myid'
|
||||
args = [myid]
|
||||
self._test_delete_resource(resource, cmd, myid, args)
|
@ -1,273 +0,0 @@
|
||||
# Copyright 2016 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 unittest import mock
|
||||
|
||||
|
||||
from neutronclient.common import exceptions
|
||||
from neutronclient.neutron.v2_0.bgp import speaker as bgp_speaker
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20BGPSpeakerJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
non_admin_status_resources = ['bgp_speaker']
|
||||
|
||||
def test_create_bgp_speaker_with_minimal_options(self):
|
||||
# Create BGP Speaker with mandatory params.
|
||||
resource = 'bgp_speaker'
|
||||
cmd = bgp_speaker.CreateSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
local_asnum = '1'
|
||||
args = [name, '--local-as', local_asnum, ]
|
||||
position_names = ['name', 'local_as', 'ip_version']
|
||||
position_values = [name, local_asnum, 4]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_ipv4_bgp_speaker_with_all_params(self):
|
||||
# Create BGP Speaker with all params.
|
||||
resource = 'bgp_speaker'
|
||||
cmd = bgp_speaker.CreateSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
local_asnum = '1'
|
||||
args = [name,
|
||||
'--local-as', local_asnum,
|
||||
'--ip-version', '4',
|
||||
'--advertise-floating-ip-host-routes', 'True',
|
||||
'--advertise-tenant-networks', 'True']
|
||||
position_names = ['name', 'local_as', 'ip_version',
|
||||
'advertise_floating_ip_host_routes',
|
||||
'advertise_tenant_networks']
|
||||
position_values = [name, local_asnum, 4, 'True', 'True']
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_ipv6_bgp_speaker_with_all_params(self):
|
||||
# Create BGP Speaker with all params.
|
||||
resource = 'bgp_speaker'
|
||||
cmd = bgp_speaker.CreateSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
local_asnum = '65535'
|
||||
args = [name,
|
||||
'--local-as', local_asnum,
|
||||
'--ip-version', '6',
|
||||
'--advertise-floating-ip-host-routes', 'True',
|
||||
'--advertise-tenant-networks', 'True']
|
||||
position_names = ['name', 'local_as', 'ip_version',
|
||||
'advertise_floating_ip_host_routes',
|
||||
'advertise_tenant_networks']
|
||||
position_values = [name, local_asnum, 6, 'True', 'True']
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_bgp_speaker_with_invalid_min_local_asnum(self):
|
||||
# Create BGP Speaker with invalid minimum local-asnum.
|
||||
resource = 'bgp_speaker'
|
||||
cmd = bgp_speaker.CreateSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
local_asnum = '0'
|
||||
args = [name,
|
||||
'--local-as', local_asnum]
|
||||
position_names = ['name', 'local_as']
|
||||
position_values = [name, local_asnum]
|
||||
exc = self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_resource,
|
||||
resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
self.assertEqual('local-as "0" should be an integer [%s:%s].' %
|
||||
(bgp_speaker.MIN_AS_NUM, bgp_speaker.MAX_AS_NUM),
|
||||
str(exc))
|
||||
|
||||
def test_create_bgp_speaker_with_invalid_max_local_asnum(self):
|
||||
# Create BGP Speaker with invalid maximum local-asnum.
|
||||
resource = 'bgp_speaker'
|
||||
cmd = bgp_speaker.CreateSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
my_id = 'my-id'
|
||||
local_asnum = '4294967296'
|
||||
args = [name,
|
||||
'--local-as', local_asnum]
|
||||
position_names = ['name', 'local_as', ]
|
||||
position_values = [name, local_asnum, ]
|
||||
exc = self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_resource,
|
||||
resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
self.assertEqual('local-as "4294967296" should be an '
|
||||
'integer [%s:%s].' %
|
||||
(bgp_speaker.MIN_AS_NUM, bgp_speaker.MAX_AS_NUM),
|
||||
str(exc))
|
||||
|
||||
def test_update_bgp_speaker(self):
|
||||
# Update BGP Speaker:
|
||||
# myid --advertise-tenant-networks True
|
||||
# --advertise-floating-ip-host-routes False
|
||||
resource = 'bgp_speaker'
|
||||
cmd = bgp_speaker.UpdateSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid',
|
||||
'--name', 'new-name',
|
||||
'--advertise-tenant-networks', 'True',
|
||||
'--advertise-floating-ip-host-routes',
|
||||
'False'],
|
||||
{'name': 'new-name',
|
||||
'advertise_tenant_networks': 'True',
|
||||
'advertise_floating_ip_host_routes':
|
||||
'False'})
|
||||
|
||||
def test_update_bgp_speaker_exception(self):
|
||||
# Update BGP Speaker: myid.
|
||||
resource = 'bgp_speaker'
|
||||
cmd = bgp_speaker.UpdateSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self.assertRaises(exceptions.CommandError,
|
||||
self._test_update_resource,
|
||||
resource, cmd, 'myid', ['myid'], {})
|
||||
|
||||
def test_list_bgp_speaker(self):
|
||||
# List all BGP Speakers.
|
||||
resources = "bgp_speakers"
|
||||
cmd = bgp_speaker.ListSpeakers(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
@mock.patch.object(bgp_speaker.ListSpeakers, "extend_list")
|
||||
def test_list_bgp_speaker_pagination(self, mock_extend_list):
|
||||
# List all BGP Speakers with pagination support.
|
||||
cmd = bgp_speaker.ListSpeakers(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources_with_pagination("bgp_speakers",
|
||||
cmd)
|
||||
mock_extend_list.assert_called_once_with(test_cli20.IsA(list),
|
||||
mock.ANY)
|
||||
|
||||
def test_list_bgp_speaker_sort(self):
|
||||
# sorted list: bgp-speaker-list --sort-key name --sort-key id
|
||||
# --sort-key asc --sort-key desc
|
||||
resources = "bgp_speakers"
|
||||
cmd = bgp_speaker.ListSpeakers(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_list_bgp_speaker_limit(self):
|
||||
# size (1000) limited list: bgp-speaker-list -P.
|
||||
resources = "bgp_speakers"
|
||||
cmd = bgp_speaker.ListSpeakers(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000)
|
||||
|
||||
def test_show_bgp_speaker(self):
|
||||
# Show BGP Speaker: --fields id --fields name myid.
|
||||
resource = 'bgp_speaker'
|
||||
cmd = bgp_speaker.ShowSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args,
|
||||
['id', 'name'])
|
||||
|
||||
def test_delete_bgp_speaker(self):
|
||||
# Delete BGP Speaker: bgp_speaker_id.
|
||||
resource = 'bgp_speaker'
|
||||
cmd = bgp_speaker.DeleteSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
myid = 'myid'
|
||||
args = [myid]
|
||||
self._test_delete_resource(resource, cmd, myid, args)
|
||||
|
||||
def _test_add_remove_peer(self, action, cmd, args):
|
||||
"""Add or Remove BGP Peer to/from a BGP Speaker."""
|
||||
resource = 'bgp_speaker'
|
||||
subcmd = '%s_bgp_peer' % action
|
||||
body = {'bgp_peer_id': 'peerid'}
|
||||
if action == 'add':
|
||||
retval = {'bgp_peer': 'peerid'}
|
||||
retval = self.client.serialize(retval)
|
||||
expected_code = 200
|
||||
else:
|
||||
retval = None
|
||||
expected_code = 204
|
||||
self._test_update_resource_action(resource, cmd, 'myid',
|
||||
subcmd, args, body, expected_code,
|
||||
retval)
|
||||
|
||||
def test_add_peer_to_bgp_speaker(self):
|
||||
# Add peer to BGP speaker: myid peer_id=peerid
|
||||
cmd = bgp_speaker.AddPeerToSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['myid', 'peerid']
|
||||
self._test_add_remove_peer('add', cmd, args)
|
||||
|
||||
def test_remove_peer_from_bgp_speaker(self):
|
||||
# Remove peer from BGP speaker: myid peer_id=peerid
|
||||
cmd = bgp_speaker.RemovePeerFromSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['myid', 'peerid']
|
||||
self._test_add_remove_peer('remove', cmd, args)
|
||||
|
||||
def _test_add_remove_network(self, action, cmd, args):
|
||||
# Add or Remove network to/from a BGP Speaker.
|
||||
resource = 'bgp_speaker'
|
||||
subcmd = '%s_gateway_network' % action
|
||||
body = {'network_id': 'netid'}
|
||||
if action == 'add':
|
||||
retval = {'network': 'netid'}
|
||||
retval = self.client.serialize(retval)
|
||||
expected_code = 200
|
||||
else:
|
||||
retval = None
|
||||
expected_code = 204
|
||||
self._test_update_resource_action(resource, cmd, 'myid',
|
||||
subcmd, args, body, expected_code,
|
||||
retval)
|
||||
|
||||
def test_add_network_to_bgp_speaker(self):
|
||||
# Add peer to BGP speaker: myid network_id=netid
|
||||
cmd = bgp_speaker.AddNetworkToSpeaker(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['myid', 'netid']
|
||||
self._test_add_remove_network('add', cmd, args)
|
||||
|
||||
def test_remove_network_from_bgp_speaker(self):
|
||||
# Remove network from BGP speaker: myid network_id=netid
|
||||
cmd = bgp_speaker.RemoveNetworkFromSpeaker(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['myid', 'netid']
|
||||
self._test_add_remove_network('remove', cmd, args)
|
||||
|
||||
def test_list_routes_advertised_by_a_bgp_speaker(self):
|
||||
# Retrieve advertised route list
|
||||
resources = 'advertised_routes'
|
||||
cmd = bgp_speaker.ListRoutesAdvertisedBySpeaker(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
bs_id = 'bgp_speaker_id1'
|
||||
path = ((self.client.bgp_speaker_path + '/get_advertised_routes') %
|
||||
bs_id)
|
||||
self._test_list_resources(resources, cmd, base_args=[bs_id],
|
||||
path=path)
|
@ -1,154 +0,0 @@
|
||||
# Copyright 2015 Hewlett-Packard Development Company, L.P.
|
||||
# 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.flavor import flavor
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20FlavorJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def setUp(self):
|
||||
"""Prepare test environment."""
|
||||
super(CLITestV20FlavorJSON, self).setUp(plurals={'flavors': 'flavor'})
|
||||
self.register_non_admin_status_resource('flavor')
|
||||
self.register_non_admin_status_resource('service_profile')
|
||||
|
||||
def test_create_flavor_with_missing_params(self):
|
||||
"""Create test flavor with missing parameters."""
|
||||
resource = 'flavor'
|
||||
cmd = flavor.CreateFlavor(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'Test flavor'
|
||||
myid = 'myid'
|
||||
position_names = []
|
||||
position_values = []
|
||||
args = []
|
||||
self.assertRaises(
|
||||
SystemExit, self._test_create_resource,
|
||||
resource, cmd, name, myid, args, position_names, position_values)
|
||||
|
||||
def test_create_flavor_with_mandatory_params(self):
|
||||
"""Create test flavor with minimal parameters."""
|
||||
resource = 'flavor'
|
||||
cmd = flavor.CreateFlavor(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'Test flavor'
|
||||
myid = 'myid'
|
||||
service_type = 'DUMMY'
|
||||
# Defaults are returned in body
|
||||
position_names = ['name', 'service_type']
|
||||
position_values = [name, service_type]
|
||||
args = [name, service_type]
|
||||
self._test_create_resource(resource, cmd, name, myid, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_flavor_with_optional_params(self):
|
||||
"""Create test flavor including optional parameters."""
|
||||
resource = 'flavor'
|
||||
cmd = flavor.CreateFlavor(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'Test flavor'
|
||||
myid = 'myid'
|
||||
service_type = 'DUMMY'
|
||||
description = 'Test description'
|
||||
position_names = ['name', 'service_type', 'description', 'enabled']
|
||||
position_values = [name, service_type, description, 'False']
|
||||
args = [name, service_type,
|
||||
'--description', description,
|
||||
'--enabled=False']
|
||||
self._test_create_resource(resource, cmd, name, myid, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_delete_flavor(self):
|
||||
"""Delete flavor."""
|
||||
resource = 'flavor'
|
||||
cmd = flavor.DeleteFlavor(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args)
|
||||
|
||||
def test_list_flavors(self):
|
||||
"""List flavors test."""
|
||||
resources = 'flavors'
|
||||
cmd = flavor.ListFlavor(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
def test_list_flavors_with_pagination(self):
|
||||
"""List flavors test with pagination."""
|
||||
resources = 'flavors'
|
||||
cmd = flavor.ListFlavor(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(resources, cmd)
|
||||
|
||||
def test_list_flavors_with_sort(self):
|
||||
"""List flavors test with sorting by name and id."""
|
||||
resources = 'flavors'
|
||||
cmd = flavor.ListFlavor(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_show_flavor(self):
|
||||
"""Show flavor test."""
|
||||
resource = 'flavor'
|
||||
cmd = flavor.ShowFlavor(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'])
|
||||
|
||||
def test_update_flavor_with_name(self):
|
||||
"""Update flavor test."""
|
||||
resource = 'flavor'
|
||||
cmd = flavor.UpdateFlavor(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
newname = 'Test New Name'
|
||||
newdescription = 'New Description'
|
||||
args = ['--name', newname,
|
||||
'--description', newdescription,
|
||||
'--enabled', 'False', self.test_id]
|
||||
self._test_update_resource(resource, cmd, self.test_id, args,
|
||||
{'name': newname,
|
||||
'description': newdescription,
|
||||
'enabled': 'False'})
|
||||
|
||||
def test_associate_flavor(self):
|
||||
"""Associate flavor test."""
|
||||
resource = 'service_profile'
|
||||
cmd = flavor.AssociateFlavor(test_cli20.MyApp(sys.stdout), None)
|
||||
flavor_id = 'flavor-id'
|
||||
profile_id = 'profile-id'
|
||||
name = ''
|
||||
args = [flavor_id, profile_id]
|
||||
position_names = ['id']
|
||||
position_values = [profile_id]
|
||||
self._test_create_resource(resource, cmd, name, profile_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource='flavor_profile_binding',
|
||||
parent_id=flavor_id)
|
||||
|
||||
def test_disassociate_flavor(self):
|
||||
"""Disassociate flavor test."""
|
||||
resource = 'flavor_profile_binding'
|
||||
cmd = flavor.DisassociateFlavor(test_cli20.MyApp(sys.stdout), None)
|
||||
flavor_id = 'flavor-id'
|
||||
profile_id = 'profile-id'
|
||||
args = [flavor_id, profile_id]
|
||||
self._test_delete_resource(resource, cmd, profile_id, args,
|
||||
parent_id=flavor_id)
|
@ -1,122 +0,0 @@
|
||||
# Copyright 2015 Hewlett-Packard Development Company, L.P.
|
||||
# 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.flavor import flavor_profile
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20FlavorProfileJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def setUp(self):
|
||||
"""Prepare test environment."""
|
||||
super(CLITestV20FlavorProfileJSON, self).setUp(
|
||||
plurals={'service_profiles': 'service_profile'})
|
||||
self.register_non_admin_status_resource('service_profile')
|
||||
|
||||
def test_create_flavor_profile_with_mandatory_params(self):
|
||||
"""Create test flavor profile test."""
|
||||
resource = 'service_profile'
|
||||
cmd = flavor_profile.CreateFlavorProfile(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
name = ''
|
||||
description = 'Test flavor profile'
|
||||
myid = 'myid'
|
||||
metainfo = "{'a':'b'}"
|
||||
# Defaults are returned in body
|
||||
position_names = ['description', 'metainfo']
|
||||
position_values = [description, metainfo]
|
||||
args = ['--description', description, '--metainfo', metainfo]
|
||||
self._test_create_resource(resource, cmd, name, myid, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_flavor_profile_with_optional_params(self):
|
||||
"""Create test flavor profile disabled test."""
|
||||
resource = 'service_profile'
|
||||
cmd = flavor_profile.CreateFlavorProfile(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
name = ''
|
||||
description = 'Test flavor profile - disabled'
|
||||
myid = 'myid'
|
||||
driver = 'mydriver'
|
||||
metainfo = "{'a':'b'}"
|
||||
position_names = ['description', 'driver', 'metainfo', 'enabled']
|
||||
position_values = [description, driver, metainfo, 'False']
|
||||
args = ['--description', description, '--driver', driver,
|
||||
'--metainfo', metainfo, '--enabled=False']
|
||||
self._test_create_resource(resource, cmd, name, myid, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_list_flavor_profiles(self):
|
||||
"""List flavor profiles test."""
|
||||
resources = 'service_profiles'
|
||||
cmd = flavor_profile.ListFlavorProfile(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
def test_list_flavor_profiles_with_pagination(self):
|
||||
"""List flavor profiles test with pagination."""
|
||||
resources = 'service_profiles'
|
||||
cmd = flavor_profile.ListFlavorProfile(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(resources, cmd)
|
||||
|
||||
def test_list_flavor_profiles_with_sort(self):
|
||||
"""List flavor profiles test with sort by description."""
|
||||
resources = 'service_profiles'
|
||||
cmd = flavor_profile.ListFlavorProfile(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["description"],
|
||||
sort_dir=["asc"])
|
||||
|
||||
def test_show_flavor_profile(self):
|
||||
"""Show flavor profile test."""
|
||||
resource = 'service_profile'
|
||||
cmd = flavor_profile.ShowFlavorProfile(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'])
|
||||
|
||||
def test_update_flavor_profile(self):
|
||||
"""Update flavor profile test."""
|
||||
resource = 'service_profile'
|
||||
cmd = flavor_profile.UpdateFlavorProfile(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
newdescription = 'Test new description'
|
||||
newdriver = 'NewDriver'
|
||||
newmetainfo = "{'c':'d'}"
|
||||
newenabled = "False"
|
||||
args = ['--description', newdescription,
|
||||
'--driver', newdriver,
|
||||
'--metainfo', newmetainfo,
|
||||
'--enabled', newenabled,
|
||||
self.test_id]
|
||||
self._test_update_resource(resource, cmd, self.test_id, args,
|
||||
{'description': newdescription,
|
||||
'driver': newdriver,
|
||||
'metainfo': newmetainfo,
|
||||
'enabled': newenabled})
|
||||
|
||||
def test_delete_flavor_profile(self):
|
||||
"""Delete flavor profile."""
|
||||
resource = 'service_profile'
|
||||
cmd = flavor_profile.DeleteFlavorProfile(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args)
|
@ -1,170 +0,0 @@
|
||||
# Copyright 2013 Big Switch Networks 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
|
||||
from neutronclient.neutron.v2_0.fw import firewall
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20FirewallJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def test_create_firewall_with_mandatory_params(self):
|
||||
# firewall-create with mandatory (none) params.
|
||||
resource = 'firewall'
|
||||
cmd = firewall.CreateFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
name = ''
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'my-id'
|
||||
policy_id = 'my-policy-id'
|
||||
args = ['--tenant-id', tenant_id, policy_id, ]
|
||||
position_names = ['firewall_policy_id', ]
|
||||
position_values = [policy_id, ]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
admin_state_up=True, tenant_id=tenant_id)
|
||||
|
||||
def test_create_firewall_with_all_params(self):
|
||||
# firewall-create with all params set.
|
||||
resource = 'firewall'
|
||||
cmd = firewall.CreateFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'my-name'
|
||||
description = 'my-desc'
|
||||
policy_id = 'my-policy-id'
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'my-id'
|
||||
args = ['--description', description,
|
||||
'--admin-state-down',
|
||||
'--tenant-id', tenant_id,
|
||||
policy_id]
|
||||
position_names = ['firewall_policy_id', ]
|
||||
position_values = [policy_id, ]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
description=description,
|
||||
admin_state_up=False,
|
||||
tenant_id=tenant_id)
|
||||
|
||||
def test_create_firewall_with_routers(self):
|
||||
resource = 'firewall'
|
||||
cmd = firewall.CreateFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'my-name'
|
||||
policy_id = 'my-policy-id'
|
||||
my_id = 'my-id'
|
||||
args = ['--router', 'fake-id', '--router', 'fake-name', policy_id]
|
||||
router_ids = ['fake-id', 'fake-name']
|
||||
position_names = ['firewall_policy_id', 'router_ids']
|
||||
position_values = [policy_id, router_ids]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_list_firewalls(self):
|
||||
# firewall-list.
|
||||
resources = "firewalls"
|
||||
cmd = firewall.ListFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
def test_list_firewalls_pagination(self):
|
||||
# firewall-list with pagination.
|
||||
resources = "firewalls"
|
||||
cmd = firewall.ListFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(resources, cmd)
|
||||
|
||||
def test_list_firewalls_sort(self):
|
||||
# sorted list: firewall-list --sort-key name --sort-key id
|
||||
# --sort-key asc --sort-key desc
|
||||
resources = "firewalls"
|
||||
cmd = firewall.ListFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_list_firewalls_limit(self):
|
||||
# size (1000) limited list: firewall-list -P.
|
||||
resources = "firewalls"
|
||||
cmd = firewall.ListFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000)
|
||||
|
||||
def test_show_firewall_id(self):
|
||||
# firewall-show test_id.
|
||||
resource = 'firewall'
|
||||
cmd = firewall.ShowFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'])
|
||||
|
||||
def test_show_firewall_id_name(self):
|
||||
# firewall-show.
|
||||
resource = 'firewall'
|
||||
cmd = firewall.ShowFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id,
|
||||
args, ['id', 'name'])
|
||||
|
||||
def test_update_firewall(self):
|
||||
# firewall-update myid --name newname --tags a b.
|
||||
resource = 'firewall'
|
||||
cmd = firewall.UpdateFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--name', 'newname'],
|
||||
{'name': 'newname', })
|
||||
|
||||
def test_update_firewall_using_policy_name(self):
|
||||
# firewall-update myid --policy newpolicy.
|
||||
resource = 'firewall'
|
||||
cmd = firewall.UpdateFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--policy', 'newpolicy'],
|
||||
{'firewall_policy_id': 'newpolicy'})
|
||||
|
||||
def test_update_firewall_with_routers(self):
|
||||
resource = 'firewall'
|
||||
cmd = firewall.UpdateFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(
|
||||
resource, cmd, 'myid',
|
||||
['myid', '--router', 'fake-id', '--router', 'fake-name'],
|
||||
{'router_ids': ['fake-id', 'fake-name']})
|
||||
|
||||
def test_update_firewall_with_no_routers(self):
|
||||
resource = 'firewall'
|
||||
cmd = firewall.UpdateFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(
|
||||
resource, cmd, 'myid',
|
||||
['myid', '--no-routers'], {'router_ids': []})
|
||||
|
||||
def test_update_firewall_with_bad_router_options(self):
|
||||
resource = 'firewall'
|
||||
cmd = firewall.UpdateFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
self.assertRaises(
|
||||
SystemExit,
|
||||
self._test_update_resource,
|
||||
resource, cmd, 'myid',
|
||||
['myid', '--no-routers', '--router', 'fake-id'], {})
|
||||
|
||||
def test_delete_firewall(self):
|
||||
# firewall-delete my-id.
|
||||
resource = 'firewall'
|
||||
cmd = firewall.DeleteFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args)
|
||||
|
||||
def test_update_firewall_admin_state(self):
|
||||
# firewall-update myid --admin-state-up True.
|
||||
resource = 'firewall'
|
||||
cmd = firewall.UpdateFirewall(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--admin-state-up', 'True'],
|
||||
{'admin_state_up': 'True'})
|
@ -1,228 +0,0 @@
|
||||
# Copyright 2013 Big Switch Networks 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
from unittest import mock
|
||||
|
||||
|
||||
from neutronclient.neutron.v2_0.fw import firewallpolicy
|
||||
from neutronclient import shell
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20FirewallPolicyJSON(test_cli20.CLITestV20Base):
|
||||
def setUp(self):
|
||||
super(CLITestV20FirewallPolicyJSON, self).setUp()
|
||||
|
||||
def test_create_firewall_policy_with_mandatory_params(self):
|
||||
# firewall-policy-create with mandatory (none) params only.
|
||||
resource = 'firewall_policy'
|
||||
cmd = firewallpolicy.CreateFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
tenant_id = 'my-tenant'
|
||||
name = 'my-name'
|
||||
my_id = 'myid'
|
||||
args = ['--tenant-id', tenant_id,
|
||||
'--admin-state_up',
|
||||
name, ]
|
||||
position_names = ['name', ]
|
||||
position_values = [name, ]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
admin_state_up=True, tenant_id=tenant_id)
|
||||
|
||||
def test_create_firewall_policy_with_all_params(self):
|
||||
# firewall-policy-create with rule param of misc format.
|
||||
resource = 'firewall_policy'
|
||||
cmd = firewallpolicy.CreateFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
description = 'my-desc'
|
||||
firewall_rules_res = ['rule_id1', 'rule_id2']
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'myid'
|
||||
position_names = ['name', ]
|
||||
position_values = [name, ]
|
||||
|
||||
# check for both str and unicode format firewall_rules_arg
|
||||
for firewall_rules_arg in ['rule_id1 rule_id2', u'rule_id1 rule_id2']:
|
||||
args = ['--description', description,
|
||||
'--shared',
|
||||
'--firewall-rules', firewall_rules_arg,
|
||||
'--audited',
|
||||
'--tenant-id', tenant_id,
|
||||
'--admin-state_up',
|
||||
name]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
description=description, shared=True,
|
||||
firewall_rules=firewall_rules_res,
|
||||
audited=True, admin_state_up=True,
|
||||
tenant_id=tenant_id)
|
||||
|
||||
def test_list_firewall_policies(self):
|
||||
# firewall-policy-list.
|
||||
resources = "firewall_policies"
|
||||
cmd = firewallpolicy.ListFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
def test_list_firewall_policies_pagination(self):
|
||||
# firewall-policy-list."""
|
||||
resources = "firewall_policies"
|
||||
cmd = firewallpolicy.ListFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources_with_pagination(resources, cmd)
|
||||
|
||||
def test_list_firewall_policies_sort(self):
|
||||
# sorted list: firewall-policy-list --sort-key name --sort-key id
|
||||
# --sort-key asc --sort-key desc
|
||||
resources = "firewall_policies"
|
||||
cmd = firewallpolicy.ListFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_list_firewall_policies_limit(self):
|
||||
# size (1000) limited list: firewall-policy-list -P.
|
||||
resources = "firewall_policies"
|
||||
cmd = firewallpolicy.ListFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000)
|
||||
|
||||
def test_show_firewall_policy_id(self):
|
||||
# firewall-policy-show test_id.
|
||||
resource = 'firewall_policy'
|
||||
cmd = firewallpolicy.ShowFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'])
|
||||
|
||||
def test_show_firewall_policy_id_name(self):
|
||||
# firewall-policy-show.
|
||||
resource = 'firewall_policy'
|
||||
cmd = firewallpolicy.ShowFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id,
|
||||
args, ['id', 'name'])
|
||||
|
||||
def test_update_firewall_policy(self):
|
||||
# firewall-policy-update myid --name newname.
|
||||
resource = 'firewall_policy'
|
||||
cmd = firewallpolicy.UpdateFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--name', 'newname'],
|
||||
{'name': 'newname', })
|
||||
|
||||
def test_update_firewall_policy_with_rules(self):
|
||||
# firewall-policy-update myid --firewall-rules "rule1 rule2".
|
||||
resource = 'firewall_policy'
|
||||
cmd = firewallpolicy.UpdateFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
firewall_rules_arg = u'rule_id3 rule_id4'
|
||||
firewall_rules_res = ['rule_id3', 'rule_id4']
|
||||
self._test_update_resource(
|
||||
resource, cmd, 'myid',
|
||||
['myid', '--firewall-rules', firewall_rules_arg],
|
||||
{'firewall_rules': firewall_rules_res, })
|
||||
|
||||
def test_delete_firewall_policy(self):
|
||||
# firewall-policy-delete my-id.
|
||||
resource = 'firewall_policy'
|
||||
cmd = firewallpolicy.DeleteFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'myid1'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args)
|
||||
|
||||
def test_insert_firewall_rule(self):
|
||||
# firewall-policy-insert-rule myid newruleid --insert-before ruleAid
|
||||
# --insert-after ruleBid
|
||||
resource = 'firewall_policy'
|
||||
cmd = firewallpolicy.FirewallPolicyInsertRule(
|
||||
test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
myid = 'myid'
|
||||
args = ['myid', 'newrule',
|
||||
'--insert-before', 'rule2',
|
||||
'--insert-after', 'rule1']
|
||||
extrafields = {'firewall_rule_id': 'newrule',
|
||||
'insert_before': 'rule2',
|
||||
'insert_after': 'rule1'}
|
||||
|
||||
body = extrafields
|
||||
path = getattr(self.client, resource + "_insert_path")
|
||||
cmd_parser = cmd.get_parser(resource + "_insert_rule")
|
||||
resp = (test_cli20.MyResp(204), None)
|
||||
|
||||
with mock.patch.object(cmd, "get_client",
|
||||
return_value=self.client) as mock_get_client, \
|
||||
mock.patch.object(self.client.httpclient, "request",
|
||||
return_value=resp) as mock_request:
|
||||
shell.run_command(cmd, cmd_parser, args)
|
||||
self.assert_mock_multiple_calls_with_same_arguments(
|
||||
mock_get_client, mock.call(), 4)
|
||||
mock_request.assert_called_once_with(
|
||||
test_cli20.MyUrlComparator(
|
||||
test_cli20.end_url(path % myid),
|
||||
self.client),
|
||||
'PUT', body=test_cli20.MyComparator(body, self.client),
|
||||
headers=test_cli20.ContainsKeyValue(
|
||||
{'X-Auth-Token': test_cli20.TOKEN}))
|
||||
|
||||
def test_remove_firewall_rule(self):
|
||||
# firewall-policy-remove-rule myid ruleid
|
||||
resource = 'firewall_policy'
|
||||
cmd = firewallpolicy.FirewallPolicyRemoveRule(
|
||||
test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
myid = 'myid'
|
||||
args = ['myid', 'removerule']
|
||||
extrafields = {'firewall_rule_id': 'removerule', }
|
||||
|
||||
body = extrafields
|
||||
path = getattr(self.client, resource + "_remove_path")
|
||||
cmd_parser = cmd.get_parser(resource + "_remove_rule")
|
||||
resp = (test_cli20.MyResp(204), None)
|
||||
|
||||
with mock.patch.object(cmd, "get_client",
|
||||
return_value=self.client) as mock_get_client, \
|
||||
mock.patch.object(self.client.httpclient, "request",
|
||||
return_value=resp) as mock_request:
|
||||
shell.run_command(cmd, cmd_parser, args)
|
||||
self.assert_mock_multiple_calls_with_same_arguments(
|
||||
mock_get_client, mock.call(), 2)
|
||||
mock_request.assert_called_once_with(
|
||||
test_cli20.MyUrlComparator(
|
||||
test_cli20.end_url(path % myid),
|
||||
self.client),
|
||||
'PUT', body=test_cli20.MyComparator(body, self.client),
|
||||
headers=test_cli20.ContainsKeyValue(
|
||||
{'X-Auth-Token': test_cli20.TOKEN}))
|
||||
|
||||
def test_update_firewall_policy_name_shared_audited(self):
|
||||
# firewall-policy-update myid --name newname2 --shared --audited
|
||||
resource = 'firewall_policy'
|
||||
cmd = firewallpolicy.UpdateFirewallPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--name', 'newname2',
|
||||
'--shared', 'True', '--audited', 'True'],
|
||||
{'name': 'newname2',
|
||||
'shared': 'True', 'audited': 'True'})
|
@ -1,251 +0,0 @@
|
||||
# Copyright 2013 Big Switch Networks 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
|
||||
from neutronclient.neutron.v2_0.fw import firewallrule
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20FirewallRuleJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def _test_create_firewall_rule_with_mandatory_params(self, enabled):
|
||||
# firewall-rule-create with mandatory (none) params only.
|
||||
resource = 'firewall_rule'
|
||||
cmd = firewallrule.CreateFirewallRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
tenant_id = 'my-tenant'
|
||||
name = ''
|
||||
my_id = 'myid'
|
||||
protocol = 'tcp'
|
||||
action = 'allow'
|
||||
ip_version = 4
|
||||
args = ['--tenant-id', tenant_id,
|
||||
'--admin-state-up',
|
||||
'--protocol', protocol,
|
||||
'--action', action,
|
||||
'--enabled', enabled]
|
||||
position_names = []
|
||||
position_values = []
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
protocol=protocol, action=action,
|
||||
enabled=enabled, tenant_id=tenant_id,
|
||||
ip_version=ip_version)
|
||||
|
||||
def test_create_enabled_firewall_rule_with_mandatory_params_lcase(self):
|
||||
self._test_create_firewall_rule_with_mandatory_params(enabled='true')
|
||||
|
||||
def test_create_disabled_firewall_rule_with_mandatory_params_lcase(self):
|
||||
self._test_create_firewall_rule_with_mandatory_params(enabled='false')
|
||||
|
||||
def test_create_enabled_firewall_rule_with_mandatory_params(self):
|
||||
self._test_create_firewall_rule_with_mandatory_params(enabled='True')
|
||||
|
||||
def test_create_disabled_firewall_rule_with_mandatory_params(self):
|
||||
self._test_create_firewall_rule_with_mandatory_params(enabled='False')
|
||||
|
||||
def _setup_create_firewall_rule_with_all_params(
|
||||
self, protocol='tcp', protocol_cli=None,
|
||||
action='allow', action_cli=None, ip_version='4'):
|
||||
# firewall-rule-create with all params set.
|
||||
resource = 'firewall_rule'
|
||||
cmd = firewallrule.CreateFirewallRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
name = 'my-name'
|
||||
description = 'my-desc'
|
||||
source_ip = '192.168.1.0/24'
|
||||
destination_ip = '192.168.2.0/24'
|
||||
source_port = '0:65535'
|
||||
destination_port = '0:65535'
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'myid'
|
||||
enabled = 'True'
|
||||
args = ['--description', description,
|
||||
'--shared',
|
||||
'--protocol', protocol_cli or protocol,
|
||||
'--ip-version', ip_version,
|
||||
'--source-ip-address', source_ip,
|
||||
'--destination-ip-address', destination_ip,
|
||||
'--source-port', source_port,
|
||||
'--destination-port', destination_port,
|
||||
'--action', action_cli or action,
|
||||
'--enabled', enabled,
|
||||
'--admin-state-up',
|
||||
'--tenant-id', tenant_id]
|
||||
position_names = []
|
||||
position_values = []
|
||||
if protocol == 'any':
|
||||
protocol = None
|
||||
if ip_version == '4' or ip_version == '6':
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
description=description, shared=True,
|
||||
protocol=protocol,
|
||||
ip_version=int(ip_version),
|
||||
source_ip_address=source_ip,
|
||||
destination_ip_address=destination_ip,
|
||||
source_port=source_port,
|
||||
destination_port=destination_port,
|
||||
action=action, enabled='True',
|
||||
tenant_id=tenant_id)
|
||||
else:
|
||||
self.assertRaises(SystemExit, self._test_create_resource,
|
||||
resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
ip_version=int(ip_version),
|
||||
source_ip_address=source_ip,
|
||||
destination_ip_address=destination_ip,
|
||||
source_port=source_port,
|
||||
destination_port=destination_port,
|
||||
action=action, enabled='True',
|
||||
tenant_id=tenant_id)
|
||||
|
||||
def test_create_firewall_rule_with_all_params(self):
|
||||
self._setup_create_firewall_rule_with_all_params()
|
||||
|
||||
def test_create_firewall_rule_with_proto_any(self):
|
||||
self._setup_create_firewall_rule_with_all_params(protocol='any')
|
||||
|
||||
def test_create_firewall_rule_with_IP_version_6(self):
|
||||
self._setup_create_firewall_rule_with_all_params(ip_version='6')
|
||||
|
||||
def test_create_firewall_rule_with_invalid_IP_version(self):
|
||||
self._setup_create_firewall_rule_with_all_params(ip_version='5')
|
||||
|
||||
def test_create_firewall_rule_with_proto_action_upper_capitalized(self):
|
||||
for protocol in ('TCP', 'Tcp', 'ANY', 'AnY'):
|
||||
self._setup_create_firewall_rule_with_all_params(
|
||||
protocol=protocol.lower(),
|
||||
protocol_cli=protocol)
|
||||
for action in ('Allow', 'DENY', 'reject'):
|
||||
self._setup_create_firewall_rule_with_all_params(
|
||||
action=action.lower(),
|
||||
action_cli=action)
|
||||
|
||||
def test_list_firewall_rules(self):
|
||||
# firewall-rule-list.
|
||||
resources = "firewall_rules"
|
||||
cmd = firewallrule.ListFirewallRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
def test_list_firewall_rules_pagination(self):
|
||||
# firewall-rule-list.
|
||||
resources = "firewall_rules"
|
||||
cmd = firewallrule.ListFirewallRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources_with_pagination(resources, cmd)
|
||||
|
||||
def test_list_firewall_rules_sort(self):
|
||||
# firewall-rule-list --sort-key name --sort-key id --sort-key asc
|
||||
# --sort-key desc
|
||||
resources = "firewall_rules"
|
||||
cmd = firewallrule.ListFirewallRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_list_firewall_rules_limit(self):
|
||||
# firewall-rule-list -P."""
|
||||
resources = "firewall_rules"
|
||||
cmd = firewallrule.ListFirewallRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000)
|
||||
|
||||
def test_show_firewall_rule_id(self):
|
||||
# firewall-rule-show test_id.
|
||||
resource = 'firewall_rule'
|
||||
cmd = firewallrule.ShowFirewallRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'])
|
||||
|
||||
def test_show_firewall_rule_id_name(self):
|
||||
# firewall-rule-show.
|
||||
resource = 'firewall_rule'
|
||||
cmd = firewallrule.ShowFirewallRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id,
|
||||
args, ['id', 'name'])
|
||||
|
||||
def test_update_firewall_rule(self):
|
||||
# firewall-rule-update myid --name newname.
|
||||
resource = 'firewall_rule'
|
||||
cmd = firewallrule.UpdateFirewallRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--name', 'newname'],
|
||||
{'name': 'newname', })
|
||||
|
||||
# firewall-rule-update myid --protocol any.
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--protocol', 'any'],
|
||||
{'protocol': None, })
|
||||
|
||||
# firewall-rule-update myid --description any
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--description', 'any'],
|
||||
{'description': 'any', })
|
||||
|
||||
# firewall-rule-update myid --source_ip_address 192.192.192.192
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--source_ip_address',
|
||||
'192.192.192.192'],
|
||||
{'source_ip_address': '192.192.192.192', })
|
||||
|
||||
# firewall-rule-update myid --source_port 32767
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--source_port', '32767'],
|
||||
{'source_port': '32767', })
|
||||
|
||||
# firewall-rule-update myid --destination_ip_address 0.1.0.1
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--destination_ip_address',
|
||||
'0.1.0.1'],
|
||||
{'destination_ip_address': '0.1.0.1', })
|
||||
|
||||
# firewall-rule-update myid --destination_port 65432
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--destination_port',
|
||||
'65432'],
|
||||
{'destination_port': '65432', })
|
||||
|
||||
# firewall-rule-update myid --enabled False
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--enabled', 'False'],
|
||||
{'enabled': 'False', })
|
||||
|
||||
# firewall-rule-update myid --action reject
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--action', 'reject'],
|
||||
{'action': 'reject', })
|
||||
|
||||
# firewall-rule-update myid --shared false
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--shared', 'false'],
|
||||
{'shared': 'false', })
|
||||
|
||||
def test_delete_firewall_rule(self):
|
||||
# firewall-rule-delete my-id.
|
||||
resource = 'firewall_rule'
|
||||
cmd = firewallrule.DeleteFirewallRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'myid1'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args)
|
@ -1,202 +0,0 @@
|
||||
# Copyright 2013 Mirantis 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
from unittest import mock
|
||||
|
||||
|
||||
from neutronclient.neutron.v2_0.lb import healthmonitor
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20LbHealthmonitorJSON(test_cli20.CLITestV20Base):
|
||||
def test_create_healthmonitor_with_mandatory_params(self):
|
||||
# lb-healthmonitor-create with mandatory params only.
|
||||
resource = 'health_monitor'
|
||||
cmd = healthmonitor.CreateHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
admin_state_up = False
|
||||
delay = '60'
|
||||
max_retries = '2'
|
||||
timeout = '10'
|
||||
type = 'TCP'
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'my-id'
|
||||
args = ['--admin-state-down',
|
||||
'--delay', delay,
|
||||
'--max-retries', max_retries,
|
||||
'--timeout', timeout,
|
||||
'--type', type,
|
||||
'--tenant-id', tenant_id]
|
||||
position_names = ['admin_state_up', 'delay', 'max_retries', 'timeout',
|
||||
'type', 'tenant_id']
|
||||
position_values = [admin_state_up, delay, max_retries, timeout, type,
|
||||
tenant_id]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_healthmonitor_with_all_params(self):
|
||||
# lb-healthmonitor-create with all params set.
|
||||
resource = 'health_monitor'
|
||||
cmd = healthmonitor.CreateHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
admin_state_up = False
|
||||
delay = '60'
|
||||
expected_codes = '200-202,204'
|
||||
http_method = 'HEAD'
|
||||
max_retries = '2'
|
||||
timeout = '10'
|
||||
type = 'TCP'
|
||||
tenant_id = 'my-tenant'
|
||||
url_path = '/health'
|
||||
my_id = 'my-id'
|
||||
args = ['--admin-state-down',
|
||||
'--delay', delay,
|
||||
'--expected-codes', expected_codes,
|
||||
'--http-method', http_method,
|
||||
'--max-retries', max_retries,
|
||||
'--timeout', timeout,
|
||||
'--type', type,
|
||||
'--tenant-id', tenant_id,
|
||||
'--url-path', url_path]
|
||||
position_names = ['admin_state_up', 'delay',
|
||||
'expected_codes', 'http_method',
|
||||
'max_retries', 'timeout',
|
||||
'type', 'tenant_id', 'url_path']
|
||||
position_values = [admin_state_up, delay,
|
||||
expected_codes, http_method,
|
||||
max_retries, timeout,
|
||||
type, tenant_id, url_path]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_list_healthmonitors(self):
|
||||
# lb-healthmonitor-list.
|
||||
resources = "health_monitors"
|
||||
cmd = healthmonitor.ListHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
def test_list_healthmonitors_pagination(self):
|
||||
# lb-healthmonitor-list.
|
||||
resources = "health_monitors"
|
||||
cmd = healthmonitor.ListHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources_with_pagination(resources, cmd)
|
||||
|
||||
def test_list_healthmonitors_sort(self):
|
||||
# lb-healthmonitor-list --sort-key name --sort-key id --sort-key asc
|
||||
# --sort-key desc
|
||||
resources = "health_monitors"
|
||||
cmd = healthmonitor.ListHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_list_healthmonitors_limit(self):
|
||||
# lb-healthmonitor-list -P.
|
||||
resources = "health_monitors"
|
||||
cmd = healthmonitor.ListHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000)
|
||||
|
||||
def test_show_healthmonitor_id(self):
|
||||
# lb-healthmonitor-show test_id.
|
||||
resource = 'health_monitor'
|
||||
cmd = healthmonitor.ShowHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'])
|
||||
|
||||
def test_update_health_monitor(self):
|
||||
# lb-healthmonitor-update myid --name myname --tags a b.
|
||||
resource = 'health_monitor'
|
||||
cmd = healthmonitor.UpdateHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--timeout', '5'],
|
||||
{'timeout': '5', })
|
||||
|
||||
def test_delete_healthmonitor(self):
|
||||
# lb-healthmonitor-delete my-id."""
|
||||
resource = 'health_monitor'
|
||||
cmd = healthmonitor.DeleteHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args)
|
||||
|
||||
def test_associate_healthmonitor(self):
|
||||
cmd = healthmonitor.AssociateHealthMonitor(
|
||||
test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
resource = 'health_monitor'
|
||||
health_monitor_id = 'hm-id'
|
||||
pool_id = 'p_id'
|
||||
args = [health_monitor_id, pool_id]
|
||||
|
||||
body = {resource: {'id': health_monitor_id}}
|
||||
result = {resource: {'id': health_monitor_id}, }
|
||||
result_str = self.client.serialize(result)
|
||||
|
||||
path = getattr(self.client,
|
||||
"associate_pool_health_monitors_path") % pool_id
|
||||
return_tup = (test_cli20.MyResp(200), result_str)
|
||||
cmd_parser = cmd.get_parser('test_' + resource)
|
||||
parsed_args = cmd_parser.parse_args(args)
|
||||
|
||||
with mock.patch.object(cmd, "get_client",
|
||||
return_value=self.client) as mock_get_client, \
|
||||
mock.patch.object(self.client.httpclient, "request",
|
||||
return_value=return_tup) as mock_request:
|
||||
cmd.run(parsed_args)
|
||||
|
||||
mock_get_client.assert_called_once_with()
|
||||
mock_request.assert_called_once_with(
|
||||
test_cli20.end_url(path), 'POST',
|
||||
body=test_cli20.MyComparator(body, self.client),
|
||||
headers=test_cli20.ContainsKeyValue(
|
||||
{'X-Auth-Token': test_cli20.TOKEN}))
|
||||
|
||||
def test_disassociate_healthmonitor(self):
|
||||
cmd = healthmonitor.DisassociateHealthMonitor(
|
||||
test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
resource = 'health_monitor'
|
||||
health_monitor_id = 'hm-id'
|
||||
pool_id = 'p_id'
|
||||
args = [health_monitor_id, pool_id]
|
||||
|
||||
path = (getattr(self.client,
|
||||
"disassociate_pool_health_monitors_path") %
|
||||
{'pool': pool_id, 'health_monitor': health_monitor_id})
|
||||
return_tup = (test_cli20.MyResp(204), None)
|
||||
cmd_parser = cmd.get_parser('test_' + resource)
|
||||
parsed_args = cmd_parser.parse_args(args)
|
||||
|
||||
with mock.patch.object(cmd, "get_client",
|
||||
return_value=self.client) as mock_get_client, \
|
||||
mock.patch.object(self.client.httpclient, "request",
|
||||
return_value=return_tup) as mock_request:
|
||||
cmd.run(parsed_args)
|
||||
|
||||
mock_get_client.assert_called_once_with()
|
||||
mock_request.assert_called_once_with(
|
||||
test_cli20.end_url(path), 'DELETE',
|
||||
body=None,
|
||||
headers=test_cli20.ContainsKeyValue(
|
||||
{'X-Auth-Token': test_cli20.TOKEN}))
|
@ -1,118 +0,0 @@
|
||||
# Copyright 2013 Mirantis 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
|
||||
from neutronclient.neutron.v2_0.lb import member
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20LbMemberJSON(test_cli20.CLITestV20Base):
|
||||
def setUp(self):
|
||||
super(CLITestV20LbMemberJSON, self).setUp(plurals={'tags': 'tag'})
|
||||
|
||||
def test_create_member(self):
|
||||
# lb-member-create with mandatory params only.
|
||||
resource = 'member'
|
||||
cmd = member.CreateMember(test_cli20.MyApp(sys.stdout), None)
|
||||
address = '10.0.0.1'
|
||||
port = '8080'
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'my-id'
|
||||
pool_id = 'pool-id'
|
||||
args = ['--address', address, '--protocol-port', port,
|
||||
'--tenant-id', tenant_id, pool_id]
|
||||
position_names = ['address', 'protocol_port', 'tenant_id', 'pool_id',
|
||||
'admin_state_up']
|
||||
position_values = [address, port, tenant_id, pool_id, True]
|
||||
self._test_create_resource(resource, cmd, None, my_id, args,
|
||||
position_names, position_values,
|
||||
admin_state_up=None)
|
||||
|
||||
def test_create_member_all_params(self):
|
||||
# lb-member-create with all available params.
|
||||
resource = 'member'
|
||||
cmd = member.CreateMember(test_cli20.MyApp(sys.stdout), None)
|
||||
address = '10.0.0.1'
|
||||
admin_state_up = False
|
||||
port = '8080'
|
||||
weight = '1'
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'my-id'
|
||||
pool_id = 'pool-id'
|
||||
args = ['--address', address, '--admin-state-down',
|
||||
'--protocol-port', port, '--weight', weight,
|
||||
'--tenant-id', tenant_id, pool_id]
|
||||
position_names = [
|
||||
'address', 'admin_state_up', 'protocol_port', 'weight',
|
||||
'tenant_id', 'pool_id'
|
||||
]
|
||||
position_values = [address, admin_state_up, port, weight,
|
||||
tenant_id, pool_id]
|
||||
self._test_create_resource(resource, cmd, None, my_id, args,
|
||||
position_names, position_values,
|
||||
admin_state_up=None)
|
||||
|
||||
def test_list_members(self):
|
||||
# lb-member-list.
|
||||
resources = "members"
|
||||
cmd = member.ListMember(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
def test_list_members_pagination(self):
|
||||
# lb-member-list.
|
||||
resources = "members"
|
||||
cmd = member.ListMember(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(resources, cmd)
|
||||
|
||||
def test_list_members_sort(self):
|
||||
# lb-member-list --sort-key name --sort-key id --sort-key asc
|
||||
# --sort-key desc
|
||||
resources = "members"
|
||||
cmd = member.ListMember(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_list_members_limit(self):
|
||||
# lb-member-list -P.
|
||||
resources = "members"
|
||||
cmd = member.ListMember(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000)
|
||||
|
||||
def test_show_member_id(self):
|
||||
# lb-member-show test_id.
|
||||
resource = 'member'
|
||||
cmd = member.ShowMember(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'])
|
||||
|
||||
def test_update_member(self):
|
||||
# lb-member-update myid --name myname --tags a b.
|
||||
resource = 'member'
|
||||
cmd = member.UpdateMember(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--name', 'myname',
|
||||
'--tags', 'a', 'b'],
|
||||
{'name': 'myname', 'tags': ['a', 'b'], })
|
||||
|
||||
def test_delete_member(self):
|
||||
# lb-member-delete my-id.
|
||||
resource = 'member'
|
||||
cmd = member.DeleteMember(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args)
|
@ -1,166 +0,0 @@
|
||||
# Copyright 2013 Mirantis 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
from unittest import mock
|
||||
|
||||
|
||||
from neutronclient.neutron.v2_0.lb import pool
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20LbPoolJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def test_create_pool_with_mandatory_params(self):
|
||||
# lb-pool-create with mandatory params only.
|
||||
resource = 'pool'
|
||||
cmd = pool.CreatePool(test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'my-name'
|
||||
lb_method = 'ROUND_ROBIN'
|
||||
protocol = 'HTTP'
|
||||
subnet_id = 'subnet-id'
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'my-id'
|
||||
args = ['--lb-method', lb_method,
|
||||
'--name', name,
|
||||
'--protocol', protocol,
|
||||
'--subnet-id', subnet_id,
|
||||
'--tenant-id', tenant_id]
|
||||
position_names = ['admin_state_up', 'lb_method', 'name',
|
||||
'protocol', 'subnet_id', 'tenant_id']
|
||||
position_values = [True, lb_method, name,
|
||||
protocol, subnet_id, tenant_id]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_pool_with_all_params(self):
|
||||
# lb-pool-create with all params set.
|
||||
resource = 'pool'
|
||||
cmd = pool.CreatePool(test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'my-name'
|
||||
description = 'my-desc'
|
||||
lb_method = 'ROUND_ROBIN'
|
||||
protocol = 'HTTP'
|
||||
subnet_id = 'subnet-id'
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'my-id'
|
||||
provider = 'lbaas'
|
||||
args = ['--admin-state-down',
|
||||
'--description', description,
|
||||
'--lb-method', lb_method,
|
||||
'--name', name,
|
||||
'--protocol', protocol,
|
||||
'--subnet-id', subnet_id,
|
||||
'--tenant-id', tenant_id,
|
||||
'--provider', provider]
|
||||
position_names = ['admin_state_up', 'description', 'lb_method', 'name',
|
||||
'protocol', 'subnet_id', 'tenant_id', 'provider']
|
||||
position_values = [False, description, lb_method, name,
|
||||
protocol, subnet_id, tenant_id, provider]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_list_pools(self):
|
||||
# lb-pool-list.
|
||||
resources = "pools"
|
||||
cmd = pool.ListPool(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
def test_list_pools_pagination(self):
|
||||
# lb-pool-list.
|
||||
resources = "pools"
|
||||
cmd = pool.ListPool(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(resources, cmd)
|
||||
|
||||
def test_list_pools_sort(self):
|
||||
# lb-pool-list --sort-key name --sort-key id --sort-key asc
|
||||
# --sort-key desc
|
||||
resources = "pools"
|
||||
cmd = pool.ListPool(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_list_pools_limit(self):
|
||||
# lb-pool-list -P.
|
||||
resources = "pools"
|
||||
cmd = pool.ListPool(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000)
|
||||
|
||||
def test_show_pool_id(self):
|
||||
# lb-pool-show test_id.
|
||||
resource = 'pool'
|
||||
cmd = pool.ShowPool(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'])
|
||||
|
||||
def test_show_pool_id_name(self):
|
||||
# lb-pool-show.
|
||||
resource = 'pool'
|
||||
cmd = pool.ShowPool(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id,
|
||||
args, ['id', 'name'])
|
||||
|
||||
def test_update_pool(self):
|
||||
# lb-pool-update myid --name newname --tags a b.
|
||||
resource = 'pool'
|
||||
cmd = pool.UpdatePool(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--name', 'newname'],
|
||||
{'name': 'newname', })
|
||||
|
||||
def test_delete_pool(self):
|
||||
# lb-pool-delete my-id.
|
||||
resource = 'pool'
|
||||
cmd = pool.DeletePool(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args)
|
||||
|
||||
def test_retrieve_pool_stats(self):
|
||||
# lb-pool-stats test_id.
|
||||
resource = 'pool'
|
||||
cmd = pool.RetrievePoolStats(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = self.test_id
|
||||
fields = ['bytes_in', 'bytes_out']
|
||||
args = ['--fields', 'bytes_in', '--fields', 'bytes_out', my_id]
|
||||
|
||||
query = "&".join(["fields=%s" % field for field in fields])
|
||||
expected_res = {'stats': {'bytes_in': '1234', 'bytes_out': '4321'}}
|
||||
resstr = self.client.serialize(expected_res)
|
||||
path = getattr(self.client, "pool_path_stats")
|
||||
return_tup = (test_cli20.MyResp(200), resstr)
|
||||
|
||||
cmd_parser = cmd.get_parser("test_" + resource)
|
||||
parsed_args = cmd_parser.parse_args(args)
|
||||
|
||||
with mock.patch.object(cmd, "get_client",
|
||||
return_value=self.client) as mock_get_client, \
|
||||
mock.patch.object(self.client.httpclient, "request",
|
||||
return_value=return_tup) as mock_request:
|
||||
cmd.run(parsed_args)
|
||||
|
||||
self.assert_mock_multiple_calls_with_same_arguments(
|
||||
mock_get_client, mock.call(), 2)
|
||||
mock_request.assert_called_once_with(
|
||||
test_cli20.end_url(path % my_id, query), 'GET',
|
||||
body=None,
|
||||
headers=test_cli20.ContainsKeyValue(
|
||||
{'X-Auth-Token': test_cli20.TOKEN}))
|
||||
_str = self.fake_stdout.make_string()
|
||||
self.assertIn('bytes_in', _str)
|
||||
self.assertIn('bytes_out', _str)
|
@ -1,206 +0,0 @@
|
||||
# Copyright 2013 Mirantis 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
|
||||
from neutronclient.neutron.v2_0.lb import vip
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20LbVipJSON(test_cli20.CLITestV20Base):
|
||||
def setUp(self):
|
||||
super(CLITestV20LbVipJSON, self).setUp(plurals={'tags': 'tag'})
|
||||
|
||||
def test_create_vip_with_mandatory_params(self):
|
||||
# lb-vip-create with all mandatory params.
|
||||
resource = 'vip'
|
||||
cmd = vip.CreateVip(test_cli20.MyApp(sys.stdout), None)
|
||||
pool_id = 'my-pool-id'
|
||||
name = 'my-name'
|
||||
subnet_id = 'subnet-id'
|
||||
protocol_port = '1000'
|
||||
protocol = 'TCP'
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'my-id'
|
||||
args = ['--name', name,
|
||||
'--protocol-port', protocol_port,
|
||||
'--protocol', protocol,
|
||||
'--subnet-id', subnet_id,
|
||||
'--tenant-id', tenant_id,
|
||||
pool_id]
|
||||
position_names = ['pool_id', 'name', 'protocol_port', 'protocol',
|
||||
'subnet_id', 'tenant_id']
|
||||
position_values = [pool_id, name, protocol_port, protocol,
|
||||
subnet_id, tenant_id]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
admin_state_up=True)
|
||||
|
||||
def test_create_vip_with_all_params(self):
|
||||
# lb-vip-create with all params.
|
||||
resource = 'vip'
|
||||
cmd = vip.CreateVip(test_cli20.MyApp(sys.stdout), None)
|
||||
pool_id = 'my-pool-id'
|
||||
name = 'my-name'
|
||||
description = 'my-desc'
|
||||
address = '10.0.0.2'
|
||||
admin_state = False
|
||||
connection_limit = '1000'
|
||||
subnet_id = 'subnet-id'
|
||||
protocol_port = '80'
|
||||
protocol = 'TCP'
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'my-id'
|
||||
args = ['--name', name,
|
||||
'--description', description,
|
||||
'--address', address,
|
||||
'--admin-state-down',
|
||||
'--connection-limit', connection_limit,
|
||||
'--protocol-port', protocol_port,
|
||||
'--protocol', protocol,
|
||||
'--subnet-id', subnet_id,
|
||||
'--tenant-id', tenant_id,
|
||||
pool_id]
|
||||
position_names = ['pool_id', 'name', 'description', 'address',
|
||||
'admin_state_up', 'connection_limit',
|
||||
'protocol_port', 'protocol', 'subnet_id',
|
||||
'tenant_id']
|
||||
position_values = [pool_id, name, description, address,
|
||||
admin_state, connection_limit, protocol_port,
|
||||
protocol, subnet_id,
|
||||
tenant_id]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_vip_with_session_persistence_params(self):
|
||||
# lb-vip-create with mandatory and session-persistence params.
|
||||
resource = 'vip'
|
||||
cmd = vip.CreateVip(test_cli20.MyApp(sys.stdout), None)
|
||||
pool_id = 'my-pool-id'
|
||||
name = 'my-name'
|
||||
subnet_id = 'subnet-id'
|
||||
protocol_port = '1000'
|
||||
protocol = 'TCP'
|
||||
tenant_id = 'my-tenant'
|
||||
my_id = 'my-id'
|
||||
args = ['--name', name,
|
||||
'--protocol-port', protocol_port,
|
||||
'--protocol', protocol,
|
||||
'--subnet-id', subnet_id,
|
||||
'--tenant-id', tenant_id,
|
||||
pool_id,
|
||||
'--session-persistence', 'type=dict',
|
||||
'type=cookie,cookie_name=pie',
|
||||
'--optional-param', 'any']
|
||||
position_names = ['pool_id', 'name', 'protocol_port', 'protocol',
|
||||
'subnet_id', 'tenant_id', 'optional_param']
|
||||
position_values = [pool_id, name, protocol_port, protocol,
|
||||
subnet_id, tenant_id, 'any']
|
||||
extra_body = {
|
||||
'session_persistence': {
|
||||
'type': 'cookie',
|
||||
'cookie_name': 'pie',
|
||||
},
|
||||
}
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
admin_state_up=True, extra_body=extra_body)
|
||||
|
||||
def test_list_vips(self):
|
||||
# lb-vip-list.
|
||||
resources = "vips"
|
||||
cmd = vip.ListVip(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
def test_list_vips_pagination(self):
|
||||
# lb-vip-list.
|
||||
resources = "vips"
|
||||
cmd = vip.ListVip(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(resources, cmd)
|
||||
|
||||
def test_list_vips_sort(self):
|
||||
# lb-vip-list --sort-key name --sort-key id --sort-key asc
|
||||
# --sort-key desc
|
||||
resources = "vips"
|
||||
cmd = vip.ListVip(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_list_vips_limit(self):
|
||||
# lb-vip-list -P.
|
||||
resources = "vips"
|
||||
cmd = vip.ListVip(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000)
|
||||
|
||||
def test_show_vip_id(self):
|
||||
# lb-vip-show test_id.
|
||||
resource = 'vip'
|
||||
cmd = vip.ShowVip(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'])
|
||||
|
||||
def test_show_vip_id_name(self):
|
||||
# lb-vip-show.
|
||||
resource = 'vip'
|
||||
cmd = vip.ShowVip(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id,
|
||||
args, ['id', 'name'])
|
||||
|
||||
def test_update_vip(self):
|
||||
# lb-vip-update myid --name myname --tags a b.
|
||||
resource = 'vip'
|
||||
cmd = vip.UpdateVip(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--name', 'myname',
|
||||
'--tags', 'a', 'b'],
|
||||
{'name': 'myname', 'tags': ['a', 'b'], })
|
||||
|
||||
def test_update_vip_with_session_persistence(self):
|
||||
resource = 'vip'
|
||||
cmd = vip.UpdateVip(test_cli20.MyApp(sys.stdout), None)
|
||||
body = {
|
||||
'session_persistence': {
|
||||
'type': 'source',
|
||||
},
|
||||
}
|
||||
args = ['myid', '--session-persistence', 'type=dict',
|
||||
'type=source']
|
||||
self._test_update_resource(resource, cmd, 'myid', args, body)
|
||||
|
||||
def test_update_vip_with_session_persistence_and_name(self):
|
||||
resource = 'vip'
|
||||
cmd = vip.UpdateVip(test_cli20.MyApp(sys.stdout), None)
|
||||
body = {
|
||||
'name': 'newname',
|
||||
'session_persistence': {
|
||||
'type': 'cookie',
|
||||
'cookie_name': 'pie',
|
||||
},
|
||||
}
|
||||
args = ['myid', '--name', 'newname',
|
||||
'--session-persistence', 'type=dict',
|
||||
'type=cookie,cookie_name=pie']
|
||||
self._test_update_resource(resource, cmd, 'myid', args, body)
|
||||
|
||||
def test_delete_vip(self):
|
||||
# lb-vip-delete my-id.
|
||||
resource = 'vip'
|
||||
cmd = vip.DeleteVip(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args)
|
@ -1,175 +0,0 @@
|
||||
# Copyright 2014 Blue Box Group, 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
|
||||
from neutronclient.neutron.v2_0.lb.v2 import healthmonitor
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20LbHealthMonitorJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def test_create_healthmonitor_with_mandatory_params(self):
|
||||
# lbaas-healthmonitor-create with mandatory params only.
|
||||
resource = 'healthmonitor'
|
||||
cmd_resource = 'lbaas_healthmonitor'
|
||||
cmd = healthmonitor.CreateHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'my-id'
|
||||
type = 'PING'
|
||||
max_retries = '3'
|
||||
delay = '10'
|
||||
timeout = '60'
|
||||
pool = 'pool1'
|
||||
args = ['--type', type, '--max-retries', max_retries,
|
||||
'--delay', delay, '--timeout', timeout, '--pool', pool]
|
||||
position_names = ['type', 'max_retries', 'delay', 'timeout', 'pool_id']
|
||||
position_values = [type, max_retries, delay, timeout, pool]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_create_healthmonitor_with_all_params(self):
|
||||
# lbaas-healthmonitor-create with all params set.
|
||||
resource = 'healthmonitor'
|
||||
cmd_resource = 'lbaas_healthmonitor'
|
||||
cmd = healthmonitor.CreateHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'my-id'
|
||||
type = 'PING'
|
||||
max_retries = '3'
|
||||
delay = '10'
|
||||
timeout = '60'
|
||||
http_method = 'GET'
|
||||
expected_codes = '201'
|
||||
url_path = '/somepath'
|
||||
pool = 'pool1'
|
||||
name = 'healthmonitor1'
|
||||
args = ['--admin-state-down', '--http-method', http_method,
|
||||
'--expected-codes', expected_codes, '--url-path', url_path,
|
||||
'--type', type, '--max-retries', max_retries,
|
||||
'--delay', delay, '--timeout', timeout, '--pool', pool,
|
||||
'--name', name]
|
||||
position_names = ['admin_state_up', 'http_method', 'expected_codes',
|
||||
'url_path', 'type', 'max_retries', 'delay',
|
||||
'timeout', 'pool_id', 'name']
|
||||
position_values = [False, http_method, expected_codes, url_path,
|
||||
type, max_retries, delay, timeout, pool, name]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_list_healthmonitors(self):
|
||||
# lbaas-healthmonitor-list.
|
||||
resources = 'healthmonitors'
|
||||
cmd_resources = 'lbaas_healthmonitors'
|
||||
cmd = healthmonitor.ListHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, True,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_healthmonitors_pagination(self):
|
||||
# lbaas-healthmonitor-list with pagination.
|
||||
resources = 'healthmonitors'
|
||||
cmd_resources = 'lbaas_healthmonitors'
|
||||
cmd = healthmonitor.ListHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources_with_pagination(resources, cmd,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_healthmonitors_sort(self):
|
||||
# lbaas-healthmonitor-list --sort-key id --sort-key asc.
|
||||
resources = 'healthmonitors'
|
||||
cmd_resources = 'lbaas_healthmonitors'
|
||||
cmd = healthmonitor.ListHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, True,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_healthmonitors_limit(self):
|
||||
# lbaas-healthmonitor-list -P.
|
||||
resources = 'healthmonitors'
|
||||
cmd_resources = 'lbaas_healthmonitors'
|
||||
cmd = healthmonitor.ListHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_show_healthmonitor_id(self):
|
||||
# lbaas-healthmonitor-show test_id.
|
||||
resource = 'healthmonitor'
|
||||
cmd_resource = 'lbaas_healthmonitor'
|
||||
cmd = healthmonitor.ShowHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'],
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_show_healthmonitor_id_name(self):
|
||||
# lbaas-healthmonitor-show.
|
||||
resource = 'healthmonitor'
|
||||
cmd_resource = 'lbaas_healthmonitor'
|
||||
cmd = healthmonitor.ShowHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id,
|
||||
args, ['id', 'name'],
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def _test_update_hm(self, args, expected_values):
|
||||
resource = 'healthmonitor'
|
||||
cmd_resource = 'lbaas_healthmonitor'
|
||||
my_id = 'myid'
|
||||
cmd = healthmonitor.UpdateHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args.insert(0, my_id)
|
||||
self._test_update_resource(resource, cmd, my_id,
|
||||
args,
|
||||
expected_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_update_healthmonitor(self):
|
||||
# lbaas-healthmonitor-update myid --name newname.
|
||||
self._test_update_hm(['--name', 'newname'], {'name': 'newname', })
|
||||
# lbaas-healthmonitor-update myid --delay 10.
|
||||
self._test_update_hm(['--delay', '10'], {'delay': '10'})
|
||||
# lbaas-healthmonitor-update myid --timeout 5.
|
||||
self._test_update_hm(['--timeout', '5'], {'timeout': '5', })
|
||||
# lbaas-healthmonitor-update myid --delay 10.
|
||||
self._test_update_hm(['--http-method', 'OPTIONS'],
|
||||
{'http_method': 'OPTIONS'})
|
||||
# lbaas-healthmonitor-update myid --url-path /test/string .
|
||||
self._test_update_hm(['--url-path', '/test/string'],
|
||||
{'url_path': '/test/string', })
|
||||
# lbaas-healthmonitor-update myid --max-retries 5
|
||||
self._test_update_hm(['--max-retries', '5'], {'max_retries': '5'})
|
||||
# lbaas-healthmonitor-update myid --expected-codes 201
|
||||
self._test_update_hm(['--expected-codes', '201'],
|
||||
{'expected_codes': '201'})
|
||||
# lbaas-healthmonitor-update myid --admin-state-up False
|
||||
self._test_update_hm(['--admin-state-up', 'False'],
|
||||
{'admin_state_up': 'False'})
|
||||
|
||||
def test_delete_healthmonitor(self):
|
||||
# lbaas-healthmonitor-delete my-id.
|
||||
resource = 'healthmonitor'
|
||||
cmd_resource = 'lbaas_healthmonitor'
|
||||
cmd = healthmonitor.DeleteHealthMonitor(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args,
|
||||
cmd_resource=cmd_resource)
|
@ -1,260 +0,0 @@
|
||||
# Copyright 2016 Radware 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.common import exceptions
|
||||
from neutronclient.neutron.v2_0.lb.v2 import l7policy
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
"""Structure for mapping cli and api arguments
|
||||
|
||||
The structure maps cli arguments and a list of its
|
||||
api argument name, default cli value and default api value.
|
||||
It helps to make tests more general for different argument types.
|
||||
"""
|
||||
args_conf = {
|
||||
'name': ['name', 'test_policy', 'test_policy'],
|
||||
'description': ['description', 'test policy', 'test policy'],
|
||||
'listener': ['listener_id', 'test_listener', 'test_listener'],
|
||||
'admin-state-up': ['admin_state_up', True, True],
|
||||
'admin-state-down': ['admin_state_up', None, False],
|
||||
'action': ['action', 'REJECT', 'REJECT'],
|
||||
'redirect-url': ['redirect_url', 'http://url', 'http://url'],
|
||||
'redirect-pool': ['redirect_pool_id', 'test_pool', 'test_pool'],
|
||||
'position': ['position', '1', 1]}
|
||||
|
||||
|
||||
class CLITestV20LbL7PolicyJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def _get_test_args(self, *args, **kwargs):
|
||||
"""Function for generically building testing arguments"""
|
||||
cli_args = []
|
||||
api_args = {}
|
||||
for arg in args:
|
||||
cli_args.append('--' + arg)
|
||||
if not args_conf[arg][1]:
|
||||
pass
|
||||
elif arg in kwargs:
|
||||
cli_args.append(str(kwargs[arg]))
|
||||
else:
|
||||
cli_args.append(args_conf[arg][1])
|
||||
|
||||
if arg in kwargs:
|
||||
api_args[args_conf[arg][0]] = kwargs[arg]
|
||||
else:
|
||||
api_args[args_conf[arg][0]] = args_conf[arg][2]
|
||||
|
||||
return cli_args, api_args
|
||||
|
||||
def _test_create_policy(self, *args, **kwargs):
|
||||
resource = 'l7policy'
|
||||
cmd_resource = 'lbaas_l7policy'
|
||||
cmd = l7policy.CreateL7Policy(test_cli20.MyApp(sys.stdout), None)
|
||||
cli_args, api_args = self._get_test_args(*args, **kwargs)
|
||||
position_names = list(api_args.keys())
|
||||
position_values = list(api_args.values())
|
||||
self._test_create_resource(resource, cmd, None, 'test_id',
|
||||
cli_args, position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def _test_update_policy(self, *args, **kwargs):
|
||||
resource = 'l7policy'
|
||||
cmd_resource = 'lbaas_l7policy'
|
||||
cmd = l7policy.UpdateL7Policy(test_cli20.MyApp(sys.stdout), None)
|
||||
cli_args, api_args = self._get_test_args(*args, **kwargs)
|
||||
cli_args.append('test_id')
|
||||
self._test_update_resource(resource, cmd, 'test_id',
|
||||
cli_args, api_args,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_create_policy_with_mandatory_params(self):
|
||||
# lbaas-l7policy-create with mandatory params only.
|
||||
self._test_create_policy('action', 'listener')
|
||||
|
||||
def test_create_policy_with_all_params(self):
|
||||
# lbaas-l7policy-create REJECT policy.
|
||||
self._test_create_policy('name', 'description',
|
||||
'action', 'listener',
|
||||
'position')
|
||||
|
||||
def test_create_disabled_policy(self):
|
||||
# lbaas-l7policy-create disabled REJECT policy.
|
||||
self._test_create_policy('action', 'listener', 'admin-state-down')
|
||||
|
||||
def test_create_url_redirect_policy(self):
|
||||
# lbaas-l7policy-create REDIRECT_TO_URL policy.
|
||||
self._test_create_policy('name', 'description',
|
||||
'action', 'listener',
|
||||
'redirect-url',
|
||||
action='REDIRECT_TO_URL')
|
||||
|
||||
def test_create_url_redirect_policy_no_url(self):
|
||||
# lbaas-l7policy-create REDIRECT_TO_URL policy without url argument.
|
||||
self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_policy,
|
||||
'name', 'description',
|
||||
'action', 'listener',
|
||||
action='REDIRECT_TO_URL')
|
||||
|
||||
def test_create_pool_redirect_policy(self):
|
||||
# lbaas-l7policy-create REDIRECT_TO_POOL policy.
|
||||
self._test_create_policy('name', 'description',
|
||||
'action', 'listener',
|
||||
'redirect-pool',
|
||||
action='REDIRECT_TO_POOL')
|
||||
|
||||
def test_create_pool_redirect_policy_no_pool(self):
|
||||
# lbaas-l7policy-create REDIRECT_TO_POOL policy without pool argument.
|
||||
self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_policy,
|
||||
'name', 'description',
|
||||
'action', 'listener',
|
||||
action='REDIRECT_TO_POOL')
|
||||
|
||||
def test_create_reject_policy_with_url(self):
|
||||
# lbaas-l7policy-create REJECT policy while specifying url argument.
|
||||
self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_policy,
|
||||
'action', 'listener',
|
||||
'redirect-url')
|
||||
|
||||
def test_create_reject_policy_with_pool(self):
|
||||
# lbaas-l7policy-create REJECT policy while specifying pool argument.
|
||||
self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_policy,
|
||||
'action', 'listener',
|
||||
'redirect-pool')
|
||||
|
||||
def test_create_pool_redirect_policy_with_url(self):
|
||||
# lbaas-l7policy-create REDIRECT_TO_POOL policy with url argument.
|
||||
self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_policy,
|
||||
'action', 'listener',
|
||||
'redirect-pool', 'redirect-url',
|
||||
action='REDIRECT_TO_POOL')
|
||||
|
||||
def test_create_url_redirect_policy_with_pool(self):
|
||||
# lbaas-l7policy-create REDIRECT_TO_URL policy with pool argument.
|
||||
self.assertRaises(exceptions.CommandError,
|
||||
self._test_create_policy,
|
||||
'action', 'listener',
|
||||
'redirect-pool', 'redirect-url',
|
||||
action='REDIRECT_TO_URL')
|
||||
|
||||
def test_list_policies(self):
|
||||
# lbaas-l7policy-list.
|
||||
|
||||
resources = 'l7policies'
|
||||
cmd_resources = 'lbaas_l7policies'
|
||||
cmd = l7policy.ListL7Policy(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_policies_pagination(self):
|
||||
# lbaas-l7policy-list with pagination.
|
||||
|
||||
resources = 'l7policies'
|
||||
cmd_resources = 'lbaas_l7policies'
|
||||
cmd = l7policy.ListL7Policy(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(
|
||||
resources, cmd, cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_policies_sort(self):
|
||||
# lbaas-l7policy-list --sort-key id --sort-key asc.
|
||||
|
||||
resources = 'l7policies'
|
||||
cmd_resources = 'lbaas_l7policies'
|
||||
cmd = l7policy.ListL7Policy(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(
|
||||
resources, cmd, True, cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_policies_limit(self):
|
||||
# lbaas-l7policy-list -P.
|
||||
|
||||
resources = 'l7policies'
|
||||
cmd_resources = 'lbaas_l7policies'
|
||||
cmd = l7policy.ListL7Policy(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(
|
||||
resources, cmd, page_size=1000, cmd_resources=cmd_resources)
|
||||
|
||||
def test_show_policy_id(self):
|
||||
# lbaas-l7policy-show test_id.
|
||||
|
||||
resource = 'l7policy'
|
||||
cmd_resource = 'lbaas_l7policy'
|
||||
cmd = l7policy.ShowL7Policy(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'test_id', self.test_id]
|
||||
self._test_show_resource(
|
||||
resource, cmd, self.test_id, args,
|
||||
['test_id'], cmd_resource=cmd_resource)
|
||||
|
||||
def test_show_policy_id_name(self):
|
||||
# lbaas-l7policy-show.
|
||||
|
||||
resource = 'l7policy'
|
||||
cmd_resource = 'lbaas_l7policy'
|
||||
cmd = l7policy.ShowL7Policy(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'test_id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(
|
||||
resource, cmd, self.test_id, args,
|
||||
['test_id', 'name'], cmd_resource=cmd_resource)
|
||||
|
||||
def test_disable_policy(self):
|
||||
# lbaas-l7policy-update test_id --admin-state-up False.
|
||||
|
||||
self._test_update_policy('admin-state-up',
|
||||
**{'admin-state-up': 'False'})
|
||||
|
||||
def test_update_policy_name_and_description(self):
|
||||
# lbaas-l7policy-update test_id --name other --description other_desc.
|
||||
|
||||
self._test_update_policy('name', 'description',
|
||||
name='name',
|
||||
description='other desc')
|
||||
|
||||
def test_update_pool_redirect_policy(self):
|
||||
# lbaas-l7policy-update test_id --action REDIRECT_TO_POOL
|
||||
# --redirect-pool id.
|
||||
|
||||
self._test_update_policy('action', 'redirect-pool',
|
||||
**{'action': 'REDIRECT_TO_POOL',
|
||||
'redirect-pool': 'id'})
|
||||
|
||||
def test_update_url_redirect_policy(self):
|
||||
# lbaas-l7policy-update test_id --action REDIRECT_TO_URL
|
||||
# --redirect-url http://other_url.
|
||||
|
||||
self._test_update_policy('action', 'redirect-url',
|
||||
**{'action': 'REDIRECT_TO_URL',
|
||||
'redirect-url': 'http://other_url'})
|
||||
|
||||
def test_update_policy_position(self):
|
||||
# lbaas-l7policy-update test_id --position 2.
|
||||
|
||||
self._test_update_policy('position',
|
||||
position=2)
|
||||
|
||||
def test_delete_policy(self):
|
||||
# lbaas-l7policy-delete test_id.
|
||||
|
||||
resource = 'l7policy'
|
||||
cmd_resource = 'lbaas_l7policy'
|
||||
cmd = l7policy.DeleteL7Policy(test_cli20.MyApp(sys.stdout), None)
|
||||
test_id = 'test_id'
|
||||
args = [test_id]
|
||||
self._test_delete_resource(resource, cmd, test_id, args,
|
||||
cmd_resource=cmd_resource)
|
@ -1,210 +0,0 @@
|
||||
# Copyright 2016 Radware 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.lb.v2 import l7rule
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
"""Structure for mapping cli and api arguments
|
||||
|
||||
The structure maps cli arguments and a list of its
|
||||
api argument name, default cli value and default api value.
|
||||
It helps to make tests more general for different argument types.
|
||||
"""
|
||||
args_conf = {
|
||||
'admin-state-up': ['admin_state_up', True, True],
|
||||
'admin-state-down': ['admin_state_up', None, False],
|
||||
'type': ['type', 'HOST_NAME', 'HOST_NAME'],
|
||||
'compare-type': ['compare_type', 'EQUAL_TO', 'EQUAL_TO'],
|
||||
'invert-compare': ['invert', None, True],
|
||||
'key': ['key', 'key', 'key'],
|
||||
'value': ['value', 'value', 'value']}
|
||||
|
||||
|
||||
class CLITestV20LbL7RuleJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def _get_test_args(self, *args, **kwargs):
|
||||
"""Function for generically building testing arguments"""
|
||||
cli_args = []
|
||||
api_args = {}
|
||||
for arg in args:
|
||||
cli_args.append('--' + arg)
|
||||
if not args_conf[arg][1]:
|
||||
pass
|
||||
elif arg in kwargs:
|
||||
cli_args.append(str(kwargs[arg]))
|
||||
else:
|
||||
cli_args.append(args_conf[arg][1])
|
||||
|
||||
if arg in kwargs:
|
||||
api_args[args_conf[arg][0]] = kwargs[arg]
|
||||
else:
|
||||
api_args[args_conf[arg][0]] = args_conf[arg][2]
|
||||
|
||||
if 'invert' not in api_args:
|
||||
api_args['invert'] = False
|
||||
return cli_args, api_args
|
||||
|
||||
def _test_create_rule(self, *args, **kwargs):
|
||||
resource = 'rule'
|
||||
cmd_resource = 'lbaas_l7rule'
|
||||
cmd = l7rule.CreateL7Rule(test_cli20.MyApp(sys.stdout), None)
|
||||
cli_args, api_args = self._get_test_args(*args, **kwargs)
|
||||
position_names = list(api_args.keys())
|
||||
position_values = list(api_args.values())
|
||||
cli_args.append('test_policy')
|
||||
self._test_create_resource(resource, cmd, None, 'test_id',
|
||||
cli_args, position_names, position_values,
|
||||
cmd_resource=cmd_resource,
|
||||
parent_id='test_policy')
|
||||
|
||||
def _test_update_rule(self, *args, **kwargs):
|
||||
resource = 'rule'
|
||||
cmd_resource = 'lbaas_l7rule'
|
||||
cmd = l7rule.UpdateL7Rule(test_cli20.MyApp(sys.stdout), None)
|
||||
cli_args, api_args = self._get_test_args(*args, **kwargs)
|
||||
cli_args.append('test_id')
|
||||
cli_args.append('test_policy')
|
||||
self._test_update_resource(resource, cmd, 'test_id',
|
||||
cli_args, api_args,
|
||||
cmd_resource=cmd_resource,
|
||||
parent_id='test_policy')
|
||||
|
||||
def test_create_rule_with_mandatory_params(self):
|
||||
# lbaas-l7rule-create with mandatory params only.
|
||||
|
||||
self._test_create_rule('type', 'compare-type',
|
||||
'value')
|
||||
|
||||
def test_create_disabled_rule(self):
|
||||
# lbaas-l7rule-create disabled rule.
|
||||
|
||||
self._test_create_rule('type', 'compare-type',
|
||||
'value', 'admin-state-down')
|
||||
|
||||
def test_create_rule_with_all_params(self):
|
||||
# lbaas-l7rule-create with all params set.
|
||||
|
||||
self._test_create_rule('type', 'compare-type',
|
||||
'invert-compare', 'key', 'value',
|
||||
type='HEADER', compare_type='CONTAINS',
|
||||
key='other_key', value='other_value')
|
||||
|
||||
def test_create_rule_with_inverted_compare(self):
|
||||
# lbaas-l7rule-create with invertted compare type.
|
||||
|
||||
self._test_create_rule('type', 'compare-type',
|
||||
'invert-compare', 'value')
|
||||
|
||||
def test_list_rules(self):
|
||||
# lbaas-l7rule-list.
|
||||
|
||||
resources = 'rules'
|
||||
cmd_resources = 'lbaas_l7rules'
|
||||
cmd = l7rule.ListL7Rule(test_cli20.MyApp(sys.stdout), None)
|
||||
|
||||
policy_id = 'policy_id'
|
||||
self._test_list_resources(resources, cmd, True,
|
||||
base_args=[policy_id],
|
||||
cmd_resources=cmd_resources,
|
||||
parent_id=policy_id,
|
||||
query="l7policy_id=%s" % policy_id)
|
||||
|
||||
def test_list_rules_pagination(self):
|
||||
# lbaas-l7rule-list with pagination.
|
||||
|
||||
resources = 'rules'
|
||||
cmd_resources = 'lbaas_l7rules'
|
||||
cmd = l7rule.ListL7Rule(test_cli20.MyApp(sys.stdout), None)
|
||||
policy_id = 'policy_id'
|
||||
self._test_list_resources_with_pagination(
|
||||
resources, cmd, base_args=[policy_id],
|
||||
cmd_resources=cmd_resources, parent_id=policy_id,
|
||||
query="l7policy_id=%s" % policy_id)
|
||||
|
||||
def test_list_rules_sort(self):
|
||||
# lbaas-l7rule-list --sort-key id --sort-key asc.
|
||||
|
||||
resources = 'rules'
|
||||
cmd_resources = 'lbaas_l7rules'
|
||||
cmd = l7rule.ListL7Rule(test_cli20.MyApp(sys.stdout), None)
|
||||
policy_id = 'policy_id'
|
||||
self._test_list_resources(
|
||||
resources, cmd, True, base_args=[policy_id],
|
||||
cmd_resources=cmd_resources, parent_id=policy_id,
|
||||
query="l7policy_id=%s" % policy_id)
|
||||
|
||||
def test_list_rules_limit(self):
|
||||
# lbaas-l7rule-list -P.
|
||||
|
||||
resources = 'rules'
|
||||
cmd_resources = 'lbaas_l7rules'
|
||||
cmd = l7rule.ListL7Rule(test_cli20.MyApp(sys.stdout), None)
|
||||
policy_id = 'policy_id'
|
||||
self._test_list_resources(resources, cmd, page_size=1000,
|
||||
base_args=[policy_id],
|
||||
cmd_resources=cmd_resources,
|
||||
parent_id=policy_id,
|
||||
query="l7policy_id=%s" % policy_id)
|
||||
|
||||
def test_show_rule_id(self):
|
||||
# lbaas-l7rule-show test_id.
|
||||
|
||||
resource = 'rule'
|
||||
cmd_resource = 'lbaas_l7rule'
|
||||
policy_id = 'policy_id'
|
||||
cmd = l7rule.ShowL7Rule(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id, policy_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'],
|
||||
cmd_resource=cmd_resource,
|
||||
parent_id=policy_id)
|
||||
|
||||
def test_update_rule_type(self):
|
||||
# lbaas-l7rule-update test_id --type HEADER test_policy
|
||||
|
||||
self._test_update_rule('type', type='HEADER')
|
||||
|
||||
def test_update_rule_compare_type(self):
|
||||
# lbaas-l7rule-update test_id --compare-type CONTAINS test_policy.
|
||||
|
||||
self._test_update_rule('compare-type',
|
||||
**{'compare-type': 'CONTAINS'})
|
||||
|
||||
def test_update_rule_inverted_compare_type(self):
|
||||
# lbaas-l7rule-update test_id --invert-compare test_policy.
|
||||
|
||||
self._test_update_rule('invert-compare')
|
||||
|
||||
def test_update_rule_key_value(self):
|
||||
# lbaas-l7rule-update test_id --key other --value other test_policy.
|
||||
|
||||
self._test_update_rule('key', 'value',
|
||||
key='other', value='other')
|
||||
|
||||
def test_delete_rule(self):
|
||||
# lbaas-l7rule-delete test_id policy_id.
|
||||
|
||||
resource = 'rule'
|
||||
cmd_resource = 'lbaas_l7rule'
|
||||
policy_id = 'policy_id'
|
||||
test_id = 'test_id'
|
||||
cmd = l7rule.DeleteL7Rule(test_cli20.MyApp(sys.stdout), None)
|
||||
args = [test_id, policy_id]
|
||||
self._test_delete_resource(resource, cmd, test_id, args,
|
||||
cmd_resource=cmd_resource,
|
||||
parent_id=policy_id)
|
@ -1,194 +0,0 @@
|
||||
# Copyright 2014 Blue Box Group, 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
|
||||
from neutronclient.common import exceptions
|
||||
from neutronclient.neutron.v2_0.lb.v2 import listener
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20LbListenerJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def test_create_listener_with_loadbalancer(self):
|
||||
# lbaas-listener-create with --loadbalancer
|
||||
resource = 'listener'
|
||||
cmd_resource = 'lbaas_listener'
|
||||
cmd = listener.CreateListener(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
loadbalancer_id = 'loadbalancer'
|
||||
protocol = 'TCP'
|
||||
protocol_port = '80'
|
||||
args = ['--protocol', protocol, '--protocol-port', protocol_port,
|
||||
'--loadbalancer', loadbalancer_id]
|
||||
position_names = ['protocol', 'protocol_port', 'loadbalancer_id']
|
||||
position_values = [protocol, protocol_port, loadbalancer_id,
|
||||
True]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_create_listener_with_default_pool(self):
|
||||
# lbaas-listener-create with --default-pool and no --loadbalancer.
|
||||
resource = 'listener'
|
||||
cmd_resource = 'lbaas_listener'
|
||||
cmd = listener.CreateListener(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
default_pool_id = 'default-pool'
|
||||
protocol = 'TCP'
|
||||
protocol_port = '80'
|
||||
args = ['--protocol', protocol, '--protocol-port', protocol_port,
|
||||
'--default-pool', default_pool_id]
|
||||
position_names = ['protocol', 'protocol_port', 'default_pool_id']
|
||||
position_values = [protocol, protocol_port, default_pool_id,
|
||||
True]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_create_listener_with_no_loadbalancer_or_default_pool(self):
|
||||
# lbaas-listener-create without --default-pool or --loadbalancer.
|
||||
resource = 'listener'
|
||||
cmd_resource = 'lbaas_listener'
|
||||
cmd = listener.CreateListener(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
protocol = 'TCP'
|
||||
protocol_port = '80'
|
||||
args = ['--protocol', protocol, '--protocol-port', protocol_port]
|
||||
position_names = ['protocol', 'protocol_port']
|
||||
position_values = [protocol, protocol_port, True]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource,
|
||||
no_api_call=True,
|
||||
expected_exception=exceptions.CommandError)
|
||||
|
||||
def test_create_listener_with_all_params(self):
|
||||
# lbaas-listener-create with all params set.
|
||||
resource = 'listener'
|
||||
cmd_resource = 'lbaas_listener'
|
||||
cmd = listener.CreateListener(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
loadbalancer = 'loadbalancer'
|
||||
default_pool_id = 'default-pool'
|
||||
protocol = 'TCP'
|
||||
protocol_port = '80'
|
||||
connection_limit = 10
|
||||
def_tls_cont_ref = '11111'
|
||||
args = ['--admin-state-down',
|
||||
'--protocol', protocol, '--protocol-port', protocol_port,
|
||||
'--loadbalancer', loadbalancer,
|
||||
'--default-pool', default_pool_id,
|
||||
'--default-tls-container-ref', def_tls_cont_ref,
|
||||
'--sni-container-refs', '1111', '2222', '3333',
|
||||
'--connection-limit', '10']
|
||||
position_names = ['admin_state_up',
|
||||
'protocol', 'protocol_port', 'loadbalancer_id',
|
||||
'default_pool_id',
|
||||
'default_tls_container_ref', 'sni_container_refs',
|
||||
'connection_limit']
|
||||
position_values = [False, protocol, protocol_port, loadbalancer,
|
||||
default_pool_id,
|
||||
def_tls_cont_ref, ['1111', '2222', '3333'],
|
||||
connection_limit]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_list_listeners(self):
|
||||
# lbaas-listener-list.
|
||||
resources = 'listeners'
|
||||
cmd_resources = 'lbaas_listeners'
|
||||
cmd = listener.ListListener(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_listeners_pagination(self):
|
||||
# lbaas-listener-list with pagination.
|
||||
resources = 'listeners'
|
||||
cmd_resources = 'lbaas_listeners'
|
||||
cmd = listener.ListListener(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(resources, cmd,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_listeners_sort(self):
|
||||
# lbaas-listener-list --sort-key id --sort-key asc.
|
||||
resources = 'listeners'
|
||||
cmd_resources = 'lbaas_listeners'
|
||||
cmd = listener.ListListener(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_listeners_limit(self):
|
||||
# lbaas-listener-list -P.
|
||||
resources = 'listeners'
|
||||
cmd_resources = 'lbaas_listeners'
|
||||
cmd = listener.ListListener(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_show_listener_id(self):
|
||||
# lbaas-listener-show test_id.
|
||||
resource = 'listener'
|
||||
cmd_resource = 'lbaas_listener'
|
||||
cmd = listener.ShowListener(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'],
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_show_listener_id_name(self):
|
||||
# lbaas-listener-show.
|
||||
resource = 'listener'
|
||||
cmd_resource = 'lbaas_listener'
|
||||
cmd = listener.ShowListener(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id,
|
||||
args, ['id', 'name'],
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def _test_update_listener(self, args, expected_values):
|
||||
resource = 'listener'
|
||||
cmd_resource = 'lbaas_listener'
|
||||
my_id = 'myid'
|
||||
args.insert(0, my_id)
|
||||
cmd = listener.UpdateListener(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(resource, cmd, my_id,
|
||||
args, expected_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_update_listener(self):
|
||||
# lbaas-listener-update myid --name newname.
|
||||
self._test_update_listener(['--name', 'newname'],
|
||||
{'name': 'newname', })
|
||||
# lbaas-listener-update myid --description check.
|
||||
self._test_update_listener(['--description', 'check'],
|
||||
{'description': 'check', })
|
||||
# lbaas-listener-update myid --connection-limit -1
|
||||
self._test_update_listener(['--connection-limit', '-1'],
|
||||
{'connection_limit': -1, })
|
||||
# lbaas-listener-update myid --admin-state-up False.
|
||||
self._test_update_listener(['--admin-state-up', 'False'],
|
||||
{'admin_state_up': 'False', })
|
||||
|
||||
def test_delete_listener(self):
|
||||
# lbaas-listener-delete my-id.
|
||||
resource = 'listener'
|
||||
cmd_resource = 'lbaas_listener'
|
||||
cmd = listener.DeleteListener(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args,
|
||||
cmd_resource=cmd_resource)
|
@ -1,213 +0,0 @@
|
||||
# Copyright 2014 Blue Box Group, 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
from unittest import mock
|
||||
|
||||
|
||||
from neutronclient.neutron.v2_0.lb.v2 import loadbalancer as lb
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20LbLoadBalancerJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def test_create_loadbalancer_with_mandatory_params(self):
|
||||
# lbaas-loadbalancer-create with mandatory params only.
|
||||
resource = 'loadbalancer'
|
||||
cmd_resource = 'lbaas_loadbalancer'
|
||||
cmd = lb.CreateLoadBalancer(test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'lbaas-loadbalancer-name'
|
||||
vip_subnet_id = 'vip-subnet'
|
||||
my_id = 'my-id'
|
||||
args = [vip_subnet_id]
|
||||
position_names = ['vip_subnet_id']
|
||||
position_values = [vip_subnet_id]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_create_loadbalancer_with_all_params(self):
|
||||
# lbaas-loadbalancer-create with all params set.
|
||||
resource = 'loadbalancer'
|
||||
cmd_resource = 'lbaas_loadbalancer'
|
||||
cmd = lb.CreateLoadBalancer(test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'lbaas-loadbalancer-name'
|
||||
description = 'lbaas-loadbalancer-desc'
|
||||
flavor_id = 'lbaas-loadbalancer-flavor'
|
||||
vip_subnet_id = 'vip-subnet'
|
||||
my_id = 'my-id'
|
||||
args = ['--admin-state-down', '--description', description,
|
||||
'--name', name, '--flavor', flavor_id, vip_subnet_id]
|
||||
position_names = ['admin_state_up', 'description', 'name',
|
||||
'flavor_id', 'vip_subnet_id']
|
||||
position_values = [False, description, name, flavor_id, vip_subnet_id]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_list_loadbalancers(self):
|
||||
# lbaas-loadbalancer-list.
|
||||
resources = 'loadbalancers'
|
||||
cmd_resources = 'lbaas_loadbalancers'
|
||||
cmd = lb.ListLoadBalancer(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_loadbalancers_pagination(self):
|
||||
# lbaas-loadbalancer-list with pagination.
|
||||
resources = 'loadbalancers'
|
||||
cmd_resources = 'lbaas_loadbalancers'
|
||||
cmd = lb.ListLoadBalancer(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(resources, cmd,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_loadbalancers_sort(self):
|
||||
# lbaas-loadbalancer-list --sort-key name --sort-key id --sort-key asc
|
||||
# --sort-key desc
|
||||
resources = 'loadbalancers'
|
||||
cmd_resources = 'lbaas_loadbalancers'
|
||||
cmd = lb.ListLoadBalancer(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"],
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_loadbalancers_limit(self):
|
||||
# lbaas-loadbalancer-list -P.
|
||||
resources = 'loadbalancers'
|
||||
cmd_resources = 'lbaas_loadbalancers'
|
||||
cmd = lb.ListLoadBalancer(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_show_loadbalancer_id(self):
|
||||
# lbaas-loadbalancer-loadbalancer-show test_id.
|
||||
resource = 'loadbalancer'
|
||||
cmd_resource = 'lbaas_loadbalancer'
|
||||
cmd = lb.ShowLoadBalancer(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'],
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_show_loadbalancer_id_name(self):
|
||||
# lbaas-loadbalancer-loadbalancer-show.
|
||||
resource = 'loadbalancer'
|
||||
cmd_resource = 'lbaas_loadbalancer'
|
||||
cmd = lb.ShowLoadBalancer(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id,
|
||||
args, ['id', 'name'],
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def _test_update_lb(self, args, expected_values):
|
||||
resource = 'loadbalancer'
|
||||
cmd_resource = 'lbaas_loadbalancer'
|
||||
my_id = 'myid'
|
||||
args.insert(0, my_id)
|
||||
cmd = lb.UpdateLoadBalancer(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(resource, cmd, my_id,
|
||||
args, expected_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_update_loadbalancer(self):
|
||||
# lbaas-loadbalancer-update myid --name newname.
|
||||
self._test_update_lb(['--name', 'newname'], {'name': 'newname', })
|
||||
# lbaas-loadbalancer-update myid --description check.
|
||||
self._test_update_lb(['--description', 'check'],
|
||||
{'description': 'check', })
|
||||
# lbaas-loadbalancer-update myid --admin-state-up False.
|
||||
self._test_update_lb(['--admin-state-up', 'False'],
|
||||
{'admin_state_up': 'False', })
|
||||
|
||||
def test_delete_loadbalancer(self):
|
||||
# lbaas-loadbalancer-loadbalancer-delete my-id.
|
||||
resource = 'loadbalancer'
|
||||
cmd_resource = 'lbaas_loadbalancer'
|
||||
cmd = lb.DeleteLoadBalancer(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_retrieve_loadbalancer_stats(self):
|
||||
# lbaas-loadbalancer-stats test_id.
|
||||
resource = 'loadbalancer'
|
||||
cmd = lb.RetrieveLoadBalancerStats(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = self.test_id
|
||||
fields = ['bytes_in', 'bytes_out']
|
||||
args = ['--fields', 'bytes_in', '--fields', 'bytes_out', my_id]
|
||||
|
||||
query = "&".join(["fields=%s" % field for field in fields])
|
||||
expected_res = {'stats': {'bytes_in': '1234', 'bytes_out': '4321'}}
|
||||
resstr = self.client.serialize(expected_res)
|
||||
path = getattr(self.client, "lbaas_loadbalancer_path_stats")
|
||||
return_tup = (test_cli20.MyResp(200), resstr)
|
||||
|
||||
cmd_parser = cmd.get_parser("test_" + resource)
|
||||
parsed_args = cmd_parser.parse_args(args)
|
||||
with mock.patch.object(cmd, "get_client",
|
||||
return_value=self.client) as mock_get_client, \
|
||||
mock.patch.object(self.client.httpclient, "request",
|
||||
return_value=return_tup) as mock_request:
|
||||
cmd.run(parsed_args)
|
||||
|
||||
self.assert_mock_multiple_calls_with_same_arguments(
|
||||
mock_get_client, mock.call(), 2)
|
||||
mock_request.assert_called_once_with(
|
||||
test_cli20.end_url(path % my_id, query), 'GET',
|
||||
body=None,
|
||||
headers=test_cli20.ContainsKeyValue(
|
||||
{'X-Auth-Token': test_cli20.TOKEN}))
|
||||
_str = self.fake_stdout.make_string()
|
||||
self.assertIn('bytes_in', _str)
|
||||
self.assertIn('1234', _str)
|
||||
self.assertIn('bytes_out', _str)
|
||||
self.assertIn('4321', _str)
|
||||
|
||||
def test_get_loadbalancer_statuses(self):
|
||||
# lbaas-loadbalancer-status test_id.
|
||||
resource = 'loadbalancer'
|
||||
cmd = lb.RetrieveLoadBalancerStatus(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = self.test_id
|
||||
args = [my_id]
|
||||
|
||||
expected_res = {'statuses': {'operating_status': 'ONLINE',
|
||||
'provisioning_status': 'ACTIVE'}}
|
||||
|
||||
resstr = self.client.serialize(expected_res)
|
||||
|
||||
path = getattr(self.client, "lbaas_loadbalancer_path_status")
|
||||
return_tup = (test_cli20.MyResp(200), resstr)
|
||||
|
||||
cmd_parser = cmd.get_parser("test_" + resource)
|
||||
parsed_args = cmd_parser.parse_args(args)
|
||||
with mock.patch.object(cmd, "get_client",
|
||||
return_value=self.client) as mock_get_client, \
|
||||
mock.patch.object(self.client.httpclient, "request",
|
||||
return_value=return_tup) as mock_request:
|
||||
cmd.run(parsed_args)
|
||||
|
||||
mock_get_client.assert_called_once_with()
|
||||
mock_request.assert_called_once_with(
|
||||
test_cli20.end_url(path % my_id), 'GET',
|
||||
body=None,
|
||||
headers=test_cli20.ContainsKeyValue(
|
||||
{'X-Auth-Token': test_cli20.TOKEN}))
|
||||
_str = self.fake_stdout.make_string()
|
||||
self.assertIn('operating_status', _str)
|
||||
self.assertIn('ONLINE', _str)
|
||||
self.assertIn('provisioning_status', _str)
|
||||
self.assertIn('ACTIVE', _str)
|
@ -1,171 +0,0 @@
|
||||
# Copyright 2014 Blue Box Group, 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
|
||||
from neutronclient.neutron.v2_0.lb.v2 import member
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20LbMemberJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def test_create_member_with_mandatory_params(self):
|
||||
# lbaas-member-create with mandatory params only.
|
||||
resource = 'member'
|
||||
cmd_resource = 'lbaas_member'
|
||||
cmd = member.CreateMember(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
address = '10.1.1.1'
|
||||
protocol_port = '80'
|
||||
pool_id = 'pool-id'
|
||||
subnet_id = 'subnet-id'
|
||||
args = ['--address', address, '--protocol-port', protocol_port,
|
||||
'--subnet', subnet_id, pool_id]
|
||||
position_names = ['admin_state_up', 'address',
|
||||
'protocol_port', 'subnet_id']
|
||||
position_values = [True, address, protocol_port, subnet_id]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource,
|
||||
parent_id=pool_id)
|
||||
|
||||
def test_create_member_with_all_params(self):
|
||||
# lbaas-member-create with all params set.
|
||||
resource = 'member'
|
||||
cmd_resource = 'lbaas_member'
|
||||
cmd = member.CreateMember(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
address = '10.1.1.1'
|
||||
protocol_port = '80'
|
||||
pool_id = 'pool-id'
|
||||
subnet_id = 'subnet-id'
|
||||
weight = '100'
|
||||
name = 'member1'
|
||||
args = ['--address', address, '--protocol-port', protocol_port,
|
||||
'--subnet', subnet_id, pool_id, '--weight', weight,
|
||||
'--admin-state-down', '--name', name]
|
||||
position_names = ['admin_state_up', 'address', 'protocol_port',
|
||||
'subnet_id', 'weight', 'name']
|
||||
position_values = [False, address, protocol_port,
|
||||
subnet_id, weight, name]
|
||||
self._test_create_resource(resource, cmd, name, my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource,
|
||||
parent_id=pool_id)
|
||||
|
||||
def test_list_members(self):
|
||||
# lbaas-member-list.
|
||||
resources = 'members'
|
||||
cmd_resources = 'lbaas_members'
|
||||
pool_id = 'pool-id'
|
||||
cmd = member.ListMember(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True, base_args=[pool_id],
|
||||
cmd_resources=cmd_resources,
|
||||
parent_id=pool_id,
|
||||
query="pool_id=%s" % pool_id)
|
||||
|
||||
def test_list_members_pagination(self):
|
||||
# lbaas-member-list with pagination.
|
||||
resources = 'members'
|
||||
cmd_resources = 'lbaas_members'
|
||||
pool_id = 'pool-id'
|
||||
cmd = member.ListMember(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(resources, cmd,
|
||||
base_args=[pool_id],
|
||||
cmd_resources=cmd_resources,
|
||||
parent_id=pool_id,
|
||||
query="pool_id=%s" % pool_id)
|
||||
|
||||
def test_list_members_sort(self):
|
||||
# lbaas-member-list --sort-key id --sort-key asc.
|
||||
resources = 'members'
|
||||
cmd_resources = 'lbaas_members'
|
||||
pool_id = 'pool-id'
|
||||
cmd = member.ListMember(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True, base_args=[pool_id],
|
||||
cmd_resources=cmd_resources,
|
||||
parent_id=pool_id,
|
||||
query="pool_id=%s" % pool_id)
|
||||
|
||||
def test_list_members_limit(self):
|
||||
# lbaas-member-list -P.
|
||||
resources = 'members'
|
||||
cmd_resources = 'lbaas_members'
|
||||
pool_id = 'pool-id'
|
||||
cmd = member.ListMember(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000,
|
||||
base_args=[pool_id],
|
||||
cmd_resources=cmd_resources,
|
||||
parent_id=pool_id,
|
||||
query="pool_id=%s" % pool_id)
|
||||
|
||||
def test_show_member_id(self):
|
||||
# lbaas-member-show test_id.
|
||||
resource = 'member'
|
||||
cmd_resource = 'lbaas_member'
|
||||
pool_id = 'pool-id'
|
||||
cmd = member.ShowMember(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id, pool_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'],
|
||||
cmd_resource=cmd_resource, parent_id=pool_id)
|
||||
|
||||
def test_show_member_id_name(self):
|
||||
# lbaas-member-show.
|
||||
resource = 'member'
|
||||
cmd_resource = 'lbaas_member'
|
||||
pool_id = 'pool-id'
|
||||
cmd = member.ShowMember(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id, pool_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id,
|
||||
args, ['id', 'name'],
|
||||
cmd_resource=cmd_resource, parent_id=pool_id)
|
||||
|
||||
def test_update_member(self):
|
||||
# lbaas-member-update myid --name newname.
|
||||
resource = 'member'
|
||||
cmd_resource = 'lbaas_member'
|
||||
my_id = 'my-id'
|
||||
pool_id = 'pool-id'
|
||||
args = [my_id, pool_id, '--name', 'newname']
|
||||
cmd = member.UpdateMember(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(resource, cmd, my_id, args,
|
||||
{'name': 'newname', },
|
||||
cmd_resource=cmd_resource,
|
||||
parent_id=pool_id)
|
||||
# lbaas-member-update myid --weight 100.
|
||||
args = [my_id, pool_id, '--weight', '100']
|
||||
self._test_update_resource(resource, cmd, my_id, args,
|
||||
{'weight': '100', },
|
||||
cmd_resource=cmd_resource,
|
||||
parent_id=pool_id)
|
||||
# lbaas-member-update myid --admin-state-up False
|
||||
args = [my_id, pool_id, '--admin-state-up', 'False']
|
||||
self._test_update_resource(resource, cmd, my_id, args,
|
||||
{'admin_state_up': 'False', },
|
||||
cmd_resource=cmd_resource,
|
||||
parent_id=pool_id)
|
||||
|
||||
def test_delete_member(self):
|
||||
# lbaas-member-delete my-id.
|
||||
resource = 'member'
|
||||
cmd_resource = 'lbaas_member'
|
||||
cmd = member.DeleteMember(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
pool_id = 'pool-id'
|
||||
args = [my_id, pool_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args,
|
||||
cmd_resource=cmd_resource,
|
||||
parent_id=pool_id)
|
@ -1,202 +0,0 @@
|
||||
# Copyright 2014 Blue Box Group, 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
|
||||
from neutronclient.common import exceptions
|
||||
from neutronclient.neutron.v2_0.lb.v2 import pool
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20LbPoolJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def test_create_pool_with_listener(self):
|
||||
# lbaas-pool-create with listener
|
||||
resource = 'pool'
|
||||
cmd_resource = 'lbaas_pool'
|
||||
cmd = pool.CreatePool(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
lb_algorithm = 'ROUND_ROBIN'
|
||||
listener = 'listener'
|
||||
protocol = 'TCP'
|
||||
args = ['--lb-algorithm', lb_algorithm, '--protocol', protocol,
|
||||
'--listener', listener]
|
||||
position_names = ['admin_state_up', 'lb_algorithm', 'protocol',
|
||||
'listener_id']
|
||||
position_values = [True, lb_algorithm, protocol, listener]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_create_pool_with_loadbalancer_no_listener(self):
|
||||
"""lbaas-pool-create with loadbalancer, no listener."""
|
||||
resource = 'pool'
|
||||
cmd_resource = 'lbaas_pool'
|
||||
cmd = pool.CreatePool(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
lb_algorithm = 'ROUND_ROBIN'
|
||||
loadbalancer = 'loadbalancer'
|
||||
protocol = 'TCP'
|
||||
args = ['--lb-algorithm', lb_algorithm, '--protocol', protocol,
|
||||
'--loadbalancer', loadbalancer]
|
||||
position_names = ['admin_state_up', 'lb_algorithm', 'protocol',
|
||||
'loadbalancer_id']
|
||||
position_values = [True, lb_algorithm, protocol, loadbalancer]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_create_pool_with_no_listener_or_loadbalancer(self):
|
||||
"""lbaas-pool-create with no listener or loadbalancer."""
|
||||
resource = 'pool'
|
||||
cmd_resource = 'lbaas_pool'
|
||||
cmd = pool.CreatePool(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
lb_algorithm = 'ROUND_ROBIN'
|
||||
protocol = 'TCP'
|
||||
args = ['--lb-algorithm', lb_algorithm, '--protocol', protocol]
|
||||
position_names = ['admin_state_up', 'lb_algorithm', 'protocol']
|
||||
position_values = [True, lb_algorithm, protocol]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource,
|
||||
no_api_call=True,
|
||||
expected_exception=exceptions.CommandError)
|
||||
|
||||
def test_create_pool_with_all_params(self):
|
||||
# lbaas-pool-create with all params set.
|
||||
resource = 'pool'
|
||||
cmd_resource = 'lbaas_pool'
|
||||
cmd = pool.CreatePool(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
lb_algorithm = 'ROUND_ROBIN'
|
||||
listener = 'listener'
|
||||
loadbalancer = 'loadbalancer'
|
||||
protocol = 'TCP'
|
||||
description = 'description'
|
||||
session_persistence_str = 'type=APP_COOKIE,cookie_name=1234'
|
||||
session_persistence = {'type': 'APP_COOKIE',
|
||||
'cookie_name': '1234'}
|
||||
name = 'my-pool'
|
||||
args = ['--lb-algorithm', lb_algorithm, '--protocol', protocol,
|
||||
'--description', description, '--session-persistence',
|
||||
session_persistence_str, '--admin-state-down', '--name', name,
|
||||
'--listener', listener, '--loadbalancer', loadbalancer]
|
||||
position_names = ['lb_algorithm', 'protocol', 'description',
|
||||
'session_persistence', 'admin_state_up', 'name',
|
||||
'listener_id', 'loadbalancer_id']
|
||||
position_values = [lb_algorithm, protocol, description,
|
||||
session_persistence, False, name, listener,
|
||||
loadbalancer]
|
||||
self._test_create_resource(resource, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_list_pools(self):
|
||||
# lbaas-pool-list.
|
||||
resources = 'pools'
|
||||
cmd_resources = 'lbaas_pools'
|
||||
cmd = pool.ListPool(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_pools_pagination(self):
|
||||
# lbaas-pool-list with pagination.
|
||||
resources = 'pools'
|
||||
cmd_resources = 'lbaas_pools'
|
||||
cmd = pool.ListPool(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources_with_pagination(resources, cmd,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_pools_sort(self):
|
||||
# lbaas-pool-list --sort-key id --sort-key asc.
|
||||
resources = 'pools'
|
||||
cmd_resources = 'lbaas_pools'
|
||||
cmd = pool.ListPool(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, True,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_list_pools_limit(self):
|
||||
# lbaas-pool-list -P.
|
||||
resources = 'pools'
|
||||
cmd_resources = 'lbaas_pools'
|
||||
cmd = pool.ListPool(test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000,
|
||||
cmd_resources=cmd_resources)
|
||||
|
||||
def test_show_pool_id(self):
|
||||
# lbaas-pool-show test_id.
|
||||
resource = 'pool'
|
||||
cmd_resource = 'lbaas_pool'
|
||||
cmd = pool.ShowPool(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args, ['id'],
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_show_pool_id_name(self):
|
||||
# lbaas-pool-show.
|
||||
resource = 'pool'
|
||||
cmd_resource = 'lbaas_pool'
|
||||
cmd = pool.ShowPool(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id,
|
||||
args, ['id', 'name'],
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_update_pool(self):
|
||||
# lbaas-pool-update myid --name newname --description SuperPool
|
||||
# --lb-algorithm SOURCE_IP --admin-state-up
|
||||
# --session-persistence type=dict,type=HTTP_COOKIE,cookie_name=pie
|
||||
|
||||
resource = 'pool'
|
||||
cmd_resource = 'lbaas_pool'
|
||||
cmd = pool.UpdatePool(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['myid', '--name', 'newname',
|
||||
'--description', 'SuperPool', '--lb-algorithm', "SOURCE_IP",
|
||||
'--admin-state-up', 'True',
|
||||
'--session-persistence', 'type=dict,'
|
||||
'type=HTTP_COOKIE,cookie_name=pie']
|
||||
body = {'name': 'newname',
|
||||
"description": "SuperPool",
|
||||
"lb_algorithm": "SOURCE_IP",
|
||||
"admin_state_up": 'True',
|
||||
'session_persistence': {
|
||||
'type': 'HTTP_COOKIE',
|
||||
'cookie_name': 'pie',
|
||||
}, }
|
||||
self._test_update_resource(resource, cmd, 'myid', args, body,
|
||||
cmd_resource=cmd_resource)
|
||||
# lbaas-pool-update myid --name Name
|
||||
# --no-session-persistence
|
||||
|
||||
resource = 'pool'
|
||||
cmd_resource = 'lbaas_pool'
|
||||
cmd = pool.UpdatePool(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['myid', '--name', 'Name', '--no-session-persistence']
|
||||
body = {'name': "Name",
|
||||
"session_persistence": None, }
|
||||
self._test_update_resource(resource, cmd, 'myid', args, body,
|
||||
cmd_resource=cmd_resource)
|
||||
|
||||
def test_delete_pool(self):
|
||||
# lbaas-pool-delete my-id.
|
||||
resource = 'pool'
|
||||
cmd_resource = 'lbaas_pool'
|
||||
cmd = pool.DeletePool(test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(resource, cmd, my_id, args,
|
||||
cmd_resource=cmd_resource)
|
@ -1,137 +0,0 @@
|
||||
# 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.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20QoSBandwidthLimitRuleJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
non_admin_status_resources = ['bandwidth_limit_rule']
|
||||
|
||||
def setUp(self):
|
||||
super(CLITestV20QoSBandwidthLimitRuleJSON, self).setUp()
|
||||
self.res = 'bandwidth_limit_rule'
|
||||
self.cmd_res = 'qos_bandwidth_limit_rule'
|
||||
self.ress = self.res + 's'
|
||||
self.cmd_ress = self.cmd_res + 's'
|
||||
|
||||
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 = ['--fields', 'id', self.test_id, policy_id]
|
||||
self._test_show_resource(self.res, cmd, self.test_id, args,
|
||||
['id'], cmd_resource=self.cmd_res,
|
||||
parent_id=policy_id)
|
@ -1,91 +0,0 @@
|
||||
# Copyright 2016 Comcast 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
|
||||
from neutronclient.common import exceptions
|
||||
from neutronclient.neutron.v2_0.qos import dscp_marking_rule as dscp_rule
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20QoSDscpMarkingRuleJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
non_admin_status_resources = ['dscp_marking_rule']
|
||||
|
||||
def setUp(self):
|
||||
super(CLITestV20QoSDscpMarkingRuleJSON, self).setUp()
|
||||
self.dscp_res = 'dscp_marking_rule'
|
||||
self.dscp_cmd_res = 'qos_dscp_marking_rule'
|
||||
self.dscp_ress = self.dscp_res + 's'
|
||||
self.dscp_cmd_ress = self.dscp_cmd_res + 's'
|
||||
|
||||
def test_create_dscp_marking_rule_with_dscp_mark(self):
|
||||
cmd = dscp_rule.CreateQoSDscpMarkingRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'my-id'
|
||||
policy_id = 'policy_id'
|
||||
position_names = ['dscp_mark']
|
||||
valid_dscp_marks = ['0', '56']
|
||||
invalid_dscp_marks = ['-1', '19', '42', '44', '57', '58']
|
||||
for dscp_mark in valid_dscp_marks:
|
||||
args = ['--dscp-mark', dscp_mark, policy_id]
|
||||
position_values = [dscp_mark]
|
||||
self._test_create_resource(self.dscp_res, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=self.dscp_cmd_res,
|
||||
parent_id=policy_id)
|
||||
for dscp_mark in invalid_dscp_marks:
|
||||
args = ['--dscp-mark', dscp_mark, policy_id]
|
||||
position_values = [dscp_mark]
|
||||
self._test_create_resource(
|
||||
self.dscp_res, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=self.dscp_cmd_res,
|
||||
parent_id=policy_id,
|
||||
no_api_call=True,
|
||||
expected_exception=exceptions.CommandError)
|
||||
|
||||
def test_update_dscp_marking_rule_with_dscp_mark(self):
|
||||
cmd = dscp_rule.UpdateQoSDscpMarkingRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'my-id'
|
||||
dscp_mark = '56'
|
||||
policy_id = 'policy_id'
|
||||
args = ['--dscp-mark', dscp_mark,
|
||||
my_id, policy_id]
|
||||
self._test_update_resource(self.dscp_res, cmd, my_id, args,
|
||||
{'dscp_mark': dscp_mark},
|
||||
cmd_resource=self.dscp_cmd_res,
|
||||
parent_id=policy_id)
|
||||
|
||||
def test_delete_dscp_marking_rule(self):
|
||||
cmd = dscp_rule.DeleteQoSDscpMarkingRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'my-id'
|
||||
policy_id = 'policy_id'
|
||||
args = [my_id, policy_id]
|
||||
self._test_delete_resource(self.dscp_res, cmd, my_id, args,
|
||||
cmd_resource=self.dscp_cmd_res,
|
||||
parent_id=policy_id)
|
||||
|
||||
def test_show_dscp_marking_rule(self):
|
||||
cmd = dscp_rule.ShowQoSDscpMarkingRule(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
policy_id = 'policy_id'
|
||||
args = ['--fields', 'id', self.test_id, policy_id]
|
||||
self._test_show_resource(self.dscp_res, cmd, self.test_id, args,
|
||||
['id'], cmd_resource=self.dscp_cmd_res,
|
||||
parent_id=policy_id)
|
@ -1,143 +0,0 @@
|
||||
# Copyright (c) 2016 Intel Corporation.
|
||||
# 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 minimum_bandwidth_rule as bw_rule
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20QoSMinimumBandwidthRuleJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
non_admin_status_resources = ['minimum_bandwidth_rule']
|
||||
|
||||
def setUp(self):
|
||||
super(CLITestV20QoSMinimumBandwidthRuleJSON, self).setUp()
|
||||
self.res = 'minimum_bandwidth_rule'
|
||||
self.cmd_res = 'qos_minimum_bandwidth_rule'
|
||||
self.ress = self.res + 's'
|
||||
self.cmd_ress = self.cmd_res + 's'
|
||||
|
||||
def test_create_minimum_bandwidth_rule_min_kbps_only(self):
|
||||
cmd = bw_rule.CreateQoSMinimumBandwidthRule(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
min_kbps = '1500'
|
||||
policy_id = 'policy_id'
|
||||
args = ['--min-kbps', min_kbps,
|
||||
policy_id]
|
||||
position_names = ['min_kbps']
|
||||
position_values = [min_kbps]
|
||||
self.assertRaises(SystemExit, self._test_create_resource,
|
||||
self.res, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=self.cmd_res,
|
||||
parent_id=policy_id,
|
||||
no_api_call=True)
|
||||
|
||||
def test_create_minimum_bandwidth_rule_direction_only(self):
|
||||
cmd = bw_rule.CreateQoSMinimumBandwidthRule(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
direction = 'egress'
|
||||
policy_id = 'policy_id'
|
||||
args = ['--direction', direction,
|
||||
policy_id]
|
||||
position_names = ['direction']
|
||||
position_values = [direction]
|
||||
self.assertRaises(SystemExit, self._test_create_resource,
|
||||
self.res, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=self.cmd_res,
|
||||
parent_id=policy_id,
|
||||
no_api_call=True)
|
||||
|
||||
def test_create_minimum_bandwidth_rule_none(self):
|
||||
cmd = bw_rule.CreateQoSMinimumBandwidthRule(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
policy_id = 'policy_id'
|
||||
args = [policy_id]
|
||||
position_names = []
|
||||
position_values = []
|
||||
self.assertRaises(SystemExit, self._test_create_resource,
|
||||
self.res, cmd, '', my_id, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=self.cmd_res,
|
||||
parent_id=policy_id,
|
||||
no_api_call=True)
|
||||
|
||||
def test_create_minimum_bandwidth_rule_all(self):
|
||||
cmd = bw_rule.CreateQoSMinimumBandwidthRule(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
min_kbps = '1500'
|
||||
direction = 'egress'
|
||||
policy_id = 'policy_id'
|
||||
args = ['--min-kbps', min_kbps,
|
||||
'--direction', direction,
|
||||
policy_id]
|
||||
position_names = ['direction', 'min_kbps']
|
||||
position_values = [direction, min_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_minimum_bandwidth_rule(self):
|
||||
cmd = bw_rule.UpdateQoSMinimumBandwidthRule(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
my_id = 'my-id'
|
||||
min_kbps = '1200'
|
||||
direction = 'egress'
|
||||
policy_id = 'policy_id'
|
||||
args = ['--min-kbps', min_kbps,
|
||||
'--direction', direction,
|
||||
my_id, policy_id]
|
||||
self._test_update_resource(self.res, cmd, my_id, args,
|
||||
{'min_kbps': min_kbps,
|
||||
'direction': direction},
|
||||
cmd_resource=self.cmd_res,
|
||||
parent_id=policy_id)
|
||||
|
||||
def test_delete_minimum_bandwidth_rule(self):
|
||||
cmd = bw_rule.DeleteQoSMinimumBandwidthRule(
|
||||
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_minimum_bandwidth_rule(self):
|
||||
cmd = bw_rule.ShowQoSMinimumBandwidthRule(
|
||||
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_minimum_bandwidth_rule(self):
|
||||
cmd = bw_rule.ListQoSMinimumBandwidthRules(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
policy_id = 'policy_id'
|
||||
args = [policy_id]
|
||||
contents = [{'name': 'rule1', 'min-kbps': 1000, 'direction': 'egress'}]
|
||||
self._test_list_resources(self.ress, cmd, parent_id=policy_id,
|
||||
cmd_resources=self.cmd_ress,
|
||||
base_args=args, response_contents=contents)
|
@ -1,192 +0,0 @@
|
||||
# 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 policy as policy
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20QoSPolicyJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
non_admin_status_resources = ['policy']
|
||||
|
||||
def setUp(self):
|
||||
super(CLITestV20QoSPolicyJSON, self).setUp()
|
||||
self.res = 'policy'
|
||||
self.cmd_res = 'qos_policy'
|
||||
self.ress = "policies"
|
||||
self.cmd_ress = 'qos_policies'
|
||||
|
||||
def test_create_policy_with_only_keyattributes(self):
|
||||
# Create qos policy abc.
|
||||
cmd = policy.CreateQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
myid = 'myid'
|
||||
name = 'abc'
|
||||
args = [name]
|
||||
position_names = ['name']
|
||||
position_values = [name]
|
||||
self._test_create_resource(self.res, cmd, name, myid, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=self.cmd_res)
|
||||
|
||||
def test_create_policy_with_description(self):
|
||||
# Create qos policy xyz --description abc.
|
||||
cmd = policy.CreateQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
myid = 'myid'
|
||||
name = 'abc'
|
||||
description = 'policy_abc'
|
||||
args = [name, '--description', description]
|
||||
position_names = ['name', 'description']
|
||||
position_values = [name, description]
|
||||
self._test_create_resource(self.res, cmd, name, myid, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=self.cmd_res)
|
||||
|
||||
def test_create_policy_with_shared(self):
|
||||
# Create qos policy abc shared across tenants
|
||||
cmd = policy.CreateQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
myid = 'myid'
|
||||
name = 'abc'
|
||||
description = 'policy_abc'
|
||||
args = [name, '--description', description, '--shared']
|
||||
position_names = ['name', 'description', 'shared']
|
||||
position_values = [name, description, True]
|
||||
self._test_create_resource(self.res, cmd, name, myid, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=self.cmd_res)
|
||||
|
||||
def test_create_policy_with_unicode(self):
|
||||
# Create qos policy u'\u7f51\u7edc'.
|
||||
cmd = policy.CreateQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
myid = 'myid'
|
||||
name = u'\u7f51\u7edc'
|
||||
description = u'\u7f51\u7edc'
|
||||
args = [name, '--description', description]
|
||||
position_names = ['name', 'description']
|
||||
position_values = [name, description]
|
||||
self._test_create_resource(self.res, cmd, name, myid, args,
|
||||
position_names, position_values,
|
||||
cmd_resource=self.cmd_res)
|
||||
|
||||
def test_update_policy(self):
|
||||
# policy-update myid --name newname.
|
||||
cmd = policy.UpdateQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_update_resource(self.res, cmd, 'myid',
|
||||
['myid', '--name', 'newname'],
|
||||
{'name': 'newname', },
|
||||
cmd_resource=self.cmd_res)
|
||||
|
||||
def test_update_policy_description(self):
|
||||
# policy-update myid --name newname --description newdesc
|
||||
cmd = policy.UpdateQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_update_resource(self.res, cmd, 'myid',
|
||||
['myid', '--description', 'newdesc'],
|
||||
{'description': 'newdesc', },
|
||||
cmd_resource=self.cmd_res)
|
||||
|
||||
def test_update_policy_to_shared(self):
|
||||
# policy-update myid --shared
|
||||
cmd = policy.UpdateQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_update_resource(self.res, cmd, 'myid',
|
||||
['myid', '--shared'],
|
||||
{'shared': True, },
|
||||
cmd_resource=self.cmd_res)
|
||||
|
||||
def test_update_policy_to_no_shared(self):
|
||||
# policy-update myid --no-shared
|
||||
cmd = policy.UpdateQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_update_resource(self.res, cmd, 'myid',
|
||||
['myid', '--no-shared'],
|
||||
{'shared': False, },
|
||||
cmd_resource=self.cmd_res)
|
||||
|
||||
def test_update_policy_to_shared_no_shared_together(self):
|
||||
# policy-update myid --shared --no-shared
|
||||
cmd = policy.UpdateQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self.assertRaises(
|
||||
SystemExit,
|
||||
self._test_update_resource,
|
||||
self.res, cmd, 'myid',
|
||||
['myid', '--shared', '--no-shared'], {},
|
||||
cmd_resource=self.cmd_res
|
||||
)
|
||||
|
||||
def test_list_policies(self):
|
||||
# qos-policy-list.
|
||||
cmd = policy.ListQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(self.ress, cmd, True,
|
||||
cmd_resources=self.cmd_ress)
|
||||
|
||||
def test_list_policies_pagination(self):
|
||||
# qos-policy-list for pagination.
|
||||
cmd = policy.ListQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources_with_pagination(self.ress, cmd,
|
||||
cmd_resources=self.cmd_ress)
|
||||
|
||||
def test_list_policies_sort(self):
|
||||
# sorted list: qos-policy-list --sort-key name --sort-key id
|
||||
# --sort-key asc --sort-key desc
|
||||
cmd = policy.ListQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(self.ress, cmd,
|
||||
sort_key=["name", "id"],
|
||||
sort_dir=["asc", "desc"],
|
||||
cmd_resources=self.cmd_ress)
|
||||
|
||||
def test_list_policies_limit(self):
|
||||
# size (1000) limited list: qos-policy-list -P.
|
||||
cmd = policy.ListQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(self.ress, cmd, page_size=1000,
|
||||
cmd_resources=self.cmd_ress)
|
||||
|
||||
def test_show_policy_id(self):
|
||||
# qos-policy-show test_id.
|
||||
cmd = policy.ShowQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', self.test_id]
|
||||
self._test_show_resource(self.res, cmd, self.test_id, args,
|
||||
['id'], cmd_resource=self.cmd_res)
|
||||
|
||||
def test_show_policy_name(self):
|
||||
# qos-policy-show.
|
||||
cmd = policy.ShowQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
||||
self._test_show_resource(self.res, cmd, self.test_id,
|
||||
args, ['id', 'name'],
|
||||
cmd_resource=self.cmd_res)
|
||||
|
||||
def test_delete_policy(self):
|
||||
# qos-policy-delete my-id.
|
||||
cmd = policy.DeleteQoSPolicy(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
my_id = 'myid1'
|
||||
args = [my_id]
|
||||
self._test_delete_resource(self.res, cmd, my_id, args,
|
||||
cmd_resource=self.cmd_res)
|
@ -1,44 +0,0 @@
|
||||
# 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 rule as qos_rule
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20QoSRuleJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
non_admin_status_resources = ['bandwidth_limit_rule',
|
||||
'dscp_marking_rule',
|
||||
'minimum_bandwidth_rule']
|
||||
|
||||
def setUp(self):
|
||||
super(CLITestV20QoSRuleJSON, self).setUp()
|
||||
|
||||
def test_list_qos_rule_types(self):
|
||||
# qos_rule_types.
|
||||
resources = 'rule_types'
|
||||
cmd_resources = 'qos_rule_types'
|
||||
response_contents = [{'type': 'bandwidth_limit'},
|
||||
{'type': 'dscp_marking'},
|
||||
{'type': 'minimum_bandwidth'}]
|
||||
|
||||
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)
|
@ -1,76 +0,0 @@
|
||||
# Copyright 2016 IBM
|
||||
# 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 import auto_allocated_topology as aat
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class TestAutoAllocatedTopologyJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
def test_show_auto_allocated_topology_arg(self):
|
||||
resource = 'auto_allocated_topology'
|
||||
cmd = aat.ShowAutoAllocatedTopology(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--tenant-id', self.test_id]
|
||||
self._test_show_resource(resource, cmd, self.test_id, args)
|
||||
|
||||
def test_show_auto_allocated_topology_posarg(self):
|
||||
resource = 'auto_allocated_topology'
|
||||
cmd = aat.ShowAutoAllocatedTopology(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['some-tenant']
|
||||
self._test_show_resource(resource, cmd, "some-tenant", args)
|
||||
|
||||
def test_show_auto_allocated_topology_no_arg(self):
|
||||
resource = 'auto_allocated_topology'
|
||||
cmd = aat.ShowAutoAllocatedTopology(test_cli20.MyApp(sys.stdout), None)
|
||||
args = []
|
||||
self._test_show_resource(resource, cmd, "None", args)
|
||||
|
||||
def test_show_auto_allocated_topology_dry_run_as_tenant(self):
|
||||
resource = 'auto_allocated_topology'
|
||||
cmd = aat.ShowAutoAllocatedTopology(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--dry-run']
|
||||
self._test_show_resource(resource, cmd, "None", args,
|
||||
fields=('dry-run',))
|
||||
|
||||
def test_show_auto_allocated_topology_dry_run_as_admin(self):
|
||||
resource = 'auto_allocated_topology'
|
||||
cmd = aat.ShowAutoAllocatedTopology(test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--dry-run', 'some-tenant']
|
||||
self._test_show_resource(resource, cmd, "some-tenant", args,
|
||||
fields=('dry-run',))
|
||||
|
||||
def test_delete_auto_allocated_topology_arg(self):
|
||||
resource = 'auto_allocated_topology'
|
||||
cmd = aat.DeleteAutoAllocatedTopology(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['--tenant-id', self.test_id]
|
||||
self._test_delete_resource(resource, cmd, self.test_id, args)
|
||||
|
||||
def test_delete_auto_allocated_topology_posarg(self):
|
||||
resource = 'auto_allocated_topology'
|
||||
cmd = aat.DeleteAutoAllocatedTopology(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = ['some-tenant']
|
||||
self._test_delete_resource(resource, cmd, "some-tenant", args)
|
||||
|
||||
def test_delete_auto_allocated_topology_no_arg(self):
|
||||
resource = 'auto_allocated_topology'
|
||||
cmd = aat.DeleteAutoAllocatedTopology(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
args = []
|
||||
self._test_delete_resource(resource, cmd, "None", args)
|
File diff suppressed because it is too large
Load Diff
@ -1,175 +0,0 @@
|
||||
# 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 unittest import mock
|
||||
|
||||
|
||||
from neutronclient.common import exceptions
|
||||
from neutronclient.neutron.v2_0 import address_scope
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20AddressScopeJSON(test_cli20.CLITestV20Base):
|
||||
|
||||
non_admin_status_resources = ['address_scope']
|
||||
|
||||
def setUp(self):
|
||||
super(CLITestV20AddressScopeJSON, self).setUp(plurals={'tags': 'tag'})
|
||||
|
||||
def test_create_address_scope_with_minimum_option_ipv4(self):
|
||||
"""Create address_scope: foo-address-scope with minimum option."""
|
||||
resource = 'address_scope'
|
||||
cmd = address_scope.CreateAddressScope(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'foo-address-scope'
|
||||
myid = 'myid'
|
||||
args = [name, '4']
|
||||
position_names = ['name', 'ip_version']
|
||||
position_values = [name, 4]
|
||||
self._test_create_resource(resource, cmd, name, myid, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_address_scope_with_minimum_option_ipv6(self):
|
||||
"""Create address_scope: foo-address-scope with minimum option."""
|
||||
resource = 'address_scope'
|
||||
cmd = address_scope.CreateAddressScope(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'foo-address-scope'
|
||||
myid = 'myid'
|
||||
args = [name, '6']
|
||||
position_names = ['name', 'ip_version']
|
||||
position_values = [name, 6]
|
||||
self._test_create_resource(resource, cmd, name, myid, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_address_scope_with_minimum_option_bad_ip_version(self):
|
||||
"""Create address_scope: foo-address-scope with minimum option."""
|
||||
resource = 'address_scope'
|
||||
cmd = address_scope.CreateAddressScope(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'foo-address-scope'
|
||||
myid = 'myid'
|
||||
args = [name, '5']
|
||||
position_names = ['name', 'ip_version']
|
||||
position_values = [name, 5]
|
||||
self.assertRaises(SystemExit, self._test_create_resource,
|
||||
resource, cmd, name, myid, args, position_names,
|
||||
position_values)
|
||||
|
||||
def test_create_address_scope_with_all_option(self):
|
||||
# Create address_scope: foo-address-scope with all options.
|
||||
resource = 'address_scope'
|
||||
cmd = address_scope.CreateAddressScope(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
name = 'foo-address-scope'
|
||||
myid = 'myid'
|
||||
args = [name, '4', '--shared']
|
||||
position_names = ['name', 'ip_version', 'shared']
|
||||
position_values = [name, 4, True]
|
||||
self._test_create_resource(resource, cmd, name, myid, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_create_address_scope_with_unicode(self):
|
||||
# Create address_scope: u'\u7f51\u7edc'.
|
||||
resource = 'address_scope'
|
||||
cmd = address_scope.CreateAddressScope(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
name = u'\u7f51\u7edc'
|
||||
ip_version = u'4'
|
||||
myid = 'myid'
|
||||
args = [name, ip_version]
|
||||
position_names = ['name', 'ip_version']
|
||||
position_values = [name, 4]
|
||||
self._test_create_resource(resource, cmd, name, myid, args,
|
||||
position_names, position_values)
|
||||
|
||||
def test_update_address_scope_exception(self):
|
||||
# Update address_scope (Negative) : myid.
|
||||
resource = 'address_scope'
|
||||
cmd = address_scope.UpdateAddressScope(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
self.assertRaises(exceptions.CommandError, self._test_update_resource,
|
||||
resource, cmd, 'myid', ['myid'], {})
|
||||
|
||||
def test_update_address_scope(self):
|
||||
# Update address_scope: myid --name newname-address-scope.
|
||||
resource = 'address_scope'
|
||||
cmd = address_scope.UpdateAddressScope(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--name', 'newname-address-scope'],
|
||||
{'name': 'newname-address-scope'}
|
||||
)
|
||||
# Update address_scope: myid --shared
|
||||
self._test_update_resource(resource, cmd, 'myid',
|
||||
['myid', '--shared', 'True'],
|
||||
{'shared': "True"}
|
||||
)
|
||||
|
||||
def test_list_address_scope(self):
|
||||
# address_scope-list.
|
||||
resources = "address_scopes"
|
||||
cmd = address_scope.ListAddressScope(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, True)
|
||||
|
||||
@mock.patch.object(address_scope.ListAddressScope, "extend_list")
|
||||
def test_list_address_scope_pagination(self, mock_extend_list):
|
||||
# address_scope-list.
|
||||
cmd = address_scope.ListAddressScope(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources_with_pagination("address_scopes",
|
||||
cmd)
|
||||
mock_extend_list.assert_called_once_with(test_cli20.IsA(list),
|
||||
mock.ANY)
|
||||
|
||||
def test_list_address_scope_sort(self):
|
||||
# sorted list:
|
||||
# address_scope-list --sort-key name --sort-key id --sort-key asc
|
||||
# --sort-key desc
|
||||
resources = "address_scopes"
|
||||
cmd = address_scope.ListAddressScope(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd,
|
||||
sort_key=["name", "id", "ip_version"],
|
||||
sort_dir=["asc", "desc"])
|
||||
|
||||
def test_list_address_scope_limit(self):
|
||||
# size (1000) limited list: address_scope-list -P.
|
||||
resources = "address_scopes"
|
||||
cmd = address_scope.ListAddressScope(test_cli20.MyApp(sys.stdout),
|
||||
None)
|
||||
self._test_list_resources(resources, cmd, page_size=1000)
|
||||
|
||||
def test_show_address_scope(self):
|
||||
# Show address_scope: --fields id --fields name myid.
|
||||
resource = 'address_scope'
|
||||
cmd = address_scope.ShowAddressScope(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
args = ['--fields', 'id', '--fields', 'name', self.test_id,
|
||||
'--fields', 'ip_version', '6']
|
||||
self._test_show_resource(resource, cmd, self.test_id, args,
|
||||
['id', 'name', 'ip_version'])
|
||||
|
||||
def test_delete_address_scope(self):
|
||||
# Delete address_scope: address_scope_id.
|
||||
resource = 'address_scope'
|
||||
cmd = address_scope.DeleteAddressScope(
|
||||
test_cli20.MyApp(sys.stdout), None)
|
||||
myid = 'myid'
|
||||
args = [myid]
|
||||
self._test_delete_resource(resource, cmd, myid, args)
|
@ -1,97 +0,0 @@
|
||||
# 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 oslo_serialization import jsonutils
|
||||
|
||||
from neutronclient.neutron.v2_0 import agent
|
||||
from neutronclient.tests.unit import test_cli20
|
||||
|
||||
|
||||
class CLITestV20Agent(test_cli20.CLITestV20Base):
|
||||
def test_list_agents(self):
|
||||
contents = {'agents |