memcached (openstack) is no longer in use
[mirror/dsa-puppet.git] / 3rdparty / modules / nova / lib / puppet / provider / nova_aggregate / nova.rb
1 require File.join(File.dirname(__FILE__), '..','..','..',
2                   'puppet/provider/nova')
3
4 Puppet::Type.type(:nova_aggregate).provide(
5   :nova,
6   :parent => Puppet::Provider::Nova
7 ) do
8
9   desc "Manage nova aggregations"
10
11   commands :nova => 'nova'
12
13   mk_resource_methods
14
15   def self.instances
16     nova_aggregate_resources_ids().collect do |el|
17       attrs = nova_aggregate_resources_attr(el['Id'])
18       new(
19           :ensure => :present,
20           :name => attrs['Name'],
21           :id => attrs['Id'],
22           :availability_zone => attrs['Availability Zone'],
23           :metadata => attrs['Metadata'],
24           :hosts => attrs['Hosts']
25           )
26     end
27   end
28
29   def self.prefetch(resources)
30     instances_ = instances
31     resources.keys.each do |name|
32       if provider = instances_.find{ |instance| instance.name == name }
33         resources[name].provider = provider
34       end
35     end
36   end
37
38   def exists?
39     @property_hash[:ensure] == :present
40   end
41
42   def destroy
43     #delete hosts first
44     if not @property_hash[:hosts].nil?
45       @property_hash[:hosts].each do |h|
46         auth_nova("aggregate-remove-host", name, h)
47       end
48     end
49     #now delete aggregate
50     auth_nova("aggregate-delete", name)
51     @property_hash[:ensure] = :absent
52   end
53
54   def create
55     extras = Array.new
56     #check for availability zone
57     if not @resource[:availability_zone].nil? and not @resource[:availability_zone].empty?
58       extras << "#{@resource[:availability_zone]}"
59     end
60     #run the command
61     result = auth_nova("aggregate-create", resource[:name], extras)
62
63     #get Id by Name
64     id = self.class.nova_aggregate_resources_get_name_by_id(resource[:name])
65
66     @property_hash = {
67       :ensure => :present,
68       :name => resource[:name],
69       :id => id,
70       :availability_zone => resource[:availability_zone]
71       }
72
73     #add metadata
74     if not @resource[:metadata].nil? and not @resource[:metadata].empty?
75       @resource[:metadata].each do |key, value|
76         set_metadata_helper(id, key, value)
77       end
78       @property_hash[:metadata] = resource[:metadata]
79     end
80
81     #add hosts - This throws an error if the host is already attached to another aggregate!
82     if not @resource[:hosts].nil? and not @resource[:hosts].empty?
83       @resource[:hosts].each do |host|
84         auth_nova("aggregate-add-host", id, "#{host}")
85       end
86       @property_hash[:hosts] = resource[:hosts]
87     end
88   end
89
90   def hosts=(val)
91     #get current hosts
92     id = self.class.nova_aggregate_resources_get_name_by_id(name)
93     attrs = self.class.nova_aggregate_resources_attr(id)
94     #remove all hosts which are not in new value list
95     attrs['Hosts'].each do |h|
96       if not val.include? h
97         auth_nova("aggregate-remove-host", id, "#{h}")
98       end
99     end
100
101     #add hosts from the value list
102     val.each do |h|
103       if not attrs['Hosts'].include? h
104         auth_nova("aggregate-add-host", id, "#{h}")
105       end
106     end
107   end
108
109   def set_metadata_helper(agg_id, key, value)
110     auth_nova("aggregate-set-metadata", agg_id, "#{key}=#{value}")
111   end
112
113   def metadata
114     #get current metadata
115     id = self.class.nova_aggregate_resources_get_name_by_id(name)
116     attrs = self.class.nova_aggregate_resources_attr(id)
117     #just ignore the availability_zone. that's handled directly by nova
118     attrs['Metadata'].delete('availability_zone')
119     return attrs['Metadata']
120   end
121
122   def metadata=(val)
123     #get current metadata
124     id = self.class.nova_aggregate_resources_get_name_by_id(name)
125     attrs = self.class.nova_aggregate_resources_attr(id)
126     #get keys which are in current metadata but not in val. Make sure it has data first!
127     if attrs['Metadata'].length > 0
128       obsolete_keys = attrs['Metadata'].keys - val.keys
129     end
130     # clear obsolete keys. If there are any!
131     if obsolete_keys
132       obsolete_keys.each do |key|
133         if not key.include? 'availability_zone'
134           auth_nova("aggregate-set-metadata", id, "#{key}")
135         end
136       end
137       #handle keys (with obsolete keys)
138       new_keys = val.keys - obsolete_keys
139     else
140       #handle keys (without obsolete keys)
141       new_keys = val.keys
142     end
143     #set new metadata if value changed
144     new_keys.each do |key|
145       if val[key] != attrs['Metadata'][key.to_s]
146         value = val[key]
147         set_metadata_helper(id, key, value)
148       end
149     end
150   end
151
152   def availability_zone=(val)
153     id = self.class.nova_aggregate_resources_get_name_by_id(name)
154     auth_nova("aggregate-set-metadata", id, "availability_zone=#{val}")
155   end
156
157 end