]> git.donarmstrong.com Git - dsa-puppet.git/blobdiff - 3rdparty/modules/neutron/lib/puppet/provider/neutron_router_interface/neutron.rb
try again, with puppetforge modules, correctly included now
[dsa-puppet.git] / 3rdparty / modules / neutron / lib / puppet / provider / neutron_router_interface / neutron.rb
diff --git a/3rdparty/modules/neutron/lib/puppet/provider/neutron_router_interface/neutron.rb b/3rdparty/modules/neutron/lib/puppet/provider/neutron_router_interface/neutron.rb
new file mode 100644 (file)
index 0000000..4637846
--- /dev/null
@@ -0,0 +1,93 @@
+require File.join(File.dirname(__FILE__), '..','..','..',
+                  'puppet/provider/neutron')
+
+Puppet::Type.type(:neutron_router_interface).provide(
+  :neutron,
+  :parent => Puppet::Provider::Neutron
+) do
+  desc <<-EOT
+    Neutron provider to manage neutron_router_interface type.
+
+    Assumes that the neutron service is configured on the same host.
+
+    It is not possible to manage an interface for the subnet used by
+    the gateway network, and such an interface will appear in the list
+    of resources ('puppet resource [type]').  Attempting to manage the
+    gateway interfae will result in an error.
+
+  EOT
+
+  commands :neutron => 'neutron'
+
+  mk_resource_methods
+
+  def self.instances
+    subnet_name_hash = {}
+    Puppet::Type.type('neutron_subnet').instances.each do |instance|
+      subnet_name_hash[instance.provider.id] = instance.provider.name
+    end
+    instances_ = []
+    Puppet::Type.type('neutron_router').instances.each do |instance|
+      list_router_ports(instance.provider.id).each do |port_hash|
+        router_name = instance.provider.name
+        subnet_name = subnet_name_hash[port_hash['subnet_id']]
+        name = "#{router_name}:#{subnet_name}"
+        instances_ << new(
+            :ensure                    => :present,
+            :name                      => name,
+            :id                        => port_hash['id'],
+            :port                      => port_hash['name']
+            )
+      end
+    end
+    return instances_
+  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 create
+    router,subnet = resource[:name].split(':', 2)
+    port = resource[:port]
+    args = ["router-interface-add", "--format=shell", router]
+    if port
+      args << "port=#{port}"
+    else
+      args << "subnet=#{subnet}"
+    end
+    results = auth_neutron(args)
+
+    if results =~ /Added interface.* to router/
+      @property_hash = {
+        :ensure => :present,
+        :name   => resource[:name],
+      }
+    else
+      fail("did not get expected message on interface addition, got #{results}")
+    end
+  end
+
+  def router_name
+    name.split(':', 2).first
+  end
+
+  def subnet_name
+    name.split(':', 2).last
+  end
+
+  def destroy
+    auth_neutron('router-interface-delete', router_name, subnet_name)
+    @property_hash[:ensure] = :absent
+  end
+
+end