fog-xenserver 0.0.1.alpha

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 (130) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/CONTRIBUTING.md +18 -0
  6. data/CONTRIBUTORS.md +1 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.md +20 -0
  9. data/README.md +29 -0
  10. data/Rakefile +2 -0
  11. data/fog-xenserver.gemspec +26 -0
  12. data/lib/fog.rb +3 -0
  13. data/lib/fog/compute.rb +7 -0
  14. data/lib/fog/xenserver.rb +1 -0
  15. data/lib/fog/xenserver/compute.rb +176 -0
  16. data/lib/fog/xenserver/core.rb +84 -0
  17. data/lib/fog/xenserver/examples/README.md +11 -0
  18. data/lib/fog/xenserver/examples/chage_default_storage_repository.md +99 -0
  19. data/lib/fog/xenserver/examples/creating_servers.md +168 -0
  20. data/lib/fog/xenserver/examples/getting_started.md +163 -0
  21. data/lib/fog/xenserver/examples/networks-and-vlans.rb +45 -0
  22. data/lib/fog/xenserver/examples/storage_repositories.md +94 -0
  23. data/lib/fog/xenserver/models/compute/blob.rb +22 -0
  24. data/lib/fog/xenserver/models/compute/blobs.rb +25 -0
  25. data/lib/fog/xenserver/models/compute/bond.rb +23 -0
  26. data/lib/fog/xenserver/models/compute/bonds.rb +25 -0
  27. data/lib/fog/xenserver/models/compute/console.rb +29 -0
  28. data/lib/fog/xenserver/models/compute/consoles.rb +25 -0
  29. data/lib/fog/xenserver/models/compute/crash_dump.rb +19 -0
  30. data/lib/fog/xenserver/models/compute/crash_dumps.rb +25 -0
  31. data/lib/fog/xenserver/models/compute/dr_task.rb +17 -0
  32. data/lib/fog/xenserver/models/compute/dr_tasks.rb +25 -0
  33. data/lib/fog/xenserver/models/compute/gpu_group.rb +22 -0
  34. data/lib/fog/xenserver/models/compute/gpu_groups.rb +25 -0
  35. data/lib/fog/xenserver/models/compute/guest_metrics.rb +29 -0
  36. data/lib/fog/xenserver/models/compute/host.rb +159 -0
  37. data/lib/fog/xenserver/models/compute/host_cpu.rb +38 -0
  38. data/lib/fog/xenserver/models/compute/host_crash_dump.rb +20 -0
  39. data/lib/fog/xenserver/models/compute/host_crash_dumps.rb +25 -0
  40. data/lib/fog/xenserver/models/compute/host_metrics.rb +29 -0
  41. data/lib/fog/xenserver/models/compute/host_patch.rb +25 -0
  42. data/lib/fog/xenserver/models/compute/host_patchs.rb +25 -0
  43. data/lib/fog/xenserver/models/compute/hosts.rb +29 -0
  44. data/lib/fog/xenserver/models/compute/network.rb +92 -0
  45. data/lib/fog/xenserver/models/compute/networks.rb +33 -0
  46. data/lib/fog/xenserver/models/compute/pbd.rb +40 -0
  47. data/lib/fog/xenserver/models/compute/pbds.rb +33 -0
  48. data/lib/fog/xenserver/models/compute/pci.rb +22 -0
  49. data/lib/fog/xenserver/models/compute/pcis.rb +25 -0
  50. data/lib/fog/xenserver/models/compute/pgpu.rb +20 -0
  51. data/lib/fog/xenserver/models/compute/pgpus.rb +25 -0
  52. data/lib/fog/xenserver/models/compute/pif.rb +57 -0
  53. data/lib/fog/xenserver/models/compute/pif_metrics.rb +28 -0
  54. data/lib/fog/xenserver/models/compute/pifs.rb +33 -0
  55. data/lib/fog/xenserver/models/compute/pifs_metrics.rb +25 -0
  56. data/lib/fog/xenserver/models/compute/pool.rb +79 -0
  57. data/lib/fog/xenserver/models/compute/pool_patch.rb +24 -0
  58. data/lib/fog/xenserver/models/compute/pool_patchs.rb +25 -0
  59. data/lib/fog/xenserver/models/compute/pools.rb +33 -0
  60. data/lib/fog/xenserver/models/compute/role.rb +19 -0
  61. data/lib/fog/xenserver/models/compute/roles.rb +25 -0
  62. data/lib/fog/xenserver/models/compute/server.rb +250 -0
  63. data/lib/fog/xenserver/models/compute/server_appliance.rb +21 -0
  64. data/lib/fog/xenserver/models/compute/server_appliances.rb +25 -0
  65. data/lib/fog/xenserver/models/compute/servers.rb +68 -0
  66. data/lib/fog/xenserver/models/compute/storage_manager.rb +28 -0
  67. data/lib/fog/xenserver/models/compute/storage_managers.rb +25 -0
  68. data/lib/fog/xenserver/models/compute/storage_repositories.rb +31 -0
  69. data/lib/fog/xenserver/models/compute/storage_repository.rb +93 -0
  70. data/lib/fog/xenserver/models/compute/tunnel.rb +20 -0
  71. data/lib/fog/xenserver/models/compute/tunnels.rb +25 -0
  72. data/lib/fog/xenserver/models/compute/vbd.rb +91 -0
  73. data/lib/fog/xenserver/models/compute/vbd_metrics.rb +27 -0
  74. data/lib/fog/xenserver/models/compute/vbds.rb +33 -0
  75. data/lib/fog/xenserver/models/compute/vdi.rb +105 -0
  76. data/lib/fog/xenserver/models/compute/vdis.rb +29 -0
  77. data/lib/fog/xenserver/models/compute/vif.rb +60 -0
  78. data/lib/fog/xenserver/models/compute/vifs.rb +29 -0
  79. data/lib/fog/xenserver/models/compute/vlan.rb +81 -0
  80. data/lib/fog/xenserver/models/compute/vlans.rb +39 -0
  81. data/lib/fog/xenserver/models/compute/vmpp.rb +35 -0
  82. data/lib/fog/xenserver/models/compute/vmpps.rb +25 -0
  83. data/lib/fog/xenserver/models/compute/vtpm.rb +18 -0
  84. data/lib/fog/xenserver/models/compute/vtpms.rb +25 -0
  85. data/lib/fog/xenserver/parser.rb +36 -0
  86. data/lib/fog/xenserver/parsers/get_hosts.rb +19 -0
  87. data/lib/fog/xenserver/parsers/get_networks.rb +19 -0
  88. data/lib/fog/xenserver/parsers/get_pools.rb +19 -0
  89. data/lib/fog/xenserver/parsers/get_records.rb +19 -0
  90. data/lib/fog/xenserver/parsers/get_storage_repositories.rb +19 -0
  91. data/lib/fog/xenserver/parsers/get_vbds.rb +19 -0
  92. data/lib/fog/xenserver/parsers/get_vifs.rb +19 -0
  93. data/lib/fog/xenserver/parsers/get_vms.rb +20 -0
  94. data/lib/fog/xenserver/requests/compute/clone_server.rb +31 -0
  95. data/lib/fog/xenserver/requests/compute/create_network.rb +42 -0
  96. data/lib/fog/xenserver/requests/compute/create_server.rb +130 -0
  97. data/lib/fog/xenserver/requests/compute/create_sr.rb +72 -0
  98. data/lib/fog/xenserver/requests/compute/create_vbd.rb +40 -0
  99. data/lib/fog/xenserver/requests/compute/create_vdi.rb +33 -0
  100. data/lib/fog/xenserver/requests/compute/create_vif.rb +57 -0
  101. data/lib/fog/xenserver/requests/compute/create_vlan.rb +35 -0
  102. data/lib/fog/xenserver/requests/compute/destroy_network.rb +33 -0
  103. data/lib/fog/xenserver/requests/compute/destroy_server.rb +22 -0
  104. data/lib/fog/xenserver/requests/compute/destroy_sr.rb +30 -0
  105. data/lib/fog/xenserver/requests/compute/destroy_vdi.rb +22 -0
  106. data/lib/fog/xenserver/requests/compute/destroy_vif.rb +22 -0
  107. data/lib/fog/xenserver/requests/compute/destroy_vlan.rb +32 -0
  108. data/lib/fog/xenserver/requests/compute/disable_host.rb +29 -0
  109. data/lib/fog/xenserver/requests/compute/eject_vbd.rb +22 -0
  110. data/lib/fog/xenserver/requests/compute/enable_host.rb +28 -0
  111. data/lib/fog/xenserver/requests/compute/get_record.rb +29 -0
  112. data/lib/fog/xenserver/requests/compute/get_records.rb +30 -0
  113. data/lib/fog/xenserver/requests/compute/insert_vbd.rb +22 -0
  114. data/lib/fog/xenserver/requests/compute/provision_server.rb +21 -0
  115. data/lib/fog/xenserver/requests/compute/reboot_host.rb +23 -0
  116. data/lib/fog/xenserver/requests/compute/reboot_server.rb +23 -0
  117. data/lib/fog/xenserver/requests/compute/scan_sr.rb +22 -0
  118. data/lib/fog/xenserver/requests/compute/set_affinity.rb +25 -0
  119. data/lib/fog/xenserver/requests/compute/set_attribute.rb +25 -0
  120. data/lib/fog/xenserver/requests/compute/shutdown_host.rb +23 -0
  121. data/lib/fog/xenserver/requests/compute/shutdown_server.rb +23 -0
  122. data/lib/fog/xenserver/requests/compute/snapshot_revert.rb +22 -0
  123. data/lib/fog/xenserver/requests/compute/snapshot_server.rb +22 -0
  124. data/lib/fog/xenserver/requests/compute/start_server.rb +23 -0
  125. data/lib/fog/xenserver/requests/compute/start_vm.rb +25 -0
  126. data/lib/fog/xenserver/requests/compute/unplug_pbd.rb +25 -0
  127. data/lib/fog/xenserver/requests/compute/unplug_vbd.rb +30 -0
  128. data/lib/fog/xenserver/utilities.rb +8 -0
  129. data/lib/fog/xenserver/version.rb +5 -0
  130. metadata +228 -0
