kitchen-openstack 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NjAwZTAyMmFlODViMmNiOTllNDYwOWM3YzA2MjM1Yjc3ZDczZGZlZQ==
5
- data.tar.gz: !binary |-
6
- OGM1NTk4NjUxMmY5Y2E2MmNhMTVkZThmYTBjOGQxMmE4ZTAzNTRkZQ==
2
+ SHA1:
3
+ metadata.gz: 23c44843c2f545b10ef08c9a7e798afff8acd4e3
4
+ data.tar.gz: 88bb1823d40b4929fef0de8d05a62ade24909d1c
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- YmNkY2I2YTJhZDg4N2U2MGUxZTk2NGE0NDAzMjhlNDgwZThmZWZkMGQ5MDUy
10
- NWVkNDU3OWE0YzZmOWMwZjRmYzI4OGQzZjA5ZTM5NjgyZjRiYmFiYjhkZjNh
11
- YjUwYTM3Yjk4ODk4M2QzYzI1NTE3MDI5NzViODRkM2IwOGFlOTI=
12
- data.tar.gz: !binary |-
13
- MmJhNTZlYWE3OTI1MDAwYTc1MzM4YWQxZTZkYTAwYmMxYTM0NjE5YzhiNDhk
14
- OWIxMmI4NGU4YzVjNzUzZDg3OWM4NWVlNzE3ZWVlYzIxNTBlYmYwZWExYzE1
15
- M2U5MTVjNWM5Y2M0NjAyZWE0N2NiMGVlMjdmYWFkYzgxNmI0MDY=
6
+ metadata.gz: cc92ccbd2840b79694c06fbbf9b631d5067ae7268b8c5f01b2739ff0cd7441eeba405d227b919f5048749ec253286adcbab5ff28e89c645418b5fe54ef10af04
7
+ data.tar.gz: bb10f75c4b1751658486c274f4a398fdd59baa2bfa77a1c7a3d4fbc4617003f7186c9abfb94ff84c2d48e0bc05f232ce1c921db8e4425f8e0a68798919bc12ca
@@ -1,3 +1,16 @@
1
+ # 1.3.0 / 2014-03-09
2
+
3
+ ### New Features
4
+
5
+ * PR [#40][] - New `user_data` option; via [@wilreichert][]
6
+ * PR [#39][] - New `network_ref` option to only provision a server with
7
+ certain specified NICs; via [@monsterzz][]
8
+
9
+ ### Bug Fixes
10
+
11
+ * PR [#41][] - Fix issue creating servers with custom SSH ports; via
12
+ [@tenforward][]
13
+
1
14
  # 1.2.0 / 2014-01-30
2
15
 
3
16
  ### New Features
@@ -68,6 +81,9 @@
68
81
 
69
82
  * Initial release! Woo!
70
83
 
84
+ [#41]: https://github.com/test-kitchen/kitchen-openstack/pull/41
85
+ [#40]: https://github.com/test-kitchen/kitchen-openstack/pull/40
86
+ [#39]: https://github.com/test-kitchen/kitchen-openstack/pull/39
71
87
  [#37]: https://github.com/test-kitchen/kitchen-openstack/pull/37
72
88
  [#31]: https://github.com/test-kitchen/kitchen-openstack/pull/31
73
89
  [#27]: https://github.com/test-kitchen/kitchen-openstack/pull/27
@@ -84,6 +100,9 @@
84
100
  [#7]: https://github.com/test-kitchen/kitchen-openstack/pull/7
85
101
  [#2]: https://github.com/test-kitchen/kitchen-openstack/pull/2
86
102
 
103
+ [@wilreichert]: https://github.com/wilreichert
104
+ [@tenforward]: https://github.com/tenforward
105
+ [@monsterzz]: https://github.com/monsterzz
87
106
  [@bears4barrett]: https://github.com/bears4barrett
88
107
  [@jgawor]: https://github.com/jgawor
89
108
  [@hufman]: https://github.com/hufman
data/README.md CHANGED
@@ -54,12 +54,15 @@ behavior can be overridden with additional options:
54
54
  openstack_tenant: [YOUR OPENSTACK TENANT ID]
55
55
  openstack_region: [A VALID OPENSTACK REGION]
56
56
  openstack_service_name: [YOUR OPENSTACK COMPUTE SERVICE NAME]
57
- openstack_network_name: [YOUR OPENSTACK NETWORK NAME]
57
+ openstack_network_name: [YOUR OPENSTACK NETWORK NAME USED TO CONNECT]
58
58
  floating_ip: [A SPECIFIC FLOATING IP TO ASSIGN]
59
59
  floating_ip_pool: [AN OPENSTACK POOL NAME TO ASSIGN THE NEXT IP FROM]
60
60
  security_groups:
61
61
  - [A LIST OF...]
62
62
  - [...SECURITY GROUPS TO JOIN]
63
+ network_ref:
64
+ - [OPENSTACK NETWORK NAMES OR...]
65
+ - [...ID TO CREATE INSTANCE WITH]
63
66
 
64
67
  If a `key_name` is provided it will be used instead of any
65
68
  `public_key_path` that is specified.
@@ -68,6 +71,24 @@ If a `key_name` is provided without any `private_key_path`, unexpected
68
71
  behavior may result if your local RSA/DSA private key doesn't match that
69
72
  OpenStack key.
70
73
 
74
+ The `network_ref` option can be specified as an exact id, an exact name,
75
+ or as a regular expression matching the name of the network. You can pass one
76
+
77
+ network_ref: MYNET1
78
+
79
+ or many networks
80
+
81
+ network_ref:
82
+ - MYNET1
83
+ - MYNET2
84
+
85
+ The `openstack_network_name` is used to select IP address for SSH connection.
86
+ It's recommended to specify this option in case of multiple networks used for
87
+ instance to provide more control over network connectivity.
88
+
89
+ Please note that `network_ref` relies on Network Services (`Fog::Network`) and
90
+ it can be unavailable in your OpenStack installation.
91
+
71
92
  disable_ssl_validation: true
72
93
 
73
94
  Only disable SSL cert validation if you absolutely know what you are doing,
@@ -77,6 +98,7 @@ but are stuck with an OpenStack deployment without valid SSL certs.
77
98
 
78
99
  1. Fork it
79
100
  2. Create your feature branch (`git checkout -b my-new-feature`)
80
- 3. Commit your changes (`git commit -am 'Add some feature'`)
81
- 4. Push to the branch (`git push origin my-new-feature`)
82
- 5. Create new Pull Request
101
+ 3. Run style checks and RSpec tests (`bundle exec rake`)
102
+ 4. Commit your changes (`git commit -am 'Add some feature'`)
103
+ 5. Push to the branch (`git push origin my-new-feature`)
104
+ 6. Create new Pull Request
@@ -52,6 +52,7 @@ module Kitchen
52
52
  default_config :floating_ip_pool, nil
53
53
  default_config :floating_ip, nil
54
54
  default_config :security_groups, nil
55
+ default_config :network_ref, nil
55
56
 
56
57
  def create(state)
57
58
  config[:server_name] ||= generate_name(instance.name)
@@ -67,7 +68,8 @@ module Kitchen
67
68
  end
68
69
  state[:hostname] = get_ip(server)
69
70
  state[:ssh_key] = config[:private_key_path]
70
- wait_for_sshd(state[:hostname]) ; info '(ssh ready)'
71
+ wait_for_sshd(state[:hostname], config[:username],
72
+ { :port => config[:port] }) ; info '(ssh ready)'
71
73
  if config[:key_name]
72
74
  info "Using OpenStack keypair <#{config[:key_name]}>"
73
75
  end
@@ -93,7 +95,7 @@ module Kitchen
93
95
 
94
96
  private
95
97
 
96
- def compute
98
+ def openstack_server
97
99
  server_def = {
98
100
  :provider => 'OpenStack',
99
101
  :openstack_username => config[:openstack_username],
@@ -106,36 +108,86 @@ module Kitchen
106
108
  optional.each do |o|
107
109
  config[o] and server_def[o] = config[o]
108
110
  end
109
- Fog::Compute.new(server_def)
111
+ server_def
110
112
  end
111
113
 
112
- def create_server
113
- image = find_matching(compute.images, config[:image_ref])
114
- raise ActionFailed, "Image not found" if !image
115
- debug "Selected image: #{image.id} #{image.name}"
114
+ def network
115
+ Fog::Network.new(openstack_server)
116
+ end
116
117
 
117
- flavor = find_matching(compute.flavors, config[:flavor_ref])
118
- raise ActionFailed, "Flavor not found" if !flavor
119
- debug "Selected flavor: #{flavor.id} #{flavor.name}"
118
+ def compute
119
+ Fog::Compute.new(openstack_server)
120
+ end
120
121
 
121
- server_def = {
122
- :name => config[:server_name],
123
- :image_ref => image.id,
124
- :flavor_ref => flavor.id,
125
- }
126
- if config[:security_groups] && config[:security_groups].kind_of?(Array)
127
- server_def[:security_groups] = config[:security_groups]
122
+ def create_server
123
+ server_def = init_config
124
+
125
+ if config[:network_ref]
126
+ networks = [].concat([config[:network_ref]])
127
+ server_def[:nics] = networks.flatten.map do |net|
128
+ { 'net_id' => find_network(net).id }
129
+ end
128
130
  end
129
- if config[:public_key_path]
130
- server_def[:public_key_path] = config[:public_key_path]
131
+
132
+ [
133
+ :security_groups,
134
+ :public_key_path,
135
+ :key_name,
136
+ :user_data
137
+ ].each do |c|
138
+ server_def[c] = optional_config(c) if config[c]
131
139
  end
132
- server_def[:key_name] = config[:key_name] if config[:key_name]
140
+
133
141
  # Can't use the Fog bootstrap and/or setup methods here; they require a
134
142
  # public IP address that can't be guaranteed to exist across all
135
143
  # OpenStack deployments (e.g. TryStack ARM only has private IPs).
136
144
  compute.servers.create(server_def)
137
145
  end
138
146
 
147
+ def init_config
148
+ {
149
+ :name => config[:server_name],
150
+ :image_ref => find_image(config[:image_ref]).id,
151
+ :flavor_ref => find_flavor(config[:flavor_ref]).id,
152
+ }
153
+ end
154
+
155
+ def optional_config(c)
156
+ case c
157
+ when :security_groups
158
+ if config[c].kind_of?(Array)
159
+ config[c]
160
+ end
161
+ when :user_data
162
+ if File.exist?(config[c])
163
+ File.open(config[c]) { |f| f.read }
164
+ end
165
+ else
166
+ config[c]
167
+ end
168
+ end
169
+
170
+ def find_image(image_ref)
171
+ image = find_matching(compute.images, image_ref)
172
+ raise ActionFailed, 'Image not found' if !image
173
+ debug "Selected image: #{image.id} #{image.name}"
174
+ image
175
+ end
176
+
177
+ def find_flavor(flavor_ref)
178
+ flavor = find_matching(compute.flavors, flavor_ref)
179
+ raise ActionFailed, 'Flavor not found' if !flavor
180
+ debug "Selected flavor: #{flavor.id} #{flavor.name}"
181
+ flavor
182
+ end
183
+
184
+ def find_network(network_ref)
185
+ net = find_matching(network.networks.all, network_ref)
186
+ raise ActionFailed, 'Network not found' if !net
187
+ debug "Selected net: #{net.id} #{net.name}"
188
+ net
189
+ end
190
+
139
191
  def generate_name(base)
140
192
  # Generate what should be a unique server name
141
193
  sep = '-'
@@ -178,7 +230,7 @@ module Kitchen
178
230
 
179
231
  def get_ip(server)
180
232
  if config[:openstack_network_name]
181
- debug "Using configured network: #{config[:openstack_network_name]}"
233
+ debug "Using configured net: #{config[:openstack_network_name]}"
182
234
  return server.addresses[config[:openstack_network_name]].first['addr']
183
235
  end
184
236
  begin
@@ -19,7 +19,7 @@
19
19
  module Kitchen
20
20
  module Driver
21
21
  # Version string for OpenStack Kitchen driver
22
- OPENSTACK_VERSION = '1.2.0'
22
+ OPENSTACK_VERSION = '1.3.0'
23
23
  end
24
24
  end
25
25
 
@@ -104,7 +104,8 @@ describe Kitchen::Driver::Openstack do
104
104
  :openstack_region,
105
105
  :openstack_service_name,
106
106
  :floating_ip_pool,
107
- :floating_ip
107
+ :floating_ip,
108
+ :network_ref
108
109
  ]
109
110
  nils.each do |i|
110
111
  it "defaults to no #{i}" do
@@ -127,7 +128,8 @@ describe Kitchen::Driver::Openstack do
127
128
  :openstack_service_name => 'the_service',
128
129
  :private_key_path => '/path/to/id_rsa',
129
130
  :floating_ip_pool => 'swimmers',
130
- :floating_ip => '11111'
131
+ :floating_ip => '11111',
132
+ :network_ref => '0xCAFFE'
131
133
  }
132
134
  end
133
135
 
@@ -150,7 +152,10 @@ describe Kitchen::Driver::Openstack do
150
152
  d.instance = instance
151
153
  d.stub(:generate_name).with('potatoes').and_return('a_monkey!')
152
154
  d.stub(:create_server).and_return(server)
153
- d.stub(:wait_for_sshd).with('1.2.3.4').and_return(true)
155
+ d.stub(:wait_for_sshd).with(
156
+ '1.2.3.4',
157
+ 'root',
158
+ { :port => '22' }).and_return(true)
154
159
  d.stub(:get_ip).and_return('1.2.3.4')
155
160
  d.stub(:do_ssh_setup).and_return(true)
156
161
  d
@@ -284,6 +289,12 @@ describe Kitchen::Driver::Openstack do
284
289
  res = config.merge({ :provider => 'OpenStack' })
285
290
  expect(driver.send(:compute)).to eq(res)
286
291
  end
292
+
293
+ it 'creates a new network connection' do
294
+ Fog::Network.stub(:new) { |arg| arg }
295
+ res = config.merge({ :provider => 'OpenStack' })
296
+ expect(driver.send(:network)).to eq(res)
297
+ end
287
298
  end
288
299
 
289
300
  context 'only an API key provided' do
@@ -317,18 +328,31 @@ describe Kitchen::Driver::Openstack do
317
328
  s.stub(:create) { |arg| arg }
318
329
  s
319
330
  end
331
+ let(:vlan1_net) { double(:id => '1', :name => 'vlan1') }
332
+ let(:vlan2_net) { double(:id => '2', :name => 'vlan2') }
320
333
  let(:ubuntu_image) { double(:id => '111', :name => 'ubuntu') }
321
334
  let(:fedora_image) { double(:id => '222', :name => 'fedora') }
322
335
  let(:tiny_flavor) { double(:id => '1', :name => 'tiny') }
323
336
  let(:small_flavor) { double(:id => '2', :name => 'small') }
324
337
  let(:compute) do
325
- double(:servers => servers, :images => [ubuntu_image, fedora_image],
326
- :flavors => [tiny_flavor, small_flavor])
338
+ double(
339
+ :servers => servers,
340
+ :images => [ubuntu_image, fedora_image],
341
+ :flavors => [tiny_flavor, small_flavor],
342
+ )
343
+ end
344
+ let(:network) do
345
+ double(
346
+ :networks => double(
347
+ :all => [vlan1_net, vlan2_net]
348
+ )
349
+ )
327
350
  end
328
351
  let(:driver) do
329
352
  d = Kitchen::Driver::Openstack.new(config)
330
353
  d.instance = instance
331
354
  d.stub(:compute).and_return(compute)
355
+ d.stub(:network).and_return(network)
332
356
  d
333
357
  end
334
358
 
@@ -467,6 +491,113 @@ describe Kitchen::Driver::Openstack do
467
491
  driver.send(:create_server)
468
492
  end
469
493
  end
494
+
495
+ context 'network specifies id' do
496
+ let(:config) do
497
+ {
498
+ :server_name => 'hello',
499
+ :image_ref => '111',
500
+ :flavor_ref => '1',
501
+ :public_key_path => 'tarpals',
502
+ :network_ref => '1'
503
+ }
504
+ end
505
+
506
+ it 'exact id match' do
507
+ networks = [
508
+ { 'net_id' => '1' }
509
+ ]
510
+ servers.should_receive(:create).with(
511
+ :name => 'hello',
512
+ :image_ref => '111',
513
+ :flavor_ref => '1',
514
+ :public_key_path => 'tarpals',
515
+ :nics => networks
516
+ )
517
+ driver.send(:create_server)
518
+ end
519
+ end
520
+
521
+ context 'network specifies name' do
522
+ let(:config) do
523
+ {
524
+ :server_name => 'hello',
525
+ :image_ref => '111',
526
+ :flavor_ref => '1',
527
+ :public_key_path => 'tarpals',
528
+ :network_ref => 'vlan1'
529
+ }
530
+ end
531
+
532
+ it 'exact id match' do
533
+ networks = [
534
+ { 'net_id' => '1' }
535
+ ]
536
+ servers.should_receive(:create).with(
537
+ :name => 'hello',
538
+ :image_ref => '111',
539
+ :flavor_ref => '1',
540
+ :public_key_path => 'tarpals',
541
+ :nics => networks
542
+ )
543
+ driver.send(:create_server)
544
+ end
545
+ end
546
+
547
+ context 'multiple networks specifies id' do
548
+ let(:config) do
549
+ {
550
+ :server_name => 'hello',
551
+ :image_ref => '111',
552
+ :flavor_ref => '1',
553
+ :public_key_path => 'tarpals',
554
+ :network_ref => %w(1 2)
555
+ }
556
+ end
557
+
558
+ it 'exact id match' do
559
+ networks = [
560
+ { 'net_id' => '1' },
561
+ { 'net_id' => '2' },
562
+ ]
563
+ servers.should_receive(:create).with(
564
+ :name => 'hello',
565
+ :image_ref => '111',
566
+ :flavor_ref => '1',
567
+ :public_key_path => 'tarpals',
568
+ :nics => networks
569
+ )
570
+ driver.send(:create_server)
571
+ end
572
+ end
573
+
574
+ context 'user_data specified' do
575
+ let(:config) do
576
+ {
577
+ :server_name => 'hello',
578
+ :image_ref => '111',
579
+ :flavor_ref => '1',
580
+ :public_key_path => 'tarpals',
581
+ :user_data => 'cloud-init.txt'
582
+ }
583
+ end
584
+ let(:data) { "#cloud-config\n" }
585
+
586
+ before(:each) do
587
+ File.stub(:exist?).and_return(true)
588
+ File.stub(:open).and_return(data)
589
+ end
590
+
591
+ it 'should pass file contents' do
592
+ servers.should_receive(:create).with(
593
+ :name => 'hello',
594
+ :image_ref => '111',
595
+ :flavor_ref => '1',
596
+ :public_key_path => 'tarpals',
597
+ :user_data => data)
598
+ driver.send(:create_server)
599
+ end
600
+ end
470
601
  end
471
602
 
472
603
  describe '#generate_name' do
metadata CHANGED
@@ -1,181 +1,181 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-openstack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Hartman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-30 00:00:00.000000000 Z
11
+ date: 2014-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-kitchen
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: fog
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.18'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.18'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: unf
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ! '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ! '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ! '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ! '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: tailor
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ! '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ! '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: cane
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ! '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ! '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: countloc
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ! '>='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ! '>='
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rspec
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ! '>='
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ! '>='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: simplecov
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ! '>='
143
+ - - ">="
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ! '>='
150
+ - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: simplecov-console
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - ! '>='
157
+ - - ">="
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - ! '>='
164
+ - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: coveralls
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - ! '>='
171
+ - - ">="
172
172
  - !ruby/object:Gem::Version
173
173
  version: '0'
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
- - - ! '>='
178
+ - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
181
  description: A Test Kitchen OpenStack Nova driver
@@ -185,8 +185,8 @@ executables: []
185
185
  extensions: []
186
186
  extra_rdoc_files: []
187
187
  files:
188
- - .gitignore
189
- - .travis.yml
188
+ - ".gitignore"
189
+ - ".travis.yml"
190
190
  - CHANGELOG.md
191
191
  - Gemfile
192
192
  - LICENSE.txt
@@ -207,17 +207,17 @@ require_paths:
207
207
  - lib
208
208
  required_ruby_version: !ruby/object:Gem::Requirement
209
209
  requirements:
210
- - - ! '>='
210
+ - - ">="
211
211
  - !ruby/object:Gem::Version
212
212
  version: '0'
213
213
  required_rubygems_version: !ruby/object:Gem::Requirement
214
214
  requirements:
215
- - - ! '>='
215
+ - - ">="
216
216
  - !ruby/object:Gem::Version
217
217
  version: '0'
218
218
  requirements: []
219
219
  rubyforge_project:
220
- rubygems_version: 2.2.1
220
+ rubygems_version: 2.2.2
221
221
  signing_key:
222
222
  specification_version: 4
223
223
  summary: A Test Kitchen OpenStack Nova driver