vagrant-skytap 0.2.10 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/lib/vagrant-skytap/action/check_created.rb +43 -0
  4. data/lib/vagrant-skytap/action/check_running.rb +43 -0
  5. data/lib/vagrant-skytap/action/get_host_vm.rb +52 -0
  6. data/lib/vagrant-skytap/action/prepare_nfs_settings.rb +22 -5
  7. data/lib/vagrant-skytap/action.rb +11 -18
  8. data/lib/vagrant-skytap/api/connectable.rb +50 -0
  9. data/lib/vagrant-skytap/api/environment.rb +10 -5
  10. data/lib/vagrant-skytap/api/interface.rb +9 -0
  11. data/lib/vagrant-skytap/api/network.rb +60 -1
  12. data/lib/vagrant-skytap/api/public_ip.rb +7 -75
  13. data/lib/vagrant-skytap/api/publish_set.rb +4 -0
  14. data/lib/vagrant-skytap/api/published_service.rb +7 -71
  15. data/lib/vagrant-skytap/api/resource.rb +25 -3
  16. data/lib/vagrant-skytap/api/tunnel.rb +69 -0
  17. data/lib/vagrant-skytap/api/vm.rb +10 -2
  18. data/lib/vagrant-skytap/api/vpn.rb +2 -106
  19. data/lib/vagrant-skytap/cap/host_metadata.rb +45 -0
  20. data/lib/vagrant-skytap/connection/public_ip_choice.rb +94 -0
  21. data/lib/vagrant-skytap/connection/published_service_choice.rb +100 -0
  22. data/lib/vagrant-skytap/connection/tunnel_choice.rb +118 -0
  23. data/lib/vagrant-skytap/connection/vpn_choice.rb +132 -0
  24. data/lib/vagrant-skytap/connection.rb +123 -0
  25. data/lib/vagrant-skytap/errors.rb +4 -0
  26. data/lib/vagrant-skytap/plugin.rb +5 -0
  27. data/lib/vagrant-skytap/setup_helper.rb +34 -8
  28. data/lib/vagrant-skytap/version.rb +1 -1
  29. data/locales/en.yml +46 -0
  30. data/spec/unit/actions/prepare_nfs_settings_spec.rb +63 -16
  31. data/spec/unit/cap/host_metadata_spec.rb +43 -0
  32. data/spec/unit/connections/public_ip_choice_spec.rb +57 -0
  33. data/spec/unit/connections/published_service_choice_spec.rb +79 -0
  34. data/spec/unit/connections/tunnel_choice_spec.rb +124 -0
  35. data/spec/unit/connections/vpn_choice_spec.rb +109 -0
  36. data/spec/unit/interface_spec.rb +53 -0
  37. data/spec/unit/network_spec.rb +123 -0
  38. data/spec/unit/setup_helper_spec.rb +59 -19
  39. data/spec/unit/support/api_responses/tunnel1.json +7 -0
  40. data/spec/unit/support/api_responses/vm1.json +12 -1
  41. data/spec/unit/support/shared/rest_api_context.rb +1 -0
  42. data/spec/unit/tunnel_spec.rb +62 -0
  43. data/spec/unit/vm_spec.rb +53 -60
  44. metadata +22 -2
@@ -58,10 +58,15 @@ describe VagrantPlugins::Skytap::SetupHelper do
58
58
  end
59
59
  end
60
60
 
61
- let(:vpn) {API::Vpn.new(vpn_attrs, env)}
62
- let(:vpns) {[vpn]}
63
- let(:vpn_choice) {double(:vpn_choice, vpn: vpn, choose: ["1.2.3.4", 22], :valid? => true)}
64
- let(:user_input) { "" }
61
+ let(:vpn) {API::Vpn.new(vpn_attrs, env)}
62
+ let(:vpns) {[vpn]}
63
+ let(:vpn_choice) {double(:vpn_choice, vpn: vpn, choose: ["1.2.3.4", 22], :valid? => true)}
64
+ let(:vpn_choice2) {double(:vpn_choice2, vpn: nil, choose: ["5.6.7.8", 22], :valid? => true)}
65
+ let(:icnr_choice) {double(:icnr_choice, choose: ["10.0.0.1", 22], :valid? => icnr_valid, validation_error_message: icnr_err_msg)}
66
+ let(:icnr_valid) { true }
67
+ let(:icnr_err_msg) { nil }
68
+ let(:user_input) { "" }
69
+ let(:running_in_skytap_vm) {false}
65
70
 
