]> git.donarmstrong.com Git - dsa-puppet.git/blobdiff - 3rdparty/modules/nova/lib/puppet/provider/nova_aggregate/nova.rb
try again, with puppetforge modules, correctly included now
[dsa-puppet.git] / 3rdparty / modules / nova / lib / puppet / provider / nova_aggregate / nova.rb
diff --git a/3rdparty/modules/nova/lib/puppet/provider/nova_aggregate/nova.rb b/3rdparty/modules/nova/lib/puppet/provider/nova_aggregate/nova.rb
new file mode 100644 (file)
index 0000000..cad8a67
--- /dev/null
@@ -0,0 +1,157 @@
+require File.join(File.dirname(__FILE__), '..','..','..',
+                  'puppet/provider/nova')
+
+Puppet::Type.type(:nova_aggregate).provide(
+  :nova,
+  :parent => Puppet::Provider::Nova
+) do
+
+  desc "Manage nova aggregations"
+
+  commands :nova => 'nova'
+
+  mk_resource_methods
+
+  def self.instances
+    nova_aggregate_resources_ids().collect do |el|
+      attrs = nova_aggregate_resources_attr(el['Id'])
+      new(
+          :ensure => :present,
+          :name => attrs['Name'],
+          :id => attrs['Id'],
+          :availability_zone => attrs['Availability Zone'],
+          :metadata => attrs['Metadata'],
+          :hosts => attrs['Hosts']
+          )
+    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 destroy
+    #delete hosts first
+    if not @property_hash[:hosts].nil?
+      @property_hash[:hosts].each do |h|
+        auth_nova("aggregate-remove-host", name, h)
+      end
+    end
+    #now delete aggregate
+    auth_nova("aggregate-delete", name)
+    @property_hash[:ensure] = :absent
+  end
+
+  def create
+    extras = Array.new
+    #check for availability zone
+    if not @resource[:availability_zone].nil? and not @resource[:availability_zone].empty?
+      extras << "#{@resource[:availability_zone]}"
+    end
+    #run the command
+    result = auth_nova("aggregate-create", resource[:name], extras)
+
+    #get Id by Name
+    id = self.class.nova_aggregate_resources_get_name_by_id(resource[:name])
+
+    @property_hash = {
+      :ensure => :present,
+      :name => resource[:name],
+      :id => id,
+      :availability_zone => resource[:availability_zone]
+      }
+
+    #add metadata
+    if not @resource[:metadata].nil? and not @resource[:metadata].empty?
+      @resource[:metadata].each do |key, value|
+        set_metadata_helper(id, key, value)
+      end
+      @property_hash[:metadata] = resource[:metadata]
+    end
+
+    #add hosts - This throws an error if the host is already attached to another aggregate!
+    if not @resource[:hosts].nil? and not @resource[:hosts].empty?
+      @resource[:hosts].each do |host|
+        auth_nova("aggregate-add-host", id, "#{host}")
+      end
+      @property_hash[:hosts] = resource[:hosts]
+    end
+  end
+
+  def hosts=(val)
+    #get current hosts
+    id = self.class.nova_aggregate_resources_get_name_by_id(name)
+    attrs = self.class.nova_aggregate_resources_attr(id)
+    #remove all hosts which are not in new value list
+    attrs['Hosts'].each do |h|
+      if not val.include? h
+        auth_nova("aggregate-remove-host", id, "#{h}")
+      end
+    end
+
+    #add hosts from the value list
+    val.each do |h|
+      if not attrs['Hosts'].include? h
+        auth_nova("aggregate-add-host", id, "#{h}")
+      end
+    end
+  end
+
+  def set_metadata_helper(agg_id, key, value)
+    auth_nova("aggregate-set-metadata", agg_id, "#{key}=#{value}")
+  end
+
+  def metadata
+    #get current metadata
+    id = self.class.nova_aggregate_resources_get_name_by_id(name)
+    attrs = self.class.nova_aggregate_resources_attr(id)
+    #just ignore the availability_zone. that's handled directly by nova
+    attrs['Metadata'].delete('availability_zone')
+    return attrs['Metadata']
+  end
+
+  def metadata=(val)
+    #get current metadata
+    id = self.class.nova_aggregate_resources_get_name_by_id(name)
+    attrs = self.class.nova_aggregate_resources_attr(id)
+    #get keys which are in current metadata but not in val. Make sure it has data first!
+    if attrs['Metadata'].length > 0
+      obsolete_keys = attrs['Metadata'].keys - val.keys
+    end
+    # clear obsolete keys. If there are any!
+    if obsolete_keys
+      obsolete_keys.each do |key|
+        if not key.include? 'availability_zone'
+          auth_nova("aggregate-set-metadata", id, "#{key}")
+        end
+      end
+      #handle keys (with obsolete keys)
+      new_keys = val.keys - obsolete_keys
+    else
+      #handle keys (without obsolete keys)
+      new_keys = val.keys
+    end
+    #set new metadata if value changed
+    new_keys.each do |key|
+      if val[key] != attrs['Metadata'][key.to_s]
+        value = val[key]
+        set_metadata_helper(id, key, value)
+      end
+    end
+  end
+
+  def availability_zone=(val)
+    id = self.class.nova_aggregate_resources_get_name_by_id(name)
+    auth_nova("aggregate-set-metadata", id, "availability_zone=#{val}")
+  end
+
+end