chef-provisioning-fog 0.18.0 → 0.19.0
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 +18 -7
- data/lib/chef/provisioning/fog_driver/providers/aws.rb +1 -1
- data/lib/chef/provisioning/fog_driver/providers/openstack.rb +45 -0
- data/lib/chef/provisioning/fog_driver/providers/xenserver.rb +69 -23
- data/lib/chef/provisioning/fog_driver/version.rb +1 -1
- data/spec/unit/providers/aws/credentials_spec.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb7a20a86bedac40466c9f1ef6f3ffe0e6f8ada8
|
4
|
+
data.tar.gz: e77ef8bf2a3f5a685e43495b4820c1d1c913c461
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1d2ea4273853a0b71603e5b5e36abe234646cdf8d5bc6297bb3d12987988349af74e5f0f83e5df64532c1e8ce9e2058f8178bb17091e34465cc6172b2675334
|
7
|
+
data.tar.gz: e43836b5011677d59a494b3cf94115e9583e284e8f1fd0fce7321084afaf4b6f7bff891928e86af9804dc1916e2b2d95710355bb0fe8481e75a8ec8b49a43a3d
|
data/README.md
CHANGED
@@ -37,9 +37,9 @@ For example:
|
|
37
37
|
```ruby
|
38
38
|
driver 'fog:AWS:<account_id>:<region>'
|
39
39
|
driver_options :compute_options => {
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
:aws_access_key_id => 'YOUR-ACCESS-KEY-ID',
|
41
|
+
:aws_secret_access_key => 'YOUR-SECRET-ACCESS-KEY',
|
42
|
+
:region => 'THE-REGION-YOU-WANT-TO-PROVISION-IN'
|
43
43
|
}
|
44
44
|
```
|
45
45
|
|
@@ -52,9 +52,9 @@ Update your `knife.rb` to contain your DigitalOcean API token and the driver:
|
|
52
52
|
|
53
53
|
```ruby
|
54
54
|
driver 'fog:DigitalOcean'
|
55
|
-
driver_options compute_options
|
56
|
-
|
57
|
-
|
55
|
+
driver_options :compute_options => {
|
56
|
+
:digitalocean_token => 'token'
|
57
|
+
}
|
58
58
|
```
|
59
59
|
|
60
60
|
For a full example see [examples/digitalocean/simple.rb](examples/digitalocean/simple.rb).
|
@@ -177,8 +177,19 @@ Docs TODO.
|
|
177
177
|
|
178
178
|
### XenServer
|
179
179
|
|
180
|
-
|
180
|
+
You should configure XenServer driver with your credentials:
|
181
|
+
|
182
|
+
```ruby
|
183
|
+
with_driver "fog:XenServer:<XEN-SERVER-IP/NAME>", compute_options: {
|
184
|
+
xenserver_username: 'MY-XEN-USER',
|
185
|
+
xenserver_password: 'MY-XEN-PASSWORD',
|
186
|
+
xenserver_defaults: {
|
187
|
+
'template' => 'ubuntu-14.04'
|
188
|
+
}
|
189
|
+
}
|
190
|
+
```
|
181
191
|
|
192
|
+
For a full example see [examples/xenserver/simple.rb](examples/xenserver/simple.rb).
|
182
193
|
|
183
194
|
### Cleaning up
|
184
195
|
|
@@ -134,7 +134,7 @@ module FogDriver
|
|
134
134
|
if machine_options[:is_windows]
|
135
135
|
Chef::Log.debug('Attaching WinRM data for user data.')
|
136
136
|
# Enable WinRM basic auth, HTTP and open the firewall
|
137
|
-
bootstrap_options[:user_data] = user_data
|
137
|
+
bootstrap_options[:user_data] = user_data if bootstrap_options[:user_data].nil?
|
138
138
|
end
|
139
139
|
bootstrap_options.delete(:tags) # we handle these separately for performance reasons
|
140
140
|
bootstrap_options
|
@@ -18,6 +18,25 @@ module FogDriver
|
|
18
18
|
super(machine_spec, machine_options)
|
19
19
|
end
|
20
20
|
|
21
|
+
def create_winrm_transport(machine_spec, machine_options, server)
|
22
|
+
if machine_options[:winrm].nil?
|
23
|
+
fail "You must provide winrm settings in machine_options to use the winrm transport!"
|
24
|
+
end
|
25
|
+
remote_host = determine_remote_host machine_spec, server
|
26
|
+
Chef::Log::info("Connecting to server #{remote_host}")
|
27
|
+
port = machine_options[:winrm][:port] || 5985
|
28
|
+
endpoint = "http://#{remote_host}:#{port}/wsman"
|
29
|
+
type = machine_options[:winrm][:type] || :negotiate
|
30
|
+
decrypted_password = machine_options[:winrm][:password] || ''
|
31
|
+
options = {
|
32
|
+
:user => machine_options[:winrm][:username] || 'Administrator',
|
33
|
+
:pass => decrypted_password,
|
34
|
+
:disable_sspi => !!machine_options[:winrm][:disable_sspi] || false,
|
35
|
+
:basic_auth_only => !!machine_options[:winrm][:basic_auth_only] || false
|
36
|
+
}
|
37
|
+
Chef::Provisioning::Transport::WinRM.new(endpoint, type, options, {})
|
38
|
+
end
|
39
|
+
|
21
40
|
def self.compute_options_for(provider, id, config)
|
22
41
|
new_compute_options = {}
|
23
42
|
new_compute_options[:provider] = provider
|
@@ -117,6 +136,32 @@ module FogDriver
|
|
117
136
|
end
|
118
137
|
end
|
119
138
|
|
139
|
+
def determine_remote_host(machine_spec, server)
|
140
|
+
transport_address_location = (machine_spec.reference['transport_address_location'] || :none).to_sym
|
141
|
+
|
142
|
+
if machine_spec.reference['use_private_ip_for_ssh']
|
143
|
+
# The machine_spec has the old config key, lets update it - a successful chef converge will save the machine_spec
|
144
|
+
# TODO in 2.0 get rid of this update
|
145
|
+
machine_spec.reference.delete('use_private_ip_for_ssh')
|
146
|
+
machine_spec.reference['transport_address_location'] = :private_ip
|
147
|
+
server.private_ip_address
|
148
|
+
elsif transport_address_location == :ip_addresses
|
149
|
+
server.ip_addresses.first
|
150
|
+
elsif transport_address_location == :private_ip
|
151
|
+
server.private_ip_address
|
152
|
+
elsif transport_address_location == :public_ip
|
153
|
+
server.public_ip_address
|
154
|
+
elsif !server.public_ip_address && server.private_ip_address
|
155
|
+
Chef::Log.warn("Server #{machine_spec.name} has no public floating_ip address. Using private floating_ip '#{server.private_ip_address}'. Set driver option 'transport_address_location' => :private_ip if this will always be the case ...")
|
156
|
+
server.private_ip_address
|
157
|
+
elsif server.public_ip_address
|
158
|
+
server.public_ip_address
|
159
|
+
else
|
160
|
+
raise "Server #{server.id} has no private or public IP address!"
|
161
|
+
# raise "Invalid 'transport_address_location'. They can only be 'public_ip', 'private_ip', or 'ip_addresses'."
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
120
165
|
end
|
121
166
|
end
|
122
167
|
end
|
@@ -11,6 +11,19 @@ class Chef
|
|
11
11
|
compute_options[:xenserver_username]
|
12
12
|
end
|
13
13
|
|
14
|
+
def bootstrap_options_for(action_handler, machine_spec, machine_options)
|
15
|
+
bootstrap_options = super
|
16
|
+
bootstrap_options[:tags] = bootstrap_options[:tags].map {|k,v| "#{k}: #{v}" }
|
17
|
+
bootstrap_options
|
18
|
+
end
|
19
|
+
|
20
|
+
def ssh_options_for(machine_spec, machine_options, server)
|
21
|
+
{ auth_methods: [ 'password' ],
|
22
|
+
timeout: (machine_options[:ssh_timeout] || 600),
|
23
|
+
password: machine_options[:ssh_password]
|
24
|
+
}.merge(machine_options[:ssh_options] || {})
|
25
|
+
end
|
26
|
+
|
14
27
|
def self.compute_options_for(provider, id, config)
|
15
28
|
new_compute_options = {}
|
16
29
|
new_compute_options[:provider] = provider
|
@@ -57,20 +70,22 @@ class Chef
|
|
57
70
|
end
|
58
71
|
result
|
59
72
|
end
|
60
|
-
|
73
|
+
|
61
74
|
def create_many_servers(num_servers, bootstrap_options, parallelizer)
|
62
75
|
parallelizer.parallelize(1.upto(num_servers)) do |i|
|
63
|
-
|
64
|
-
server
|
76
|
+
compute.default_template = bootstrap_options[:template] if bootstrap_options[:template]
|
77
|
+
raise 'No server can be created without a template, please set a template name as bootstrap_options' unless compute.default_template
|
78
|
+
server = compute.default_template.clone bootstrap_options[:name]
|
65
79
|
|
66
80
|
if bootstrap_options[:affinity]
|
67
81
|
host = compute.hosts.all.select { |h| h.address == bootstrap_options[:affinity] }.first
|
68
82
|
if !host
|
69
83
|
raise "Host with ID #{bootstrap_options[:affinity]} not found."
|
70
84
|
end
|
71
|
-
server.
|
85
|
+
server.affinity = host.reference
|
72
86
|
end
|
73
87
|
|
88
|
+
|
74
89
|
unless bootstrap_options[:memory].nil?
|
75
90
|
mem = (bootstrap_options[:memory].to_i * 1024 * 1024).to_s
|
76
91
|
server.set_attribute 'memory_limits', mem, mem, mem, mem
|
@@ -86,6 +101,13 @@ class Chef
|
|
86
101
|
attrs = {}
|
87
102
|
unless bootstrap_options[:network].nil?
|
88
103
|
network = bootstrap_options[:network]
|
104
|
+
net_names = network[:vifs]
|
105
|
+
if net_names
|
106
|
+
server.vifs.each {|x| x.destroy }
|
107
|
+
compute.networks.select { |net| Array(net_names).include? net.name }.each do |net|
|
108
|
+
compute.vifs.create vm: server, network: net, device: "0"
|
109
|
+
end
|
110
|
+
end
|
89
111
|
attrs['vm-data/ip'] = network[:vm_ip] if network[:vm_ip]
|
90
112
|
attrs['vm-data/gw'] = network[:vm_gateway] if network[:vm_gateway]
|
91
113
|
attrs['vm-data/nm'] = network[:vm_netmask] if network[:vm_netmask]
|
@@ -96,6 +118,28 @@ class Chef
|
|
96
118
|
end
|
97
119
|
end
|
98
120
|
|
121
|
+
userdevice = 1
|
122
|
+
(bootstrap_options[:additional_disks] || Hash.new).each do |name, data|
|
123
|
+
sr_name = data[:sr]
|
124
|
+
storage_repository = compute.storage_repositories.find { |sr| sr.name == sr_name }
|
125
|
+
raise 'You must specify sr name to add additional disks' unless storage_repository
|
126
|
+
raise 'You must specify size to add additional disk' unless data[:size]
|
127
|
+
|
128
|
+
gb = 1_073_741_824
|
129
|
+
size = data[:size].to_i * gb
|
130
|
+
|
131
|
+
|
132
|
+
vdi_params = { name: name}
|
133
|
+
vdi_params[:storage_repository] = storage_repository
|
134
|
+
vdi_params[:description] == data[:description] if data[:description]
|
135
|
+
vdi_params[:virtual_size] = size.to_s
|
136
|
+
vdi = compute.vdis.create vdi_params
|
137
|
+
|
138
|
+
compute.vbds.create vm: server, vdi: vdi, userdevice: userdevice.to_s, bootable: false
|
139
|
+
userdevice += 1
|
140
|
+
|
141
|
+
end
|
142
|
+
|
99
143
|
server.provision
|
100
144
|
yield server if block_given?
|
101
145
|
server
|
@@ -127,31 +171,33 @@ require 'fog/compute/models/server'
|
|
127
171
|
module Fog
|
128
172
|
module Compute
|
129
173
|
class XenServer
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
174
|
+
module Models
|
175
|
+
class Server < Fog::Compute::Server
|
176
|
+
def id
|
177
|
+
uuid
|
178
|
+
end
|
134
179
|
|
135
|
-
|
136
|
-
|
137
|
-
|
180
|
+
def state
|
181
|
+
attributes[:power_state]
|
182
|
+
end
|
138
183
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
else
|
143
|
-
wait_for { tools_installed? }
|
144
|
-
if tools_installed?
|
145
|
-
guest_metrics.networks.first[1]
|
184
|
+
def public_ip_address
|
185
|
+
if xenstore_data['vm-data/ip']
|
186
|
+
xenstore_data['vm-data/ip']
|
146
187
|
else
|
147
|
-
|
148
|
-
|
188
|
+
wait_for { tools_installed? }
|
189
|
+
if tools_installed?
|
190
|
+
guest_metrics.networks.first[1]
|
191
|
+
else
|
192
|
+
fail 'Unable to return IP address. Virtual machine does not ' \
|
193
|
+
'have XenTools installed or a timeout occurred.'
|
194
|
+
end
|
149
195
|
end
|
150
196
|
end
|
151
|
-
end
|
152
197
|
|
153
|
-
|
154
|
-
|
198
|
+
def ready?
|
199
|
+
running?
|
200
|
+
end
|
155
201
|
end
|
156
202
|
end
|
157
203
|
end
|
@@ -2,7 +2,7 @@ require 'chef/provisioning/fog_driver/providers/aws/credentials'
|
|
2
2
|
|
3
3
|
describe Chef::Provisioning::FogDriver::Providers::AWS::Credentials do
|
4
4
|
let(:credentials) { Chef::Provisioning::FogDriver::Providers::AWS::Credentials.new }
|
5
|
-
|
5
|
+
|
6
6
|
describe "#load_inis" do
|
7
7
|
let(:aws_credentials_ini_file) { File.join(File.expand_path('../../../../support', __FILE__), 'aws/ini-file.ini') }
|
8
8
|
|
@@ -15,7 +15,7 @@ describe Chef::Provisioning::FogDriver::Providers::AWS::Credentials do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should load the correct values" do
|
18
|
-
expect(credentials['default'][:aws_access_key_id]).to eq
|
18
|
+
expect(credentials['default'][:aws_access_key_id]).to eq 12345
|
19
19
|
expect(credentials['default'][:aws_secret_access_key]).to eq "abcde"
|
20
20
|
expect(credentials['default'][:region]).to eq "us-east-1"
|
21
21
|
expect(credentials['default'][:aws_session_token]).to eq "mysecret"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-provisioning-fog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.19.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Keiser
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2016-
|
15
|
+
date: 2016-06-02 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: chef-provisioning
|
@@ -189,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
189
|
version: '0'
|
190
190
|
requirements: []
|
191
191
|
rubyforge_project:
|
192
|
-
rubygems_version: 2.
|
192
|
+
rubygems_version: 2.5.1
|
193
193
|
signing_key:
|
194
194
|
specification_version: 4
|
195
195
|
summary: Driver for creating Fog instances in Chef Provisioning.
|