Use a resource provider for cell_v2 cells
Change-Id: Ibfcfc276d81e9c41f79d6b6a3d5d5509dd94979b Closes-bug: #1670488
This commit is contained in:
parent
d7e2d37ecf
commit
2c743a6bff
|
@ -0,0 +1,147 @@
|
|||
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"
|
||||
|
||||
optional_commands :nova_manage => 'nova-manage'
|
||||
|
||||
mk_resource_methods
|
||||
|
||||
def initialize(value={})
|
||||
super(value)
|
||||
@property_flush = {}
|
||||
end
|
||||
|
||||
def self.instances
|
||||
cells_list = nova_manage("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('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("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("cell_v2", "update_cell", "--cell_uuid", @property_hash[:uuid], opts)
|
||||
end
|
||||
@property_flush = {}
|
||||
end
|
||||
end
|
|
@ -0,0 +1,19 @@
|
|||
Puppet::Type.newtype(:nova_cell_v2) do
|
||||
ensurable
|
||||
|
||||
newparam(:name, :namevar => true) do
|
||||
defaultto 'default'
|
||||
end
|
||||
|
||||
newproperty(:uuid, :readonly => true) do
|
||||
end
|
||||
|
||||
newproperty(:transport_url) do
|
||||
defaultto 'default'
|
||||
end
|
||||
|
||||
newproperty(:database_connection) do
|
||||
defaultto 'default'
|
||||
end
|
||||
|
||||
end
|
|
@ -5,19 +5,13 @@
|
|||
#
|
||||
# === Parameters
|
||||
#
|
||||
# [*extra_params*]
|
||||
# (optional) String of extra command line parameters to pass
|
||||
# to the nova-manage command. These will be inserted in
|
||||
# the command line between 'nova-manage' and 'cell_v2'.
|
||||
# Defaults to ''
|
||||
#
|
||||
# [*transport_url*]
|
||||
# (optional) This is the transport url to use for the cell_v2 commands.
|
||||
# By default the command should look for the DEFAULT/transport_url from
|
||||
# the nova configuration. If not available, you need to provide the
|
||||
# transport url via the parameters. Prior to Ocata, the transport-url
|
||||
# was a required parameter.
|
||||
# Defaults to undef.
|
||||
# Defaults to 'default' (nova.conf value).
|
||||
#
|
||||
# [*database_connection*]
|
||||
# (optional) This is the database url to use for the cell_v2 create command
|
||||
|
@ -25,20 +19,30 @@
|
|||
# By default the command should look for the DEFAULT/database_connection from
|
||||
# the nova configuration. If not available, you need to provide the database
|
||||
# url via the parameters.
|
||||
# Defaults to undef.
|
||||
# Defaults to 'default' (nova.conf value).
|
||||
#
|
||||
# [*database_connection_cell0*]
|
||||
# (optional) This is the database url to use for the cell_v2 cell0.
|
||||
# By default the command should look for the DEFAULT/database_connection from
|
||||
# the nova configuration and append '_cell0'. If not available, you need to provide the database
|
||||
# url via the parameters.
|
||||
# Defaults to 'default' (nova.conf value).
|
||||
#
|
||||
class nova::cell_v2::simple_setup (
|
||||
$extra_params = '',
|
||||
$transport_url = undef,
|
||||
$database_connection = undef,
|
||||
$transport_url = 'default',
|
||||
$database_connection = 'default',
|
||||
$database_connection_cell0 = 'default',
|
||||
) {
|
||||
|
||||
include ::nova::deps
|
||||
|
||||
include ::nova::cell_v2::map_cell0
|
||||
|
||||
nova::cell_v2::cell { 'default':
|
||||
extra_params => $extra_params,
|
||||
nova_cell_v2 { 'cell0':
|
||||
database_connection => $database_connection_cell0
|
||||
}
|
||||
|
||||
nova_cell_v2 { 'default':
|
||||
transport_url => $transport_url,
|
||||
database_connection => $database_connection
|
||||
}
|
||||
|
@ -46,7 +50,7 @@ class nova::cell_v2::simple_setup (
|
|||
include ::nova::cell_v2::discover_hosts
|
||||
|
||||
Class['nova::cell_v2::map_cell0'] ->
|
||||
Nova::Cell_v2::Cell <| |> ~>
|
||||
Nova_cell_v2 <| |> ~>
|
||||
Class['nova::cell_v2::discover_hosts']
|
||||
|
||||
}
|
||||
|
|
|
@ -7,30 +7,12 @@ describe 'nova::cell_v2::simple_setup' do
|
|||
|
||||
it {
|
||||
is_expected.to contain_class('nova::cell_v2::map_cell0')
|
||||
is_expected.to contain_nova__cell_v2__cell('default').with(
|
||||
:extra_params => '',
|
||||
:transport_url => nil,
|
||||
:database_conneciton => nil
|
||||
is_expected.to contain_nova_cell_v2('cell0').with(
|
||||
:database_connection => 'default'
|
||||
)
|
||||
is_expected.to contain_class('nova::cell_v2::discover_hosts')
|
||||
}
|
||||
end
|
||||
|
||||
context "overriding extra_params" do
|
||||
let :params do
|
||||
{
|
||||
:extra_params => '--config-file /etc/nova/nova.conf',
|
||||
:transport_url => 'rabbit://user:pass@host:1234/virt',
|
||||
:database_connection => 'mysql://nova:pass@host:1234/nova'
|
||||
}
|
||||
end
|
||||
|
||||
it {
|
||||
is_expected.to contain_class('nova::cell_v2::map_cell0')
|
||||
is_expected.to contain_nova__cell_v2__cell('default').with(
|
||||
:extra_params => params[:extra_params],
|
||||
:transport_url => params[:transport_url],
|
||||
:database_connection => params[:database_connection]
|
||||
is_expected.to contain_nova_cell_v2('default').with(
|
||||
:transport_url => 'default',
|
||||
:database_connection => 'default'
|
||||
)
|
||||
is_expected.to contain_class('nova::cell_v2::discover_hosts')
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue