vagrant-skytap 0.2.6 → 0.2.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: df35f6df87630a3718560fe3900aa38b7eb7d946
4
- data.tar.gz: 98caf819eed011f11be89c6072c5df6e3a8a4664
3
+ metadata.gz: ba60765d51a7600c51ba087d57506e1f469c03dc
4
+ data.tar.gz: 1629dbd77eede4f26f948f1ed65e1e24416ac3ba
5
5
  SHA512:
6
- metadata.gz: d3798da927dafe1c1f69b8b2f5bbe5fb8ef8480c71fce6866f7ce268c476b7be4ce9ed0226e683e493f957d492d799c67ea9798e273f208fdce1ba32ca61c71c
7
- data.tar.gz: 0641307fac52c06148d0554eae1455783834fe745a7bf7432086e27d9001a55660d3e3f41392df8561e69d52be4c78248954cf0aa5b981e6078f75666243747a
6
+ metadata.gz: f8516f76818cee5c9cb7cebcc9a01b91a94f4be9de223bc21d8b48eb1e6385c0f233e8d4b2daf37e649aa0352069eef227e5c6f1f80896cc790c7d86819843b4
7
+ data.tar.gz: 701d24018b94c72f42c95d7829285ed60004cb2ddf111a063d02d907853c198948ab043fe2a50d0bc0702c29ae28f762af837e88a6eef23cce314fce48d08a6f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 0.2.7 (February 19, 2016)
2
+
3
+ * Add User-Agent string with the plugin version and Vagrant version.
4
+
5
+ * Fix bug which coud cause machines to be mapped to the wrong VMs.
6
+
1
7
  # 0.2.6 (February 16, 2016)
2
8
 
3
9
  * Changes to support logging in to base boxes with the default `vagrant` user and
@@ -20,7 +20,6 @@
20
20
  # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
21
  # DEALINGS IN THE SOFTWARE.
22
22
 
23
- require 'log4r'
24
23
  require 'vagrant-skytap/api/environment'
25
24
  require 'vagrant-skytap/api/vm'
26
25
 
@@ -70,6 +69,7 @@ module VagrantPlugins
70
69
  # @return [API::Environment] The new or existing environment
71
70
  def add_vms(environment, machines)
72
71
  source_vms_map = fetch_source_vms(machines)
72
+ names_to_vm_ids = {}
73
73
 
74
74
  get_groupings(source_vms_map, parallel: @env[:parallel]).each do |names|
75
75
  vms_for_pass = names.collect{|name| source_vms_map[name]}
@@ -84,9 +84,11 @@ module VagrantPlugins
84
84
  vms = environment.add_vms(vms_for_pass)
85
85
  end
86
86
 
87
- machines.select{|m| names.include?(m.name)}.each_with_index do |machine, i|
88
- machine.id = vms[i].id
89
- end
87
+ vms.each_with_index {|vm, i| names_to_vm_ids[names[i]] = vm.id }
88
+ end
89
+
90
+ machines.each do |machine|
91
+ machine.id = names_to_vm_ids[machine.name]
90
92
  end
91
93
 
92
94
  environment
@@ -129,15 +131,18 @@ module VagrantPlugins
129
131
  acc
130
132
  end.values
131
133
 
132
- # If the same source VM appears more than once, the API
133
- # requires us to make multiple calls. For simplicity,
134
- # if a particular grouping includes such, just create a single
135
- # call for each vm in the group. (Could be optimized further)
136
134
  groupings2 = []
137
135
  groupings.each_with_index do |grouping, i|
138
136
  if grouping.values.uniq.count == grouping.values.count
139
- groupings2 << grouping.keys
137
+ # The new VMs in the API response will be sorted
138
+ # by the source VM ids. Sort the machines within
139
+ # each group to match.
140
+ groupings2 << grouping.invert.sort.collect(&:last)
140
141
  else
142
+ # If the same source VM appears more than once in a
143
+ # group, we have to make multiple API calls. For
144
+ # simplicity, handle this case by creating a single
145
+ # group for each machine.
141
146
  groupings2.concat(grouping.keys.map{|v| [v]})
142
147
  end
143
148
  end
@@ -129,12 +129,16 @@ module VagrantPlugins
129
129
 
130
130
  private
131
131
 
132
+ def user_agent_string
133
+ "Vagrant-Skytap/#{VERSION} Vagrant/#{Vagrant::VERSION}"
134
+ end
132
135
 
133
136
  def default_headers
134
137
  {
135
138
  'Authorization' => auth_header,
136
139
  'Content-Type' => 'application/json',
137
- 'Accept' => 'application/json'
140
+ 'Accept' => 'application/json',
141
+ 'User-Agent' => user_agent_string,
138
142
  }
139
143
  end
