Merge "Fix senlin tempest plugin to work properly"

This commit is contained in:
Zuul 2018-01-22 02:50:59 +00:00 committed by Gerrit Code Review
commit 36b3f4f159
139 changed files with 189 additions and 740 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@ __pycache__
.testrepository
.tox
*.egg-info
*.pyc

21
.zuul.yaml Normal file
View File

@ -0,0 +1,21 @@
- project:
name: openstack/senlin-tempest-plugin
check:
jobs:
- senlin-dsvm-tempest-py27-api
- senlin-dsvm-tempest-py35-api:
voting: false
branches: ^(?!stable/newton).*$
- senlin-dsvm-tempest-py27-functional
- senlin-dsvm-tempest-py35-functional:
voting: false
branches: ^(?!stable/newton).*$
- senlin-dsvm-tempest-py27-integration:
voting: false
- senlin-dsvm-tempest-py35-integration:
voting: false
branches: ^(?!stable/newton).*$
gate:
jobs:
- senlin-dsvm-tempest-py27-api
- senlin-dsvm-tempest-py27-functional

View File

@ -7,84 +7,40 @@ Team and repository tags
.. Change things from this point on
Senlin
======
==============================
Tempest integration of Senlin
==============================
--------
Overview
--------
This project contains the Tempest plugin for the Senlin project for
OpenStack Clustering.
Senlin is a clustering service for OpenStack clouds. It creates and operates
clusters of homogeneous objects exposed by other OpenStack services. The goal
is to make the orchestration of collections of similar objects easier.
For more information about Senlin see:
https://docs.openstack.org/senlin/latest/
Senlin provides RESTful APIs to users so that they can associate various
policies to a cluster. Sample policies include placement policy, load
balancing policy, health policy, scaling policy, update policy and so on.
For more information about Tempest plugins see:
https://docs.openstack.org/tempest/latest/plugin.html
Senlin is designed to be capable of managing different types of objects. An
object's lifecycle is managed using profile type implementations, which are
themselves plugins.
* Free software: Apache license
* Source: http://git.openstack.org/cgit/openstack/senlin-tempest-plugin
---------
For Users
---------
If you want to install Senlin for a try out, please refer to the documents
under the ``doc/source/user/`` subdirectory.
--------------
For Developers
--------------
There are many ways to help improve the software, for example, filing a bug,
submitting or reviewing a patch, writing or reviewing some documents. There
are documents under the ``doc/source/developer/`` subdirectory.
---------
Resources
---------
Launchpad Projects
------------------
- Server: https://launchpad.net/senlin
- Client: https://launchpad.net/python-senlinclient
- Dashboard: https://launchpad.net/senlin-dashboard
- Tempest Plugin: https://launchpad.net/senlin-tempest-plugin
Code Repository
---------------
- Server: https://git.openstack.org/cgit/openstack/senlin
- Client: https://git.openstack.org/cgit/openstack/python-senlinclient
- Dashboard: https://git.openstack.org/cgit/openstack/senlin-dashboard
- Tempest Plugin: https://git.openstack.org/cgit/openstack/senlin-tempest-plugin
Blueprints
Installing
----------
- Blueprints: https://blueprints.launchpad.net/senlin
Bug Tracking
------------
- Server Bugs: https://bugs.launchpad.net/senlin
- Client Bugs: https://bugs.launchpad.net/python-senlinclient
- Dashboard Bugs: https://bugs.launchpad.net/senlin-dashboard
- Tempest Plugin Bugs: https://bugs.launchpad.net/senlin-tempest-plugin
Clone this repository to the destination machine, and call from the repo::
Weekly Meetings
---------------
- Schedule: every Tuesday at 1300 UTC, on #openstack-meeting channel
- Agenda: https://wiki.openstack.org/wiki/Meetings/SenlinAgenda
- Archive: http://eavesdrop.openstack.org/meetings/senlin/2017/
$ pip install -e .
IRC
---
IRC Channel: #senlin on `Freenode`_.
Running the tests
-----------------
Mailinglist
-----------
Project use http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
as the mailinglist. Please use tag ``[Senlin]`` in the subject for new
threads.
To run all the tests from this plugin, call from the tempest repo::
$ tox -e all-plugin -- senlin_tempest_plugin
.. _Freenode: https://freenode.net/
To run a single test case, call with full path, for example::
$ tox -e all-plugin -- senlin_tempest_plugin.tests.api.policies.test_policy_update.TestPolicyUpdate.test_policy_update
To retrieve a list of all tempest tests, run::
$ testr list-tests

