vagrant-xenserver 0.0.11 → 0.0.12
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.
- checksums.yaml +4 -4
- data/README.md +103 -25
- data/example_box/install_wheezy.sh +128 -0
- data/example_box/mkbox.sh +17 -0
- data/lib/vagrant-xenserver/action.rb +14 -4
- data/lib/vagrant-xenserver/action/clone_disk.rb +1 -1
- data/lib/vagrant-xenserver/action/clone_vm.rb +35 -0
- data/lib/vagrant-xenserver/action/connect_xs.rb +19 -11
- data/lib/vagrant-xenserver/action/create_template.rb +86 -0
- data/lib/vagrant-xenserver/action/create_vifs.rb +44 -23
- data/lib/vagrant-xenserver/action/create_vm.rb +14 -10
- data/lib/vagrant-xenserver/action/destroy_vm.rb +9 -6
- data/lib/vagrant-xenserver/action/download_xva.rb +96 -0
- data/lib/vagrant-xenserver/action/halt_vm.rb +1 -5
- data/lib/vagrant-xenserver/action/prepare_nfs_valid_ids.rb +1 -1
- data/lib/vagrant-xenserver/action/read_ssh_info.rb +48 -12
- data/lib/vagrant-xenserver/action/read_state.rb +4 -5
- data/lib/vagrant-xenserver/action/resume_vm.rb +3 -3
- data/lib/vagrant-xenserver/action/set_vm_params.rb +28 -0
- data/lib/vagrant-xenserver/action/start_vm.rb +7 -2
- data/lib/vagrant-xenserver/action/suspend_vm.rb +3 -3
- data/lib/vagrant-xenserver/action/upload_vhd.rb +130 -115
- data/lib/vagrant-xenserver/action/upload_xva.rb +63 -50
- data/lib/vagrant-xenserver/config.rb +45 -0
- data/lib/vagrant-xenserver/errors.rb +20 -0
- data/lib/vagrant-xenserver/plugin.rb +8 -0
- data/lib/vagrant-xenserver/util/exnhandler.rb +49 -0
- data/lib/vagrant-xenserver/version.rb +1 -1
- data/locales/en.yml +20 -1
- data/vagrant-xenserver.gemspec +1 -0
- metadata +24 -5
- data/lib/vagrant-xenserver/action/maybe_upload_disk.rb +0 -85
- data/test +0 -0
@@ -8,6 +8,16 @@ module VagrantPlugins
|
|
8
8
|
# @return [String]
|
9
9
|
attr_accessor :xs_host
|
10
10
|
|
11
|
+
# The port to communicate with the API on XenServer
|
12
|
+
#
|
13
|
+
# @return [Int]
|
14
|
+
attr_accessor :xs_port
|
15
|
+
|
16
|
+
# True if the API should be accessed over SSL/TLS
|
17
|
+
#
|
18
|
+
# @return [Bool]
|
19
|
+
attr_accessor :xs_use_ssl
|
20
|
+
|
11
21
|
# The XenServer username
|
12
22
|
#
|
13
23
|
# @return [String]
|
@@ -18,30 +28,61 @@ module VagrantPlugins
|
|
18
28
|
# @return [String]
|
19
29
|
attr_accessor :xs_password
|
20
30
|
|
31
|
+
# Name of the VM
|
32
|
+
#
|
33
|
+
# @return [String]
|
34
|
+
attr_accessor :name
|
35
|
+
|
21
36
|
# True if the VM should be PV
|
22
37
|
#
|
23
38
|
# @return [Bool]
|
24
39
|
attr_accessor :pv
|
25
40
|
|
41
|
+
# Timeout for commands sent to XenServer
|
42
|
+
#
|
43
|
+
# @return [Int]
|
44
|
+
attr_accessor :api_timeout
|
45
|
+
|
26
46
|
# Memory settings
|
27
47
|
#
|
28
48
|
# @return [Int]
|
29
49
|
attr_accessor :memory
|
30
50
|
|
51
|
+
# XVA URL: If this is set, we'll assume that the XenServer should directly download an XVA from the specified URL
|
52
|
+
#
|
53
|
+
# @return [String]
|
54
|
+
attr_accessor :xva_url
|
55
|
+
|
56
|
+
# Use HIMN: If this is set, we'll use the host-internal-management-network to connect to the VM (proxying via dom0)
|
57
|
+
# Useful if the guest does not have tools installed
|
58
|
+
attr_accessor :use_himn
|
59
|
+
|
31
60
|
def initialize
|
32
61
|
@xs_host = UNSET_VALUE
|
62
|
+
@xs_port = UNSET_VALUE
|
63
|
+
@xs_use_ssl = UNSET_VALUE
|
33
64
|
@xs_username = UNSET_VALUE
|
34
65
|
@xs_password = UNSET_VALUE
|
66
|
+
@name = UNSET_VALUE
|
35
67
|
@pv = UNSET_VALUE
|
68
|
+
@api_timeout = UNSET_VALUE
|
36
69
|
@memory = UNSET_VALUE
|
70
|
+
@xva_url = UNSET_VALUE
|
71
|
+
@use_himn = UNSET_VALUE
|
37
72
|
end
|
38
73
|
|
39
74
|
def finalize!
|
40
75
|
@xs_host = nil if @xs_host == UNSET_VALUE
|
76
|
+
@xs_port = 80 if @xs_port == UNSET_VALUE
|
77
|
+
@xs_use_ssl = false if @xs_use_ssl == UNSET_VALUE
|
41
78
|
@xs_username = nil if @xs_username == UNSET_VALUE
|
42
79
|
@xs_password = nil if @xs_password == UNSET_VALUE
|
80
|
+
@name = nil if @name == UNSET_VALUE
|
43
81
|
@pv = nil if @pv == UNSET_VALUE
|
82
|
+
@api_timeout = 60 if @api_timeout == UNSET_VALUE
|
44
83
|
@memory = 1024 if @memory == UNSET_VALUE
|
84
|
+
@xva_url = nil if @xva_url == UNSET_VALUE
|
85
|
+
@use_himn = false if @use_himn == UNSET_VALUE
|
45
86
|
end
|
46
87
|
|
47
88
|
def validate(machine)
|
@@ -50,8 +91,12 @@ module VagrantPlugins
|
|
50
91
|
errors << I18n.t("vagrant_xenserver.config.username_required") if @xs_username.nil?
|
51
92
|
errors << I18n.t("vagrant_xenserver.config.password_required") if @xs_password.nil?
|
52
93
|
|
94
|
+
if not (machine.config.vm.networks.any? { |type,options| type == :public_network })
|
95
|
+
errors << I18n.t("vagrant_xenserver.config.himn_required") if not @use_himn
|
96
|
+
end
|
53
97
|
{ "XenServer Provider" => errors }
|
54
98
|
end
|
55
99
|
end
|
56
100
|
end
|
57
101
|
end
|
102
|
+
|
@@ -26,6 +26,26 @@ module VagrantPlugins
|
|
26
26
|
class UnknownOS < VagrantXenServerError
|
27
27
|
error_key(:unknown_os)
|
28
28
|
end
|
29
|
+
|
30
|
+
class QemuImgError < VagrantXenServerError
|
31
|
+
error_key(:qemuimg_error)
|
32
|
+
end
|
33
|
+
|
34
|
+
class NoDefaultSR < VagrantXenServerError
|
35
|
+
error_key(:nodefaultsr_error)
|
36
|
+
end
|
37
|
+
|
38
|
+
class NoHostsAvailable < VagrantXenServerError
|
39
|
+
error_key(:nohostsavailable_error)
|
40
|
+
end
|
41
|
+
|
42
|
+
class Import404 < VagrantXenServerError
|
43
|
+
error_key(:import404)
|
44
|
+
end
|
45
|
+
|
46
|
+
class InsufficientSpace < VagrantXenServerError
|
47
|
+
error_key(:insufficientspace)
|
48
|
+
end
|
29
49
|
end
|
30
50
|
end
|
31
51
|
end
|
@@ -20,9 +20,17 @@ module VagrantPlugins
|
|
20
20
|
end
|
21
21
|
|
22
22
|
provider('xenserver', parallel: true) do
|
23
|
+
setup_i18n
|
24
|
+
|
23
25
|
require_relative "provider"
|
24
26
|
Provider
|
25
27
|
end
|
28
|
+
|
29
|
+
def self.setup_i18n
|
30
|
+
I18n.load_path << File.expand_path('locales/en.yml',
|
31
|
+
XenServer.source_root)
|
32
|
+
I18n.reload!
|
33
|
+
end
|
26
34
|
end
|
27
35
|
end
|
28
36
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# Handle the errors thrown by XenServer
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module XenServer
|
6
|
+
module MyUtil
|
7
|
+
class Exnhandler
|
8
|
+
|
9
|
+
def self.def(api,error)
|
10
|
+
# Default case: raise generic API error
|
11
|
+
raise Errors::APIError,
|
12
|
+
api: api,
|
13
|
+
error: String(error)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.handle(api,error)
|
17
|
+
case error[0]
|
18
|
+
when "IMPORT_ERROR"
|
19
|
+
case error[1]
|
20
|
+
when "404 Not Found"
|
21
|
+
raise Errors::Import404
|
22
|
+
else
|
23
|
+
Exnhandler.def(api,error)
|
24
|
+
end
|
25
|
+
when "SR_BACKEND_FAILURE_44"
|
26
|
+
raise Errors::InsufficientSpace
|
27
|
+
else
|
28
|
+
raise Errors::APIError,
|
29
|
+
api: api,
|
30
|
+
error: String(error)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.handle_xenapiexn(api,e,logger)
|
35
|
+
case e
|
36
|
+
when XenApi::Errors::SRFull
|
37
|
+
raise Errors::InsufficientSpace
|
38
|
+
when XenApi::Errors::GenericError
|
39
|
+
# Grotesque hack - get the error array back by parsing the string
|
40
|
+
# representation as JSON. Bleurgh!
|
41
|
+
self.handle(api,JSON.parse(e.message))
|
42
|
+
else
|
43
|
+
self.handle(api,e)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/locales/en.yml
CHANGED
@@ -7,4 +7,23 @@ en:
|
|
7
7
|
The XenServer username must be defined via "xs_username"
|
8
8
|
password_required: |-
|
9
9
|
The password for the XenServer username must be defined via "xs_password"
|
10
|
-
|
10
|
+
himn_required: |-
|
11
|
+
Either a public network must be specified or the Host Internal Management Network
|
12
|
+
parameter must be enabled. Public networks require the XenServer tools to be
|
13
|
+
installed in the guest. If this is not the case, the HIMN must be used by specifying
|
14
|
+
'use_himn=true' in the provider configuration.
|
15
|
+
errors:
|
16
|
+
login_error: |-
|
17
|
+
Failed to login to the XenServer. Check the "xs_username" and "xs_password" parameters
|
18
|
+
qemuimg_error: |-
|
19
|
+
Failure executing qemu-img. Check that it is installed and working, and that the VHD file referenced is valid.
|
20
|
+
nodefaultsr_error: |-
|
21
|
+
Failed to find a valid default SR for the pool. Please set one.
|
22
|
+
nohostsavailable_error: |-
|
23
|
+
No hosts were available to start the VM. Check the memory, disks and whether the hosts are enabled
|
24
|
+
import404: |-
|
25
|
+
The XVA import failed with a 404 Not Found error: Check the xva_url parameter of your box.
|
26
|
+
insufficientspace: |-
|
27
|
+
There is insufficient space available on the SR.
|
28
|
+
api_error: |-
|
29
|
+
The API call '%{api}' failed with error '%{error}'.
|
data/vagrant-xenserver.gemspec
CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_development_dependency "rake"
|
16
16
|
s.add_runtime_dependency "nokogiri", "~> 1.6.3"
|
17
17
|
s.add_runtime_dependency "json"
|
18
|
+
s.add_runtime_dependency "xenapi"
|
18
19
|
|
19
20
|
s.files = `git ls-files`.split($\)
|
20
21
|
s.executables = [] # gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-xenserver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Ludlam
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: xenapi
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: Enables Vagrant to manage XenServers.
|
56
70
|
email: jonathan.ludlam@citrix.com
|
57
71
|
executables: []
|
@@ -63,25 +77,30 @@ files:
|
|
63
77
|
- LICENSE
|
64
78
|
- README.md
|
65
79
|
- Rakefile
|
80
|
+
- example_box/install_wheezy.sh
|
66
81
|
- example_box/metadata.json
|
82
|
+
- example_box/mkbox.sh
|
67
83
|
- lib/vagrant-xenserver.rb
|
68
84
|
- lib/vagrant-xenserver/action.rb
|
69
85
|
- lib/vagrant-xenserver/action/clone_disk.rb
|
86
|
+
- lib/vagrant-xenserver/action/clone_vm.rb
|
70
87
|
- lib/vagrant-xenserver/action/connect_xs.rb
|
88
|
+
- lib/vagrant-xenserver/action/create_template.rb
|
71
89
|
- lib/vagrant-xenserver/action/create_vifs.rb
|
72
90
|
- lib/vagrant-xenserver/action/create_vm.rb
|
73
91
|
- lib/vagrant-xenserver/action/destroy_vm.rb
|
92
|
+
- lib/vagrant-xenserver/action/download_xva.rb
|
74
93
|
- lib/vagrant-xenserver/action/dummy.rb
|
75
94
|
- lib/vagrant-xenserver/action/halt_vm.rb
|
76
95
|
- lib/vagrant-xenserver/action/is_created.rb
|
77
96
|
- lib/vagrant-xenserver/action/is_running.rb
|
78
97
|
- lib/vagrant-xenserver/action/is_suspended.rb
|
79
|
-
- lib/vagrant-xenserver/action/maybe_upload_disk.rb
|
80
98
|
- lib/vagrant-xenserver/action/prepare_nfs_settings.rb
|
81
99
|
- lib/vagrant-xenserver/action/prepare_nfs_valid_ids.rb
|
82
100
|
- lib/vagrant-xenserver/action/read_ssh_info.rb
|
83
101
|
- lib/vagrant-xenserver/action/read_state.rb
|
84
102
|
- lib/vagrant-xenserver/action/resume_vm.rb
|
103
|
+
- lib/vagrant-xenserver/action/set_vm_params.rb
|
85
104
|
- lib/vagrant-xenserver/action/start_vm.rb
|
86
105
|
- lib/vagrant-xenserver/action/suspend_vm.rb
|
87
106
|
- lib/vagrant-xenserver/action/upload_vhd.rb
|
@@ -90,10 +109,10 @@ files:
|
|
90
109
|
- lib/vagrant-xenserver/errors.rb
|
91
110
|
- lib/vagrant-xenserver/plugin.rb
|
92
111
|
- lib/vagrant-xenserver/provider.rb
|
112
|
+
- lib/vagrant-xenserver/util/exnhandler.rb
|
93
113
|
- lib/vagrant-xenserver/util/uploader.rb
|
94
114
|
- lib/vagrant-xenserver/version.rb
|
95
115
|
- locales/en.yml
|
96
|
-
- test
|
97
116
|
- vagrant-xenserver.gemspec
|
98
117
|
homepage: http://github.com/jonludlam/vagrant-xenserver
|
99
118
|
licenses:
|
@@ -115,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
134
|
version: '0'
|
116
135
|
requirements: []
|
117
136
|
rubyforge_project:
|
118
|
-
rubygems_version: 2.
|
137
|
+
rubygems_version: 2.5.1
|
119
138
|
signing_key:
|
120
139
|
specification_version: 4
|
121
140
|
summary: Enables Vagrant to manage XenServers.
|
@@ -1,85 +0,0 @@
|
|
1
|
-
require "log4r"
|
2
|
-
require "xmlrpc/client"
|
3
|
-
require "vagrant-xenserver/util/uploader"
|
4
|
-
require "rexml/document"
|
5
|
-
|
6
|
-
module VagrantPlugins
|
7
|
-
module XenServer
|
8
|
-
module Action
|
9
|
-
class UploadXVA
|
10
|
-
def initialize(app, env)
|
11
|
-
@app = app
|
12
|
-
@logger = Log4r::Logger.new("vagrant::xenserver::actions::maybe_upload_disk")
|
13
|
-
end
|
14
|
-
|
15
|
-
def call(env)
|
16
|
-
#box_image_file = env[:machine].box.directory.join('export.xva').to_s
|
17
|
-
box_image_file = "/home/jludlam/devel/vagrant-xenserver/centos-6.5.vhd"
|
18
|
-
hostname = env[:machine].provider_config.xs_host
|
19
|
-
session = env[:session]
|
20
|
-
|
21
|
-
@logger.info("box name=" + env[:machine].box.name.to_s)
|
22
|
-
@logger.info("box version=" + env[:machine].box.version.to_s)
|
23
|
-
|
24
|
-
# Create a task to so we can get the result of the upload
|
25
|
-
task_result = env[:xc].call("task.create", env[:session], "vagrant-xva-upload",
|
26
|
-
"Task to track progress of the XVA upload from vagrant")
|
27
|
-
|
28
|
-
if task_result["Status"] != "Success"
|
29
|
-
raise Errors::APIError
|
30
|
-
end
|
31
|
-
|
32
|
-
task = task_result["Value"]
|
33
|
-
|
34
|
-
url = "https://#{hostname}/import?session_id=#{session}&task_id=#{task}"
|
35
|
-
|
36
|
-
uploader_options = {}
|
37
|
-
uploader_options[:ui] = env[:ui]
|
38
|
-
uploader_options[:insecure] = true
|
39
|
-
|
40
|
-
uploader = MyUtil::Uploader.new(box_image_file, url, uploader_options)
|
41
|
-
|
42
|
-
begin
|
43
|
-
uploader.upload!
|
44
|
-
rescue Errors::UploaderInterrupted
|
45
|
-
env[:ui].info(I18n.t("vagrant.xenserver.action.upload_xva.interrupted"))
|
46
|
-
raise
|
47
|
-
end
|
48
|
-
|
49
|
-
task_status = ""
|
50
|
-
|
51
|
-
begin
|
52
|
-
sleep(0.2)
|
53
|
-
task_status_result = env[:xc].call("task.get_status",env[:session],task)
|
54
|
-
if task_status_result["Status"] != "Success"
|
55
|
-
raise Errors::APIError
|
56
|
-
end
|
57
|
-
task_status = task_status_result["Value"]
|
58
|
-
end while task_status == "pending"
|
59
|
-
|
60
|
-
@logger.info("task_status="+task_status)
|
61
|
-
|
62
|
-
if task_status != "success"
|
63
|
-
raise Errors::APIError
|
64
|
-
end
|
65
|
-
|
66
|
-
task_result_result = env[:xc].call("task.get_result",env[:session],task)
|
67
|
-
if task_result_result["Status"] != "Success"
|
68
|
-
raise Errors::APIError
|
69
|
-
end
|
70
|
-
|
71
|
-
task_result = task_result_result["Value"]
|
72
|
-
|
73
|
-
doc = REXML::Document.new(task_result)
|
74
|
-
|
75
|
-
doc.elements.each('value/array/data/value') do |ele|
|
76
|
-
@logger.info("ele=" + ele.text)
|
77
|
-
end
|
78
|
-
|
79
|
-
@logger.info("task_result=" + task_result)
|
80
|
-
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
data/test
DELETED
Binary file
|