fog-xenserver 0.0.1.alpha

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