
nova-manage can output a warning message in some cases (see [1] for an example with the latest oslo.db), and that confuses the nova_manage provider. Since the command in a provider cannot separate stdout and stderr[2], we use a workaround with Puppet::Util::Execution.execute, and use that instead of the provider command in the nova_cells and nova_cell_v2 providers. [1] - https://logs.rdoproject.org/23/9323/2/experimental/gate-weirdo-dlrn-master-puppet-scenario001/Z6a290513d2904561a2adc60ddbfd7084/weirdo-project/puppet.txt.gz [2] - https://github.com/puppetlabs/puppet/blob/master/lib/puppet/util/execution.rb#L14-L16 Change-Id: I79f76592672d968b96338b3e0f6a86c9b7faeb93
146 lines
4.2 KiB
Ruby
146 lines
4.2 KiB
Ruby
require File.join(File.dirname(__FILE__), '..','..','..', 'puppet/provider/nova')
|
|
require 'uri'
|
|
|
|
Puppet::Type.type(:nova_cell_v2).provide(
|
|
:nova_manage,
|
|
:parent => Puppet::Provider::Nova
|
|
) do
|
|
|
|
desc "Manage nova cellv2 cells"
|
|
|
|
mk_resource_methods
|
|
|
|
def initialize(value={})
|
|
super(value)
|
|
@property_flush = {}
|
|
end
|
|
|
|
def self.instances
|
|
cells_list = nova_manage_request("cell_v2", "list_cells", "--verbose")
|
|
|
|
cells_list.split("\n")[3..-2].collect do |cell|
|
|
$name, $uuid, $transport_url, $database_connection = cell.split('|')[1..-1].map{ |x| x.strip}
|
|
default_transport_url = defaults(is_cell0($uuid))[:transport_url]
|
|
default_database_connection = defaults(is_cell0($uuid))[:database_connection]
|
|
|
|
if $transport_url == default_transport_url
|
|
$transport_url = 'default'
|
|
end
|
|
if $database_connection == default_database_connection
|
|
$database_connection = 'default'
|
|
end
|
|
new(
|
|
:name => $name,
|
|
:uuid => $uuid,
|
|
:transport_url => $transport_url,
|
|
:database_connection => $database_connection,
|
|
:ensure => :present
|
|
)
|
|
end
|
|
end
|
|
|
|
def self.prefetch(resources)
|
|
instances.each do |prov|
|
|
if resource = resources[prov.name]
|
|
resource.provider = prov
|
|
end
|
|
end
|
|
end
|
|
|
|
@cell0_uuid = '00000000-0000-0000-0000-000000000000'
|
|
|
|
def self.is_cell0(uuid)
|
|
uuid == @cell0_uuid
|
|
end
|
|
|
|
def self.defaults(cell0=false)
|
|
conf = nova_conf
|
|
if cell0
|
|
database_uri = URI.parse(conf['database']['connection'].strip)
|
|
database_uri.path += '_cell0'
|
|
{
|
|
:transport_url => 'none:///',
|
|
:database_connection => database_uri.to_s
|
|
}
|
|
else
|
|
{
|
|
:transport_url => conf['DEFAULT']['transport_url'].strip,
|
|
:database_connection => conf['database']['connection'].strip,
|
|
}
|
|
end
|
|
end
|
|
|
|
def is_cell0?
|
|
self.class.is_cell0(@property_hash[:uuid])
|
|
end
|
|
|
|
def exists?
|
|
@property_hash[:ensure] == :present
|
|
end
|
|
|
|
def create
|
|
optional_opts = []
|
|
unless resource[:name] == 'None'
|
|
optional_opts.push('--name').push(resource[:name])
|
|
end
|
|
{
|
|
:transport_url => '--transport-url',
|
|
:database_connection => '--database_connection'
|
|
}.each do |param, opt|
|
|
if resource[param] and resource[param] != 'default'
|
|
optional_opts.push(opt).push(resource[param])
|
|
end
|
|
end
|
|
cell_uuid = nova_manage_request('cell_v2', 'create_cell',
|
|
optional_opts, "--verbose"
|
|
)
|
|
@property_hash = {
|
|
:uuid => cell_uuid.strip(),
|
|
:ensure => :present,
|
|
:transport_url => resource[:transport_url],
|
|
:database_connection => resource[:database_connection]
|
|
}
|
|
end
|
|
|
|
def transport_url=(value)
|
|
@property_flush[:transport_url] = value
|
|
end
|
|
|
|
def database_connection=(value)
|
|
@property_flush[:database_connection] = value
|
|
end
|
|
|
|
def destroy
|
|
@property_flush[:ensure] = :absent
|
|
end
|
|
|
|
def flush
|
|
@property_hash.update(@property_flush)
|
|
if @property_flush[:ensure] == :absent
|
|
nova_manage_request("cell_v2", "delete_cell", "--cell_uuid", @property_hash[:uuid])
|
|
elsif @property_flush[:transport_url] or @property_flush[:database_connection]
|
|
opts = []
|
|
if not @property_flush[:transport_url]
|
|
# Must pass this even when not changed or it will change to the value in nova.conf
|
|
@property_flush[:transport_url] = @property_hash[:transport_url]
|
|
end
|
|
if @property_flush[:transport_url] == 'default'
|
|
@property_flush[:transport_url] = self.class.defaults(is_cell0?)[:transport_url]
|
|
end
|
|
opts.push('--transport-url').push(@property_flush[:transport_url])
|
|
|
|
if not @property_flush[:database_connection]
|
|
# Must pass this even when not changed or it will change to the value in nova.conf
|
|
@property_flush[:database_connection] = @property_hash[:database_connection]
|
|
end
|
|
if @property_flush[:database_connection] == 'default'
|
|
@property_flush[:database_connection] = self.class.defaults(is_cell0?)[:database_connection]
|
|
end
|
|
opts.push('--database_connection').push(@property_flush[:database_connection])
|
|
|
|
nova_manage_request("cell_v2", "update_cell", "--cell_uuid", @property_hash[:uuid], opts)
|
|
end
|
|
@property_flush = {}
|
|
end
|
|
end
|