fog-libvirt 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTORS.md +23 -0
  3. data/Gemfile +9 -0
  4. data/LICENSE.md +20 -0
  5. data/README.md +29 -0
  6. data/Rakefile +122 -0
  7. data/fog-libvirt.gemspec +49 -0
  8. data/lib/fog/bin/libvirt.rb +58 -0
  9. data/lib/fog/libvirt/compute.rb +136 -0
  10. data/lib/fog/libvirt/models/compute/README.md +76 -0
  11. data/lib/fog/libvirt/models/compute/interface.rb +25 -0
  12. data/lib/fog/libvirt/models/compute/interfaces.rb +20 -0
  13. data/lib/fog/libvirt/models/compute/network.rb +29 -0
  14. data/lib/fog/libvirt/models/compute/networks.rb +20 -0
  15. data/lib/fog/libvirt/models/compute/nic.rb +50 -0
  16. data/lib/fog/libvirt/models/compute/nics.rb +12 -0
  17. data/lib/fog/libvirt/models/compute/node.rb +29 -0
  18. data/lib/fog/libvirt/models/compute/nodes.rb +20 -0
  19. data/lib/fog/libvirt/models/compute/pool.rb +84 -0
  20. data/lib/fog/libvirt/models/compute/pools.rb +20 -0
  21. data/lib/fog/libvirt/models/compute/server.rb +401 -0
  22. data/lib/fog/libvirt/models/compute/servers.rb +21 -0
  23. data/lib/fog/libvirt/models/compute/templates/network.xml.erb +6 -0
  24. data/lib/fog/libvirt/models/compute/templates/pool.xml.erb +6 -0
  25. data/lib/fog/libvirt/models/compute/templates/server.xml.erb +54 -0
  26. data/lib/fog/libvirt/models/compute/templates/volume.xml.erb +26 -0
  27. data/lib/fog/libvirt/models/compute/util/uri.rb +138 -0
  28. data/lib/fog/libvirt/models/compute/util/util.rb +32 -0
  29. data/lib/fog/libvirt/models/compute/volume.rb +122 -0
  30. data/lib/fog/libvirt/models/compute/volumes.rb +20 -0
  31. data/lib/fog/libvirt/requests/compute/clone_volume.rb +18 -0
  32. data/lib/fog/libvirt/requests/compute/create_domain.rb +17 -0
  33. data/lib/fog/libvirt/requests/compute/create_volume.rb +16 -0
  34. data/lib/fog/libvirt/requests/compute/define_domain.rb +17 -0
  35. data/lib/fog/libvirt/requests/compute/define_pool.rb +16 -0
  36. data/lib/fog/libvirt/requests/compute/destroy_interface.rb +18 -0
  37. data/lib/fog/libvirt/requests/compute/destroy_network.rb +17 -0
  38. data/lib/fog/libvirt/requests/compute/get_node_info.rb +37 -0
  39. data/lib/fog/libvirt/requests/compute/list_domains.rb +105 -0
  40. data/lib/fog/libvirt/requests/compute/list_interfaces.rb +57 -0
  41. data/lib/fog/libvirt/requests/compute/list_networks.rb +55 -0
  42. data/lib/fog/libvirt/requests/compute/list_pool_volumes.rb +19 -0
  43. data/lib/fog/libvirt/requests/compute/list_pools.rb +71 -0
  44. data/lib/fog/libvirt/requests/compute/list_volumes.rb +88 -0
  45. data/lib/fog/libvirt/requests/compute/mock_files/domain.xml +40 -0
  46. data/lib/fog/libvirt/requests/compute/pool_action.rb +19 -0
  47. data/lib/fog/libvirt/requests/compute/update_display.rb +31 -0
  48. data/lib/fog/libvirt/requests/compute/vm_action.rb +19 -0
  49. data/lib/fog/libvirt/requests/compute/volume_action.rb +18 -0
  50. data/lib/fog/libvirt/version.rb +5 -0
  51. data/lib/fog/libvirt.rb +18 -0
  52. data/tests/helper.rb +17 -0
  53. data/tests/helpers/formats_helper.rb +98 -0
  54. data/tests/helpers/formats_helper_tests.rb +110 -0
  55. data/tests/helpers/mock_helper.rb +14 -0
  56. data/tests/helpers/succeeds_helper.rb +9 -0
  57. data/tests/libvirt/compute_tests.rb +17 -0
  58. data/tests/libvirt/models/compute/interface_tests.rb +27 -0
  59. data/tests/libvirt/models/compute/interfaces_tests.rb +14 -0
  60. data/tests/libvirt/models/compute/network_tests.rb +27 -0
  61. data/tests/libvirt/models/compute/networks_tests.rb +13 -0
  62. data/tests/libvirt/models/compute/nic_tests.rb +31 -0
  63. data/tests/libvirt/models/compute/nics_tests.rb +10 -0
  64. data/tests/libvirt/models/compute/pool_tests.rb +27 -0
  65. data/tests/libvirt/models/compute/pools_tests.rb +13 -0
  66. data/tests/libvirt/models/compute/server_tests.rb +58 -0
  67. data/tests/libvirt/models/compute/servers_tests.rb +14 -0
  68. data/tests/libvirt/models/compute/volume_tests.rb +38 -0
  69. data/tests/libvirt/models/compute/volumes_tests.rb +14 -0
  70. data/tests/libvirt/requests/compute/create_domain_tests.rb +21 -0
  71. data/tests/libvirt/requests/compute/define_domain_tests.rb +11 -0
  72. data/tests/libvirt/requests/compute/update_display.rb +13 -0
  73. metadata +355 -0