140
144
 
@@ -22,6 +22,6 @@
22
22
 
23
23
  module VagrantPlugins
24
24
  module Skytap
25
- VERSION = "0.2.6"
25
+ VERSION = "0.2.7"
26
26
  end
27
27
  end
@@ -25,29 +25,45 @@ require File.expand_path("../../base", __FILE__)
25
25
  describe VagrantPlugins::Skytap::Action::ComposeEnvironment do
26
26
  include_context "rest_api"
27
27
 
28
+ let(:json_path) { File.join(File.expand_path('../..', __FILE__), 'support', 'api_responses') }
29
+ let(:vm1_attrs) { read_json(json_path, 'vm1.json').merge("id" => "1") }
30
+ let(:vm2_attrs) { vm1_attrs.merge("id" => "2") }
31
+ let(:environment_attrs) { read_json(json_path, 'empty_environment.json').merge('vms' => [vm1_attrs]) }
32
+
28
33
  let(:app) { lambda { |env| } }
29
- let(:env) { { machine: machine, machines: [machine], environment: environment, ui: ui, api_client: api_client } }
34
+ let(:env) { { machine: machine, machines: machines, ui: ui, api_client: api_client, parallel: true } }
30
35
  let(:provider_config) do
31
36
  double(:provider_config, vm_url: "/vms/1", username: "jsmith", api_token: "123123", base_url: base_url)
32
37
  end
33
38
  let(:api_client) { API::Client.new(provider_config) }
34
39
 
35
40
  let(:machine) { double(:machine, name: "vm1", id: nil, :id= => nil, provider_config: provider_config) }
36
- let(:existing_machine) { double(:existing_machine, name: "vm2", id: 2) }
41
+ let(:existing_machine) { double(:existing_machine, name: "vm2", id: "2") }
42
+ let(:machines) { [machine] }
37
43
 
38
44
  let(:environment) { double(:environment, url: "foo") }
39
45
  let(:new_environment) { double(:environment, url: "foo", vms: [vm], properties: environment_properties) }
40
- let(:vm) { double(:vm, id: 1, parent_url: "https://example.com/templates/1") }
46
+ let(:vm) { double(:vm, id: "1", parent_url: "https://example.com/templates/1", :stopped? => true) }
41
47
 
42
48
  let(:environment_properties) { double(:environment_properties, read: nil, write: nil) }
43
49
 
44
- let(:subject) { described_class.new(app, env) }
50
+ let(:instance) { described_class.new(app, env) }
45
51
 
52
+ let(:get_vm_attrs) { vm1_attrs }
53
+ let(:post_config_attrs) { environment_attrs }
54
+ let(:put_config_attrs) { environment_attrs }
46
55
  before do
47
- stub_request(:get, /.*/).to_return(body: '{}', status: 200)
56
+ allow_any_instance_of(API::Environment).to receive(:properties).and_return(environment_properties)
57
+ env[:environment] = environment
58
+
59
+ stub_get(%r{/vms/\d+}, get_vm_attrs)
60
+ stub_post(%r{/configurations$}, post_config_attrs)
61
+ stub_put(%r{/configurations/\d+}, put_config_attrs)
48
62
  end
49
63
 
50
64
  describe "#call" do
65
+ subject {instance}
66
+
51
67
  it "does nothing if all machines exist" do
52
68
  machine.stub(id: 1)
53
69
  expect(app).to receive(:call).with(env)
@@ -59,7 +75,7 @@ describe VagrantPlugins::Skytap::Action::ComposeEnvironment do
59
75
  subject.call(env)
60
76
  end
61
77
 
62
- it "makes a single create! call when creating an environment with 1 machine", run: true do
78
+ it "makes a single create! call when creating an environment with 1 machine" do
63
79
  myenv = env.merge(environment: nil)
64
80
  expect(app).to receive(:call).with(myenv)
65
81
 
@@ -82,7 +98,49 @@ describe VagrantPlugins::Skytap::Action::ComposeEnvironment do
82
98
  end
83
99
  end
84
100
 
