fog-libvirt 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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