@@ -0,0 +1,138 @@
1
+ require 'uri'
2
+ require 'cgi'
3
+
4
+ module Fog
5
+ module Compute
6
+ module LibvirtUtil
7
+ class URI
8
+ attr_reader :uri
9
+
10
+ def initialize(uri)
11
+ @parsed_uri=::URI.parse(uri)
12
+ @uri=uri
13
+ return self
14
+ end
15
+
16
+ # Transport will be part of the scheme
17
+ # The part after the plus sign
18
+ # f.i. qemu+ssh
19
+ def transport
20
+ scheme=@parsed_uri.scheme
21
+ return nil if scheme.nil?
22
+
23
+ return scheme.split(/\+/)[1]
24
+ end
25
+
26
+ def scheme
27
+ return @parsed_uri.scheme
28
+ end
29
+
30
+ def driver
31
+ scheme=@parsed_uri.scheme
32
+ return nil if scheme.nil?
33
+
34
+ return scheme.split(/\+/).first
35
+ end
36
+
37
+ def ssh_enabled?
38
+ if remote?
39
+ return transport.include?("ssh")
40
+ else
41
+ return false
42
+ end
43
+ end
44
+
45
+ def remote?
46
+ return !transport.nil?
47
+ end
48
+
49
+ def user
50
+ @parsed_uri.user
51
+ end
52
+
53
+ def host
54
+ @parsed_uri.host
55
+ end
56
+
57
+ def port
58
+ @parsed_uri.port
59
+ end
60
+
61
+ def password
62
+ @parsed_uri.password
63
+ end
64
+
65
+ def name
66
+ value("name")
67
+ end
68
+
69
+ def command
70
+ value("command")
71
+ end
72
+
73
+ def socket
74
+ value("socket")
75
+ end
76
+
77
+ def keyfile
78
+ value("keyfile")
79
+ end
80
+
81
+ def netcat
82
+ value("netcat")
83
+ end
84
+
85
+ def no_verify?
86
+ no_verify=value("no_verify")
87
+ return false if no_verify.nil?
88
+
89
+ if no_verify.to_s=="0"
90
+ return false
91
+ else
92
+ return true
93
+ end
94
+ end
95
+
96
+ def verify?
97
+ return !no_verify?
98
+ end
99
+
100
+ def no_tty?
101
+ no_tty=value("no_tty")
102
+
103
+ return false if no_tty.nil?
104
+
105
+ if no_tty=="0"
106
+ return false
107
+ else
108
+ return true
109
+ end
110
+ end
111
+
112
+ def tty?
113
+ return !no_tty?
114
+ end
115
+
116
+ def pkipath
117
+ value("pkipath")
118
+ end
119
+
120
+ # A libvirt URI allows you to specify extra params
121
+ # http://libvirt.org/remote.html
122
+ private
123
+ def value(name)
124
+ unless @parsed_uri.query.nil?
125
+ params=CGI.parse(@parsed_uri.query)
126
+ if params.key?(name)
127
+ return params[name].first
128
+ else
129
+ return nil
130
+ end
131
+ else
132
+ return nil
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,32 @@
1
+ require 'nokogiri'
2
+ require 'erb'
3
+ require 'ostruct'
4
+ require 'securerandom'
5
+
6
+ module Fog
7
+ module Compute
8
+ module LibvirtUtil
9
+ def xml_element(xml, path, attribute=nil)
10
+ xml = Nokogiri::XML(xml)
11
+ attribute.nil? ? (xml/path).first.text : (xml/path).first[attribute.to_sym]
12
+ end
13
+
14
+ def xml_elements(xml, path, attribute=nil)
15
+ xml = Nokogiri::XML(xml)
16
+ attribute.nil? ? (xml/path).map : (xml/path).map{|element| element[attribute.to_sym]}
17
+ end
18
+
19
+ def to_xml template_name = nil
20
+ # figure out our ERB template filename
21
+ erb = template_name || self.class.to_s.split("::").last.downcase
22
+ path = File.join(File.dirname(__FILE__), "..", "templates", "#{erb}.xml.erb")
23
+ template = File.read(path)
24
+ ERB.new(template, nil, '-').result(binding)
25
+ end
26
+
27
+ def randomized_name
28
+ "fog-#{(SecureRandom.random_number*10E14).to_i.round}"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,122 @@
1
+ require 'fog/core/model'
2
+ require 'fog/libvirt/models/compute/util/util'
3
+
4
+ module Fog
5
+ module Compute
6
+ class Libvirt
7
+ class Volume < Fog::Model
8
+ attr_reader :xml
9
+ include Fog::Compute::LibvirtUtil
10
+
11
+ identity :id, :aliases => 'key'
12
+
13
+ attribute :pool_name
14
+ attribute :key
15
+ attribute :name
16
+ attribute :path
17
+ attribute :capacity
18
+ attribute :allocation
19
+ attribute :format_type
20
+ attribute :backing_volume
21
+
22
+ # Can be created by passing in :xml => "<xml to create volume>"
23
+ # A volume always belongs to a pool, :pool_name => "<name of pool>"
24
+ #
25
+ def initialize(attributes={ })
26
+ @xml = attributes.delete(:xml)
27
+ super(defaults.merge(attributes))
28
+
29
+ # We need a connection to calculate the pool_name
30
+ # This is why we do this after super
31
+ self.pool_name ||= default_pool_name
32
+ end
33
+
34
+ # Takes a pool and either :xml or other settings
35
+ def save
36
+ requires :pool_name
37
+
38
+ raise Fog::Errors::Error.new('Reserving an existing volume may create a duplicate') if key
39
+ @xml ||= to_xml
40
+ self.path = service.create_volume(pool_name, xml).path
41
+ end
42
+
43
+ # Destroy a volume
44
+ def destroy
45
+ service.volume_action key, :delete
46
+ end
47
+
48
+ # Wipes a volume , zeroes disk
49
+ def wipe
50
+ service.volume_action key, :wipe
51
+ end
52
+
53
+ # Clones this volume to the name provided
54
+ def clone(name)
55
+ new_volume = self.dup
56
+ new_volume.key = nil
57
+ new_volume.name = name
58
+ new_volume.save
59
+
60
+ new_volume.reload
61
+ end
62
+
63
+ def clone_volume(new_name)
64
+ requires :pool_name
65
+
66
+ new_volume = self.dup
67
+ new_volume.key = nil
68
+ new_volume.name = new_name
69
+ new_volume.path = service.clone_volume(pool_name, new_volume.to_xml, self.name).path
70
+
71
+ new_volume.reload
72
+ end
73
+
74
+ private
75
+
76
+ def image_suffix
77
+ return "img" if format_type == "raw"
78
+ format_type
79
+ end
80
+
81
+ def randominzed_name
82
+ "#{super}.#{image_suffix}"
83
+ end
84
+
85
+ # Try to guess the default/first pool of no pool_name was specified
86
+ def default_pool_name
87
+ name = "default"
88
+ return name unless (service.pools.all(:name => name)).empty?
89
+
90
+ # we default to the first pool we find.
91
+ first_pool = service.pools.first
92
+
93
+ raise Fog::Errors::Error.new('No storage pools are defined') unless first_pool
94
+ first_pool.name
95
+ end
96
+
97
+ def defaults
98
+ {
99
+ :persistent => true,
100
+ :format_type => "raw",
101
+ :name => randomized_name,
102
+ :capacity => "10G",
103
+ :allocation => "1G",
104
+ }
105
+ end
106
+
107
+ def split_size_unit(text)
108
+ if text.kind_of? Integer
109
+ # if text is an integer, match will fail
110
+ size = text
111
+ unit = 'G'
112
+ else
113
+ matcher = text.match(/(\d+)(.+)/)
114
+ size = matcher[1]
115
+ unit = matcher[2]
116
+ end
117
+ [size, unit]
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,20 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/libvirt/models/compute/volume'
3
+
4
+ module Fog
5
+ module Compute
6
+ class Libvirt
7
+ class Volumes < Fog::Collection
8
+ model Fog::Compute::Libvirt::Volume
9
+
10
+ def all(filter = {})
11
+ load(service.list_volumes(filter))
12
+ end
13
+
14
+ def get(key)
15
+ self.all(:key => key).first
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ def clone_volume (pool_name, xml, name)
6
+ vol = client.lookup_storage_pool_by_name(pool_name).lookup_volume_by_name(name)
7
+ client.lookup_storage_pool_by_name(pool_name).create_vol_xml_from(xml, vol)
8
+ end
9
+ end
10
+
11
+ class Mock
12
+ def clone_volume(pool_name, xml, name)
13
+ Fog::Compute::Libvirt::Volume.new({:pool_name => pool_name, :xml => xml})
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ def create_domain(xml)
6
+ client.create_domain_xml(xml)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def create_domain(xml)
12
+ ::Libvirt::Domain.new()
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ def create_volume(pool_name, xml)
6
+ client.lookup_storage_pool_by_name(pool_name).create_vol_xml(xml)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def create_volume(pool_name, xml)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ def define_domain(xml)
6
+ client.define_domain_xml(xml)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def define_domain(xml)
12
+ ::Libvirt::Domain.new()
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ def define_pool(xml)
6
+ client.define_storage_pool_xml(xml)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def define_pool(xml)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ #shutdown the interface
6
+ def destroy_interface(uuid)
7
+ client.lookup_interface_by_uuid(uuid).destroy
8
+ end
9
+ end
10
+
11
+ class Mock
12
+ def destroy_interface(uuid)
13
+ true
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ def destroy_network(uuid)
6
+ client.lookup_network_by_uuid(uuid).destroy
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def destroy_network(uuid)
12
+ true
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ def get_node_info
6
+ node_hash = Hash.new
7
+ node_info = client.node_get_info
8
+ [:model, :memory, :cpus, :mhz, :nodes, :sockets, :cores, :threads].each do |param|
9
+ node_hash[param] = node_info.send(param) rescue nil
10
+ end
11
+ [:type, :version, :node_free_memory, :max_vcpus].each do |param|
12
+ node_hash[param] = client.send(param) rescue nil
13
+ end
14
+ node_hash[:uri] = client.uri
15
+ xml = client.sys_info rescue nil
16
+ [:uuid, :manufacturer, :product, :serial].each do |attr|
17
+ node_hash[attr] = node_attr(attr, xml) rescue nil
18
+ end if xml
19
+
20
+ node_hash[:hostname] = client.hostname
21
+ [node_hash]
22
+ end
23
+
24
+ private
25
+
26
+ def node_attr attr, xml
27
+ xml_element(xml, "sysinfo/system/entry[@name='#{attr}']").strip
28
+ end
29
+ end
30
+
31
+ class Mock
32
+ def get_node_info
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,105 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ def list_domains(filter = { })
6
+ data=[]
7
+
8
+ if filter.key?(:uuid)
9
+ data << client.lookup_domain_by_uuid(filter[:uuid])
10
+ elsif filter.key?(:name)
11
+ data << client.lookup_domain_by_name(filter[:name])
12
+ else
13
+ client.list_defined_domains.each { |name| data << client.lookup_domain_by_name(name) } unless filter[:defined] == false
14
+ client.list_domains.each { |id| data << client.lookup_domain_by_id(id) } unless filter[:active] == false
15
+ end
16
+ data.compact.map { |d| domain_to_attributes d }
17
+ end
18
+ end
19
+
20
+ module Shared
21
+ private
22
+
23
+ def domain_display xml
24
+ attrs = {}
25
+ [:type, :port, :password, :listen].each do |element|
26
+ attrs[element] = xml_element(xml, "domain/devices/graphics",element.to_s) rescue nil
27
+ end
28
+ attrs.reject{|k,v| v.nil? or v == ""}
29
+ end
30
+
31
+ def domain_volumes xml
32
+ xml_elements(xml, "domain/devices/disk/source", "file")
33
+ end
34
+
35
+ def boot_order xml
36
+ xml_elements(xml, "domain/os/boot", "dev")
37
+ end
38
+
39
+ def domain_interfaces xml
40
+ ifs = xml_elements(xml, "domain/devices/interface")
41
+ ifs.map { |i|
42
+ nics.new({
43
+ :type => i['type'],
44
+ :mac => (i/'mac').first[:address],
45
+ :network => ((i/'source').first[:network] rescue nil),
46
+ :bridge => ((i/'source').first[:bridge] rescue nil),
47
+ :model => ((i/'model').first[:type] rescue nil),
48
+ }.reject{|k,v| v.nil?})
49
+ }
50
+ end
51
+
52
+ def domain_to_attributes(dom)
53
+ states= %w(nostate running blocked paused shutting-down shutoff crashed)
54
+ {
55
+ :id => dom.uuid,
56
+ :uuid => dom.uuid,
57
+ :name => dom.name,
58
+ :max_memory_size => dom.info.max_mem,
59
+ :cputime => dom.info.cpu_time,
60
+ :memory_size => dom.info.memory,
61
+ :cpus => dom.info.nr_virt_cpu,
62
+ :autostart => dom.autostart?,
63
+ :os_type => dom.os_type,
64
+ :active => dom.active?,
65
+ :display => domain_display(dom.xml_desc),
66
+ :boot_order => boot_order(dom.xml_desc),
67
+ :nics => domain_interfaces(dom.xml_desc),
68
+ :volumes_path => domain_volumes(dom.xml_desc),
69
+ :state => states[dom.info.state]
70
+ }
71
+ end
72
+ end
73
+
74
+ class Mock
75
+ def list_domains(filter = { })
76
+ dom1 = mock_domain 'fog-dom1'
77
+ dom2 = mock_domain 'fog-dom2'
78
+ dom3 = mock_domain 'a-fog-dom3'
79
+ [dom1, dom2, dom3]
80
+ end
81
+
82
+ def mock_domain name
83
+ xml = read_xml 'domain.xml'
84
+ {
85
+ :id => "dom.uuid",
86
+ :uuid => "dom.uuid",
87
+ :name => name,
88
+ :max_memory_size => 8,
89
+ :cputime => 7,
90
+ :memory_size => 6,
91
+ :cpus => 5,
92
+ :autostart => false,
93
+ :os_type => "RHEL6",
94
+ :active => false,
95
+ :vnc_port => 5910,
96
+ :boot_order => boot_order(xml),
97
+ :nics => domain_interfaces(xml),
98
+ :volumes_path => domain_volumes(xml),
99
+ :state => 'shutoff'
100
+ }
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,57 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ def list_interfaces(filter = { })
6
+ data=[]
7
+ if filter.keys.empty?
8
+ active_networks = client.list_interfaces rescue []
9
+ defined_networks = client.list_defined_interfaces rescue []
10
+ (active_networks + defined_networks).each do |ifname|
11
+ data << interface_to_attributes(client.lookup_interface_by_name(ifname))
12
+ end
13
+ else
14
+ data = [interface_to_attributes(get_interface_by_filter(filter))]
15
+ end
16
+ data.compact
17
+ end
18
+
19
+ private
20
+ # Retrieve the interface by mac or by name
21
+ def get_interface_by_filter(filter)
22
+ case filter.keys.first
23
+ when :mac
24
+ client.lookup_interface_by_mac(filter[:mac])
25
+ when :name
26
+ client.lookup_interface_by_name(filter[:name])
27
+ end
28
+ end
29
+
30
+ def interface_to_attributes(net)
31
+ return if net.nil? || net.name == 'lo'
32
+ {
33
+ :mac => net.mac,
34
+ :name => net.name,
35
+ :active => net.active?
36
+ }
37
+ end
38
+ end
39
+
40
+ class Mock
41
+ def list_interfaces(filters={ })
42
+ if1 = mock_interface 'if1'
43
+ if2 = mock_interface 'if2'
44
+ [if1, if2]
45
+ end
46
+
47
+ def mock_interface name
48
+ {
49
+ :mac => 'aa:bb:cc:dd:ee:ff',
50
+ :name => name,
51
+ :active => true
52
+ }
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,55 @@
1
+ module Fog
2
+ module Compute
3
+ class Libvirt
4
+ class Real
5
+ def list_networks(filter = { })
6
+ data=[]
7
+ if filter.keys.empty?
8
+ (client.list_networks + client.list_defined_networks).each do |network_name|
9
+ data << network_to_attributes(client.lookup_network_by_name(network_name))
10
+ end
11
+ else
12
+ data = [network_to_attributes(get_network_by_filter(filter))]
13
+ end
14
+ data
15
+ end
16
+
17
+ private
18
+ # Retrieve the network by uuid or name
19
+ def get_network_by_filter(filter)
20
+ case filter.keys.first
21
+ when :uuid
22
+ client.lookup_network_by_uuid(filter[:uuid])
23
+ when :name
24
+ client.lookup_network_by_name(filter[:name])
25
+ end
26
+ end
27
+
28
+ def network_to_attributes(net)
29
+ return if net.nil?
30
+ {
31
+ :uuid => net.uuid,
32
+ :name => net.name,
33
+ :bridge_name => net.bridge_name
34
+ }
35
+ end
36
+ end
37
+
38
+ class Mock
39
+ def list_networks(filters={ })
40
+ net1 = mock_network 'net1'
41
+ net2 = mock_network 'net2'
42
+ [net1, net2]
43
+ end
44
+
45
+ def mock_network name
46
+ {
47
+ :uuid => 'net.uuid',
48
+ :name => name,
49
+ :bridge_name => 'net.bridge_name'
50
+ }
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end