@@ -0,0 +1,18 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Compute
5
+ class XenServer
6
+ class Vtpm < Fog::Model
7
+ # API Reference here:
8
+ # http://docs.vmd.citrix.com/XenServer/6.2.0/1.0/en_gb/api/?c=VTPM
9
+
10
+ identity :reference
11
+
12
+ attribute :__backend, :aliases => :backend
13
+ attribute :uuid
14
+ attribute :__vm, :aliases => :vm
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,25 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/xenserver/models/compute/vtpm'
3
+
4
+ module Fog
5
+ module Compute
6
+ class XenServer
7
+ class Vtpms < Fog::Collection
8
+ model Fog::Compute::XenServer::Vtpm
9
+
10
+ def all(options={})
11
+ data = service.get_records 'VTPM'
12
+ load(data)
13
+ end
14
+
15
+ def get( vtpm_ref )
16
+ if vtpm_ref && vtpm = service.get_record( vtpm_ref, 'VTPM' )
17
+ new(vtpm)
18
+ else
19
+ nil
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,36 @@
1
+ module Fog
2
+ module Parsers
3
+ module XenServer
4
+ class Base
5
+
6
+ attr_reader :response
7
+
8
+ def initialize
9
+ reset
10
+ end
11
+
12
+ def reset
13
+ @response = {}
14
+ end
15
+
16
+ def parse( data )
17
+ if data.kind_of? Hash
18
+ @response = data.symbolize_keys!
19
+ @response.each do |k,v|
20
+ if @response[k] == "OpaqueRef:NULL"
21
+ @response[k] = nil
22
+ end
23
+ end
24
+ elsif data.kind_of? Array
25
+ @response = data.first
26
+ elsif data.kind_of?(String) and data =~ /OpaqueRef:/
27
+ @response = data
28
+ end
29
+
30
+ @response
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Parsers
3
+ module XenServer
4
+ class GetHosts < Fog::Parsers::XenServer::Base
5
+
6
+ def reset
7
+ @response = []
8
+ end
9
+
10
+ def parse( data )
11
+ parser = Fog::Parsers::XenServer::Base.new
12
+ data.each_pair {|reference, host_hash| @response << parser.parse( host_hash ).merge(:reference => reference) }
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Parsers
3
+ module XenServer
4
+ class GetNetworks < Fog::Parsers::XenServer::Base
5
+
6
+ def reset
7
+ @response = []
8
+ end
9
+
10
+ def parse( data )
11
+ parser = Fog::Parsers::XenServer::Base.new
12
+ data.each_pair {|reference, network_hash| @response << parser.parse( network_hash ).merge(:reference => reference) }
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Parsers
3
+ module XenServer
4
+ class GetPools < Fog::Parsers::XenServer::Base
5
+
6
+ def reset
7
+ @response = []
8
+ end
9
+
10
+ def parse( data )
11
+ parser = Fog::Parsers::XenServer::Base.new
12
+ data.each_pair {|reference, pool_hash| @response << parser.parse( pool_hash ).merge(:reference => reference) }
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Parsers
3
+ module XenServer
4
+ class GetRecords < Fog::Parsers::XenServer::Base
5
+
6
+ def reset
7
+ @response = []
8
+ end
9
+
10
+ def parse( data )
11
+ parser = Fog::Parsers::XenServer::Base.new
12
+ data.each_pair {|reference, hash| @response << parser.parse( hash ).merge(:reference => reference) }
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Parsers
3
+ module XenServer
4
+ class GetStorageRepositories < Fog::Parsers::XenServer::Base
5
+
6
+ def reset
7
+ @response = []
8
+ end
9
+
10
+ def parse( data )
11
+ parser = Fog::Parsers::XenServer::Base.new
12
+ data.each_pair {|reference, sr_hash| @response << parser.parse( sr_hash ).merge(:reference => reference) }
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Parsers
3
+ module XenServer
4
+ class GetVBDs < Fog::Parsers::XenServer::Base
5
+
6
+ def reset
7
+ @response = []
8
+ end
9
+
10
+ def parse( data )
11
+ parser = Fog::Parsers::XenServer::Base.new
12
+ data.each_pair {|reference, hash| @response << parser.parse( hash ).merge(:reference => reference) }
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Parsers
3
+ module XenServer
4
+ class GetVIFs < Fog::Parsers::XenServer::Base
5
+
6
+ def reset
7
+ @response = []
8
+ end
9
+
10
+ def parse( data )
11
+ parser = Fog::Parsers::XenServer::Base.new
12
+ data.each_pair {|reference, vif_hash| @response << parser.parse( vif_hash ).merge(:reference => reference) }
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ module Fog
2
+ module Parsers
3
+ module XenServer
4
+
5
+ class GetVms < Fog::Parsers::XenServer::Base
6
+
7
+ def reset
8
+ @response = []
9
+ end
10
+
11
+ def parse( data )
12
+ parser = Fog::Parsers::XenServer::Base.new
13
+ data.each_pair {|reference, vm_hash| @response << parser.parse( vm_hash ).merge(:reference => reference) }
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,31 @@
1
+ module Fog
2
+ module Compute
3
+ class XenServer
4
+ class Real
5
+
6
+ def clone_server( server_name, template_ref )
7
+ # Clone the VM template
8
+ if template_ref.kind_of? Fog::Compute::XenServer::Server
9
+ template_ref = template_ref.reference
10
+ end
11
+ raise ArgumentError.new("Invalid template_ref") if template_ref.nil?
12
+ raise ArgumentError.new("Invalid template_ref") if server_name.nil?
13
+
14
+ ref = @connection.request(
15
+ {:parser => Fog::Parsers::XenServer::Base.new, :method => 'VM.clone'},
16
+ template_ref, server_name
17
+ )
18
+ end
19
+
20
+ end
21
+
22
+ class Mock
23
+
24
+ def clone_server( server_name, template_ref )
25
+ Fog::Mock.not_implemented
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,42 @@
1
+ module Fog
2
+ module Compute
3
+ class XenServer
4
+
5
+ class Real
6
+
7
+ # Create a Network
8
+ #
9
+ # @see http://docs.vmd.citrix.com/XenServer/6.0.0/1.0/en_gb/api/?c=network
10
+ #
11
+ def create_network( name, config = {} )
12
+ config.reject! { |k,v| v.nil? }
13
+
14
+ default_config = {
15
+ :name_label => name,
16
+ # Description is mandatory in XenAPI but we default to empty
17
+ :name_description => config[:description] || '',
18
+ # Mandatory, but can be empty
19
+ :other_config => {}
20
+ }.merge config
21
+
22
+ @connection.request(
23
+ {
24
+ :parser => Fog::Parsers::XenServer::Base.new,
25
+ :method => 'network.create'
26
+ },
27
+ default_config
28
+ )
29
+ end
30
+ end
31
+
32
+ class Mock
33
+
34
+ def create_network( name, description = '', config = {} )
35
+ Fog::Mock.not_implemented
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,130 @@
1
+ module Fog
2
+ module Compute
3
+ class XenServer
4
+ class Real
5
+
6
+ def get_vm_by_name(label)
7
+ @connection.request({:parser => Fog::Parsers::XenServer::Base.new, :method => 'VM.get_by_name_label' }, label)
8
+ end
9
+
10
+ def get_vm_by_uuid(uuid)
11
+ @connection.request({:parser => Fog::Parsers::XenServer::Base.new, :method => 'VM.get_by_uuid' }, uuid)
12
+ end
13
+
14
+ def create_server_raw(config = {})
15
+ config[:name_label] = config[:name] if config[:name]
16
+ config.delete :name
17
+ config[:affinity] = config[:__affinity] if config[:__affinity]
18
+ config.delete :__affinity
19
+ raise ArgumentError.new("Invalid :name_label attribute") \
20
+ if !config[:name_label]
21
+ raise ArgumentError.new("Invalid :affinity attribute") \
22
+ if not config[:affinity]
23
+ config[:affinity] = config[:affinity].reference \
24
+ if config[:affinity].kind_of? Fog::Compute::XenServer::Host
25
+ config.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
26
+ %w{ VCPUs_at_startup
27
+ VCPUs_max
28
+ VCPUs_params
29
+ PV_bootloader_args
30
+ PV_bootloader
31
+ PV_kernel
32
+ PV_ramdisk
33
+ PV_legacy_args
34
+ HVM_boot_policy
35
+ HVM_boot_params
36
+ }.each do |k|
37
+ if config[k.downcase.to_sym]
38
+ config[k.to_sym] = config[k.downcase.to_sym]
39
+ config.delete k.downcase.to_sym
40
+ end
41
+ end
42
+ vm_record = {
43
+ :name_label => '',
44
+ :name_description => 'description',
45
+ :user_version => '0',
46
+ :affinity => '',
47
+ :is_a_template => true,
48
+ :auto_power_on => false,
49
+ :memory_static_max => '536870912',
50
+ :memory_static_min => '536870912',
51
+ :memory_dynamic_max => '536870912',
52
+ :memory_dynamic_min => '536870912',
53
+ :VCPUs_params => {},
54
+ :VCPUs_max => '1',
55
+ :VCPUs_at_startup => '1',
56
+ :actions_after_shutdown => 'Destroy',
57
+ :actions_after_reboot => 'Restart',
58
+ :actions_after_crash => 'Restart',
59
+ :platform => { 'nx' => false, 'acpi' => true, 'apic' => 'true', 'pae' => true, 'viridian' => true},
60
+ :platform => {},
61
+ :other_config => {},
62
+ :pool_name => '',
63
+ :PV_bootloader => 'pygrub', #pvgrub, eliloader
64
+ :PV_kernel => '',
65
+ :PV_ramdisk => '',
66
+ :PV_args => '-- quiet console=hvc0',
67
+ :PV_bootloader_args => '',
68
+ :PV_legacy_args => '',
69
+ :HVM_boot_policy => '',
70
+ :HVM_boot_params => {},
71
+ :PCI_bus => '',
72
+ :recommendations => '',
73
+ }.merge config
74
+ ref = @connection.request({:parser => Fog::Parsers::XenServer::Base.new, :method => 'VM.create' }, vm_record)
75
+ ref
76
+ end
77
+
78
+ def create_server( name_label, template = nil, networks = [], extra_args = {})
79
+ if !networks.kind_of? Array
80
+ raise "Invalid networks argument"
81
+ end
82
+
83
+ if template.kind_of? String
84
+ template_string = template
85
+ # try template by UUID
86
+ template = servers.templates.find { |s| s.uuid == template_string }
87
+ if template.nil?
88
+ # Try with the template name just in case
89
+ template = servers.get get_vm_by_name(template_string)
90
+ end
91
+ end
92
+
93
+ if template.nil?
94
+ raise "Invalid template"
95
+ end
96
+
97
+ raise "Template #{template_string} does not exist" if template.allowed_operations.nil?
98
+ raise 'Clone Operation not Allowed' unless template.allowed_operations.include?('clone')
99
+
100
+ # Clone the VM template
101
+ ref = clone_server name_label, template.reference
102
+ # Add additional NICs
103
+ networks.each do |n|
104
+ create_vif ref, n.reference
105
+ end
106
+ if !extra_args[:auto_start] == false
107
+ @connection.request({:parser => Fog::Parsers::XenServer::Base.new, :method => 'VM.provision'}, ref)
108
+ start_vm( ref )
109
+ end
110
+
111
+ ref
112
+ end
113
+
114
+ end
115
+
116
+ class Mock
117
+
118
+ def create_server( name_label, template = nil, network = nil, extra_args = {})
119
+ Fog::Mock.not_implemented
120
+ end
121
+
122
+ def create_server_raw(config = {})
123
+ Fog::Mock.not_implemented
124
+ end
125
+
126
+ end
127
+
128
+ end
129
+ end
130
+ end