Class: BoxGrinder::OpenStackPlugin

Inherits:
BasePlugin show all
Defined in:
lib/boxgrinder-build/plugins/delivery/openstack/openstack-plugin.rb

Instance Attribute Summary

Attributes inherited from BasePlugin

#deliverables, #plugin_info

Instance Method Summary collapse

Methods inherited from BasePlugin

#current_platform, #deliverables_exists?, #init, #initialize, #is_supported_os?, #is_supported_platform?, #merge_plugin_config, #read_plugin_config, #register_deliverable, #register_supported_os, #register_supported_platform, #run, #set_default_config_value, #subtype, #supported_oses, #validate_plugin_config

Methods included from Plugins

#plugin

Constructor Details

This class inherits a constructor from BoxGrinder::BasePlugin

Instance Method Details

#after_initObject



28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/boxgrinder-build/plugins/delivery/openstack/openstack-plugin.rb', line 28

def after_init
  set_default_config_value('host', 'localhost')
  set_default_config_value('port', '9292')
  set_default_config_value('schema', 'http')
  set_default_config_value('overwrite', false)
  set_default_config_value('public', false)

  register_supported_platform(:ec2)
  register_supported_platform(:vmware)
  register_supported_platform(:virtualbox)

  @disk_format, @container_format = disk_and_container_format
  @appliance_name = "#{@appliance_config.name}-#{@appliance_config.version}.#{@appliance_config.release}-#{@disk_format}"
end

#delete_image(id) ⇒ Object

Removes image from the server for specified id.



113
114
115
116
117
# File 'lib/boxgrinder-build/plugins/delivery/openstack/openstack-plugin.rb', line 113

def delete_image(id)
  @log.trace "Removing image with id = #{id}..."
  RestClient.delete("#{url}/v1/images/#{id}")
  @log.trace "Image removed."
end

#disk_and_container_formatObject



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/boxgrinder-build/plugins/delivery/openstack/openstack-plugin.rb', line 65

def disk_and_container_format
  disk_format = :raw
  container_format = :bare

  if @previous_plugin_info[:type] == :platform
    case @previous_plugin_info[:name]
      when :ec2
        disk_format = :ami
        container_format = :ami
      when :vmware
        disk_format = :vmdk
      when :virtualbox
        disk_format = :vmdk
    end
  end

  [disk_format, container_format]
end

#executeObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/boxgrinder-build/plugins/delivery/openstack/openstack-plugin.rb', line 43

def execute
  @log.debug "Checking if '#{@appliance_name}' appliance is already registered..."
  images = get_images(:name => @appliance_name)

  unless images.empty?
    @log.debug "We found one or more appliances with the name '#{@appliance_name}'."

    unless @plugin_config['overwrite']
      @log.error "One or more appliances are already registered with the name '#{@appliance_name}'. You can specify 'overwrite' parameter to remove them."
      return
    end

    @log.info "Removing all images with name '#{@appliance_name}' because 'overwrite' parameter is set to true..."
    images.each {|i| delete_image(i['id']) }
    @log.info "Images removed."
  end

  disk_format, container_format = disk_and_container_format

  post_image(:disk_format => disk_format, :container_format => container_format, :public => @plugin_config['public'])
end

#get_images(params = {}) ⇒ Object

Retrieves a list of public images with specified filter. If no filter is specified - all images are returned.



121
122
123
124
125
126
# File 'lib/boxgrinder-build/plugins/delivery/openstack/openstack-plugin.rb', line 121

def get_images(params = {})
  @log.trace "Listing images with params = #{params.to_json}..."
  data = JSON.parse(RestClient.get("#{url}/v1/images", :params => params))['images']
  @log.trace "Listing done."
  data
end

#post_image(options = {}) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/boxgrinder-build/plugins/delivery/openstack/openstack-plugin.rb', line 84

def post_image(options = {})
  options = {
      :disk_format => :raw, # raw, vhd, vmdk, vdi, qcow2, aki, ari, ami
      :container_format => :bare, # ovf, bare, aki, ari, ami
      :public => true
  }.merge(options)

  @log.info "Uploading and registering '#{@appliance_name}' appliance in OpenStack..."

  file_size = File.size(@previous_deliverables.disk)

  @log.trace "Disk format: #{options[:disk_format]}, container format: #{options[:container_format]}, public: #{options[:public]}, size: #{file_size}."

  image = JSON.parse(RestClient.post("#{url}/v1/images",
    File.new(@previous_deliverables.disk, 'rb'),
    :content_type => 'application/octet-stream',
    'x-image-meta-size' => file_size,
    'x-image-meta-name' => @appliance_name,
    'x-image-meta-disk-format' => options[:disk_format],
    'x-image-meta-container-format' => options[:container_format],
    'x-image-meta-is-public' => options[:public] ? "true" : false,
    'x-image-meta-property-distro' => "#{@appliance_config.os.name.capitalize} #{@appliance_config.os.version}"
  ))['image']

  @log.info "Appliance registered under id = #{image['id']}."
end

#urlObject



128
129
130
# File 'lib/boxgrinder-build/plugins/delivery/openstack/openstack-plugin.rb', line 128

def url
  "#{@plugin_config['schema']}://#{@plugin_config['host']}:#{@plugin_config['port']}"
end