66
71
  let(:ssh_config) do
67
72
  double(:ssh_config, username: nil, password: nil, host: nil, port: nil)
@@ -83,6 +88,7 @@ describe VagrantPlugins::Skytap::SetupHelper do
83
88
  ENV.stub(:[] => nil)
84
89
  allow(ui).to receive(:ask).and_return(user_input)
85
90
  allow(instance).to receive(:vpns).and_return(vpns)
91
+ allow(instance).to receive(:running_in_skytap_vm?).and_return(running_in_skytap_vm)
86
92
  allow(vpn).to receive(:choice_for_setup).and_return(vpn_choice)
87
93
  stub_request(:get, /.*/).to_return(body: "{}", status: 200)
88
94
  end
@@ -110,29 +116,63 @@ describe VagrantPlugins::Skytap::SetupHelper do
110
116
  instance.send(:ask_routing)
111
117
  end
112
118
 
113
- context "when valid vpn_url specified" do
114
- it {should eq ["1.2.3.4", 22]}
119
+ let(:connection_choices) {[vpn_choice, vpn_choice2]}
120
+ let(:asks_user) {false}
121
+
122
+ before do
123
+ allow(instance).to receive(:connection_choices).and_return(connection_choices)
124
+ if asks_user
125
+ expect(ui).to receive(:ask)
126
+ else
127
+ expect(ui).to_not receive(:ask)
128
+ end
115
129
  end
116
130
 
117
- context "when invalid vpn_url specified" do
118
- let(:vpn_url) {"bogus"}
119
- it "raises error" do
120
- expect{subject}.to raise_error Errors::DoesNotExist
131
+ context "when no valid choices are available" do
132
+ let(:connection_choices) {[]}
133
+ it "should raise NoConnectionOptions" do
134
+ expect{subject}.to raise_error Errors::NoConnectionOptions
121
135
  end
122
136
  end
123
137
 
124
- context "when vpn_url unspecified" do
125
- let(:vpn_url) {nil}
126
- let(:user_input) {"1"}
127
- it {should eq ["1.2.3.4", 22]}
138
+ context "when a single valid choice is available" do
139
+ let(:connection_choices) {[vpn_choice]}
140
+ it "should pick the only available choice automatically" do
141
+ expect(subject).to eq connection_choices.first.choose
142
+ end
128
143
  end
129
144
 
130
- context "when no valid vpns exist" do
131
- before do
132
- allow(vpn_choice).to receive(:valid?).and_return(false)
145
+ context "when vpn_url specified" do
146
+ context "when vpn is an available choice" do
147
+ it "should use the specified vpn" do
148
+ expect(subject).to eq vpn_choice.choose
149
+ end
133
150
  end
134
- it "raises error" do
135
- expect{subject}.to raise_error Errors::NoConnectionOptions
151
+
152
+ context "when vpn is not an available choice" do
153
+ let(:vpn_url) {"/vpns/999"}
154
+ it "should raise DoesNotExist" do
155
+ expect{subject}.to raise_error Errors::DoesNotExist
156
+ end
157
+ end
158
+
159
+ context "when running in skytap vm" do
160
+ let(:running_in_skytap_vm) {true}
161
+ let(:connection_choices) {[icnr_choice]}
162
+ it "should ignore the vpn_url" do
163
+ expect(subject).to eq icnr_choice.choose
164
+ end
165
+ end
166
+ end
167
+
168
+ context "when vpn_url is not specified" do
169
+ let(:vpn_url) {nil}
170
+ context "when multiple valid choices are available" do
171
+ let(:user_input) {"2"}
172
+ let(:asks_user) {true}
173
+ it "should pick the one chosen by the user" do
174
+ expect(subject).to eq vpn_choice2.choose
175
+ end
136
176
  end
