nova_manage.rb 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. Puppet::Type.type(:nova_floating).provide(:nova_manage) do
  2. desc "Manage nova floating"
  3. optional_commands :nova_manage => 'nova-manage'
  4. def exists?
  5. if resource[:network] =~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}$/
  6. # Calculate num quads to grab for prefix$$
  7. mask=resource[:network].sub(/.*\/([0-9][0-9]?)/, '\1').to_i
  8. num_quads = 4 - mask / 8
  9. prefix=resource[:network].sub(/(\.[0-9]{1,3}){#{num_quads}}(\/[0-9]{1,2})?$/, '') + "."
  10. return nova_manage("floating", "list").match(/#{prefix}/)
  11. elsif resource[:network].to_s =~ /^.{0,2}\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}-\d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3}.{0,2}/
  12. if resource[:ensure] == :absent
  13. operate_range.any?
  14. else
  15. operate_range.empty?
  16. end
  17. end
  18. end
  19. def create
  20. if resource[:network] =~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}$/
  21. nova_manage("floating", "create", '--pool', resource[:pool], resource[:network])
  22. elsif resource[:network].to_s =~ /^.{0,2}\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}-\d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3}.{0,2}/
  23. mixed_range.each do |ip|
  24. nova_manage("floating", "create", ip)
  25. end
  26. end
  27. end
  28. def destroy
  29. if resource[:network] =~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}$/
  30. nova_manage("floating", "delete", resource[:network])
  31. elsif resource[:network].to_s =~ /^.{0,2}\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}-\d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3}.{0,2}/
  32. mixed_range.each do |ip|
  33. nova_manage("floating", "delete", ip )
  34. end
  35. end
  36. end
  37. # Create range in cidr, including first and last ip
  38. # Nova will create this range, excluding network and broadcast IPs
  39. def mixed_range
  40. require 'netaddr'
  41. range = []
  42. NetAddr.merge(operate_range).each do |cidr|
  43. tmp_range = NetAddr::CIDR.create(cidr).enumerate
  44. range << tmp_range.first.to_s
  45. range << tmp_range.last.to_s
  46. end
  47. range.uniq!
  48. range += NetAddr.merge(operate_range).delete_if{ |part| part =~ /\/3[12]/}
  49. end
  50. # Calculate existed IPs and provided ip ranges
  51. def operate_range
  52. exist_range = []
  53. output = nova_manage("floating", "list")
  54. range_list = output.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
  55. range_list.each do |element|
  56. exist_range << element
  57. end
  58. if @resource[:ensure] == :absent
  59. ip_range & exist_range
  60. else
  61. ip_range - exist_range
  62. end
  63. end
  64. def ip_range
  65. require 'netaddr'
  66. ip_range = []
  67. Array(@resource[:network]).each do |rng|
  68. ip = rng.split('-')
  69. generated_range = NetAddr.range(NetAddr::CIDR.create(ip.first), NetAddr::CIDR.create(ip.last))
  70. ip_range += generated_range.unshift(ip.first).push(ip.last)
  71. end
  72. return ip_range
  73. end
  74. end