Merge "Set max_microversion 2.42 for hosts tests"
diff --git a/releasenotes/notes/12/12.2.0-service_client_config-8a1d7b4de769c633.yaml b/releasenotes/notes/12/12.2.0-service_client_config-8a1d7b4de769c633.yaml
index 3e43f9a..985acb0 100644
--- a/releasenotes/notes/12/12.2.0-service_client_config-8a1d7b4de769c633.yaml
+++ b/releasenotes/notes/12/12.2.0-service_client_config-8a1d7b4de769c633.yaml
@@ -3,4 +3,4 @@
- A new helper method `service_client_config` has been added
to the stable module config.py that returns extracts from
configuration into a dictionary the configuration settings
- relevant for the initisialisation of a service client.
+ relevant for the initialization of a service client.
diff --git a/releasenotes/notes/16/16.0.0-add-content-type-without-spaces-b2c9b91b257814f3.yaml b/releasenotes/notes/16/16.0.0-add-content-type-without-spaces-b2c9b91b257814f3.yaml
index 0075a36..fc061bc 100644
--- a/releasenotes/notes/16/16.0.0-add-content-type-without-spaces-b2c9b91b257814f3.yaml
+++ b/releasenotes/notes/16/16.0.0-add-content-type-without-spaces-b2c9b91b257814f3.yaml
@@ -2,7 +2,7 @@
upgrade:
- The ``JSON_ENC`` and ``TXT_ENC`` option in the ``_error_checker``
section have been added with additional content-type which are
- defined in RFC7231 but missing in the currnt rest_client.py file.
+ defined in RFC7231 but missing in the current rest_client.py file.
The lack of these additional content-type will cause defcore test
to fail for OpenStack public cloud which uses tomcat module in the
api gateway. The additions are ``application/json;charset=utf-8``,
diff --git a/releasenotes/notes/16/16.0.0-create-server-tags-client-8c0042a77e859af6.yaml b/releasenotes/notes/16/16.0.0-create-server-tags-client-8c0042a77e859af6.yaml
index 9927971..18ad5b9 100644
--- a/releasenotes/notes/16/16.0.0-create-server-tags-client-8c0042a77e859af6.yaml
+++ b/releasenotes/notes/16/16.0.0-create-server-tags-client-8c0042a77e859af6.yaml
@@ -2,7 +2,7 @@
features:
- |
Add server tags APIs to the servers_client library.
- This feature enables the possibility of upating, deleting
+ This feature enables the possibility of updating, deleting
and checking existence of a tag on a server, as well
as updating and deleting all tags on a server.
diff --git a/releasenotes/notes/16/16.0.0-deprecate-resources-prefix-option-ad490c0a30a0266b.yaml b/releasenotes/notes/16/16.0.0-deprecate-resources-prefix-option-ad490c0a30a0266b.yaml
index f679208..0b45d0d 100644
--- a/releasenotes/notes/16/16.0.0-deprecate-resources-prefix-option-ad490c0a30a0266b.yaml
+++ b/releasenotes/notes/16/16.0.0-deprecate-resources-prefix-option-ad490c0a30a0266b.yaml
@@ -6,5 +6,5 @@
deprecations:
- The resources_prefix is marked as deprecated because it is
enough to set 'tempest' as the prefix on rand_name() to
- ideintify resources which are created by Tempest and no
+ identify resources which are created by Tempest and no
projects set this option on OpenStack dev community.
diff --git a/releasenotes/notes/add-additional-methods-to-policy-client-library-b8279c18335588c9.yaml b/releasenotes/notes/add-additional-methods-to-policy-client-library-b8279c18335588c9.yaml
new file mode 100644
index 0000000..cd5284d
--- /dev/null
+++ b/releasenotes/notes/add-additional-methods-to-policy-client-library-b8279c18335588c9.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ Add ``v3-ext/OS-ENDPOINT-POLICY`` API calls to support creation, deletion and
+ retrieval of associations between service endpoints and policies. Such associations
+ enable an endpoint to request its policy.
diff --git a/releasenotes/notes/add-support-args-kwargs-in-call-until-true-a91k592h5a64exf7.yaml b/releasenotes/notes/add-support-args-kwargs-in-call-until-true-a91k592h5a64exf7.yaml
index e23abe3..9c30a0c 100644
--- a/releasenotes/notes/add-support-args-kwargs-in-call-until-true-a91k592h5a64exf7.yaml
+++ b/releasenotes/notes/add-support-args-kwargs-in-call-until-true-a91k592h5a64exf7.yaml
@@ -2,4 +2,4 @@
features:
- Add support of args and kwargs when calling func in call_until_true,
also to log the cost time when call_until_true returns True or False
- for debuggin.
+ for debugging.
diff --git a/releasenotes/notes/compare-header-version-func-de5139b2161b3627.yaml b/releasenotes/notes/compare-header-version-func-de5139b2161b3627.yaml
index 305e756..cc6c51b 100644
--- a/releasenotes/notes/compare-header-version-func-de5139b2161b3627.yaml
+++ b/releasenotes/notes/compare-header-version-func-de5139b2161b3627.yaml
@@ -3,7 +3,7 @@
- |
Add a new function called ``compare_version_header_to_response`` to
``tempest.lib.common.api_version_utils``, which compares the API
- micoversion in the response header to another microversion using the
+ microversion in the response header to another microversion using the
comparators defined in
``tempest.lib.common.api_version_request.APIVersionRequest``.
diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst
index d968a44..2518703 100644
--- a/releasenotes/source/index.rst
+++ b/releasenotes/source/index.rst
@@ -2,20 +2,22 @@
Tempest Release Notes
===========================
- .. toctree::
- :maxdepth: 1
+.. toctree::
+ :maxdepth: 1
- unreleased
- v18.0.0
- v17.0.0
- v16.1.0
- v16.0.0
- v15.0.0
- v14.0.0
- v13.0.0
- v12.0.0
- v11.0.0
- v10.0.0
+ unreleased
+ v18.0.0
+ v17.2.0
+ v17.1.0
+ v17.0.0
+ v16.1.0
+ v16.0.0
+ v15.0.0
+ v14.0.0
+ v13.0.0
+ v12.0.0
+ v11.0.0
+ v10.0.0
Indices and tables
==================
diff --git a/releasenotes/source/v17.1.0.rst b/releasenotes/source/v17.1.0.rst
new file mode 100644
index 0000000..b8fd570
--- /dev/null
+++ b/releasenotes/source/v17.1.0.rst
@@ -0,0 +1,6 @@
+=====================
+v17.1.0 Release Notes
+=====================
+
+.. release-notes:: 17.1.0 Release Notes
+ :version: 17.1.0
diff --git a/releasenotes/source/v17.2.0.rst b/releasenotes/source/v17.2.0.rst
new file mode 100644
index 0000000..8566ae4
--- /dev/null
+++ b/releasenotes/source/v17.2.0.rst
@@ -0,0 +1,6 @@
+=====================
+v17.2.0 Release Notes
+=====================
+
+.. release-notes:: 17.2.0 Release Notes
+ :version: 17.2.0
diff --git a/requirements.txt b/requirements.txt
index 76db574..a74042f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -15,7 +15,7 @@
oslo.utils>=3.33.0 # Apache-2.0
six>=1.10.0 # MIT
fixtures>=3.0.0 # Apache-2.0/BSD
-PyYAML>=3.10 # MIT
+PyYAML>=3.12 # MIT
python-subunit>=1.0.0 # Apache-2.0/BSD
stevedore>=1.20.0 # Apache-2.0
PrettyTable<0.8,>=0.7.1 # BSD
diff --git a/tempest/api/compute/admin/test_auto_allocate_network.py b/tempest/api/compute/admin/test_auto_allocate_network.py
index c4d5768..e8011a6 100644
--- a/tempest/api/compute/admin/test_auto_allocate_network.py
+++ b/tempest/api/compute/admin/test_auto_allocate_network.py
@@ -148,9 +148,7 @@
def test_server_create_no_allocate(self):
"""Tests that no networking is allocated for the server."""
# create the server with no networking
- server, _ = compute.create_test_server(
- self.os_primary, networks='none', wait_until='ACTIVE')
- self.addCleanup(self.delete_server, server['id'])
+ server = self.create_test_server(networks='none', wait_until='ACTIVE')
# get the server ips
addresses = self.servers_client.list_addresses(
server['id'])['addresses']
diff --git a/tempest/api/compute/admin/test_volume_swap.py b/tempest/api/compute/admin/test_volume_swap.py
index 99bad8f..ed8cf20 100644
--- a/tempest/api/compute/admin/test_volume_swap.py
+++ b/tempest/api/compute/admin/test_volume_swap.py
@@ -126,13 +126,13 @@
self.assertIn(volume1['id'], vol_attachments[0]['volumeId'])
-class AttachVolumeMultiAttachTest(TestVolumeSwapBase):
+class TestMultiAttachVolumeSwap(TestVolumeSwapBase):
min_microversion = '2.60'
max_microversion = 'latest'
@classmethod
def skip_checks(cls):
- super(AttachVolumeMultiAttachTest, cls).skip_checks()
+ super(TestMultiAttachVolumeSwap, cls).skip_checks()
if not CONF.compute_feature_enabled.volume_multiattach:
raise cls.skipException('Volume multi-attach is not available.')
diff --git a/tempest/common/compute.py b/tempest/common/compute.py
index 638ad9b..68c4a10 100644
--- a/tempest/common/compute.py
+++ b/tempest/common/compute.py
@@ -289,7 +289,12 @@
def create_websocket(url):
url = urlparse.urlparse(url)
- for res in socket.getaddrinfo(url.hostname, url.port,
+
+ # NOTE(mnaser): It is possible that there is no port specified, so fall
+ # back to the default port based on the scheme.
+ port = url.port or (443 if url.scheme == 'https' else 80)
+
+ for res in socket.getaddrinfo(url.hostname, port,
socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, _, sa = res
client_socket = socket.socket(af, socktype, proto)
@@ -382,7 +387,12 @@
"""Upgrade the HTTP connection to a WebSocket and verify."""
# The real request goes to the /websockify URI always
reqdata = 'GET /websockify HTTP/1.1\r\n'
- reqdata += 'Host: %s:%s\r\n' % (url.hostname, url.port)
+ reqdata += 'Host: %s' % url.hostname
+ # Add port only if we have one specified
+ if url.port:
+ reqdata += ':%s' % url.port
+ # Line-ending for Host header
+ reqdata += '\r\n'
# Tell the HTTP Server to Upgrade the connection to a WebSocket
reqdata += 'Upgrade: websocket\r\nConnection: Upgrade\r\n'
# The token=xxx is sent as a Cookie not in the URI
diff --git a/tempest/config.py b/tempest/config.py
index 8a6370a..5d27efd 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -237,7 +237,10 @@
cfg.BoolOpt('security_compliance',
default=False,
help='Does the environment have the security compliance '
- 'settings enabled?')
+ 'settings enabled?'),
+ cfg.BoolOpt('project_tags',
+ default=False,
+ help='Is the project tags identity v3 API available?')
]
compute_group = cfg.OptGroup(name='compute',
diff --git a/tempest/lib/services/identity/v3/policies_client.py b/tempest/lib/services/identity/v3/policies_client.py
index d4560e2..ca8dbbd 100644
--- a/tempest/lib/services/identity/v3/policies_client.py
+++ b/tempest/lib/services/identity/v3/policies_client.py
@@ -73,3 +73,115 @@
resp, body = self.delete(url)
self.expected_success(204, resp.status)
return rest_client.ResponseBody(resp, body)
+
+ def update_policy_association_for_endpoint(self, policy_id, endpoint_id):
+ """Create policy association with endpoint.
+
+ For a full list of available parameters, please refer to the official
+ API reference:
+ https://developer.openstack.org/api-ref/identity/v3-ext/index.html#associate-policy-and-endpoint
+ """
+ url = "policies/{0}/OS-ENDPOINT-POLICY/endpoints/{1}"\
+ .format(policy_id, endpoint_id)
+ resp, body = self.put(url, '{}')
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
+
+ def show_policy_association_for_endpoint(self, policy_id, endpoint_id):
+ """Get policy association of endpoint.
+
+ API reference:
+ https://developer.openstack.org/api-ref/identity/v3-ext/index.html#verify-a-policy-and-endpoint-association
+ """
+ url = "policies/{0}/OS-ENDPOINT-POLICY/endpoints/{1}"\
+ .format(policy_id, endpoint_id)
+ resp, body = self.get(url)
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
+
+ def delete_policy_association_for_endpoint(self, policy_id, endpoint_id):
+ """Delete policy association with endpoint.
+
+ API reference:
+ https://developer.openstack.org/api-ref/identity/v3-ext/index.html#delete-a-policy-and-endpoint-association
+ """
+ url = "policies/{0}/OS-ENDPOINT-POLICY/endpoints/{1}"\
+ .format(policy_id, endpoint_id)
+ resp, body = self.delete(url)
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
+
+ def update_policy_association_for_service(self, policy_id, service_id):
+ """Create policy association with service.
+
+ API reference:
+ https://developer.openstack.org/api-ref/identity/v3-ext/index.html#associate-policy-and-service-type-endpoint
+ """
+ url = "policies/{0}/OS-ENDPOINT-POLICY/services/{1}"\
+ .format(policy_id, service_id)
+ resp, body = self.put(url, '{}')
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
+
+ def show_policy_association_for_service(self, policy_id, service_id):
+ """Get policy association of service.
+
+ API Reference:
+ https://developer.openstack.org/api-ref/identity/v3-ext/index.html#verify-a-policy-and-service-type-endpoint-association
+ """
+ url = "policies/{0}/OS-ENDPOINT-POLICY/services/{1}"\
+ .format(policy_id, service_id)
+ resp, body = self.get(url)
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
+
+ def delete_policy_association_for_service(self, policy_id, service_id):
+ """Delete policy association with service.
+
+ API reference:
+ https://developer.openstack.org/api-ref/identity/v3-ext/index.html#delete-a-policy-and-service-type-endpoint-association
+ """
+ url = "policies/{0}/OS-ENDPOINT-POLICY/services/{1}"\
+ .format(policy_id, service_id)
+ resp, body = self.delete(url)
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
+
+ def update_policy_association_for_region_and_service(
+ self, policy_id, service_id, region_id):
+ """Create policy association with service and region.
+
+ API reference:
+ https://developer.openstack.org/api-ref/identity/v3-ext/index.html#associate-policy-and-service-type-endpoint-in-a-region
+ """
+ url = "policies/{0}/OS-ENDPOINT-POLICY/services/{1}/regions/{2}"\
+ .format(policy_id, service_id, region_id)
+ resp, body = self.put(url, '{}')
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
+
+ def show_policy_association_for_region_and_service(
+ self, policy_id, service_id, region_id):
+ """Get policy association of service and region.
+
+ API reference:
+ https://developer.openstack.org/api-ref/identity/v3-ext/index.html#verify-a-policy-and-service-type-endpoint-in-a-region-association
+ """
+ url = "policies/{0}/OS-ENDPOINT-POLICY/services/{1}/regions/{2}"\
+ .format(policy_id, service_id, region_id)
+ resp, body = self.get(url)
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
+
+ def delete_policy_association_for_region_and_service(
+ self, policy_id, service_id, region_id):
+ """Delete policy association with service and region.
+
+ API reference:
+ https://developer.openstack.org/api-ref/identity/v3-ext/index.html#delete-a-policy-and-service-type-endpoint-in-a-region-association
+ """
+ url = "policies/{0}/OS-ENDPOINT-POLICY/services/{1}/regions/{2}"\
+ .format(policy_id, service_id, region_id)
+ resp, body = self.delete(url)
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index ef277fb..c78646f 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -141,13 +141,18 @@
vnic_type = CONF.network.port_vnic_type
profile = CONF.network.port_profile
- # If vnic_type is configured create port for
+ # If vnic_type or profile are configured create port for
# every network
- if vnic_type:
+ if vnic_type or profile:
ports = []
+ create_port_body = {}
- create_port_body = {'binding:vnic_type': vnic_type,
- 'binding:profile': profile}
+ if vnic_type:
+ create_port_body['binding:vnic_type'] = vnic_type
+
+ if profile:
+ create_port_body['binding:profile'] = profile
+
if kwargs:
# Convert security group names to security group ids
# to pass to create_port
@@ -254,6 +259,8 @@
self.addCleanup(self.snapshots_client.delete_snapshot, snapshot['id'])
waiters.wait_for_volume_resource_status(self.snapshots_client,
snapshot['id'], 'available')
+ snapshot = self.snapshots_client.show_snapshot(
+ snapshot['id'])['snapshot']
return snapshot
def create_volume_type(self, client=None, name=None, backend_name=None):
diff --git a/tempest/scenario/test_network_basic_ops.py b/tempest/scenario/test_network_basic_ops.py
index ff8837f..fd9c985 100644
--- a/tempest/scenario/test_network_basic_ops.py
+++ b/tempest/scenario/test_network_basic_ops.py
@@ -304,16 +304,19 @@
- ping internal gateway and DHCP port, implying in-tenant connectivity
pinging both, because L3 and DHCP agents might be on different nodes
+ - ping internal compute port, implying connectivity to other VMs on
+ this network
"""
floating_ip, server = self.floating_ip_tuple
# get internal ports' ips:
- # get all network ports in the new network
+ # get all network and compute ports in the new network
internal_ips = (
p['fixed_ips'][0]['ip_address'] for p in
self.os_admin.ports_client.list_ports(
tenant_id=server['tenant_id'],
network_id=network['id'])['ports']
- if p['device_owner'].startswith('network')
+ if p['device_owner'].startswith('network') or
+ p['device_owner'].startswith('compute')
)
self._check_server_connectivity(floating_ip,
diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py
index beb039c..7ceae89 100644
--- a/tempest/scenario/test_volume_boot_pattern.py
+++ b/tempest/scenario/test_volume_boot_pattern.py
@@ -30,12 +30,6 @@
# breathing room to get through deletes in the time allotted.
TIMEOUT_SCALING_FACTOR = 2
- @classmethod
- def skip_checks(cls):
- super(TestVolumeBootPattern, cls).skip_checks()
- if not CONF.volume_feature_enabled.snapshot:
- raise cls.skipException("Cinder volume snapshots are disabled")
-
def _create_volume_from_image(self):
img_uuid = CONF.compute.image_ref
vol_name = data_utils.rand_name(
@@ -76,6 +70,8 @@
@decorators.idempotent_id('557cd2c2-4eb8-4dce-98be-f86765ff311b')
@testtools.skipUnless(CONF.network.public_network_id,
'The public_network_id option must be specified.')
+ @testtools.skipUnless(CONF.volume_feature_enabled.snapshot,
+ 'Cinder volume snapshots are disabled')
@utils.services('compute', 'volume', 'image')
def test_volume_boot_pattern(self):
@@ -156,6 +152,8 @@
@decorators.idempotent_id('05795fb2-b2a7-4c9f-8fac-ff25aedb1489')
@decorators.attr(type='slow')
+ @testtools.skipUnless(CONF.volume_feature_enabled.snapshot,
+ 'Cinder volume snapshots are disabled')
@utils.services('compute', 'image', 'volume')
def test_create_server_from_volume_snapshot(self):
# Create a volume from an image
@@ -192,6 +190,8 @@
created_volume_info['attachments'][0]['volume_id'])
@decorators.idempotent_id('36c34c67-7b54-4b59-b188-02a2f458a63b')
+ @testtools.skipUnless(CONF.volume_feature_enabled.snapshot,
+ 'Cinder volume snapshots are disabled')
@utils.services('compute', 'volume', 'image')
def test_create_ebs_image_and_check_boot(self):
# create an instance from volume
diff --git a/tempest/tests/lib/services/identity/v3/test_policies_client.py b/tempest/tests/lib/services/identity/v3/test_policies_client.py
index 66c3d65..0237475 100644
--- a/tempest/tests/lib/services/identity/v3/test_policies_client.py
+++ b/tempest/tests/lib/services/identity/v3/test_policies_client.py
@@ -81,6 +81,10 @@
}
]
}
+ FAKE_ENDPOINT_ID = "234789"
+ FAKE_SERVICE_ID = "556782"
+ FAKE_POLICY_ID = "717273"
+ FAKE_REGION_ID = "73"
def setUp(self):
super(TestPoliciesClient, self).setUp()
@@ -150,3 +154,87 @@
{},
policy_id="717273",
status=204)
+
+ def test_update_policy_association_for_endpoint(self):
+ self.check_service_client_function(
+ self.client.update_policy_association_for_endpoint,
+ 'tempest.lib.common.rest_client.RestClient.put',
+ {},
+ policy_id=self.FAKE_POLICY_ID,
+ endpoint_id=self.FAKE_ENDPOINT_ID,
+ status=204)
+
+ def test_show_policy_association_for_endpoint(self):
+ self.check_service_client_function(
+ self.client.show_policy_association_for_endpoint,
+ 'tempest.lib.common.rest_client.RestClient.get',
+ {},
+ policy_id=self.FAKE_POLICY_ID,
+ endpoint_id=self.FAKE_ENDPOINT_ID,
+ status=204)
+
+ def test_delete_policy_association_for_endpoint(self):
+ self.check_service_client_function(
+ self.client.delete_policy_association_for_endpoint,
+ 'tempest.lib.common.rest_client.RestClient.delete',
+ {},
+ policy_id=self.FAKE_POLICY_ID,
+ endpoint_id=self.FAKE_ENDPOINT_ID,
+ status=204)
+
+ def test_update_policy_association_for_service(self):
+ self.check_service_client_function(
+ self.client.update_policy_association_for_service,
+ 'tempest.lib.common.rest_client.RestClient.put',
+ {},
+ policy_id=self.FAKE_POLICY_ID,
+ service_id=self.FAKE_SERVICE_ID,
+ status=204)
+
+ def test_show_policy_association_for_service(self):
+ self.check_service_client_function(
+ self.client.show_policy_association_for_service,
+ 'tempest.lib.common.rest_client.RestClient.get',
+ {},
+ policy_id=self.FAKE_POLICY_ID,
+ service_id=self.FAKE_SERVICE_ID,
+ status=204)
+
+ def test_delete_policy_association_for_service(self):
+ self.check_service_client_function(
+ self.client.delete_policy_association_for_service,
+ 'tempest.lib.common.rest_client.RestClient.delete',
+ {},
+ policy_id=self.FAKE_POLICY_ID,
+ service_id=self.FAKE_SERVICE_ID,
+ status=204)
+
+ def test_update_policy_association_for_region_and_service(self):
+ self.check_service_client_function(
+ self.client.update_policy_association_for_region_and_service,
+ 'tempest.lib.common.rest_client.RestClient.put',
+ {},
+ policy_id=self.FAKE_POLICY_ID,
+ service_id=self.FAKE_SERVICE_ID,
+ region_id=self.FAKE_REGION_ID,
+ status=204)
+
+ def test_show_policy_association_for_region_and_service(self):
+ self.check_service_client_function(
+ self.client.show_policy_association_for_region_and_service,
+ 'tempest.lib.common.rest_client.RestClient.get',
+ {},
+ policy_id=self.FAKE_POLICY_ID,
+ service_id=self.FAKE_SERVICE_ID,
+ region_id=self.FAKE_REGION_ID,
+ status=204)
+
+ def test_delete_policy_association_for_region_and_service(self):
+ self.check_service_client_function(
+ self.client.delete_policy_association_for_region_and_service,
+ 'tempest.lib.common.rest_client.RestClient.delete',
+ {},
+ policy_id=self.FAKE_POLICY_ID,
+ service_id=self.FAKE_SERVICE_ID,
+ region_id=self.FAKE_REGION_ID,
+ status=204)