Add a new flavor_id_setter provider
In some case, for example, when setting-up refstack, it is not possible to choose a flavor_id. In such case, one must get the flavor_id using the openstack client. This patch will help doing so automatically by using the flavor name instead of the ID. Change-Id: I4ee14dc6b14ab92a8cbd93948760c622e559f7ca
This commit is contained in:

committed by
Takashi Kajinami

parent
fcba2cf5fb
commit
cb3c4e0825
88
lib/puppet/provider/tempest_flavor_id_setter/openstack.rb
Normal file
88
lib/puppet/provider/tempest_flavor_id_setter/openstack.rb
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
require File.join(File.dirname(__FILE__), '..','..','..', 'puppet/provider/tempest')
|
||||||
|
|
||||||
|
Puppet::Type.type(:tempest_flavor_id_setter).provide(
|
||||||
|
:openstack,
|
||||||
|
:parent => Puppet::Provider::Tempest
|
||||||
|
) do
|
||||||
|
|
||||||
|
@credentials = Puppet::Provider::Openstack::CredentialsV3.new
|
||||||
|
|
||||||
|
def exists?
|
||||||
|
lines.find do |line|
|
||||||
|
should_line.chomp == line.chomp
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def file_path
|
||||||
|
resource[:tempest_conf_path]
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
handle_create_with_match
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
handle_create_with_match
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_flavor_id
|
||||||
|
if resource[:ensure] == :present or resource[:ensure].nil?
|
||||||
|
if @flavor_id.nil?
|
||||||
|
flavors = self.class.request('flavor', 'list', file_path)
|
||||||
|
flavor = flavors.detect {|flavor| flavor[:name] == resource[:flavor_name]}
|
||||||
|
if flavor.nil?
|
||||||
|
raise(Puppet::Error, "Flavor #{resource[:flavor_name]} not found!")
|
||||||
|
end
|
||||||
|
@flavor_id = flavor[:id]
|
||||||
|
end
|
||||||
|
elsif resource[:ensure] != :absent
|
||||||
|
raise(Puppet::Error, "Cannot ensure to #{resource[:ensure]}")
|
||||||
|
end
|
||||||
|
@flavor_id
|
||||||
|
end
|
||||||
|
|
||||||
|
def should_line
|
||||||
|
"#{resource[:name]} = #{get_flavor_id}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def match
|
||||||
|
/^\s*#{resource[:name]}\s*=\s*/
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_create_with_match()
|
||||||
|
regex = match
|
||||||
|
match_count = lines.select { |l| regex.match(l) }.count
|
||||||
|
|
||||||
|
file = lines
|
||||||
|
case match_count
|
||||||
|
when 1
|
||||||
|
File.open(file_path, 'w') do |fh|
|
||||||
|
lines.each do |l|
|
||||||
|
fh.puts(regex.match(l) ? "#{should_line}" : l)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
when 0
|
||||||
|
block_pos = lines.find_index { |l| /^\[compute\]/ =~ l }
|
||||||
|
if block_pos.nil?
|
||||||
|
file += ["[compute]\n", "#{should_line}\n"]
|
||||||
|
else
|
||||||
|
file.insert(block_pos+1, "#{should_line}\n")
|
||||||
|
end
|
||||||
|
File.write(file_path, file.join)
|
||||||
|
else # cannot be negative.
|
||||||
|
raise Puppet::Error, "More than one line in file \
|
||||||
|
'#{file_path}' matches pattern '#{regex}'"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def lines
|
||||||
|
# If this type is ever used with very large files, we should
|
||||||
|
# write this in a different way, using a temp
|
||||||
|
# file; for now assuming that this type is only used on
|
||||||
|
# small-ish config files that can fit into memory without
|
||||||
|
# too much trouble.
|
||||||
|
@lines ||= File.readlines(file_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
30
lib/puppet/type/tempest_flavor_id_setter.rb
Normal file
30
lib/puppet/type/tempest_flavor_id_setter.rb
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
Puppet::Type.newtype(:tempest_flavor_id_setter) do
|
||||||
|
#
|
||||||
|
# tempest_flavor_id_setter { 'flavor_id':
|
||||||
|
# tempest_conf_path => '/var/lib/tempest/etc/tempest.conf',
|
||||||
|
# flavor_name => $name,
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
|
||||||
|
ensurable
|
||||||
|
|
||||||
|
newparam(:name, :namevar => true) do
|
||||||
|
desc 'name of the setting to update'
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:tempest_conf_path) do
|
||||||
|
desc 'path to tempest conf file'
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:flavor_name) do
|
||||||
|
desc 'name of nova flavor'
|
||||||
|
end
|
||||||
|
|
||||||
|
autorequire(:nova_flavor) do
|
||||||
|
[self[:flavor_name]] if self[:flavor_name]
|
||||||
|
end
|
||||||
|
|
||||||
|
autorequire(:package) do
|
||||||
|
['python-openstackclient', 'python3-openstackclient']
|
||||||
|
end
|
||||||
|
end
|
@@ -98,6 +98,10 @@
|
|||||||
# Defaults to undef
|
# Defaults to undef
|
||||||
# [*run_ssh*]
|
# [*run_ssh*]
|
||||||
# Defaults to false
|
# Defaults to false
|
||||||
|
# [*flavor_name*]
|
||||||
|
# Defaults to undef
|
||||||
|
# [*flavor_name_alt*]
|
||||||
|
# Defaults to undef
|
||||||
# [*flavor_ref*]
|
# [*flavor_ref*]
|
||||||
# Defaults to undef
|
# Defaults to undef
|
||||||
# [*flavor_ref_alt*]
|
# [*flavor_ref_alt*]
|
||||||
@@ -211,6 +215,8 @@
|
|||||||
# [*db_flavor_ref*]
|
# [*db_flavor_ref*]
|
||||||
# Valid primary flavor to use in Trove tests.
|
# Valid primary flavor to use in Trove tests.
|
||||||
# Defaults to $::os_service_default
|
# Defaults to $::os_service_default
|
||||||
|
# [*db_flavor_name*]
|
||||||
|
# Defaults to undef
|
||||||
# [*baremetal_driver*]
|
# [*baremetal_driver*]
|
||||||
# Defaults to 'fake'
|
# Defaults to 'fake'
|
||||||
# [*baremetal_enabled_hardware_types*]
|
# [*baremetal_enabled_hardware_types*]
|
||||||
@@ -310,6 +316,8 @@ class tempest(
|
|||||||
$image_alt_ssh_user = undef,
|
$image_alt_ssh_user = undef,
|
||||||
$flavor_ref = undef,
|
$flavor_ref = undef,
|
||||||
$flavor_ref_alt = undef,
|
$flavor_ref_alt = undef,
|
||||||
|
$flavor_name = undef,
|
||||||
|
$flavor_name_alt = undef,
|
||||||
$compute_build_interval = undef,
|
$compute_build_interval = undef,
|
||||||
$run_ssh = false,
|
$run_ssh = false,
|
||||||
# whitebox
|
# whitebox
|
||||||
@@ -326,6 +334,7 @@ class tempest(
|
|||||||
$sahara_plugins = undef,
|
$sahara_plugins = undef,
|
||||||
# Trove config
|
# Trove config
|
||||||
$db_flavor_ref = $::os_service_default,
|
$db_flavor_ref = $::os_service_default,
|
||||||
|
$db_flavor_name = undef,
|
||||||
# Service configuration
|
# Service configuration
|
||||||
$cinder_available = true,
|
$cinder_available = true,
|
||||||
$cinder_backup_available = false,
|
$cinder_backup_available = false,
|
||||||
@@ -778,6 +787,42 @@ class tempest(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ! $flavor_ref and $flavor_name {
|
||||||
|
tempest_flavor_id_setter { 'flavor_ref':
|
||||||
|
ensure => present,
|
||||||
|
tempest_conf_path => $tempest_conf,
|
||||||
|
flavor_name => $flavor_name,
|
||||||
|
}
|
||||||
|
Tempest_config<||> -> Tempest_flavor_id_setter['flavor_ref']
|
||||||
|
Keystone_user_role<||> -> Tempest_flavor_id_setter['flavor_ref']
|
||||||
|
} elsif ($flavor_name and $flavor_ref) {
|
||||||
|
fail('flavor_ref and flavor_name are both set: please set only one of them')
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! $flavor_ref_alt and $flavor_name_alt {
|
||||||
|
tempest_flavor_id_setter { 'flavor_ref_alt':
|
||||||
|
ensure => present,
|
||||||
|
tempest_conf_path => $tempest_conf,
|
||||||
|
flavor_name => $flavor_name_alt,
|
||||||
|
}
|
||||||
|
Tempest_config<||> -> Tempest_flavor_id_setter['flavor_ref_alt']
|
||||||
|
Keystone_user_role<||> -> Tempest_flavor_id_setter['flavor_ref_alt']
|
||||||
|
} elsif ($flavor_name_alt and $flavor_ref_alt) {
|
||||||
|
fail('flavor_ref_alt and flavor_name_alt are both set: please set only one of them')
|
||||||
|
}
|
||||||
|
|
||||||
|
if is_service_default($db_flavor_ref) and $db_flavor_name {
|
||||||
|
tempest_flavor_id_setter { 'db_flavor_ref':
|
||||||
|
ensure => present,
|
||||||
|
tempest_conf_path => $tempest_conf,
|
||||||
|
flavor_name => $db_flavor_name,
|
||||||
|
}
|
||||||
|
Tempest_config<||> -> Tempest_flavor_id_setter['db_flavor_ref']
|
||||||
|
Keystone_user_role<||> -> Tempest_flavor_id_setter['db_flavor_ref']
|
||||||
|
} elsif ($db_flavor_name and ! is_service_default($db_flavor_ref)) {
|
||||||
|
fail('db_flavor_ref and db_flavor_name are both set: please set only one of them')
|
||||||
|
}
|
||||||
|
|
||||||
if $configure_images {
|
if $configure_images {
|
||||||
if ! $image_ref and $image_name {
|
if ! $image_ref and $image_name {
|
||||||
# If the image id was not provided, look it up via the image name
|
# If the image id was not provided, look it up via the image name
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
A new puppet provider makes it possible to set the ``flavor_ref``,
|
||||||
|
``flavor_ref_alt`` and ``db_flavor_ref`` using the flavor name as
|
||||||
|
parameter instead of the ID. Use ``flavor_name``, ``flavor_name_alt``
|
||||||
|
and ``db_flavor_name`` to do so.
|
@@ -380,6 +380,35 @@ describe 'tempest' do
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with flavor_name parameters' do
|
||||||
|
let :params do
|
||||||
|
{
|
||||||
|
:configure_images => false,
|
||||||
|
:flavor_name => 'm1.tiny',
|
||||||
|
:flavor_name_alt => 'm1.nano',
|
||||||
|
:db_flavor_name => 'm1.micro',
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it "sets flavor id using setter" do
|
||||||
|
is_expected.to contain_tempest_flavor_id_setter('flavor_ref').with(
|
||||||
|
:ensure => 'present',
|
||||||
|
:tempest_conf_path => '/var/lib/tempest/etc/tempest.conf',
|
||||||
|
:flavor_name => 'm1.tiny',
|
||||||
|
)
|
||||||
|
is_expected.to contain_tempest_flavor_id_setter('flavor_ref_alt').with(
|
||||||
|
:ensure => 'present',
|
||||||
|
:tempest_conf_path => '/var/lib/tempest/etc/tempest.conf',
|
||||||
|
:flavor_name => 'm1.nano',
|
||||||
|
)
|
||||||
|
is_expected.to contain_tempest_flavor_id_setter('db_flavor_ref').with(
|
||||||
|
:ensure => 'present',
|
||||||
|
:tempest_conf_path => '/var/lib/tempest/etc/tempest.conf',
|
||||||
|
:flavor_name => 'm1.micro',
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
shared_examples 'tempest with plugins packages' do
|
shared_examples 'tempest with plugins packages' do
|
||||||
|
Reference in New Issue
Block a user