137
177
  end
138
178
  end
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "tunnel-xxx-yyy",
3
+ "status": "not_busy",
4
+ "error": null,
5
+ "source_network": {},
6
+ "target_network": {}
7
+ }
@@ -47,7 +47,18 @@
47
47
  "vm_name": "Ubuntu Server 14.04 - 64-bit",
48
48
  "status": "Running",
49
49
  "nat_addresses": {
50
- "network_nat_addresses": [],
50
+ "network_nat_addresses": [
51
+ {
52
+ "ip_address": "10.0.4.1",
53
+ "network_id": "2",
54
+ "network_name": "network",
55
+ "network_url": "https://example.com/configurations/7345188/networks/2",
56
+ "configuration_id": 7345188,
57
+ "configuration_name": "cfg7345188",
58
+ "configuration_url": "https://example.com/configurations/7345188",
59
+ "viewable": true
60
+ }
61
+ ],
51
62
  "vpn_nat_addresses": [
52
63
  {
53
64
  "ip_address": "3.4.5.6",
@@ -27,6 +27,7 @@ require "vagrant-skytap/api/network"
27
27
  require "vagrant-skytap/api/public_ip"
28
28
  require "vagrant-skytap/api/published_service"
29
29
  require "vagrant-skytap/api/resource"
30
+ require "vagrant-skytap/api/tunnel"
30
31
  require "vagrant-skytap/api/vm"
31
32
  require "vagrant-skytap/api/vpn_attachment"
32
33
  require "vagrant-skytap/api/vpn"
@@ -0,0 +1,62 @@
1
+ # Copyright (c) 2014-2016 Skytap, Inc.
2
+ #
3
+ # The MIT License (MIT)
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
+ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
+ # DEALINGS IN THE SOFTWARE.
22
+
23
+ require_relative 'base'
24
+
25
+ describe VagrantPlugins::Skytap::API::Tunnel do
26
+ include_context "rest_api"
27
+
28
+ let(:json_path) { File.join(File.expand_path('..', __FILE__), 'support', 'api_responses') }
29
+ let(:tunnel1_attrs) { read_json(json_path, 'tunnel1.json') }
30
+ let(:network1_attrs) { read_json(json_path, 'network1.json').merge("id" => "1") }
31
+ let(:network2_attrs) { network1_attrs.merge("id" => "2", "tunnelable" => true) }
32
+
33
+ # TODO is this backward or not???
34
+ let(:tunnel_attrs) { tunnel1_attrs.merge("source_network" => network2_attrs, "target_network" => network1_attrs)}
35
+
36
+ let(:source_network) { API::Network.new(network1_attrs, nil, env) }
37
+ let(:target_network) { API::Network.new(network2_attrs, nil, env) }
38
+
39
+ let(:nat_subnet) { "11.0.0.0/24" }
40
+ let(:tunnelable) { false }
41
+
42
+ let(:provider_config) do
43
+ double(:provider_config, vm_url: "/vms/1", username: "jsmith", api_token: "123123", base_url: base_url)
44
+ end
45
+ let(:api_client) { API::Client.new(provider_config) }
46
+
47
+ let(:environment) {nil}
48
+ let(:env) { { environment: environment, api_client: api_client, provider_config: provider_config } }
49
+
50
+ let(:attrs) { tunnel_attrs }
51
+ let(:instance) { described_class.new(attrs, environment, env) }
52
+
53
+ describe "create!" do
54
+ subject { API::Tunnel.create!(env, source_network, target_network) }
55
+
56
+ it "should have a source and target network" do
57
+ expect(subject.source_network).to be_a_kind_of(API::Network)
58
+ expect(subject.source_network).to be_a_kind_of(API::Network)
59
+ expect(a_request(:post, %r{/tunnels})).to have_been_made.once
60
+ end
61
+ end
62
+ end
data/spec/unit/vm_spec.rb CHANGED
@@ -38,7 +38,6 @@ describe VagrantPlugins::Skytap::API::Vm do
38
38
  let(:api_client) { API::Client.new(provider_config) }
39
39
  let(:machine) { double(:machine, name: "vm1", id: nil, :id= => nil, provider_config: provider_config) }
40
40
  let(:env) { { machine: machine, api_client: api_client } }
41
- let(:instance) { described_class.new(attrs, env) }
42
41
 
43
42
  let(:environment) do
44
43
  env_attrs = empty_environment_attrs
@@ -46,30 +45,19 @@ describe VagrantPlugins::Skytap::API::Vm do
46
45
  end
47
46
 
48
47
  let(:attrs) { vm1_attrs }
48
+ let(:runstate) { nil }
49
49
  let(:instance) { described_class.new(attrs, environment, env) }
50
50
 
51
- # Ensure tests are not affected by Skytap credential environment variables
51
+ let(:get_vm_attrs) { vm1_attrs }
52
52
  before :each do
53
- ENV.stub(:[] => nil)
54
- stub_request(:get, /.*/).to_return(body: '{}', status: 200)
55
- stub_request(:get, %r{/vms/\d+}).to_return(body: JSON.dump(attrs), status: 200)
53
+ stub_get(%r{/vms/\d+}, get_vm_attrs)
54
+ allow(instance).to receive(:runstate).and_return(runstate)
56
55
  end
57
56
 
58
57
  describe "reload" do
59
- subject do
60
- new_attrs = attrs.merge('name' => 'VM1, renamed')
61
- client = double('api_client',
62
- get: double('resp', body: JSON.dump(new_attrs))
63
- )
64
- myenv = env.merge(api_client: client)
65
- described_class.new(attrs, environment, myenv)
66
- end
67
-
68
- it "updates the attrs" do
69
- expect(subject.get_api_attribute('name')).to eq 'VM1'
70
- subject.reload
71
- expect(subject.get_api_attribute('name')).to eq 'VM1, renamed'
72
- end
58
+ subject { instance.reload }
59
+ let(:get_vm_attrs) {vm1_attrs.merge('name' => 'VM1, renamed')}
60
+ its("name") {should eq 'VM1, renamed'}
73
61
  end
74
62
 
75
63
  describe "url" do
@@ -80,68 +68,73 @@ describe VagrantPlugins::Skytap::API::Vm do
80
68
  end
81
69
 
82
70
  describe "busy?" do
83
- subject do
84
- instance
85
- end
71
+ subject { instance.busy? }
86
72
 
87
- it "returns false when stopped" do
88
- allow(subject).to receive(:runstate).and_return('stopped')
89
- expect(subject.busy?).to eq false
90
- allow(subject).to receive(:runstate).and_call_original
73
+ context "when stopped" do
74
+ let(:runstate) {'stopped'}
75
+ it {should be false}
91
76
  end
92
77
 
93
- it "returns false when running" do
94
- allow(subject).to receive(:runstate).and_return('running')
95
- expect(subject.busy?).to eq false
96
- allow(subject).to receive(:runstate).and_call_original
78
+ context "when running" do
79
+ let(:runstate) {'running'}
80
+ it {should be false}
97
81
  end
98
82
 
99
- it "returns true when runstate is busy" do
100
- allow(subject).to receive(:runstate).and_return('busy')
101
- expect(subject.busy?).to eq true
102
- allow(subject).to receive(:runstate).and_call_original
83
+ context "when busy" do
84
+ let(:runstate) {'busy'}
85
+ it {should be true}
103
86
  end
104
87
  end
105
88
 
106
89
  describe "running?" do
107
- subject do
108
- instance
90
+ subject { instance.running? }
91
+
92
+ context "when stopped" do
93
+ let(:runstate) {'stopped'}
94
+ it {should be false}
95
+ end
96
+
97
+ context "when suspended" do
98
+ let(:runstate) {'suspended'}
99
+ it {should be false}
109
100
  end
110
101
 
111
- it "returns false when stopped" do
112
- allow(subject).to receive(:runstate).and_return('stopped')
113
- expect(subject.running?).to eq false
114
- allow(subject).to receive(:runstate).and_call_original
102
+ context "when busy" do
103
+ let(:runstate) {'busy'}
104
+ it {should be false}
115
105
  end
116
106
 
117
- it "returns false when suspended" do
118
- allow(subject).to receive(:runstate).and_return('suspended')
119
- expect(subject.running?).to eq false
120
- allow(subject).to receive(:runstate).and_call_original
107
+ context "when running" do
108
+ let(:runstate) {'running'}
109
+ it {should be true}
121
110
  end
111
+ end
112
+
113
+ describe "parent" do
114
+ subject {instance.region}
122
115
 
123
- it "returns false when runstate is busy" do
124
- allow(subject).to receive(:runstate).and_return('busy')
125
- expect(subject.running?).to eq false
126
- allow(subject).to receive(:runstate).and_call_original
116
+ context "when environment was passed in" do
117
+ before do
118
+ expect(a_request(:any, %r{.*})).not_to have_been_made
119
+ end
120
+ it { should eq 'US-West'}
127
121
  end
128
122
 
129
- it "returns true when running" do
130
- allow(subject).to receive(:runstate).and_return('running')
131
- expect(subject.running?).to eq true
132
- allow(subject).to receive(:runstate).and_call_original
123
+ context "when environment was not passed in" do
124
+ let(:environment) {nil}
125
+ before do
126
+ stub_get(%r{/templates/\d+}, {region: 'US-East'})
127
+ end
128
+ it { should eq 'US-East'}
133
129
  end
134
130
  end
135
131
 
136
132
  describe "region" do
137
- subject do
138
- fake_template_attrs = {'id' => '5570024', 'region' => 'EMEA'}
139
- client = double('api_client',
140
- get: double('resp', body: JSON.dump(fake_template_attrs))
141
- )
142
- myenv = env.merge(api_client: client)
143
- described_class.new(attrs, environment, myenv)
133
+ subject {instance.region}
134
+
135
+ before do
136
+ allow(environment).to receive(:region).and_return('EMEA')
144
137
  end
145
- its("region") { should == 'EMEA' }
138
+ it { should eq 'EMEA' }
146
139
  end
147
140
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-skytap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.10
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric True
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-03-17 00:00:00.000000000 Z
12
+ date: 2016-04-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json_pure
@@ -124,6 +124,8 @@ files:
124
124
  - Gemfile
125
125
  - lib/vagrant-skytap/action/action_helpers.rb
126
126
  - lib/vagrant-skytap/action/add_vm_to_environment.rb
127
+ - lib/vagrant-skytap/action/check_created.rb
128
+ - lib/vagrant-skytap/action/check_running.rb
127
129
  - lib/vagrant-skytap/action/clear_forwarded_ports.rb
128
130
  - lib/vagrant-skytap/action/compose_environment.rb
129
131
  - lib/vagrant-skytap/action/create_environment.rb
@@ -132,6 +134,7 @@ files:
132
134
  - lib/vagrant-skytap/action/existence_check.rb
133
135
  - lib/vagrant-skytap/action/fetch_environment.rb
134
136
  - lib/vagrant-skytap/action/forward_ports.rb
137
+ - lib/vagrant-skytap/action/get_host_vm.rb
135
138
  - lib/vagrant-skytap/action/initial_state.rb
136
139
  - lib/vagrant-skytap/action/initialize_api_client.rb
137
140
  - lib/vagrant-skytap/action/is_parallelized.rb
@@ -165,6 +168,7 @@ files:
165
168
  - lib/vagrant-skytap/action.rb
166
169
  - lib/vagrant-skytap/api/busyable.rb
167
170
  - lib/vagrant-skytap/api/client.rb
171
+ - lib/vagrant-skytap/api/connectable.rb
168
172
  - lib/vagrant-skytap/api/credentials.rb
169
173
  - lib/vagrant-skytap/api/environment.rb
170
174
  - lib/vagrant-skytap/api/interface.rb
@@ -175,9 +179,11 @@ files:
175
179
  - lib/vagrant-skytap/api/resource.rb
176
180
  - lib/vagrant-skytap/api/runstate_operations.rb
177
181
  - lib/vagrant-skytap/api/specified_attributes.rb
182
+ - lib/vagrant-skytap/api/tunnel.rb
178
183
  - lib/vagrant-skytap/api/vm.rb
179
184
  - lib/vagrant-skytap/api/vpn.rb
180
185
  - lib/vagrant-skytap/api/vpn_attachment.rb
186
+ - lib/vagrant-skytap/cap/host_metadata.rb
181
187
  - lib/vagrant-skytap/cap/public_address.rb
182
188
  - lib/vagrant-skytap/command/helpers.rb
183
189
  - lib/vagrant-skytap/command/publish_url/create.rb
@@ -186,6 +192,11 @@ files:
186
192
  - lib/vagrant-skytap/command/publish_url/show.rb
187
193
  - lib/vagrant-skytap/command/up.rb
188
194
  - lib/vagrant-skytap/config.rb
195
+ - lib/vagrant-skytap/connection/public_ip_choice.rb
196
+ - lib/vagrant-skytap/connection/published_service_choice.rb
197
+ - lib/vagrant-skytap/connection/tunnel_choice.rb
198
+ - lib/vagrant-skytap/connection/vpn_choice.rb
199
+ - lib/vagrant-skytap/connection.rb
189
200
  - lib/vagrant-skytap/core_ext/object/blank.rb
190
201
  - lib/vagrant-skytap/core_ext/object/tap.rb
191
202
  - lib/vagrant-skytap/core_ext/try.rb
@@ -217,17 +228,25 @@ files:
217
228
  - spec/unit/actions/update_hardware_spec.rb
218
229
  - spec/unit/api_client_spec.rb
219
230
  - spec/unit/base.rb
231
+ - spec/unit/cap/host_metadata_spec.rb
220
232
  - spec/unit/config_spec.rb
233
+ - spec/unit/connections/public_ip_choice_spec.rb
234
+ - spec/unit/connections/published_service_choice_spec.rb
235
+ - spec/unit/connections/tunnel_choice_spec.rb
236
+ - spec/unit/connections/vpn_choice_spec.rb
221
237
  - spec/unit/credentials_spec.rb
222
238
  - spec/unit/environment_spec.rb
223
239
  - spec/unit/forwarded_port_spec.rb
224
240
  - spec/unit/hosts/common/cap/ssh_tunnel_spec.rb
241
+ - spec/unit/interface_spec.rb
242
+ - spec/unit/network_spec.rb
225
243
  - spec/unit/prepare_collision_params_spec.rb
226
244
  - spec/unit/publish_set_spec.rb
227
245
  - spec/unit/setup_helper_spec.rb
228
246
  - spec/unit/support/api_responses/empty_environment.json
229
247
  - spec/unit/support/api_responses/empty_publish_set.json
230
248
  - spec/unit/support/api_responses/network1.json
249
+ - spec/unit/support/api_responses/tunnel1.json
231
250
  - spec/unit/support/api_responses/vm1.json
232
251
  - spec/unit/support/api_responses/vpn1.json
233
252
  - spec/unit/support/api_responses/vpn_attachment1.json
@@ -243,6 +262,7 @@ files:
243
262
  - spec/unit/support/forwarded_ports/machines/vm4/skytap/tcp8888_tcp_8888_80.pid
244
263
  - spec/unit/support/shared/rest_api_context.rb
245
264
  - spec/unit/support/shared/skytap_context.rb
265
+ - spec/unit/tunnel_spec.rb
246
266
  - spec/unit/vm_spec.rb
247
267
  - tasks/acceptance.rake
248
268
  - tasks/bundler.rake