--- /dev/null
+# Load the Glance provider library to help
+require File.join(File.dirname(__FILE__), '..','..','..', 'puppet/provider/glance')
+
+Puppet::Type.type(:glance_image).provide(
+ :glance,
+ :parent => Puppet::Provider::Glance
+) do
+ desc <<-EOT
+ Glance provider to manage glance_image type.
+
+ Assumes that the glance-api service is on the same host and is working.
+ EOT
+
+ commands :glance => 'glance'
+
+ mk_resource_methods
+
+ def self.instances
+ list_glance_images.collect do |image|
+ attrs = get_glance_image_attrs(image)
+ new(
+ :ensure => :present,
+ :name => attrs['name'],
+ :is_public => attrs['is_public'],
+ :container_format => attrs['container_format'],
+ :id => attrs['id'],
+ :disk_format => attrs['disk_format']
+ )
+ end
+ end
+
+ def self.prefetch(resources)
+ images = instances
+ resources.keys.each do |name|
+ if provider = images.find{ |pkg| pkg.name == name }
+ resources[name].provider = provider
+ end
+ end
+ end
+
+ def exists?
+ @property_hash[:ensure] == :present
+ end
+
+ def create
+ if resource[:source]
+ # copy_from cannot handle file://
+ if resource[:source] =~ /^\// # local file
+ location = "--file=#{resource[:source]}"
+ else
+ location = "--copy-from=#{resource[:source]}"
+ end
+ # location cannot handle file://
+ # location does not import, so no sense in doing anything more than this
+ elsif resource[:location]
+ location = "--location=#{resource[:location]}"
+ else
+ raise(Puppet::Error, "Must specify either source or location")
+ end
+ results = auth_glance('image-create', "--name=#{resource[:name]}", "--is-public=#{resource[:is_public]}", "--container-format=#{resource[:container_format]}", "--disk-format=#{resource[:disk_format]}", location)
+
+ id = nil
+
+ # Check the old behavior of the python-glanceclient
+ if results =~ /Added new image with ID: (\S+)/
+ id = $1
+ else # the new behavior doesn't print the status, so parse the table
+ results_array = parse_table(results)
+ results_array.each do |result|
+ if result["Property"] == "id"
+ id = result["Value"]
+ end
+ end
+ end
+
+ if id
+ @property_hash = {
+ :ensure => :present,
+ :name => resource[:name],
+ :is_public => resource[:is_public],
+ :container_format => resource[:container_format],
+ :disk_format => resource[:disk_format],
+ :id => id
+ }
+ else
+ fail("did not get expected message from image creation, got #{results}")
+ end
+ end
+
+ def destroy
+ auth_glance('image-delete', id)
+ @property_hash[:ensure] = :absent
+ end
+
+ def location=(value)
+ auth_glance('image-update', id, "--location=#{value}")
+ end
+
+ def is_public=(value)
+ auth_glance('image-update', id, "--is-public=#{value}")
+ end
+
+ def disk_format=(value)
+ auth_glance('image-update', id, "--disk-format=#{value}")
+ end
+
+ def container_format=(value)
+ auth_glance('image-update', id, "--container-format=#{value}")
+ end
+
+ def id=(id)
+ fail('id is read only')
+ end
+
+end