View File

@ -78,7 +78,7 @@ def delete_a_profile(base, profile_id, ignore_missing=False):
def create_a_cluster(base, profile_id, desired_capacity=0, min_size=0,
max_size=-1, timeout=None, metadata=None, name=None,
wait_timeout=None):
config=None, wait_timeout=None):
"""Utility function that generates a Senlin cluster.
Create a cluster and return it after it is ACTIVE. The function is used for
@ -94,7 +94,8 @@ def create_a_cluster(base, profile_id, desired_capacity=0, min_size=0,
'max_size': max_size,
'timeout': timeout,
'metadata': metadata,
'name': name
'name': name,
'config': config
}
}
res = base.client.create_obj('clusters', params)
@ -402,10 +403,13 @@ def create_a_receiver(base, cluster_id, action, r_type=None, name=None,
'name': name,
'cluster_id': cluster_id,
'type': r_type or 'webhook',
'action': action,
'params': params or {}
}
}
if action is not None:
body['receiver']['action'] = action
res = base.client.create_obj('receivers', body)
return res['body']['id']

View File

@ -1,11 +0,0 @@
OpenStack Test Driver
=====================
This is a fake driver for Senlin test. All interactions between Senlin
and backend OpenStack services, like Nova, Heat are simulated using this
driver. With it, Senlin API and engine workflow can be easily tested
without setting up backend services.
Configure the following option in senlin.conf to enable this driver:
`cloud_backend = openstack_test`

View File

@ -1,85 +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 senlin_tempest_plugin.drivers import base
from senlin_tempest_plugin.drivers.openstack import sdk
class HeatClient(base.DriverBase):
'''Heat V1 driver.'''
def __init__(self, params):
super(HeatClient, self).__init__(params)
self.fake_stack_create = {
"id": "3095aefc-09fb-4bc7-b1f0-f21a304e864c",
"links": [
{
"href": " ",
"rel": "self"
}
]
}
self.fake_stack_get = {
"capabilities": [],
"creation_time": "2014-06-03T20:59:46Z",
"description": "sample stack",
"disable_rollback": True,
"id": "3095aefc-09fb-4bc7-b1f0-f21a304e864c",
"links": [
{
"href": " ",
"rel": "self"
}
],
"notification_topics": [],
"outputs": [],
"parameters": {
"OS::project_id": "3ab5b02f-a01f-4f95-afa1-e254afc4a435",
"OS::stack_id": "3095aefc-09fb-4bc7-b1f0-f21a304e864c",
"OS::stack_name": "simple_stack"
},
"stack_name": "simple_stack",
"stack_owner": "simple_username",
"stack_status": "CREATE_COMPLETE",
"stack_status_reason": "Stack CREATE completed successfully",
"template_description": "sample stack",
"stack_user_project_id": "65728b74-cfe7-4f17-9c15-11d4f686e591",
"timeout_mins": "",
"updated_time": "",
"parent": "",
"tags": "",
"status": "CREATE_COMPLETE"
}
def stack_create(self, **params):
return sdk.FakeResourceObject(self.fake_stack_create)
def stack_get(self, stack_id):
return sdk.FakeResourceObject(self.fake_stack_get)
def stack_find(self, name_or_id):
return sdk.FakeResourceObject(self.fake_stack_get)
def stack_update(self, stack_id, **params):
self.fake_stack_get["status"] = "UPDATE_COMPLETE"
return sdk.FakeResourceObject(self.fake_stack_get)
def stack_delete(self, stack_id, ignore_missing=True):
return
def wait_for_stack(self, stack_id, status, failures=None, interval=2,
timeout=None):
return
def wait_for_stack_delete(self, stack_id, timeout=None):
return

View File

@ -1,38 +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 senlin_tempest_plugin.drivers import base
class LoadBalancerDriver(base.DriverBase):
def __init__(self, params):
self.lb_result = {
"loadbalancer": "a36c20d0-18e9-42ce-88fd-82a35977ee8c",
"vip_address": "192.168.1.100",
"listener": "35cb8516-1173-4035-8dae-0dae3453f37f",
"pool": "4c0a0a5f-cf8f-44b7-b912-957daa8ce5e5",
"healthmonitor": "0a9ac99d-0a09-4b18-8499-a0796850279a"
}
self.member_id = "9a7aff27-fd41-4ec1-ba4c-3eb92c629313"
def lb_create(self, vip, pool, hm=None):
return True, self.lb_result
def lb_delete(self, **kwargs):
return True, 'LB deletion succeeded'
def member_add(self, node, lb_id, pool_id, port, subnet):
return self.member_id
def member_remove(self, lb_id, pool_id, member_id):
return True

View File

@ -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.
from oslo_utils import uuidutils
from senlin_tempest_plugin.drivers import base
from senlin_tempest_plugin.drivers.openstack import sdk
class MistralClient(base.DriverBase):
'''Fake mistral V2 driver for test.'''
def __init__(self, ctx):
self.fake_workflow = {
'created_at': '1970-01-01T00:00:00.000000',
'definition': 'workflow_def',
'id': 'ffaed25e-46f5-4089-8e20-b3b4722fd597',
'input': {
'cluster_id': '8c74607c-5a74-4490-9414-a3475b1926c2',
'node_id': 'fba2cc5d-706f-4631-9577-3956048d13a2',
'flavor_id': '1'
},
'name': "cluster-coldmigration",
'project_id': 'a7eb669e9819420ea4bd1453e672c0a7',
'scope': 'private',
'tags': [
'large',
'expensive'
],
'updated_at': '1970-01-01T00:00:00.000000',
}
self.fake_workflow_create = {
'scope': 'private',
'id': 'ffaed25e-46f5-4089-8e20-b3b4722fd597',
'definition': 'workflow_def',
}
self.fake_execution_create = {
'id': 'ffaed25e-46f5-4089-8e20-b3b4722fd597',
'workflow_name': 'cluster-coldmigration',
'input': {
'cluster_id': '8c74607c-5a74-4490-9414-a3475b1926c2',
'node_id': 'fba2cc5d-706f-4631-9577-3956048d13a2',
'flavor_id': '1'
}
}
def wait_for_execution(self, execution, status='SUCCESS',
failures=['ERROR'], interval=2,
timeout=None):
return
def workflow_find(self, name_or_id, ignore_missing=True):
return sdk.FakeResourceObject(self.fake_workflow)
def workflow_delete(self, workflow, ignore_missing=True):
return
def execution_delete(self, execution, ignore_missing=True):
return
def workflow_create(self, definition, scope):
self.fake_workflow_create['id'] = uuidutils.generate_uuid()
return sdk.FakeResourceObject(self.fake_workflow_create)
def execution_create(self, name, inputs):
self.fake_execution_create['id'] = uuidutils.generate_uuid()
return sdk.FakeResourceObject(self.fake_execution_create)

View File

@ -1,37 +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 senlin_tempest_plugin.drivers import base
from senlin_tempest_plugin.drivers.openstack import sdk
class NeutronClient(base.DriverBase):
'''Fake Neutron V2 driver for test.'''
def __init__(self, ctx):
self.fake_network = {
"status": "ACTIVE",
"subnets": [
"54d6f61d-db07-451c-9ab3-b9609b6b6f0b"
],
"name": "private-network",
"router:external": False,
"admin_state_up": True,
"tenant_id": "4fd44f30292945e481c7b8a0c8908869",
"mtu": 0,
"shared": True,
"port_security_enabled": True,
"id": "d32019d3-bc6e-4319-9c1d-6722fc136a22"
}
def network_get(self, value, ignore_missing=False):
return sdk.FakeResourceObject(self.fake_network)

View File

@ -1,255 +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 copy
from oslo_utils import uuidutils
from senlin_tempest_plugin.drivers import base
from senlin_tempest_plugin.drivers.openstack import sdk
class NovaClient(base.DriverBase):
'''Fake Nova V2 driver for test.'''
def __init__(self, ctx):
self.fake_flavor = {
"is_disabled": False,
"disk": 1,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": True,
"id": "1",
"links": [],
"name": "m1.tiny",
"ram": 512,
"swap": "",
"vcpus": 1,
}
self.fake_image = {
"created": "2015-01-01T01:02:03Z",
"id": "70a599e0-31e7-49b7-b260-868f441e862b",
"links": [],
"metadata": {
"architecture": "x86_64",
"auto_disk_config": "True",
"kernel_id": "nokernel",
"ramdisk_id": "nokernel"
},
"minDisk": 0,
"minRam": 0,
"name": "cirros-0.3.5-x86_64-disk",
"progress": 100,
"status": "ACTIVE",
"updated": "2011-01-01T01:02:03Z"
}
self.fake_server_create = {
"id": "893c7791-f1df-4c3d-8383-3caae9656c62",
"availability_zone": "Zone1",
"name": "new-server-test",
"imageRef": "http://localhost/openstack/images/test-image",
"flavorRef": "http://localhost/openstack/flavors/1",
"metadata": {
"My Server Name": "Apache1"
},
"personality": [
{
"path": "/etc/banner.txt",
"contents": "personality-content"
}
],
"block_device_mapping_v2": [
{
"device_name": "/dev/sdb1",
"source_type": "blank",
"destination_type": "local",
"delete_on_termination": "True",
"guest_format": "swap",
"boot_index": "-1"
},
{
"device_name": "/dev/sda1",
"source_type": "volume",
"destination_type": "volume",
"uuid": "fake-volume-id-1",
"boot_index": "0"
}
]
}
self.fake_server_get = {
# Note: The name of some attrs are defined as following to keep
# compatible with the resource definition in openstacksdk. But
# the real name of these attrs returned by Nova API could be
# different, e.g. the name of 'access_ipv4' attribute is actually
# 'accessIPv4' in server_get API response.
"id": "893c7791-f1df-4c3d-8383-3caae9656c62",
"name": "new-server-test",
"availability_zone": "ZONE1",
"access_ipv4": "192.168.0.3",
"access_ipv6": "fe80::ac0e:2aff:fe87:5911",
"addresses": {
"private": [
{
"addr": "192.168.0.3",
"version": 4
}
]
},
"created_at": "2015-08-18T21:11:09Z",
"updated_at": "2012-08-20T21:11:09Z",
"flavor": {
"id": "1",
"links": []
},
"host_id": "65201c14a29663e06d0748e561207d998b343",
"image": {
"id": "FAKE_IMAGE_ID",
"links": []
},
"links": [],
"metadata": {
"My Server Name": "Apache1"
},
"progress": 0,
"status": "ACTIVE",
"project_id": "openstack",
"user_id": "fake"
}
self.fake_service_list = [
{
'id': 'IDENTIFIER1',
'binary': 'nova-api',
'host': 'host1',
'status': 'enabled',
'state': 'up',
'zone': 'nova'
},
{
'id': 'IDENTIFIER2',
'binary': 'nova-compute',
'host': 'host1',
'status': 'enabled',
'state': 'up',
'zone': 'nova'
},
]
self.keypair = {
'public_key': 'blahblah',
'type': 'ssh',
'name': 'oskey',
'fingerprint': 'not-real',
}
self.availability_zone = {
'zoneState': {
'available': True
},
'hosts': None,
'zoneName': 'nova',
}
def flavor_find(self, name_or_id, ignore_missing=False):
return sdk.FakeResourceObject(self.fake_flavor)
def flavor_list(self, details=True, **query):
return [sdk.FakeResourceObject(self.fake_flavor)]
def image_find(self, name_or_id, ignore_missing=False):
return sdk.FakeResourceObject(self.fake_image)
def image_list(self, details=True, **query):
return [sdk.FakeResourceObject(self.fake_image)]
def keypair_list(self, details=True, **query):
return [sdk.FakeResourceObject(self.fake_keypair)]
def keypair_find(self, name_or_id, ignore_missing=False):
return sdk.FakeResourceObject(self.keypair)
def server_create(self, **attrs):
self.fake_server_create['id'] = uuidutils.generate_uuid()
self.fake_server_get['id'] = self.fake_server_create['id']
return sdk.FakeResourceObject(self.fake_server_create)
def server_get(self, server):
return sdk.FakeResourceObject(self.fake_server_get)
def wait_for_server(self, server, timeout=None):
return
def wait_for_server_delete(self, server, timeout=None):
return
def server_update(self, server, **attrs):
self.fake_server_get.update(attrs)
return sdk.FakeResourceObject(self.fake_server_get)
def server_rebuild(self, server, imageref, name=None, admin_password=None,
**attrs):
if imageref:
attrs['image'] = {'id': imageref}
if name:
attrs['name'] = name
if admin_password:
attrs['adminPass'] = admin_password
self.fake_server_get.update(attrs)
return sdk.FakeResourceObject(self.fake_server_get)
def server_resize(self, server, flavor):
self.fake_server_get['flavor'].update({'id': flavor})
def server_resize_confirm(self, server):
return
def server_resize_revert(self, server):
return
def server_reboot(self, server, reboot_type):
return
def server_delete(self, server, ignore_missing=True):
return
def server_force_delete(self, server, ignore_missing=True):
return
def server_metadata_get(self, server):
return {}
def server_metadata_update(self, server, metadata):
new_server = copy.deepcopy(self.fake_server_get)
new_server['metadata'] = metadata
server = sdk.FakeResourceObject(new_server)
return server
def server_metadata_delete(self, server, keys):
return
def service_list(self):
return sdk.FakeResourceObject(self.fake_service_list)
def service_force_down(self, service, host, binary):
return
def service_enable(self, service, host, binary):
return
def service_disable(self, service, host, binary):
return
def availability_zone_list(self, **query):
return [sdk.FakeResourceObject(self.availability_zone)]

View File

@ -1,28 +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.
class FakeResourceObject(object):
'''Generate a fake SDK resource object based on given dictionary'''
def __init__(self, params):
for key in params:
setattr(self, key, params[key])
def to_dict(self):
'''Override this function in subclass to handle special attributes'''
data = {}
for attr in dir(self):
if not attr.startswith('__'):
# Exclude built-in attributes of python object
data[attr] = getattr(self, attr)
return data

View File

@ -23,8 +23,7 @@ class SenlinTempestPlugin(plugins.TempestPlugin):
def load_tests(self):
base_path = os.path.split(os.path.dirname(
os.path.abspath(__file__)))[0]
base_path += '/..'
test_dir = "senlin_tempest_plugin"
test_dir = "senlin_tempest_plugin/tests"
full_test_dir = os.path.join(base_path, test_dir)
return full_test_dir, base_path

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestActionList(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestActionListNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestActionShow(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestActionShowNegativeNotFound(base.BaseSenlinAPITest):

View File

@ -12,7 +12,7 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestAPIVersionShow(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestAPIVersionShowNegative(base.BaseSenlinAPITest):

View File

@ -12,7 +12,7 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestAPIVersions(base.BaseSenlinAPITest):

View File

@ -34,21 +34,21 @@ class BaseSenlinAPITest(base.BaseSenlinTest):
def setup_clients(cls):
super(BaseSenlinAPITest, cls).setup_clients()
cls.client = clustering_client.ClusteringAPIClient(
cls.os.auth_provider,
cls.os_primary.auth_provider,
CONF.clustering.catalog_type,
CONF.identity.region,
**cls.default_params_with_timeout_values
)
cls.compute_client = compute_client.V21ComputeClient(
cls.os.auth_provider,
cls.os_primary.auth_provider,
CONF.compute.catalog_type,
CONF.identity.region,
**cls.default_params_with_timeout_values
)
cls.network_client = network_client.NetworkClient(
cls.os.auth_provider,
cls.os_primary.auth_provider,
CONF.network.catalog_type,
CONF.identity.region,
**cls.default_params_with_timeout_values

View File

@ -12,7 +12,7 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestBuildInfo(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterPolicyList(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestClusterPolicyListNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterPolicyShow(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterPolicyShowNegativeClusterNotFound(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestClusterActionNegativeCommon(base.BaseSenlinAPITest):

View File

@ -13,9 +13,9 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionAddNodes(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionCheck(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterCollect(base.BaseSenlinAPITest):
@ -23,7 +23,8 @@ class TestClusterCollect(base.BaseSenlinAPITest):
super(TestClusterCollect, self).setUp()
profile_id = utils.create_a_profile(self)
self.addCleanup(utils.delete_a_profile, self, profile_id)
self.cluster_id = utils.create_a_cluster(self, profile_id)
self.cluster_id = utils.create_a_cluster(
self, profile_id, config={'node.name.format': 'N$2I'})
self.addCleanup(utils.delete_a_cluster, self, self.cluster_id)
self.node1 = utils.create_a_node(self, profile_id, name='N01',
cluster_id=self.cluster_id)

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterCreate(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterCreateNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionDelNodes(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterDelete(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterDeleteNegativePolicyConflict(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterList(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestClusterListNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionPolicyAttach(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionPolicyDetach(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionPolicyUpdate(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionRecover(base.BaseSenlinAPITest):

View File

@ -13,9 +13,9 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionReplaceNodes(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionResize(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionScaleIn(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterActionScaleOut(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterShow(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterShowNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterUpdate(base.BaseSenlinAPITest):

View File

@ -14,9 +14,9 @@ import copy
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterUpdateNegativeInvalidParam(base.BaseSenlinAPITest):

View File

@ -13,9 +13,9 @@
import copy
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestClusterUpdateProfile(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestEventList(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestEventListNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestEventShow(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestEventShowNegativeNotFound(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestNodeActionNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeCheck(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeCreate(base.BaseSenlinAPITest):
@ -22,7 +22,9 @@ class TestNodeCreate(base.BaseSenlinAPITest):
super(TestNodeCreate, self).setUp()
self.profile_id = utils.create_a_profile(self)
self.addCleanup(utils.delete_a_profile, self, self.profile_id)
self.cluster_id = utils.create_a_cluster(self, self.profile_id)
self.cluster_id = utils.create_a_cluster(
self, self.profile_id,
config={'node.name.format': 'test-node'})
self.addCleanup(utils.delete_a_cluster, self, self.cluster_id)
@decorators.idempotent_id('14d06753-7f0a-4ad2-84be-37fce7114a8f')

View File

@ -13,9 +13,9 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeCreateNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeDelete(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeDeleteNegativeNotFound(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeList(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestNodeListNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeOperation(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeRecover(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeShow(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeShowNegativeNotFound(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeUpdate(base.BaseSenlinAPITest):

View File

@ -14,9 +14,9 @@ import copy
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeUpdateNegativeNotFound(base.BaseSenlinAPITest):

View File

@ -13,9 +13,9 @@
import copy
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestNodeUpdateProfile(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.tests.api import base
class TestPolicyCreate(base.BaseSenlinAPITest):

View File

@ -14,8 +14,8 @@ import copy
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.tests.api import base
class TestPolicyCreateNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestPolicyDelete(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestPolicyDeleteNegativeConflict(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestPolicyList(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestPolicyListNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestPolicyShow(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestPolicyShowNegativeNotFound(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestPolicyUpdate(base.BaseSenlinAPITest):

View File

@ -13,8 +13,8 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestPolicyUpdateNegativeNotFound(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.tests.api import base
class TestPolicyValidate(base.BaseSenlinAPITest):

View File

@ -14,8 +14,8 @@ import copy
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import constants
from senlin_tempest_plugin.tests.api import base
class TestPolicyValidateNegativeBadRequest(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestPolicyTypeList(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestPolicyTypeShow(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestPolicyTypeShowNegative(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestProfileTypeList(base.BaseSenlinAPITest):

View File

@ -12,8 +12,8 @@
from tempest.lib import decorators
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.common import utils
from senlin_tempest_plugin.tests.api import base
class TestProfileTypeShow(base.BaseSenlinAPITest):

View File

@ -13,7 +13,7 @@
from tempest.lib import decorators
from tempest.lib import exceptions
from senlin_tempest_plugin.api import base
from senlin_tempest_plugin.tests.api import base
class TestProfileTypeShowNegativeNotFound(base.BaseSenlinAPITest):

Some files were not shown because too many files have changed in this diff Show More