Remove EC2 support

EC2 has been dropped in Mitaka [1].
This patch:
* deprecates all ec2 related parameters and have no effect.
* all configuration related to ec2 is dropped.
* all keystone resources related to ec2 are not managed anymore.
* drops acceptance test for ec2 service binding.

This is a backwards-incompatible change for people who were still
deploying ec2 with Nova, but EC2 API has been deprecated for a while
(Juno).

[1] eec7a55319
Closes-Bug: #1528948

Change-Id: Ie144202648f1aae36cdca9bab5d986ae6c4d3069
This commit is contained in:
Emilien Macchi 2015-12-23 21:25:06 +01:00
parent c339a86baf
commit d7389d44be
7 changed files with 51 additions and 181 deletions

View File

@ -65,8 +65,8 @@
# Defaults to '0.0.0.0'
#
# [*ec2_listen_port*]
# (optional) The port on which the EC2 API will listen.
# Defaults to port 8773
# (optional) DEPRECATED. The port on which the EC2 API will listen.
# Defaults to port undef
#
# [*metadata_listen*]
# (optional) IP address for metadata server to listen
@ -78,11 +78,11 @@
#
# [*enabled_apis*]
# (optional) A comma separated list of apis to enable
# Defaults to 'ec2,osapi_compute,metadata'
# Defaults to 'osapi_compute,metadata'
#
# [*keystone_ec2_url*]
# (optional) The keystone url where nova should send requests for ec2tokens
# Defaults to false
# (optional) DEPRECATED. The keystone url where nova should send requests for ec2tokens
# Defaults to undef
#
# [*volume_api_class*]
# (optional) The name of the class that nova will use to access volumes. Cinder is the only option.
@ -102,8 +102,8 @@
# Defaults to port 8774
#
# [*ec2_workers*]
# (optional) Number of workers for EC2 service
# Defaults to $::processorcount
# (optional) DEPRECATED. Number of workers for EC2 service
# Defaults to undef
#
# [*metadata_workers*]
# (optional) Number of workers for metadata service
@ -186,16 +186,13 @@ class nova::api(
$admin_tenant_name = 'services',
$admin_user = 'nova',
$api_bind_address = '0.0.0.0',
$ec2_listen_port = 8773,
$osapi_compute_listen_port = 8774,
$metadata_listen = '0.0.0.0',
$metadata_listen_port = 8775,
$enabled_apis = 'ec2,osapi_compute,metadata',
$keystone_ec2_url = false,
$enabled_apis = 'osapi_compute,metadata',
$volume_api_class = 'nova.volume.cinder.API',
$use_forwarded_for = false,
$osapi_compute_workers = $::processorcount,
$ec2_workers = $::processorcount,
$metadata_workers = $::processorcount,
$sync_db = true,
$neutron_metadata_proxy_shared_secret = undef,
@ -215,6 +212,9 @@ class nova::api(
$auth_host = '127.0.0.1',
$auth_admin_prefix = false,
$conductor_workers = undef,
$ec2_listen_port = undef,
$ec2_workers = undef,
$keystone_ec2_url = undef,
) {
include ::nova::deps
@ -224,6 +224,10 @@ class nova::api(
require ::keystone::python
include ::cinder::client
if $ec2_listen_port or $ec2_workers or $keystone_ec2_url {
warning('ec2_listen_port, ec2_workers and keystone_ec2_url are deprecated and have no effect. Deploy openstack/ec2-api instead.')
}
if $conductor_workers {
warning('The conductor_workers parameter is deprecated and has no effect. Use workers parameter of nova::conductor class instead.')
}
@ -251,15 +255,12 @@ class nova::api(
'DEFAULT/enabled_apis': value => $enabled_apis;
'DEFAULT/api_paste_config': value => $api_paste_config;
'DEFAULT/volume_api_class': value => $volume_api_class;
'DEFAULT/ec2_listen': value => $api_bind_address;
'DEFAULT/ec2_listen_port': value => $ec2_listen_port;
'DEFAULT/osapi_compute_listen': value => $api_bind_address;
'DEFAULT/metadata_listen': value => $metadata_listen;
'DEFAULT/metadata_listen_port': value => $metadata_listen_port;
'DEFAULT/osapi_compute_listen_port': value => $osapi_compute_listen_port;
'DEFAULT/osapi_volume_listen': value => $api_bind_address;
'DEFAULT/osapi_compute_workers': value => $osapi_compute_workers;
'DEFAULT/ec2_workers': value => $ec2_workers;
'DEFAULT/metadata_workers': value => $metadata_workers;
'DEFAULT/use_forwarded_for': value => $use_forwarded_for;
'DEFAULT/default_floating_pool': value => $default_floating_pool;
@ -348,16 +349,6 @@ class nova::api(
'keystone_authtoken/admin_password': value => $admin_password, secret => true;
}
if $keystone_ec2_url {
nova_config {
'DEFAULT/keystone_ec2_url': value => $keystone_ec2_url;
}
} else {
nova_config {
'DEFAULT/keystone_ec2_url': ensure => absent;
}
}
if ($ratelimits != undef) {
nova_paste_api_ini {
'filter:ratelimit/paste.filter_factory': value => $ratelimits_factory;

View File

@ -199,7 +199,7 @@
# [*enabled_ssl_apis*]
# (optional) List of APIs to SSL enable
# Defaults to []
# Possible values : 'ec2', 'osapi_compute', 'metadata'
# Possible values : 'osapi_compute', 'metadata'
#
# [*cert_file*]
# (optinal) Certificate file to use when starting API server securely
@ -373,7 +373,7 @@ class nova(
$report_interval = '10',
$rootwrap_config = '/etc/nova/rootwrap.conf',
$use_ssl = false,
$enabled_ssl_apis = ['ec2', 'metadata', 'osapi_compute'],
$enabled_ssl_apis = ['metadata', 'osapi_compute'],
$ca_file = false,
$cert_file = false,
$key_file = false,

View File

@ -34,8 +34,8 @@
# Defaults to 'Openstack Compute Service v3'.
#
# [*service_description_ec2*]
# (optional) Description for keystone ec2 service.
# Defaults to 'EC2 Service'.
# (optional) DEPRECATED. Description for keystone ec2 service.
# Defaults to undef.
#
# [*public_url*]
# (optional) The endpoint's public url. (Defaults to 'http://127.0.0.1:8774/v2/%(tenant_id)s')
@ -62,16 +62,16 @@
# This url should *not* contain any version or trailing '/'.
#
# [*ec2_public_url*]
# (optional) The endpoint's public url for EC2.
# (Defaults to 'http://127.0.0.1:8773/services/Cloud')
# (optional) DEPRECATED. The endpoint's public url for EC2.
# Defaults to undef
#
# [*ec2_internal_url*]
# (optional) The endpoint's internal url for EC2.
# (Defaults to 'http://127.0.0.1:8773/services/Cloud')
# (optional) DEPRECATED. The endpoint's internal url for EC2.
# Defaults to undef
#
# [*ec2_admin_url*]
# (optional) The endpoint's admin url for EC2.
# (Defaults to 'http://127.0.0.1:8773/services/Admin')
# (optional) DEPRECATED. The endpoint's admin url for EC2.
# Defaults to undef
#
# [*region*]
# (optional) The region in which to place the endpoints
@ -86,8 +86,8 @@
# Defaults to 'nova@localhost'
#
# [*configure_ec2_endpoint*]
# (optional) Whether to create an ec2 endpoint
# Defaults to true
# (optional) DEPRECATED. Whether to create an ec2 endpoint
# Defaults to undef
#
# [*configure_endpoint*]
# (optional) Whether to create the endpoint.
@ -117,38 +117,38 @@
# Setting this parameter overrides public_url, internal_url and admin_url parameters.
#
# [*ec2_port*]
# (optional) DEPRECATED: Use ec2_public_url, ec2_internal_url and ec2_admin_url instead.
# (optional) The port to use for the ec2 endpoint. (Defaults to 8773)
# (optional) DEPRECATED. The port to use for the ec2 endpoint.
# Defaults to undef
#
# [*public_protocol*]
# (optional) DEPRECATED: Use public_url and ec2_public_url instead.
# (optional) DEPRECATED: Use public_url instead.
# Protocol for public endpoint. (Defaults to 'http')
# Setting this parameter overrides public_url and ec2_public_url parameters.
# Setting this parameter overrides public_url parameter.
#
# [*public_address*]
# (optional) DEPRECATED: Use public_url and ec2_public_url instead.
# (optional) DEPRECATED: Use public_url instead.
# Public address for endpoint. (Defaults to '127.0.0.1')
# Setting this parameter overrides public_url and ec2_public_url parameters.
# Setting this parameter overrides public_url parameter.
#
# [*internal_protocol*]
# (optional) DEPRECATED: Use internal_url and ec2_internal_url instead.
# (optional) DEPRECATED: Use internal_url instead.
# Protocol for internal endpoint. (Defaults to 'http')
# Setting this parameter overrides internal_url and ec2_internal_url parameters.
# Setting this parameter overrides internal_url parameter.
#
# [*internal_address*]
# (optional) DEPRECATED: Use internal_url and ec2_internal_url instead.
# (optional) DEPRECATED: Use internal_url instead.
# Internal address for endpoint. (Defaults to '127.0.0.1')
# Setting this parameter overrides internal_url and ec2_internal_url parameters.
# Setting this parameter overrides internal_url parameter.
#
# [*admin_protocol*]
# (optional) DEPRECATED: Use admin_url and ec2_admin_url instead.
# (optional) DEPRECATED: Use admin_url instead.
# Protocol for admin endpoint. (Defaults to 'http')
# Setting this parameter overrides admin_url and ec2_admin_url parameters.
# Setting this parameter overrides admin_url parameter.
#
# [*admin_address*]
# (optional) DEPRECATED: Use admin_url and ec2_admin_url instead.
# Admin address for endpoint. (Defaults to '127.0.0.1')
# Setting this parameter overrides admin_url and ec2_admin_url parameters.
# Setting this parameter overrides admin_url parameter.
#
class nova::keystone::auth(
$password,
@ -158,7 +158,6 @@ class nova::keystone::auth(
$service_name_v3 = undef,
$service_description = 'Openstack Compute Service',
$service_description_v3 = 'Openstack Compute Service v3',
$service_description_ec2 = 'EC2 Service',
$region = 'RegionOne',
$tenant = 'services',
$email = 'nova@localhost',
@ -168,10 +167,6 @@ class nova::keystone::auth(
$public_url_v3 = 'http://127.0.0.1:8774/v3',
$internal_url_v3 = 'http://127.0.0.1:8774/v3',
$admin_url_v3 = 'http://127.0.0.1:8774/v3',
$ec2_public_url = 'http://127.0.0.1:8773/services/Cloud',
$ec2_internal_url = 'http://127.0.0.1:8773/services/Cloud',
$ec2_admin_url = 'http://127.0.0.1:8773/services/Admin',
$configure_ec2_endpoint = true,
$configure_endpoint = true,
$configure_endpoint_v3 = true,
$configure_user = true,
@ -186,6 +181,11 @@ class nova::keystone::auth(
$admin_address = undef,
$internal_protocol = undef,
$internal_address = undef,
$service_description_ec2 = undef,
$ec2_public_url = undef,
$ec2_internal_url = undef,
$ec2_admin_url = undef,
$configure_ec2_endpoint = undef,
) {
include ::nova::deps
@ -198,50 +198,32 @@ class nova::keystone::auth(
warning('The compute_port parameter is deprecated, use public_url, internal_url and admin_url instead.')
}
if $ec2_port {
warning('The ec2_port parameter is deprecated, use ec2_public_url, ec2_internal_url and ec2_admin_url instead.')
if $ec2_port or $service_description_ec2 or $ec2_public_url or $ec2_internal_url or $ec2_admin_url or $configure_ec2_endpoint {
warning('ec2_port, service_description_ec2, ec2_public_url, ec2_internal_url, ec2_admin_url and configure_ec2_endpoint are deprecated and have no effect..')
}
if $public_protocol {
warning('The public_protocol parameter is deprecated, use public_url instead.')
if $configure_ec2_endpoint {
warning('The public_protocol parameter is deprecated, use ec2_public_url instead.')
}
}
if $internal_protocol {
warning('The internal_protocol parameter is deprecated, use internal_url instead.')
if $configure_ec2_endpoint {
warning('The internal_protocol parameter is deprecated, use ec2_public_url instead.')
}
}
if $admin_protocol {
warning('The admin_protocol parameter is deprecated, use admin_url instead.')
if $configure_ec2_endpoint {
warning('The admin_protocol parameter is deprecated, use ec2_admin_url instead.')
}
}
if $public_address {
warning('The public_address parameter is deprecated, use public_url instead.')
if $configure_ec2_endpoint {
warning('The public_address parameter is deprecated, use ec2_public_url instead.')
}
}
if $internal_address {
warning('The internal_address parameter is deprecated, use internal_url instead.')
if $configure_ec2_endpoint {
warning('The internal_address parameter is deprecated, use ec2_internal_url instead.')
}
}
if $admin_address {
warning('The admin_address parameter is deprecated, use admin_url instead.')
if $configure_ec2_endpoint {
warning('The admin_address parameter is deprecated, use ec2_admin_url instead.')
}
}
if $service_name == undef {
@ -290,34 +272,6 @@ class nova::keystone::auth(
$admin_url_real = $admin_url
}
# EC2 endpoints
if ($public_protocol or $public_address or $ec2_port) {
$ec2_public_url_real = sprintf('%s://%s:%s/services/Cloud',
pick($public_protocol, 'http'),
pick($public_address, '127.0.0.1'),
pick($ec2_port, '8773'))
} else {
$ec2_public_url_real = $ec2_public_url
}
if ($internal_protocol or $internal_address or $ec2_port) {
$ec2_internal_url_real = sprintf('%s://%s:%s/services/Cloud',
pick($internal_protocol, 'http'),
pick($internal_address, '127.0.0.1'),
pick($ec2_port, '8773'))
} else {
$ec2_internal_url_real = $ec2_internal_url
}
if ($admin_protocol or $admin_address or $ec2_port) {
$ec2_admin_url_real = sprintf('%s://%s:%s/services/Admin',
pick($admin_protocol, 'http'),
pick($admin_address, '127.0.0.1'),
pick($ec2_port, '8773'))
} else {
$ec2_admin_url_real = $ec2_admin_url
}
if $configure_endpoint {
Keystone_endpoint["${region}/${real_service_name}::compute"] ~> Service <| name == 'nova-api' |>
}
@ -353,20 +307,4 @@ class nova::keystone::auth(
admin_url => $admin_url_v3,
internal_url => $internal_url_v3,
}
keystone::resource::service_identity { "nova ec2 service, user ${auth_name}_ec2":
configure_user => false,
configure_user_role => false,
configure_endpoint => $configure_ec2_endpoint,
configure_service => $configure_ec2_endpoint,
service_type => 'ec2',
service_description => $service_description_ec2,
service_name => "${real_service_name}_ec2",
region => $region,
auth_name => "${auth_name}_ec2",
public_url => $ec2_public_url_real,
admin_url => $ec2_admin_url_real,
internal_url => $ec2_internal_url_real,
}
}

View File

@ -70,10 +70,6 @@ describe 'basic nova' do
apply_manifest(pp, :catch_changes => true)
end
describe port(8773) do
it { is_expected.to be_listening.with('tcp') }
end
describe port(8774) do
it { is_expected.to be_listening.with('tcp') }
end

View File

@ -61,15 +61,12 @@ describe 'nova::api' do
it 'configures various stuff' do
is_expected.to contain_nova_config('DEFAULT/api_paste_config').with('value' => 'api-paste.ini')
is_expected.to contain_nova_config('DEFAULT/ec2_listen').with('value' => '0.0.0.0')
is_expected.to contain_nova_config('DEFAULT/ec2_listen_port').with('value' => '8773')
is_expected.to contain_nova_config('DEFAULT/osapi_compute_listen').with('value' => '0.0.0.0')
is_expected.to contain_nova_config('DEFAULT/osapi_compute_listen_port').with('value' => '8774')
is_expected.to contain_nova_config('DEFAULT/metadata_listen').with('value' => '0.0.0.0')
is_expected.to contain_nova_config('DEFAULT/metadata_listen_port').with('value' => '8775')
is_expected.to contain_nova_config('DEFAULT/osapi_volume_listen').with('value' => '0.0.0.0')
is_expected.to contain_nova_config('DEFAULT/osapi_compute_workers').with('value' => '5')
is_expected.to contain_nova_config('DEFAULT/ec2_workers').with('value' => '5')
is_expected.to contain_nova_config('DEFAULT/metadata_workers').with('value' => '5')
is_expected.to contain_nova_config('DEFAULT/default_floating_pool').with('value' => 'nova')
is_expected.to contain_nova_config('DEFAULT/fping_path').with('value' => '/usr/sbin/fping')
@ -103,7 +100,6 @@ describe 'nova::api' do
:metadata_listen => '127.0.0.1',
:metadata_listen_port => 8875,
:osapi_compute_listen_port => 8874,
:ec2_listen_port => 8873,
:volume_api_class => 'nova.volume.cinder.API',
:use_forwarded_for => false,
:ratelimits => '(GET, "*", .*, 100, MINUTE);(POST, "*", .*, 200, MINUTE)',
@ -112,7 +108,6 @@ describe 'nova::api' do
:metadata_workers => 2,
:default_floating_pool => 'public',
:osapi_v3 => true,
:keystone_ec2_url => 'https://example.com:5000/v2.0/ec2tokens',
:pci_alias => "[{\"vendor_id\":\"8086\",\"product_id\":\"0126\",\"name\":\"graphic_card\"},{\"vendor_id\":\"9096\",\"product_id\":\"1520\",\"name\":\"network_card\"}]"
})
end
@ -156,8 +151,6 @@ describe 'nova::api' do
end
it 'configures various stuff' do
is_expected.to contain_nova_config('DEFAULT/ec2_listen').with('value' => '192.168.56.210')
is_expected.to contain_nova_config('DEFAULT/ec2_listen_port').with('value' => '8873')
is_expected.to contain_nova_config('DEFAULT/osapi_compute_listen').with('value' => '192.168.56.210')
is_expected.to contain_nova_config('DEFAULT/osapi_compute_listen_port').with('value' => '8874')
is_expected.to contain_nova_config('DEFAULT/metadata_listen').with('value' => '127.0.0.1')
@ -169,7 +162,6 @@ describe 'nova::api' do
is_expected.to contain_nova_config('DEFAULT/default_floating_pool').with('value' => 'public')
is_expected.to contain_nova_config('neutron/service_metadata_proxy').with('value' => true)
is_expected.to contain_nova_config('neutron/metadata_proxy_shared_secret').with('value' => 'secrete')
is_expected.to contain_nova_config('DEFAULT/keystone_ec2_url').with('value' => 'https://example.com:5000/v2.0/ec2tokens')
end
it 'configure nova api v3' do

View File

@ -461,14 +461,14 @@ describe 'nova' do
let :params do
{
:use_ssl => true,
:enabled_ssl_apis => ['ec2', 'osapi_compute'],
:enabled_ssl_apis => ['osapi_compute'],
:cert_file => '/path/to/cert',
:ca_file => '/path/to/ca',
:key_file => '/path/to/key',
}
end
it { is_expected.to contain_nova_config('DEFAULT/enabled_ssl_apis').with_value('ec2,osapi_compute') }
it { is_expected.to contain_nova_config('DEFAULT/enabled_ssl_apis').with_value('osapi_compute') }
it { is_expected.to contain_nova_config('DEFAULT/ssl_ca_file').with_value('/path/to/ca') }
it { is_expected.to contain_nova_config('DEFAULT/ssl_cert_file').with_value('/path/to/cert') }
it { is_expected.to contain_nova_config('DEFAULT/ssl_key_file').with_value('/path/to/key') }
@ -478,7 +478,7 @@ describe 'nova' do
let :params do
{
:use_ssl => true,
:enabled_ssl_apis => ['ec2'],
:enabled_ssl_apis => ['osapi_compute'],
:ca_file => '/path/to/ca',
:key_file => '/path/to/key',
}

View File

@ -16,11 +16,7 @@ describe 'nova::keystone::auth' do
:admin_url => 'http://127.0.0.1:8774/v2/%(tenant_id)s',
:public_url_v3 => 'http://127.0.0.1:8774/v3',
:internal_url_v3 => 'http://127.0.0.1:8774/v3',
:admin_url_v3 => 'http://127.0.0.1:8774/v3',
:configure_ec2_endpoint => true,
:ec2_public_url => 'http://127.0.0.1:8773/services/Cloud',
:ec2_internal_url => 'http://127.0.0.1:8773/services/Cloud',
:ec2_admin_url => 'http://127.0.0.1:8773/services/Admin' }
:admin_url_v3 => 'http://127.0.0.1:8774/v3' }
end
context 'with default parameters' do
@ -45,10 +41,6 @@ describe 'nova::keystone::auth' do
:description => 'Openstack Compute Service v3'
)}
it { is_expected.to contain_keystone_service('nova_ec2::ec2').with(
:ensure => 'present',
:description => 'EC2 Service'
)}
it { is_expected.to contain_keystone_endpoint('RegionOne/nova::compute').with(
:ensure => 'present',
@ -64,13 +56,6 @@ describe 'nova::keystone::auth' do
:internal_url => 'http://127.0.0.1:8774/v3'
)}
it { is_expected.to contain_keystone_endpoint('RegionOne/nova_ec2::ec2').with(
:ensure => 'present',
:public_url => 'http://127.0.0.1:8773/services/Cloud',
:admin_url => 'http://127.0.0.1:8773/services/Admin',
:internal_url => 'http://127.0.0.1:8773/services/Cloud'
)}
end
context 'when setting auth name' do
@ -93,11 +78,6 @@ describe 'nova::keystone::auth' do
:description => 'Openstack Compute Service'
)}
it { is_expected.to contain_keystone_service('foo_ec2::ec2').with(
:ensure => 'present',
:description => 'EC2 Service'
)}
end
context 'when setting auth_name and auth_name_v3 the same' do
@ -155,9 +135,6 @@ describe 'nova::keystone::auth' do
:public_url_v3 => 'https://10.0.3.1:9774/v3',
:internal_url_v3 => 'https://10.0.3.3:9774/v3',
:admin_url_v3 => 'https://10.0.3.2:9774/v3',
:ec2_public_url => 'https://10.0.9.1:9773/services/Cloud',
:ec2_internal_url => 'https://10.0.9.2:9773/services/Cloud',
:ec2_admin_url => 'https://10.0.9.3:9773/services/Admin',
)
end
@ -175,12 +152,6 @@ describe 'nova::keystone::auth' do
:admin_url => params[:admin_url_v3]
)}
it { is_expected.to contain_keystone_endpoint('RegionTwo/nova_ec2::ec2').with(
:ensure => 'present',
:public_url => params[:ec2_public_url],
:internal_url => params[:ec2_internal_url],
:admin_url => params[:ec2_admin_url]
)}
end
context 'when providing deprecated endpoint parameters' do
@ -190,7 +161,6 @@ describe 'nova::keystone::auth' do
:admin_address => '10.0.0.2',
:internal_address => '10.0.0.3',
:compute_port => '9774',
:ec2_port => '9773',
:compute_version => 'v2.2',
:region => 'RegionTwo',
:admin_protocol => 'https',
@ -206,12 +176,6 @@ describe 'nova::keystone::auth' do
:internal_url => 'https://10.0.0.3:9774/v2.2/%(tenant_id)s'
)}
it { is_expected.to contain_keystone_endpoint('RegionTwo/nova_ec2::ec2').with(
:ensure => 'present',
:public_url => 'https://10.0.0.1:9773/services/Cloud',
:admin_url => 'https://10.0.0.2:9773/services/Admin',
:internal_url => 'https://10.0.0.3:9773/services/Cloud'
)}
end
describe 'when disabling endpoint configuration' do
@ -222,15 +186,6 @@ describe 'nova::keystone::auth' do
it { is_expected.to_not contain_keystone_endpoint('RegionOne/nova::compute') }
end
describe 'when disabling EC2 endpoint' do
before do
params.merge!( :configure_ec2_endpoint => false )
end
it { is_expected.to_not contain_keystone_service('nova_ec2::ec2') }
it { is_expected.to_not contain_keystone_endpoint('RegionOne/nova_ec2::ec2') }
end
describe 'when disabling user configuration' do
before do
params.merge!( :configure_user => false )
@ -294,10 +249,8 @@ describe 'nova::keystone::auth' do
it { is_expected.to contain_keystone_user_role('nova@services') }
it { is_expected.to contain_keystone_service('nova_service::compute') }
it { is_expected.to contain_keystone_service('nova_service_v3::computev3') }
it { is_expected.to contain_keystone_service('nova_service_ec2::ec2') }
it { is_expected.to contain_keystone_endpoint('RegionOne/nova_service::compute') }
it { is_expected.to contain_keystone_endpoint('RegionOne/nova_service_v3::computev3') }
it { is_expected.to contain_keystone_endpoint('RegionOne/nova_service_ec2::ec2') }
end