puppet-nova/lib/puppet/type/nova_flavor.rb

155 lines
3.5 KiB
Ruby

# nova_flavor type
#
# == Parameters
# [*name*]
# Name for the flavor
# Required
#
# [*id*]
# Unique ID (integer or UUID) for the flavor.
# Optional
#
# [*ram*]
# Amount of RAM to use (in megabytes).
# Optional
#
# [*disk*]
# Amount of disk space (in gigabytes) to use for the root (/) partition.
# Optional
#
# [*vcpus*]
# Number of virtual CPUs to use.
# Optional
#
# [*ephemeral*]
# Amount of disk space (in gigabytes) to use for the ephemeral partition.
# Optional
#
# [*swap*]
# Amount of swap space (in megabytes) to use.
# Optional
#
# [*rxtx_factor*]
# The slice of bandwidth that the instances with this flavor can use
# (through the Virtual Interface (vif) creation in the hypervisor)
# Optional
#
# [*is_public*]
# A boolean to indicate visibility
# Optional
#
# [*properties*]
# A key => value hash used to set the properties for the flavor. This is
# the only parameter that can be updated after the creation of the flavor.
# Optional
#
# [*project*]
# Set flavor access to project (name or ID).
# If you set this option, take care to set is_public to false.
# Optional
require 'puppet'
Puppet::Type.newtype(:nova_flavor) do
@doc = "Manage creation of nova flavors."
ensurable
autorequire(:nova_config) do
['www_authenticate_uri', 'project_name', 'username', 'password']
end
# Require the nova-api service to be running
autorequire(:service) do
['nova-api']
end
newparam(:name, :namevar => true) do
desc 'Name for the flavor'
validate do |value|
if not value.is_a? String
raise ArgumentError, "name parameter must be a String"
end
unless value =~ /^[a-zA-Z0-9\-\._]+$/
raise ArgumentError, "#{value} is not a valid name"
end
end
end
newparam(:id) do
desc 'Unique ID (integer or UUID) for the flavor.'
end
newparam(:ram) do
desc 'Amount of RAM to use (in megabytes).'
end
newparam(:disk) do
desc 'Amount of disk space (in gigabytes) to use for the root (/) partition.'
end
newparam(:vcpus) do
desc 'Number of virtual CPUs to use.'
end
newparam(:ephemeral) do
desc 'Amount of disk space (in gigabytes) to use for the ephemeral partition.'
end
newparam(:swap) do
desc 'Amount of swap space (in megabytes) to use.'
end
newparam(:rxtx_factor) do
desc 'The slice of bandwidth that the instances with this flavor can use (through the Virtual Interface (vif) creation in the hypervisor)'
end
newparam(:is_public) do
desc "Whether the flavor is public or not. Default true"
newvalues(/(y|Y)es/, /(n|N)o/, /(t|T)rue/, /(f|F)alse/, true, false)
defaultto(true)
munge do |v|
if v =~ /^(y|Y)es$/
:true
elsif v =~ /^(n|N)o$/
:false
else
v.to_s.downcase.to_sym
end
end
end
newproperty(:project) do
desc 'Set flavor access to project (name or ID).'
defaultto('')
end
newproperty(:properties) do
desc "The set of flavor properties"
munge do |value|
return value if value.is_a? Hash
# wrap property value in commas
value.gsub!(/=(\w+)/, '=\'\1\'')
Hash[value.scan(/(\S+)='([^']*)'/)]
end
validate do |value|
return true if value.is_a? Hash
value.split(',').each do |property|
raise ArgumentError, "Key/value pairs should be separated by an =" unless property.include?('=')
end
end
end
validate do
unless self[:name]
raise(ArgumentError, 'Name must be set')
end
end
end