Add trove_datastore and trove_datastore_version types
Change-Id: If739b4b26ef98ae9ba09affd4f2eeef4ad1b55fd
This commit is contained in:
parent
6cad2a1474
commit
8d37ba9451
@ -1,4 +1,4 @@
|
|||||||
require 'csv'
|
require 'json'
|
||||||
require 'puppet/util/inifile'
|
require 'puppet/util/inifile'
|
||||||
|
|
||||||
class Puppet::Provider::Trove < Puppet::Provider
|
class Puppet::Provider::Trove < Puppet::Provider
|
||||||
@ -89,62 +89,25 @@ correctly configured.")
|
|||||||
self.class.auth_trove(args)
|
self.class.auth_trove(args)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def trove_manage(*args)
|
||||||
|
cmd = args.join(" ")
|
||||||
|
output = `#{cmd}`
|
||||||
|
$?.exitstatus
|
||||||
|
end
|
||||||
|
|
||||||
def self.reset
|
def self.reset
|
||||||
@trove_conf = nil
|
@trove_conf = nil
|
||||||
@trove_credentials = nil
|
@trove_credentials = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.list_trove_resources(type)
|
def self.list_trove_resources(type, *args)
|
||||||
ids = []
|
json = auth_trove("--json", "#{type}-list", *args)
|
||||||
list = auth_trove("#{type}-list", '--format=csv',
|
return JSON.parse(json)
|
||||||
'--column=id', '--quote=none')
|
|
||||||
(list.split("\n")[1..-1] || []).compact.collect do |line|
|
|
||||||
ids << line.strip
|
|
||||||
end
|
|
||||||
return ids
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.get_trove_resource_attrs(type, id)
|
def self.get_trove_resource_attrs(type, id)
|
||||||
attrs = {}
|
json = auth_trove("--json", "#{type}-show", id)
|
||||||
net = auth_trove("#{type}-show", '--format=shell', id)
|
return JSON.parse(json)
|
||||||
last_key = nil
|
|
||||||
(net.split("\n") || []).compact.collect do |line|
|
|
||||||
if line.include? '='
|
|
||||||
k, v = line.split('=', 2)
|
|
||||||
attrs[k] = v.gsub(/\A"|"\Z/, '')
|
|
||||||
last_key = k
|
|
||||||
else
|
|
||||||
# Handle the case of a list of values
|
|
||||||
v = line.gsub(/\A"|"\Z/, '')
|
|
||||||
attrs[last_key] = [attrs[last_key], v].flatten
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return attrs
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.get_tenant_id(catalog, name)
|
|
||||||
instance_type = 'keystone_tenant'
|
|
||||||
instance = catalog.resource("#{instance_type.capitalize!}[#{name}]")
|
|
||||||
if ! instance
|
|
||||||
instance = Puppet::Type.type(instance_type).instances.find do |i|
|
|
||||||
i.provider.name == name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if instance
|
|
||||||
return instance.provider.id
|
|
||||||
else
|
|
||||||
fail("Unable to find #{instance_type} for name #{name}")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.parse_creation_output(data)
|
|
||||||
hash = {}
|
|
||||||
data.split("\n").compact.each do |line|
|
|
||||||
if line.include? '='
|
|
||||||
hash[line.split('=').first] = line.split('=', 2)[1].gsub(/\A"|"\Z/, '')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
hash
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
52
lib/puppet/provider/trove_datastore/trove.rb
Normal file
52
lib/puppet/provider/trove_datastore/trove.rb
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
require File.join(File.dirname(__FILE__), "..","..","..",
|
||||||
|
"puppet/provider/trove")
|
||||||
|
|
||||||
|
Puppet::Type.type(:trove_datastore).provide(
|
||||||
|
:trove,
|
||||||
|
:parent => Puppet::Provider::Trove
|
||||||
|
) do
|
||||||
|
desc <<-EOT
|
||||||
|
Trove provider to manage datastore type.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
commands :trove => "trove"
|
||||||
|
|
||||||
|
mk_resource_methods
|
||||||
|
|
||||||
|
def self.instances
|
||||||
|
list_trove_resources("datastore").collect do |attrs|
|
||||||
|
new(
|
||||||
|
:ensure => :present,
|
||||||
|
:name => attrs["name"],
|
||||||
|
:id => attrs["id"]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.prefetch(resources)
|
||||||
|
instances_ = instances
|
||||||
|
resources.keys.each do |name|
|
||||||
|
if provider = instances_.find{ |instance| instance.name == name }
|
||||||
|
resources[name].provider = provider
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def exists?
|
||||||
|
@property_hash[:ensure] == :present
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
if trove_manage(['trove-manage', 'datastore_update',
|
||||||
|
"#{@resource[:name]}", "''"]) != 0
|
||||||
|
fail("Failed to create datastore #{@resource[:name]}")
|
||||||
|
end
|
||||||
|
|
||||||
|
if trove_manage(['trove-manage', 'datastore_update',
|
||||||
|
"#{@resource[:name]}", "#{@resource[:version]}"]) != 0
|
||||||
|
fail("Failed to set version for datastore #{@resource[:name]}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
60
lib/puppet/provider/trove_datastore_version/trove.rb
Normal file
60
lib/puppet/provider/trove_datastore_version/trove.rb
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
require File.join(File.dirname(__FILE__), "..","..","..",
|
||||||
|
"puppet/provider/trove")
|
||||||
|
|
||||||
|
Puppet::Type.type(:trove_datastore_version).provide(
|
||||||
|
:trove,
|
||||||
|
:parent => Puppet::Provider::Trove
|
||||||
|
) do
|
||||||
|
desc <<-EOT
|
||||||
|
Trove provider to manage datastore version type.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
commands :trove => "trove"
|
||||||
|
|
||||||
|
mk_resource_methods
|
||||||
|
|
||||||
|
def self.prefetch(resource)
|
||||||
|
@datastore_version_hash = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.datastore_version_hash(datastore)
|
||||||
|
@datastore_version_hash ||= build_datastore_version_hash(datastore)
|
||||||
|
end
|
||||||
|
|
||||||
|
def datastore_version_hash(datastore)
|
||||||
|
self.class.datastore_version_hash(datastore)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.instances
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
|
def exists?
|
||||||
|
datastore_version_hash(resource[:datastore])[resource[:name]]
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
cmd = ['trove-manage', 'datastore_version_update',
|
||||||
|
"#{@resource[:datastore]}", "#{@resource[:name]}",
|
||||||
|
"#{@resource[:manager]}", "#{@resource[:image_id]}",
|
||||||
|
"#{@resource[:packages]}", "#{@resource[:active]}"]
|
||||||
|
if trove_manage(cmd) != 0
|
||||||
|
fail("Failed to create datastore version #{@resource[:name]}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
fail("Datastore version cannot be removed")
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def self.build_datastore_version_hash(datastore)
|
||||||
|
dvs = {}
|
||||||
|
list_trove_resources("datastore-version", datastore).collect do |attrs|
|
||||||
|
dvs[attrs["name"]] = attrs
|
||||||
|
end
|
||||||
|
dvs
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
26
lib/puppet/type/trove_datastore.rb
Normal file
26
lib/puppet/type/trove_datastore.rb
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
Puppet::Type.newtype(:trove_datastore) do
|
||||||
|
|
||||||
|
@doc = "Manage creation of Trove datastores"
|
||||||
|
|
||||||
|
ensurable
|
||||||
|
|
||||||
|
newparam(:name, :namevar => true) do
|
||||||
|
desc "Datastore version name)"
|
||||||
|
newvalues(/^.*$/)
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:version) do
|
||||||
|
desc "Datastore version name"
|
||||||
|
end
|
||||||
|
|
||||||
|
newproperty(:id) do
|
||||||
|
validate do |v|
|
||||||
|
raise(Puppet::Error, 'This is a read only property')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
validate do
|
||||||
|
raise(Puppet::Error, 'Version must be set') unless self[:version]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
38
lib/puppet/type/trove_datastore_version.rb
Normal file
38
lib/puppet/type/trove_datastore_version.rb
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
Puppet::Type.newtype(:trove_datastore_version) do
|
||||||
|
|
||||||
|
@doc = "Manage creation of Trove datastore versions"
|
||||||
|
|
||||||
|
ensurable
|
||||||
|
|
||||||
|
newparam(:name, :namevar => true) do
|
||||||
|
desc "Datastore version"
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:datastore) do
|
||||||
|
desc "Datastore name)"
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:manager) do
|
||||||
|
desc "Manager name"
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:image_id) do
|
||||||
|
desc "Glance image id"
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:packages) do
|
||||||
|
desc "Packages to install"
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:active) do
|
||||||
|
desc "State"
|
||||||
|
end
|
||||||
|
|
||||||
|
validate do
|
||||||
|
raise(Puppet::Error, 'Datastore must be set') unless self[:datastore]
|
||||||
|
raise(Puppet::Error, 'Manager must be set') unless self[:manager]
|
||||||
|
raise(Puppet::Error, 'Image must be set') unless self[:image_id]
|
||||||
|
raise(Puppet::Error, 'Packages must be set') unless self[:packages]
|
||||||
|
raise(Puppet::Error, 'State must be set') unless self[:active]
|
||||||
|
end
|
||||||
|
end
|
@ -166,4 +166,6 @@ class trove(
|
|||||||
command => '/bin/echo "Trove config has changed"',
|
command => '/bin/echo "Trove config has changed"',
|
||||||
refreshonly => true,
|
refreshonly => true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Trove_datastore<||> -> Trove_datastore_version<||>
|
||||||
}
|
}
|
||||||
|
57
spec/unit/provider/trove_datastore/trove_spec.rb
Normal file
57
spec/unit/provider/trove_datastore/trove_spec.rb
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
require 'puppet'
|
||||||
|
require 'spec_helper'
|
||||||
|
require 'puppet/provider/trove_datastore/trove'
|
||||||
|
|
||||||
|
provider_class = Puppet::Type.type(:trove_datastore).provider(:trove)
|
||||||
|
|
||||||
|
describe provider_class do
|
||||||
|
|
||||||
|
let :datastore_name do
|
||||||
|
'foo'
|
||||||
|
end
|
||||||
|
|
||||||
|
let :resource do
|
||||||
|
Puppet::Type::Trove_datastore.new({
|
||||||
|
:name => datastore_name,
|
||||||
|
:version => '0.1',
|
||||||
|
:ensure => 'present',
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
let :provider do
|
||||||
|
described_class.new(resource)
|
||||||
|
end
|
||||||
|
|
||||||
|
before :each do
|
||||||
|
described_class.stubs(:list_trove_resources).with('datastore').returns([
|
||||||
|
resource
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "self.instances" do
|
||||||
|
it "should have an instances method" do
|
||||||
|
provider.class.should respond_to(:instances)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should list instances" do
|
||||||
|
datastores = described_class.instances
|
||||||
|
datastores.size.should == 1
|
||||||
|
datastores.map {|provider| provider.name} == datastore_name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#create' do
|
||||||
|
it 'should call trove-manage' do
|
||||||
|
provider.expects(:trove_manage).with(
|
||||||
|
['trove-manage', 'datastore_update', datastore_name, "''"]
|
||||||
|
).returns(0)
|
||||||
|
|
||||||
|
provider.expects(:trove_manage).with(
|
||||||
|
['trove-manage', 'datastore_update', datastore_name, "0.1"]
|
||||||
|
).returns(0)
|
||||||
|
|
||||||
|
provider.create
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
50
spec/unit/provider/trove_datastore_version/trove_spec.rb
Normal file
50
spec/unit/provider/trove_datastore_version/trove_spec.rb
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
require 'puppet'
|
||||||
|
require 'spec_helper'
|
||||||
|
require 'puppet/provider/trove_datastore_version/trove'
|
||||||
|
|
||||||
|
provider_class = Puppet::Type.type(:trove_datastore_version).provider(:trove)
|
||||||
|
|
||||||
|
describe provider_class do
|
||||||
|
|
||||||
|
let :datastore_name do
|
||||||
|
'foo'
|
||||||
|
end
|
||||||
|
|
||||||
|
let :datastore_version do
|
||||||
|
'1.0'
|
||||||
|
end
|
||||||
|
|
||||||
|
let :resource do
|
||||||
|
Puppet::Type::Trove_datastore_version.new({
|
||||||
|
:name => datastore_version,
|
||||||
|
:ensure => 'present',
|
||||||
|
:datastore => datastore_name,
|
||||||
|
:manager => 'mysql',
|
||||||
|
:image_id => '1234',
|
||||||
|
:packages => 'mysql',
|
||||||
|
:active => 1
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
let :provider do
|
||||||
|
described_class.new(resource)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "self.instances" do
|
||||||
|
it "should have an instances method" do
|
||||||
|
provider.class.should respond_to(:instances)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#create' do
|
||||||
|
it 'should call trove-manage' do
|
||||||
|
provider.expects(:trove_manage).with(
|
||||||
|
['trove-manage', 'datastore_version_update', datastore_name, "1.0",
|
||||||
|
'mysql', '1234', 'mysql', '1']
|
||||||
|
).returns(0)
|
||||||
|
|
||||||
|
provider.create
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
14
spec/unit/provider/trove_spec.rb
Normal file
14
spec/unit/provider/trove_spec.rb
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
require 'puppet'
|
||||||
|
require 'spec_helper'
|
||||||
|
require 'puppet/provider/trove'
|
||||||
|
|
||||||
|
|
||||||
|
klass = Puppet::Provider::Trove
|
||||||
|
|
||||||
|
describe Puppet::Provider::Trove do
|
||||||
|
|
||||||
|
after :each do
|
||||||
|
klass.reset
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user