+Puppet::Type.type(:nova_network).provide(:nova_manage) do
+
+ desc "Manage nova network"
+
+ optional_commands :nova_manage => 'nova-manage'
+
+ # I need to setup caching and what-not to make this lookup performance not suck
+ def self.instances
+ begin
+ network_list = nova_manage("network", "list")
+ rescue Exception => e
+ if e.message =~ /No networks defined/
+ return []
+ else
+ raise(e)
+ end
+ end
+ network_list.split("\n")[1..-1].collect do |net|
+ if net =~ /^(\S+)\s+(\S+)/
+ new(:name => $2 )
+ end
+ end.compact
+ end
+
+ def create
+ optional_opts = []
+ {
+ # this needs to be converted from a project name to an id
+ :project => '--project_id',
+ :dns2 => '--dns2',
+ :gateway => '--gateway',
+ :bridge => '--bridge',
+ :vlan_start => '--vlan_start'
+ }.each do |param, opt|
+ if resource[param]
+ optional_opts.push(opt).push(resource[param])
+ end
+ end
+
+ nova_manage('network', 'create',
+ resource[:label],
+ resource[:name],
+ resource[:num_networks],
+ resource[:network_size],
+ optional_opts
+ )
+ end
+
+ def exists?
+ begin
+ network_list = nova_manage("network", "list")
+ return network_list.split("\n")[1..-1].detect do |n|
+ # TODO - this does not take the CIDR into accont. Does it matter?
+ n =~ /^(\S+)\s+(#{resource[:network].split('/').first})/
+ end
+ rescue
+ return false
+ end
+ end
+
+
+ def destroy
+ nova_manage("network", "delete", resource[:network])
+ end
+
+end