vcloud-core 0.2.0 → 0.3.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.
- data/.travis.yml +9 -0
- data/CHANGELOG.md +8 -0
- data/README.md +6 -5
- data/Rakefile +6 -1
- data/lib/vcloud/core/config_validator.rb +32 -35
- data/lib/vcloud/core/edge_gateway.rb +5 -5
- data/lib/vcloud/core/edge_gateway_interface.rb +8 -12
- data/lib/vcloud/core/org_vdc_network.rb +6 -6
- data/lib/vcloud/core/vapp.rb +5 -5
- data/lib/vcloud/core/vapp_template.rb +2 -3
- data/lib/vcloud/core/vdc.rb +4 -5
- data/lib/vcloud/core/version.rb +1 -1
- data/lib/vcloud/core/vm.rb +1 -2
- data/lib/vcloud/fog/service_interface.rb +21 -20
- data/spec/support/stub_fog_interface.rb +9 -6
- data/spec/vcloud/core/data/basic_preamble_test.erb +1 -0
- data/spec/vcloud/core/data/basic_preamble_test.erb.OUT +1 -0
- data/spec/vcloud/core/edge_gateway_interface_spec.rb +6 -19
- data/spec/vcloud/core/edge_gateway_spec.rb +2 -2
- data/spec/vcloud/core/metadata_helper_spec.rb +7 -7
- data/spec/vcloud/core/org_vdc_network_spec.rb +6 -6
- data/spec/vcloud/core/query_runner_spec.rb +18 -35
- data/spec/vcloud/core/vapp_spec.rb +16 -11
- data/spec/vcloud/core/vapp_template_spec.rb +1 -1
- data/spec/vcloud/core/vdc_spec.rb +1 -1
- data/spec/vcloud/core/vm_spec.rb +2 -2
- data/vcloud-core.gemspec +1 -0
- metadata +20 -3
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## 0.3.0 (2014-05-13)
|
2
|
+
|
3
|
+
Features:
|
4
|
+
|
5
|
+
- Switch from deprecated Fog get_network request to get_network_complete
|
6
|
+
- Breaking change to OrgVdcNetwork#vcloud_attributes due to Fog deprecation fix
|
7
|
+
- Updated vm/vApp logging levels to make use of quiet/normal/verbose operation
|
8
|
+
|
1
9
|
## 0.2.0 (2014-05-06)
|
2
10
|
|
3
11
|
Features:
|
data/README.md
CHANGED
@@ -145,12 +145,13 @@ If you want to be sure you are pinning to 5.1, or use 5.5, you can set the API v
|
|
145
145
|
|
146
146
|
## Testing
|
147
147
|
|
148
|
-
|
149
|
-
Runs the unit tests and feature tests.
|
148
|
+
Run the default suite of tests (e.g. lint, unit, features):
|
150
149
|
|
151
|
-
|
152
|
-
|
153
|
-
|
150
|
+
bundle exec rake
|
151
|
+
|
152
|
+
Run the integration tests (slower and requires a real environment):
|
153
|
+
|
154
|
+
bundle exec rake integration
|
154
155
|
|
155
156
|
### setting up and describing your environment for test runs
|
156
157
|
|
data/Rakefile
CHANGED
@@ -22,7 +22,12 @@ RSpec::Core::RakeTask.new('integration') do |t|
|
|
22
22
|
end
|
23
23
|
|
24
24
|
require "gem_publisher"
|
25
|
-
task :publish_gem do
|
25
|
+
task :publish_gem do
|
26
26
|
gem = GemPublisher.publish_if_updated("vcloud-core.gemspec", :rubygems)
|
27
27
|
puts "Published #{gem}" if gem
|
28
28
|
end
|
29
|
+
|
30
|
+
require 'rubocop/rake_task'
|
31
|
+
Rubocop::RakeTask.new(:rubocop) do |task|
|
32
|
+
task.options = ['--lint']
|
33
|
+
end
|
@@ -3,11 +3,11 @@ require 'ipaddr'
|
|
3
3
|
module Vcloud
|
4
4
|
module Core
|
5
5
|
class ConfigValidator
|
6
|
-
|
6
|
+
|
7
7
|
attr_reader :key, :data, :schema, :type, :errors
|
8
|
-
|
8
|
+
|
9
9
|
VALID_ALPHABETICAL_VALUES_FOR_IP_RANGE = %w(Any external internal)
|
10
|
-
|
10
|
+
|
11
11
|
def initialize(key, data, schema)
|
12
12
|
raise "Nil schema" unless schema
|
13
13
|
raise "Invalid schema" unless schema.key?(:type)
|
@@ -18,21 +18,21 @@ module Vcloud
|
|
18
18
|
@key = key
|
19
19
|
validate
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def valid?
|
23
23
|
@errors.empty?
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def self.validate(key, data, schema)
|
27
27
|
new(key, data, schema)
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
private
|
31
|
-
|
31
|
+
|
32
32
|
def validate
|
33
33
|
self.send("validate_#{type}".to_sym)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def validate_string
|
37
37
|
unless @data.is_a? String
|
38
38
|
errors << "#{key}: #{@data} is not a string"
|
@@ -41,14 +41,14 @@ module Vcloud
|
|
41
41
|
return unless check_emptyness_ok
|
42
42
|
return unless check_matcher_matches
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
def validate_string_or_number
|
46
46
|
unless data.is_a?(String) || data.is_a?(Numeric)
|
47
47
|
@errors << "#{key}: #{@data} is not a string_or_number"
|
48
48
|
return
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
def validate_ip_address
|
53
53
|
unless data.is_a?(String)
|
54
54
|
@errors << "#{key}: #{@data} is not a valid ip_address"
|
@@ -56,7 +56,7 @@ module Vcloud
|
|
56
56
|
end
|
57
57
|
@errors << "#{key}: #{@data} is not a valid ip_address" unless valid_ip_address?(data)
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
def validate_ip_address_range
|
61
61
|
unless data.is_a?(String)
|
62
62
|
@errors << "#{key}: #{@data} is not a valid IP address range. Valid values can be IP address, CIDR, IP range, 'Any','internal' and 'external'."
|
@@ -65,7 +65,7 @@ module Vcloud
|
|
65
65
|
valid = valid_cidr_or_ip_address? || valid_alphabetical_ip_range? || valid_ip_range?
|
66
66
|
@errors << "#{key}: #{@data} is not a valid IP address range. Valid values can be IP address, CIDR, IP range, 'Any','internal' and 'external'." unless valid
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
def valid_cidr_or_ip_address?
|
70
70
|
begin
|
71
71
|
ip = IPAddr.new(data)
|
@@ -74,11 +74,11 @@ module Vcloud
|
|
74
74
|
false
|
75
75
|
end
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
def valid_alphabetical_ip_range?
|
79
79
|
VALID_ALPHABETICAL_VALUES_FOR_IP_RANGE.include?(data)
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
def valid_ip_address? ip_address
|
83
83
|
begin
|
84
84
|
#valid formats recognized by IPAddr are : “address”, “address/prefixlen” and “address/mask”.
|
@@ -90,7 +90,7 @@ module Vcloud
|
|
90
90
|
false
|
91
91
|
end
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
def valid_ip_range?
|
95
95
|
range_parts = data.split('-')
|
96
96
|
return false if range_parts.size != 2
|
@@ -99,11 +99,11 @@ module Vcloud
|
|
99
99
|
valid_ip_address?(start_address) && valid_ip_address?(end_address) &&
|
100
100
|
valid_start_and_end_address_combination?(end_address, start_address)
|
101
101
|
end
|
102
|
-
|
102
|
+
|
103
103
|
def valid_start_and_end_address_combination?(end_address, start_address)
|
104
104
|
IPAddr.new(start_address) < IPAddr.new(end_address)
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
107
|
def validate_hash
|
108
108
|
unless data.is_a? Hash
|
109
109
|
@errors << "#{key}: is not a hash"
|
@@ -118,7 +118,7 @@ module Vcloud
|
|
118
118
|
end
|
119
119
|
end
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
122
|
def validate_array
|
123
123
|
unless data.is_a? Array
|
124
124
|
@errors << "#{key} is not an array"
|
@@ -135,23 +135,22 @@ module Vcloud
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
end
|
138
|
-
|
138
|
+
|
139
139
|
def validate_enum
|
140
|
-
|
141
|
-
|
142
|
-
end
|
140
|
+
acceptable_values = schema[:acceptable_values]
|
141
|
+
raise "Must set :acceptable_values for type 'enum'" unless acceptable_values.is_a?(Array)
|
143
142
|
unless acceptable_values.include?(data)
|
144
143
|
acceptable_values_string = acceptable_values.collect {|v| "'#{v}'" }.join(', ')
|
145
144
|
@errors << "#{key}: #{@data} is not a valid value. Acceptable values are #{acceptable_values_string}."
|
146
145
|
end
|
147
146
|
end
|
148
|
-
|
147
|
+
|
149
148
|
def validate_boolean
|
150
149
|
unless [true, false].include?(data)
|
151
150
|
@errors << "#{key}: #{data} is not a valid boolean value."
|
152
151
|
end
|
153
152
|
end
|
154
|
-
|
153
|
+
|
155
154
|
def check_emptyness_ok
|
156
155
|
unless schema.key?(:allowed_empty) && schema[:allowed_empty]
|
157
156
|
if data.empty?
|
@@ -161,9 +160,10 @@ module Vcloud
|
|
161
160
|
end
|
162
161
|
true
|
163
162
|
end
|
164
|
-
|
163
|
+
|
165
164
|
def check_matcher_matches
|
166
|
-
|
165
|
+
regex = schema[:matcher]
|
166
|
+
return unless regex
|
167
167
|
raise "#{key}: #{regex} is not a Regexp" unless regex.is_a? Regexp
|
168
168
|
unless data =~ regex
|
169
169
|
@errors << "#{key}: #{data} does not match"
|
@@ -171,7 +171,7 @@ module Vcloud
|
|
171
171
|
end
|
172
172
|
true
|
173
173
|
end
|
174
|
-
|
174
|
+
|
175
175
|
def check_hash_parameter(sub_key, sub_schema)
|
176
176
|
if sub_schema.key?(:required) && sub_schema[:required] == false
|
177
177
|
# short circuit out if we do not have the key, but it's not required.
|
@@ -190,15 +190,12 @@ module Vcloud
|
|
190
190
|
@errors = errors + sub_validator.errors
|
191
191
|
end
|
192
192
|
end
|
193
|
-
|
193
|
+
|
194
194
|
def check_for_unknown_parameters
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
if schema[:permit_unknown_parameters]
|
200
|
-
return true
|
201
|
-
end
|
195
|
+
internals = schema[:internals]
|
196
|
+
# if there are no parameters specified, then assume all are ok.
|
197
|
+
return true unless internals
|
198
|
+
return true if schema[:permit_unknown_parameters]
|
202
199
|
data.keys.each do |k|
|
203
200
|
@errors << "#{key}: parameter '#{k}' is invalid" unless internals[k]
|
204
201
|
end
|
@@ -13,10 +13,9 @@ module Vcloud
|
|
13
13
|
|
14
14
|
def self.get_ids_by_name(name)
|
15
15
|
q = Vcloud::Core::QueryRunner.new
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
res.collect do |record|
|
16
|
+
query_results = q.run('edgeGateway', :filter => "name==#{name}")
|
17
|
+
raise "Error finding edgeGateway by name #{name}" unless query_results
|
18
|
+
query_results.collect do |record|
|
20
19
|
record[:href].split('/').last if record.key?(:href)
|
21
20
|
end
|
22
21
|
end
|
@@ -58,7 +57,8 @@ module Vcloud
|
|
58
57
|
def interfaces
|
59
58
|
gateway_config = vcloud_attributes[:Configuration]
|
60
59
|
return [] unless gateway_config[:GatewayInterfaces]
|
61
|
-
|
60
|
+
gateway_interfaces = gateway_config[:GatewayInterfaces][:GatewayInterface]
|
61
|
+
return [] unless gateway_interfaces
|
62
62
|
gateway_interfaces.map do |vcloud_gateway_interface_hash|
|
63
63
|
EdgeGatewayInterface.new(vcloud_gateway_interface_hash)
|
64
64
|
end
|
@@ -5,20 +5,16 @@ module Vcloud
|
|
5
5
|
attr_accessor :name, :network_href, :network_name
|
6
6
|
|
7
7
|
def initialize(gateway_interface_hash)
|
8
|
-
|
9
|
-
|
10
|
-
unless @name = gateway_interface_hash[:Name]
|
11
|
-
raise "Argument error: must have a :Name"
|
12
|
-
end
|
13
|
-
unless network_section = gateway_interface_hash[:Network]
|
14
|
-
raise "Argument error: must have a :Network section"
|
8
|
+
if gateway_interface_hash.nil?
|
9
|
+
raise "EdgeGatewayInterface: gateway_interface_hash cannot be nil"
|
15
10
|
end
|
16
|
-
unless
|
17
|
-
raise "
|
18
|
-
end
|
19
|
-
unless @network_name = network_section[:name]
|
20
|
-
raise "Argument error: must have a :Network[:name]"
|
11
|
+
unless gateway_interface_hash[:Name] && gateway_interface_hash[:Network]
|
12
|
+
raise "EdgeGatewayInterface: bad input: #{gateway_interface_hash}"
|
21
13
|
end
|
14
|
+
@vcloud_gateway_interface = gateway_interface_hash
|
15
|
+
@name = gateway_interface_hash[:Name]
|
16
|
+
@network_href = gateway_interface_hash[:Network][:href]
|
17
|
+
@network_name = gateway_interface_hash[:Network][:name]
|
22
18
|
end
|
23
19
|
|
24
20
|
def network_id
|
@@ -12,13 +12,15 @@ module Vcloud
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.provision(config)
|
15
|
-
raise "Must specify a name" unless
|
16
|
-
raise "Must specify a vdc_name" unless
|
17
|
-
|
15
|
+
raise "Must specify a name" unless config[:name]
|
16
|
+
raise "Must specify a vdc_name" unless config[:vdc_name]
|
18
17
|
unless config[:fence_mode] == 'isolated' || config[:fence_mode] == 'natRouted'
|
19
18
|
raise "fence_mode #{config[:fence_mode]} not supported. Must be 'isolated' or 'natRouted'"
|
20
19
|
end
|
21
20
|
|
21
|
+
name = config[:name]
|
22
|
+
vdc_name = config[:vdc_name]
|
23
|
+
|
22
24
|
config[:is_shared] = false unless config[:is_shared]
|
23
25
|
|
24
26
|
if config[:fence_mode] == 'natRouted'
|
@@ -44,7 +46,7 @@ module Vcloud
|
|
44
46
|
end
|
45
47
|
|
46
48
|
def vcloud_attributes
|
47
|
-
Vcloud::Fog::ServiceInterface.new.
|
49
|
+
Vcloud::Fog::ServiceInterface.new.get_network_complete(id)
|
48
50
|
end
|
49
51
|
|
50
52
|
def name
|
@@ -59,8 +61,6 @@ module Vcloud
|
|
59
61
|
Vcloud::Fog::ServiceInterface.new.delete_network(id)
|
60
62
|
end
|
61
63
|
|
62
|
-
private
|
63
|
-
|
64
64
|
def self.construct_network_options(config)
|
65
65
|
opts = {}
|
66
66
|
opts[:Description] = config[:description] if config.key?(:description)
|
data/lib/vcloud/core/vapp.rb
CHANGED
@@ -14,14 +14,13 @@ module Vcloud
|
|
14
14
|
|
15
15
|
def self.get_by_name(name)
|
16
16
|
q = Vcloud::Core::QueryRunner.new
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
case res.size
|
17
|
+
query_results = q.run('vApp', :filter => "name==#{name}")
|
18
|
+
raise "Error finding vApp by name #{name}" unless query_results
|
19
|
+
case query_results.size
|
21
20
|
when 0
|
22
21
|
raise "vApp #{name} not found"
|
23
22
|
when 1
|
24
|
-
return self.new(
|
23
|
+
return self.new(query_results.first[:href].split('/').last)
|
25
24
|
else
|
26
25
|
raise "found multiple vApp entities with name #{name}!"
|
27
26
|
end
|
@@ -33,6 +32,7 @@ module Vcloud
|
|
33
32
|
|
34
33
|
module STATUS
|
35
34
|
RUNNING = 4
|
35
|
+
POWERED_OFF = 8
|
36
36
|
end
|
37
37
|
|
38
38
|
def name
|
@@ -26,9 +26,8 @@ module Vcloud
|
|
26
26
|
def self.get_ids_by_name_and_catalog name, catalog_name
|
27
27
|
raise "provide Catalog and vAppTemplate name" unless name && catalog_name
|
28
28
|
q = Vcloud::Core::QueryRunner.new
|
29
|
-
|
30
|
-
|
31
|
-
end
|
29
|
+
query_results = q.run('vAppTemplate', :filter => "name==#{name};catalogName==#{catalog_name}")
|
30
|
+
raise "Error retreiving #{q.type} query '#{q.filter}'" unless query_results
|
32
31
|
query_results.collect do |record|
|
33
32
|
record[:href].split('/').last if record.key?(:href)
|
34
33
|
end
|
data/lib/vcloud/core/vdc.rb
CHANGED
@@ -13,11 +13,10 @@ module Vcloud
|
|
13
13
|
|
14
14
|
def self.get_by_name(name)
|
15
15
|
q = Vcloud::Core::QueryRunner.new
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
return self.new(res.first[:href].split('/').last)
|
16
|
+
query_results = q.run('orgVdc', :filter => "name==#{name}")
|
17
|
+
raise "Error finding vDC by name #{name}" unless query_results
|
18
|
+
raise "vDc #{name} not found" unless query_results.size == 1
|
19
|
+
return self.new(query_results.first[:href].split('/').last)
|
21
20
|
end
|
22
21
|
|
23
22
|
def vcloud_attributes
|
data/lib/vcloud/core/version.rb
CHANGED
data/lib/vcloud/core/vm.rb
CHANGED
@@ -73,7 +73,7 @@ module Vcloud
|
|
73
73
|
vm = Vcloud::Fog::ModelInterface.new.get_vm_by_href(href)
|
74
74
|
if extra_disks
|
75
75
|
extra_disks.each do |extra_disk|
|
76
|
-
Vcloud::Core.logger.
|
76
|
+
Vcloud::Core.logger.debug("adding a disk of size #{extra_disk[:size]}MB into VM #{id}")
|
77
77
|
vm.disks.create(extra_disk[:size])
|
78
78
|
end
|
79
79
|
end
|
@@ -113,7 +113,6 @@ module Vcloud
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def generate_preamble(script_path, script_post_processor, vars)
|
116
|
-
vapp_name = @vapp.name
|
117
116
|
script = ERB.new(File.read(File.expand_path(script_path)), nil, '>-').result(binding)
|
118
117
|
if script_post_processor
|
119
118
|
script = Open3.capture2(File.expand_path(script_post_processor),
|
@@ -8,7 +8,7 @@ module Vcloud
|
|
8
8
|
def_delegators :@fog, :get_vapp, :organizations, :org_name, :delete_vapp, :vcloud_token, :end_point,
|
9
9
|
:get_execute_query, :get_vapp_metadata, :power_off_vapp, :shutdown_vapp, :session,
|
10
10
|
:post_instantiate_vapp_template, :put_memory, :put_cpu, :power_on_vapp, :put_vapp_metadata_value,
|
11
|
-
:put_vm, :get_edge_gateway, :
|
11
|
+
:put_vm, :get_edge_gateway, :get_network_complete, :delete_network, :post_create_org_vdc_network,
|
12
12
|
:post_configure_edge_gateway_services
|
13
13
|
|
14
14
|
#########################
|
@@ -40,14 +40,14 @@ module Vcloud
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def post_instantiate_vapp_template(vdc, template, name, params)
|
43
|
-
Vcloud::Core.logger.
|
43
|
+
Vcloud::Core.logger.debug("instantiating #{name} vapp in #{vdc[:name]}")
|
44
44
|
vapp = @vcloud.post_instantiate_vapp_template(extract_id(vdc), template, name, params).body
|
45
45
|
@vcloud.process_task(vapp[:Tasks][:Task])
|
46
46
|
@vcloud.get_vapp(extract_id(vapp)).body
|
47
47
|
end
|
48
48
|
|
49
49
|
def put_memory(vm_id, memory)
|
50
|
-
Vcloud::Core.logger.
|
50
|
+
Vcloud::Core.logger.debug("putting #{memory}MB memory into VM #{vm_id}")
|
51
51
|
task = @vcloud.put_memory(vm_id, memory).body
|
52
52
|
@vcloud.process_task(task)
|
53
53
|
end
|
@@ -62,13 +62,13 @@ module Vcloud
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def put_cpu(vm_id, cpu)
|
65
|
-
Vcloud::Core.logger.
|
65
|
+
Vcloud::Core.logger.debug("putting #{cpu} CPU(s) into VM #{vm_id}")
|
66
66
|
task = @vcloud.put_cpu(vm_id, cpu).body
|
67
67
|
@vcloud.process_task(task)
|
68
68
|
end
|
69
69
|
|
70
70
|
def put_vm(id, name, options={})
|
71
|
-
Vcloud::Core.logger.
|
71
|
+
Vcloud::Core.logger.debug("updating name : #{name}, :options => #{options} in vm : #{id}")
|
72
72
|
task = @vcloud.put_vm(id, name, options).body
|
73
73
|
@vcloud.process_task(task)
|
74
74
|
end
|
@@ -108,8 +108,8 @@ module Vcloud
|
|
108
108
|
@vcloud.process_task(task)
|
109
109
|
end
|
110
110
|
|
111
|
-
def
|
112
|
-
@vcloud.
|
111
|
+
def get_network_complete(id)
|
112
|
+
@vcloud.get_network_complete(id).body
|
113
113
|
end
|
114
114
|
|
115
115
|
def delete_network(id)
|
@@ -118,10 +118,10 @@ module Vcloud
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def post_create_org_vdc_network(vdc_id, name, options)
|
121
|
-
Vcloud::Core.logger.
|
121
|
+
Vcloud::Core.logger.debug("creating #{options[:fence_mode]} OrgVdcNetwork #{name} in vDC #{vdc_id}")
|
122
122
|
attrs = @vcloud.post_create_org_vdc_network(vdc_id, name, options).body
|
123
123
|
@vcloud.process_task(attrs[:Tasks][:Task])
|
124
|
-
|
124
|
+
get_network_complete(extract_id(attrs))
|
125
125
|
end
|
126
126
|
|
127
127
|
def post_configure_edge_gateway_services(edgegw_id, config)
|
@@ -129,7 +129,7 @@ module Vcloud
|
|
129
129
|
begin
|
130
130
|
task = @vcloud.post_configure_edge_gateway_services(edgegw_id, config).body
|
131
131
|
@vcloud.process_task(task)
|
132
|
-
rescue
|
132
|
+
rescue => ex
|
133
133
|
Vcloud::Core.logger.error("Could not update EdgeGateway #{edgegw_id} : #{ex}")
|
134
134
|
raise
|
135
135
|
end
|
@@ -141,7 +141,7 @@ module Vcloud
|
|
141
141
|
end
|
142
142
|
|
143
143
|
def power_on_vapp(vapp_id)
|
144
|
-
Vcloud::Core.logger.
|
144
|
+
Vcloud::Core.logger.debug("Powering on vApp #{vapp_id}")
|
145
145
|
task = @vcloud.post_power_on_vapp(vapp_id).body
|
146
146
|
@vcloud.process_task(task)
|
147
147
|
end
|
@@ -156,7 +156,7 @@ module Vcloud
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def put_vapp_metadata_value(id, k, v)
|
159
|
-
Vcloud::Core.logger.
|
159
|
+
Vcloud::Core.logger.debug("putting metadata pair '#{k}'=>'#{v}' to #{id}")
|
160
160
|
# need to convert key to_s since Fog 0.17 borks on symbol key
|
161
161
|
task = @vcloud.put_vapp_metadata_item_metadata(id, k.to_s, v).body
|
162
162
|
@vcloud.process_task(task)
|
@@ -203,11 +203,11 @@ module Vcloud
|
|
203
203
|
|
204
204
|
def put_network_connection_system_section_vapp(vm_id, section)
|
205
205
|
begin
|
206
|
-
Vcloud::Core.logger.
|
206
|
+
Vcloud::Core.logger.debug("adding NIC into VM #{vm_id}")
|
207
207
|
@fog.put_network_connection_system_section_vapp(vm_id, section)
|
208
|
-
rescue
|
209
|
-
Vcloud::Core.logger.
|
210
|
-
Vcloud::Core.logger.
|
208
|
+
rescue => ex
|
209
|
+
Vcloud::Core.logger.error("failed to put_network_connection_system_section_vapp for vm #{vm_id}: #{ex}")
|
210
|
+
Vcloud::Core.logger.debug("requested network section : #{section.inspect}")
|
211
211
|
raise
|
212
212
|
end
|
213
213
|
end
|
@@ -222,16 +222,17 @@ module Vcloud
|
|
222
222
|
|
223
223
|
def put_guest_customization_section(vm_id, vm_name, script)
|
224
224
|
begin
|
225
|
-
Vcloud::Core.logger.
|
225
|
+
Vcloud::Core.logger.debug("configuring guest customization section for vm : #{vm_id}")
|
226
226
|
customization_req = {
|
227
227
|
:Enabled => true,
|
228
228
|
:CustomizationScript => script,
|
229
229
|
:ComputerName => vm_name
|
230
230
|
}
|
231
231
|
@fog.put_guest_customization_section_vapp(vm_id, customization_req)
|
232
|
-
rescue
|
233
|
-
Vcloud::Core.logger.
|
234
|
-
Vcloud::Core.logger.
|
232
|
+
rescue => ex
|
233
|
+
Vcloud::Core.logger.error("Failed to update guest customization section: #{ex}")
|
234
|
+
Vcloud::Core.logger.debug("=== interpolated preamble:")
|
235
|
+
Vcloud::Core.logger.debug(script)
|
235
236
|
raise
|
236
237
|
end
|
237
238
|
end
|
@@ -8,7 +8,7 @@ class StubFogInterface
|
|
8
8
|
|
9
9
|
def vdc_object_by_name(vdc_name)
|
10
10
|
vdc = OpenStruct.new
|
11
|
-
vdc.name =
|
11
|
+
vdc.name = vdc_name
|
12
12
|
vdc
|
13
13
|
end
|
14
14
|
|
@@ -16,7 +16,7 @@ class StubFogInterface
|
|
16
16
|
{ :href => '/vappTemplate-12345678-90ab-cdef-0123-4567890abcde' }
|
17
17
|
end
|
18
18
|
|
19
|
-
def find_networks(
|
19
|
+
def find_networks(_network_names, _vdc_name)
|
20
20
|
[{
|
21
21
|
:name => 'org-vdc-1-net-1',
|
22
22
|
:href => '/org-vdc-1-net-1-id',
|
@@ -24,7 +24,10 @@ class StubFogInterface
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def get_vapp(id)
|
27
|
-
{
|
27
|
+
{
|
28
|
+
:name => 'test-vapp-1',
|
29
|
+
:href => "/#{id}",
|
30
|
+
}
|
28
31
|
end
|
29
32
|
|
30
33
|
def get_edge_gateway(id)
|
@@ -34,11 +37,11 @@ class StubFogInterface
|
|
34
37
|
}
|
35
38
|
end
|
36
39
|
|
37
|
-
def vdc(
|
40
|
+
def vdc(_name)
|
38
41
|
{ }
|
39
42
|
end
|
40
43
|
|
41
|
-
def post_instantiate_vapp_template(
|
44
|
+
def post_instantiate_vapp_template(_vdc, _template, _name, _params)
|
42
45
|
{
|
43
46
|
:href => '/test-vapp-1-id',
|
44
47
|
:Children => {
|
@@ -51,7 +54,7 @@ class StubFogInterface
|
|
51
54
|
{ }
|
52
55
|
end
|
53
56
|
|
54
|
-
def template(
|
57
|
+
def template(_catalog_name, _name)
|
55
58
|
{ :href => '/vappTemplate-12345678-90ab-cdef-0123-4567890abcde' }
|
56
59
|
end
|
57
60
|
|
@@ -40,31 +40,18 @@ module Vcloud
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should raise an error if passed a nil value" do
|
43
|
-
expect { EdgeGatewayInterface.new(nil) }.
|
43
|
+
expect { EdgeGatewayInterface.new(nil) }.
|
44
|
+
to raise_error(StandardError, /^EdgeGatewayInterface:/)
|
44
45
|
end
|
45
46
|
|
46
47
|
it "should raise an error if a :Name is not passed" do
|
47
|
-
expect { EdgeGatewayInterface.new({}) }.
|
48
|
+
expect { EdgeGatewayInterface.new({}) }.
|
49
|
+
to raise_error(StandardError, /^EdgeGatewayInterface:/)
|
48
50
|
end
|
49
51
|
|
50
52
|
it "should raise an error if a :Network is not passed" do
|
51
|
-
expect { EdgeGatewayInterface.new({Name: 'test-interface'}) }.
|
52
|
-
|
53
|
-
|
54
|
-
it "should raise an error if a :Network :href is not passed" do
|
55
|
-
bad_input = {
|
56
|
-
Name: 'test-interface',
|
57
|
-
Network: { name: "test-network" }
|
58
|
-
}
|
59
|
-
expect { EdgeGatewayInterface.new(bad_input) }.to raise_error("Argument error: must have a :Network[:href]")
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should raise an error if a :Network :name is not passed" do
|
63
|
-
bad_input = {
|
64
|
-
Name: 'test-interface',
|
65
|
-
Network: { href: "http://example.com/1234" }
|
66
|
-
}
|
67
|
-
expect { EdgeGatewayInterface.new(bad_input) }.to raise_error("Argument error: must have a :Network[:name]")
|
53
|
+
expect { EdgeGatewayInterface.new({Name: 'test-interface'}) }.
|
54
|
+
to raise_error(StandardError, /^EdgeGatewayInterface:/)
|
68
55
|
end
|
69
56
|
|
70
57
|
end
|
@@ -32,7 +32,7 @@ module Vcloud
|
|
32
32
|
|
33
33
|
it "should store the id specified" do
|
34
34
|
obj = EdgeGateway.new(@edgegw_id)
|
35
|
-
expect(obj.id)
|
35
|
+
expect(obj.id).to eq(@edgegw_id)
|
36
36
|
end
|
37
37
|
|
38
38
|
it "should raise error if id is not in correct format" do
|
@@ -63,7 +63,7 @@ module Vcloud
|
|
63
63
|
Vcloud::Core::QueryRunner.should_receive(:new).and_return(mock_query)
|
64
64
|
mock_query.should_receive(:run).with('edgeGateway', :filter => "name==edgegw-test-1").and_return(q_results)
|
65
65
|
@obj = EdgeGateway.get_by_name('edgegw-test-1')
|
66
|
-
expect(@obj.id)
|
66
|
+
expect(@obj.id).to eq(@edgegw_id)
|
67
67
|
end
|
68
68
|
|
69
69
|
it "should raise an error if no edgegw with that name exists" do
|
@@ -31,11 +31,11 @@ module Vcloud
|
|
31
31
|
}
|
32
32
|
]
|
33
33
|
metadata = MetadataHelper.extract_metadata(metadata_entries)
|
34
|
-
metadata.count.
|
35
|
-
metadata[:role_name].
|
36
|
-
metadata[:server_number].
|
37
|
-
metadata[:created_at].
|
38
|
-
metadata[:daily_shutdown].
|
34
|
+
expect(metadata.count).to eq(4)
|
35
|
+
expect(metadata[:role_name]).to eq('james-bond')
|
36
|
+
expect(metadata[:server_number]).to eq(-10)
|
37
|
+
expect(metadata[:created_at]).to eq(DateTime.parse("2013-12-16T14:30:05.000Z"))
|
38
|
+
expect(metadata[:daily_shutdown]).to be_false
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should skip metadata entry if entry type is not application/vnd.vmware.vcloud.metadata.value+xml" do
|
@@ -54,7 +54,7 @@ module Vcloud
|
|
54
54
|
|
55
55
|
]
|
56
56
|
metadata = MetadataHelper.extract_metadata(metadata_entries)
|
57
|
-
metadata.count.
|
57
|
+
expect(metadata.count).to eq(1)
|
58
58
|
metadata.keys.should_not include :untyped_key
|
59
59
|
end
|
60
60
|
|
@@ -75,7 +75,7 @@ module Vcloud
|
|
75
75
|
|
76
76
|
]
|
77
77
|
metadata = MetadataHelper.extract_metadata(metadata_entries)
|
78
|
-
metadata.count.
|
78
|
+
expect(metadata.count).to eq(2)
|
79
79
|
metadata.keys.should include :unrecognized_type_key
|
80
80
|
end
|
81
81
|
|
@@ -4,7 +4,7 @@ module Vcloud
|
|
4
4
|
module Core
|
5
5
|
describe OrgVdcNetwork do
|
6
6
|
|
7
|
-
before
|
7
|
+
before(:each) do
|
8
8
|
@vdc_id = '12345678-1234-1234-1234-000000111111'
|
9
9
|
@edgegw_id = '12345678-1234-1234-1234-000000222222'
|
10
10
|
@net_id = '12345678-1234-1234-1234-000000333333'
|
@@ -38,7 +38,7 @@ module Vcloud
|
|
38
38
|
|
39
39
|
it "should store the id specified" do
|
40
40
|
obj = OrgVdcNetwork.new(@net_id)
|
41
|
-
expect(obj.id)
|
41
|
+
expect(obj.id).to eq(@net_id)
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should raise error if id is not in correct format" do
|
@@ -136,7 +136,7 @@ module Vcloud
|
|
136
136
|
with(@vdc_id, @config[:name], expected_vcloud_attrs).
|
137
137
|
and_return({ :href => "/#{@net_id}" })
|
138
138
|
obj = Vcloud::Core::OrgVdcNetwork.provision(@config)
|
139
|
-
expect(obj.id)
|
139
|
+
expect(obj.id).to eq(@net_id)
|
140
140
|
end
|
141
141
|
|
142
142
|
it "should handle specification of one ip_ranges" do
|
@@ -165,7 +165,7 @@ module Vcloud
|
|
165
165
|
@mock_fog_interface.should_receive(:post_create_org_vdc_network).
|
166
166
|
with(@vdc_id, @config[:name], expected_vcloud_attrs).
|
167
167
|
and_return({ :href => "/#{@net_id}" })
|
168
|
-
|
168
|
+
Vcloud::Core::OrgVdcNetwork.provision(@config)
|
169
169
|
end
|
170
170
|
|
171
171
|
it "should handle specification of two ip_ranges" do
|
@@ -203,7 +203,7 @@ module Vcloud
|
|
203
203
|
@mock_fog_interface.should_receive(:post_create_org_vdc_network).
|
204
204
|
with(@vdc_id, @config[:name], expected_vcloud_attrs).
|
205
205
|
and_return({ :href => "/#{@net_id}" })
|
206
|
-
|
206
|
+
Vcloud::Core::OrgVdcNetwork.provision(@config)
|
207
207
|
end
|
208
208
|
|
209
209
|
end
|
@@ -245,7 +245,7 @@ module Vcloud
|
|
245
245
|
@mock_fog_interface.should_receive(:post_create_org_vdc_network).
|
246
246
|
with(@vdc_id, @config[:name], expected_vcloud_attrs).
|
247
247
|
and_return({ :href => "/#{@net_id}" })
|
248
|
-
|
248
|
+
Vcloud::Core::OrgVdcNetwork.provision(@config)
|
249
249
|
end
|
250
250
|
|
251
251
|
end
|
@@ -12,7 +12,7 @@ describe Vcloud::Core::QueryRunner do
|
|
12
12
|
it 'should return empty array if no query type links are returned from API' do
|
13
13
|
@mock_fog_interface.stub(:get_execute_query).and_return({:Link => {}})
|
14
14
|
result = @query_runner.available_query_types
|
15
|
-
result.size.
|
15
|
+
expect(result.size).to eq(0)
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'returns queriable entity types provided by the API via :href link elements' do
|
@@ -52,10 +52,7 @@ describe Vcloud::Core::QueryRunner do
|
|
52
52
|
|
53
53
|
it 'should return no results when fog returns no results' do
|
54
54
|
@mock_fog_interface.stub(:get_execute_query).and_return({})
|
55
|
-
|
56
|
-
result = @query_runner.run()
|
57
|
-
|
58
|
-
result.should == []
|
55
|
+
expect(@query_runner.run()).to eq([])
|
59
56
|
end
|
60
57
|
|
61
58
|
it 'return no results when fog results do not include a "Record" or a "Reference"' do
|
@@ -64,10 +61,7 @@ describe Vcloud::Core::QueryRunner do
|
|
64
61
|
:WibbleBlob => {:field1 => 'Stuff 1'}
|
65
62
|
}
|
66
63
|
)
|
67
|
-
|
68
|
-
result = @query_runner.run()
|
69
|
-
|
70
|
-
result.size.should == 0
|
64
|
+
expect(@query_runner.run().size).to eq(0)
|
71
65
|
end
|
72
66
|
|
73
67
|
it 'should return a single result when fog returns a single record' do
|
@@ -77,11 +71,9 @@ describe Vcloud::Core::QueryRunner do
|
|
77
71
|
:WibbleRecord => [fields]
|
78
72
|
}
|
79
73
|
)
|
80
|
-
|
81
74
|
result = @query_runner.run()
|
82
|
-
|
83
|
-
result.
|
84
|
-
result[0].should == fields
|
75
|
+
expect(result.size).to eq(1)
|
76
|
+
expect(result.first).to eq(fields)
|
85
77
|
end
|
86
78
|
|
87
79
|
it 'should return a single result when fog returns a single reference' do
|
@@ -91,11 +83,9 @@ describe Vcloud::Core::QueryRunner do
|
|
91
83
|
:WibbleReference => [fields]
|
92
84
|
}
|
93
85
|
)
|
94
|
-
|
95
86
|
result = @query_runner.run()
|
96
|
-
|
97
|
-
result.
|
98
|
-
result[0].should == fields
|
87
|
+
expect(result.size).to eq(1)
|
88
|
+
expect(result.first).to eq(fields)
|
99
89
|
end
|
100
90
|
|
101
91
|
it 'should wrap single result from fog in list' do
|
@@ -105,11 +95,9 @@ describe Vcloud::Core::QueryRunner do
|
|
105
95
|
:WibbleRecord => fields
|
106
96
|
}
|
107
97
|
)
|
108
|
-
|
109
98
|
result = @query_runner.run()
|
110
|
-
|
111
|
-
result.
|
112
|
-
result[0].should == fields
|
99
|
+
expect(result.size).to eq(1)
|
100
|
+
expect(result.first).to eq(fields)
|
113
101
|
end
|
114
102
|
|
115
103
|
it 'should return all results in a record returned by fog' do
|
@@ -120,12 +108,10 @@ describe Vcloud::Core::QueryRunner do
|
|
120
108
|
:WibbleRecord => [fields, more_fields]
|
121
109
|
}
|
122
110
|
)
|
123
|
-
|
124
111
|
result = @query_runner.run()
|
125
|
-
|
126
|
-
result.
|
127
|
-
result[
|
128
|
-
result[1].should == more_fields
|
112
|
+
expect(result.size).to eq(2)
|
113
|
+
expect(result[0]).to eq(fields)
|
114
|
+
expect(result[1]).to eq(more_fields)
|
129
115
|
end
|
130
116
|
|
131
117
|
it 'should return the first item if more than one records provided' do
|
@@ -137,11 +123,9 @@ describe Vcloud::Core::QueryRunner do
|
|
137
123
|
:WobbleRecord => [fields2]
|
138
124
|
}
|
139
125
|
)
|
140
|
-
|
141
126
|
result = @query_runner.run()
|
142
|
-
|
143
|
-
result.
|
144
|
-
result[0].should == fields1
|
127
|
+
expect(result.size).to eq(1)
|
128
|
+
expect(result.first).to eq(fields1)
|
145
129
|
end
|
146
130
|
|
147
131
|
it 'should raise error if lastPage is not an integer' do
|
@@ -162,13 +146,12 @@ describe Vcloud::Core::QueryRunner do
|
|
162
146
|
:lastPage => 2,
|
163
147
|
:WibbleRecord => [fields]
|
164
148
|
}
|
165
|
-
|
166
149
|
)
|
167
150
|
result = @query_runner.run()
|
168
|
-
|
169
|
-
result.
|
170
|
-
result[
|
171
|
-
result[1].should == fields
|
151
|
+
expect(result.size).to eq(2)
|
152
|
+
expect(result[0]).to eq(fields)
|
153
|
+
expect(result[1]).to eq(fields)
|
172
154
|
end
|
155
|
+
|
173
156
|
end
|
174
157
|
end
|
@@ -36,7 +36,7 @@ module Vcloud
|
|
36
36
|
|
37
37
|
it "should store the id specified" do
|
38
38
|
obj = Vapp.new(@vapp_id)
|
39
|
-
expect(obj.id)
|
39
|
+
expect(obj.id).to eq(@vapp_id)
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should raise error if id is not in correct format" do
|
@@ -99,13 +99,13 @@ module Vcloud
|
|
99
99
|
|
100
100
|
context "id" do
|
101
101
|
it "should extract id correctly" do
|
102
|
-
@vapp.id.
|
102
|
+
expect(@vapp.id).to eq(@vapp_id)
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
106
|
context "vapp should have parent vdc" do
|
107
107
|
it "should load parent vdc id from fog attributes" do
|
108
|
-
@vapp.vdc_id.
|
108
|
+
expect(@vapp.vdc_id).to eq('074aea1e-a5e9-4dd1-a028-40db8c98d237')
|
109
109
|
end
|
110
110
|
|
111
111
|
it "should raise error if vapp without parent vdc found" do
|
@@ -115,8 +115,8 @@ module Vcloud
|
|
115
115
|
end
|
116
116
|
|
117
117
|
it "should return vms" do
|
118
|
-
@vapp.fog_vms.count.
|
119
|
-
@vapp.fog_vms.first[:href].
|
118
|
+
expect(@vapp.fog_vms.count).to eq(1)
|
119
|
+
expect(@vapp.fog_vms.first[:href]).to eq('/vm-123aea1e-a5e9-4dd1-a028-40db8c98d237')
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
@@ -136,18 +136,23 @@ module Vcloud
|
|
136
136
|
|
137
137
|
it "should power on a vapp that is not powered on" do
|
138
138
|
vapp = Vapp.new(@vapp_id)
|
139
|
-
@mock_fog_interface.should_receive(:get_vapp).twice().and_return(
|
139
|
+
@mock_fog_interface.should_receive(:get_vapp).twice().and_return(
|
140
|
+
{:status => Vcloud::Core::Vapp::STATUS::POWERED_OFF},
|
141
|
+
{:status => Vcloud::Core::Vapp::STATUS::RUNNING}
|
142
|
+
)
|
140
143
|
@mock_fog_interface.should_receive(:power_on_vapp).with(vapp.id)
|
141
144
|
state = vapp.power_on
|
142
|
-
expect(state)
|
145
|
+
expect(state).to be_true
|
143
146
|
end
|
144
147
|
|
145
148
|
it "should not power on a vapp that is already powered on, but should return true" do
|
146
149
|
vapp = Vapp.new(@vapp_id)
|
147
|
-
@mock_fog_interface.should_receive(:get_vapp).and_return(
|
150
|
+
@mock_fog_interface.should_receive(:get_vapp).and_return(
|
151
|
+
{:status => Vcloud::Core::Vapp::STATUS::RUNNING}
|
152
|
+
)
|
148
153
|
@mock_fog_interface.should_not_receive(:power_on_vapp)
|
149
154
|
state = vapp.power_on
|
150
|
-
expect(state)
|
155
|
+
expect(state).to be_true
|
151
156
|
end
|
152
157
|
end
|
153
158
|
|
@@ -158,14 +163,14 @@ module Vcloud
|
|
158
163
|
it "should return nil if fog returns nil" do
|
159
164
|
StubFogInterface.any_instance.stub(:get_vapp_by_name_and_vdc_name)
|
160
165
|
.with('vapp_name', 'vdc_name').and_return(nil)
|
161
|
-
Vapp.get_by_name_and_vdc_name('vapp_name', 'vdc_name').
|
166
|
+
expect(Vapp.get_by_name_and_vdc_name('vapp_name', 'vdc_name')).to be_nil
|
162
167
|
end
|
163
168
|
|
164
169
|
it "should return vapp instance if found" do
|
165
170
|
vcloud_attr_vapp = { :href => "/#{@vapp_id}" }
|
166
171
|
StubFogInterface.any_instance.stub(:get_vapp_by_name_and_vdc_name)
|
167
172
|
.with('vapp_name', 'vdc_name').and_return(vcloud_attr_vapp)
|
168
|
-
Vapp.get_by_name_and_vdc_name('vapp_name', 'vdc_name').class.
|
173
|
+
expect(Vapp.get_by_name_and_vdc_name('vapp_name', 'vdc_name').class).to eq(Core::Vapp)
|
169
174
|
end
|
170
175
|
|
171
176
|
end
|
data/spec/vcloud/core/vm_spec.rb
CHANGED
@@ -70,7 +70,7 @@ module Vcloud
|
|
70
70
|
|
71
71
|
it "should store the id specified" do
|
72
72
|
obj = Vm.new(@vm_id, @mock_vapp)
|
73
|
-
expect(obj.id)
|
73
|
+
expect(obj.id).to eq(@vm_id)
|
74
74
|
end
|
75
75
|
|
76
76
|
it "should raise error if id is not in correct format" do
|
@@ -181,7 +181,7 @@ module Vcloud
|
|
181
181
|
end
|
182
182
|
|
183
183
|
context '#generate_preamble' do
|
184
|
-
it "should interpolate vars hash into template" do
|
184
|
+
it "should interpolate vars hash and vapp_name into template" do
|
185
185
|
vars = {:message => 'hello world'}
|
186
186
|
erbfile = "#{@data_dir}/basic_preamble_test.erb"
|
187
187
|
expected_output = File.read("#{erbfile}.OUT")
|
data/vcloud-core.gemspec
CHANGED
@@ -29,6 +29,7 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_development_dependency 'cucumber', '~> 1.3.10'
|
30
30
|
s.add_development_dependency 'rake'
|
31
31
|
s.add_development_dependency 'rspec', '~> 2.14.1'
|
32
|
+
s.add_development_dependency 'rubocop'
|
32
33
|
s.add_development_dependency 'simplecov', '~> 0.8.2'
|
33
34
|
s.add_development_dependency 'gem_publisher', '1.2.0'
|
34
35
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vcloud-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-05-
|
12
|
+
date: 2014-05-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fog
|
@@ -123,6 +123,22 @@ dependencies:
|
|
123
123
|
- - ~>
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: 2.14.1
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rubocop
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
126
142
|
- !ruby/object:Gem::Dependency
|
127
143
|
name: simplecov
|
128
144
|
requirement: !ruby/object:Gem::Requirement
|
@@ -165,6 +181,7 @@ extensions: []
|
|
165
181
|
extra_rdoc_files: []
|
166
182
|
files:
|
167
183
|
- .gitignore
|
184
|
+
- .travis.yml
|
168
185
|
- CHANGELOG.md
|
169
186
|
- Gemfile
|
170
187
|
- LICENSE.txt
|
@@ -245,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
245
262
|
version: '0'
|
246
263
|
segments:
|
247
264
|
- 0
|
248
|
-
hash:
|
265
|
+
hash: 2968796492213479520
|
249
266
|
requirements: []
|
250
267
|
rubyforge_project:
|
251
268
|
rubygems_version: 1.8.23
|