101
+ describe "add_vms" do
102
+ subject {instance}
103
+
104
+ before do
105
+ stub_get(%r{/vms/1}, vm1_attrs)
106
+ stub_get(%r{/vms/2}, vm2_attrs)
107
+ # Hack so the region mismatch check always passes
108
+ stub_get(%r{/templates/\d+}, {"region" => environment_attrs["region"]})
109
+ end
110
+
111
+ context "when creating an environment from 2 vms with the same parent" do
112
+ let(:post_config_attrs) do
113
+ environment_attrs.merge('vms' => [vm1_attrs, vm2_attrs])
114
+ end
115
+
116
+ let(:provider_config2) do
117
+ double(:provider_config2, vm_url: "/vms/2", username: "jsmith", api_token: "123123", base_url: base_url)
118
+ end
119
+ let(:machine2) do
120
+ double(:machine2, name: "vm2", id: nil, :id= => nil, provider_config: provider_config2)
121
+ end
122
+
123
+ context "when machines are ordered by vm_id" do
124
+ it "maps the machines to the correct vms" do
125
+ expect(machine).to receive(:id=).with("1")
126
+ expect(machine2).to receive(:id=).with("2")
127
+ subject.add_vms(nil, [machine, machine2])
128
+ end
129
+ end
130
+
131
+ context "when machines are not ordered by vm_id" do
132
+ it "maps the machines to the correct vms" do
133
+ expect(machine).to receive(:id=).with("1")
134
+ expect(machine2).to receive(:id=).with("2")
135
+ subject.add_vms(nil, [machine2, machine])
136
+ end
137
+ end
138
+ end
139
+ end
140
+
85
141
  describe "fetch_source_vms" do
142
+ subject {instance}
143
+
86
144
  it "fetches a vm and returns a mapping" do
87
145
  vms = subject.fetch_source_vms([machine])
88
146
  expect(a_request(:get, %r{/vms/\d+$})).to have_been_made.once
@@ -93,8 +151,10 @@ describe VagrantPlugins::Skytap::Action::ComposeEnvironment do
93
151
  end
94
152
 
95
153
  describe "get_groupings" do
96
- let(:vm_in_same_template) { double(:vm_in_same_template, id: 2, parent_url: "https://example.com/templates/1")}
97
- let(:vm_in_different_template) { double(:vm_in_different_template, id: 3, parent_url: "https://example.com/templates/2")}
154
+ let(:vm_in_same_template) { double(:vm_in_same_template, id: "2", parent_url: "https://example.com/templates/1")}
155
+ let(:vm_in_different_template) { double(:vm_in_different_template, id: "3", parent_url: "https://example.com/templates/2")}
156
+
157
+ subject {instance}
98
158
 
99
159
  it "returns a single group for a single vm" do
100
160
  expect(subject.get_groupings({"vm1" => vm})).to eq([ ["vm1"] ])
@@ -116,5 +176,9 @@ describe VagrantPlugins::Skytap::Action::ComposeEnvironment do
116
176
  it "respects parallel flag" do
117
177
  expect(subject.get_groupings({"vm1" => vm, "vm2" => vm_in_same_template}, parallel: false)).to eq([ ["vm1"], ["vm2"] ])
118
178
  end
179
+
180
+ it "sorts machines in group by vm id" do
181
+ expect(subject.get_groupings({"vm1" => vm_in_same_template, "vm2" => vm})).to eq([ ["vm2", "vm1"] ])
182
+ end
119
183
  end
120
184
  end
@@ -0,0 +1,44 @@
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
+ require "vagrant-skytap/api/client"
25
+
26
+ describe VagrantPlugins::Skytap::API::Client do
27
+ include_context "rest_api"
28
+
29
+ let(:provider_config) do
30
+ double(:provider_config, vm_url: "/vms/1", username: "jsmith", api_token: "123123", base_url: base_url)
31
+ end
32
+ let(:instance) { described_class.new(provider_config) }
33
+
34
+ before :each do
35
+ stub_request(:get, /.*/).to_return(body: "{}", status: 200)
36
+ end
37
+
38
+ describe "user_agent_string" do
39
+ subject do
40
+ instance.send(:user_agent_string)
41
+ end
42
+ it {should match %r{^Vagrant-Skytap/.* Vagrant/.*}}
43
+ end
44
+ end
@@ -36,4 +36,13 @@ shared_context "rest_api" do
36
36
 
37
37
  let(:base_url) {"http://example.com/"}
38
38
 
39
+ %i[get post put delete].each do |verb|
40
+ define_method("stub_#{verb}") do |url_matcher, response_attrs = nil|
41
+ stub_request(verb, url_matcher).to_return(body: JSON.dump(response_attrs), status: 200)
42
+ end
43
+ end
44
+
45
+ before do
46
+ stub_request(:any, /.*/).to_return(body: "{}", status: 200)
47
+ end
39
48
  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.6
4
+ version: 0.2.7
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-02-17 00:00:00.000000000 Z
12
+ date: 2016-02-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json_pure
@@ -214,6 +214,7 @@ files:
214
214
  - spec/spec_helper.rb
215
215
  - spec/unit/actions/compose_environment_spec.rb
216
216
  - spec/unit/actions/update_hardware_spec.rb
217
+ - spec/unit/api_client_spec.rb
217
218
  - spec/unit/base.rb
218
219
  - spec/unit/config_spec.rb
219
220
  - spec/unit/credentials_spec.rb