File: openstack.rb

package info (click to toggle)
puppet-module-nova 25.0.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,100 kB
  • sloc: ruby: 11,433; python: 38; sh: 10; makefile: 10
file content (66 lines) | stat: -rw-r--r-- 1,800 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
require File.join(File.dirname(__FILE__), '..','..','..', 'puppet/provider/nova')

Puppet::Type.type(:nova_service).provide(
  :openstack,
  :parent => Puppet::Provider::Nova
) do
  desc <<-EOT
    Provider to manage nova host services
  EOT

  @credentials = Puppet::Provider::Openstack::CredentialsV3.new

  mk_resource_methods

  def self.instances
    hosts = {}
    request('compute service', 'list').collect do |host_svc|
      hname = host_svc[:host]
      if hosts[hname].nil?
        hosts[hname] = Hash.new {|h,k| h[k]=[]}
        hosts[hname][:ids] = []
        hosts[hname][:service_name] = []
      end
      hosts[hname][:ids] << host_svc[:id]
      hosts[hname][:service_name] << host_svc[:binary]
    end
    hosts.collect do |hname, host|
      new(
        :ensure       => :present,
        :name         => hname,
        :ids          => host[:ids],
        :service_name => host[:service_name]
      )
    end
  end

  def self.prefetch(resources)
    instances_ = self.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 destroy
    return unless @property_hash[:ids].kind_of?(Array)
    svcname_id_map = @property_hash[:service_name].zip(@property_hash[:ids]) || {}
    svcname_id_map.each do |service_name, id|
      if (@resource[:service_name].empty? ||
          (@resource[:service_name].include? service_name))
        self.class.request('compute service', 'delete', id)
      end
    end
    @property_hash.clear
  end

  def create
    warning("Nova_service provider can only delete compute services because "\
            "of openstackclient limitations.")
  end
end