vmware-vra 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -14
- data/CHANGELOG.md +8 -1
- data/Gemfile +1 -1
- data/README.md +1 -1
- data/Rakefile +8 -5
- data/lib/vra.rb +11 -11
- data/lib/vra/catalog.rb +3 -3
- data/lib/vra/catalog_item.rb +14 -14
- data/lib/vra/catalog_request.rb +9 -9
- data/lib/vra/client.rb +29 -27
- data/lib/vra/exceptions.rb +5 -5
- data/lib/vra/http.rb +9 -9
- data/lib/vra/request.rb +6 -6
- data/lib/vra/request_parameters.rb +7 -7
- data/lib/vra/requests.rb +2 -2
- data/lib/vra/resource.rb +69 -69
- data/lib/vra/resources.rb +1 -1
- data/lib/vra/version.rb +1 -1
- data/spec/catalog_item_spec.rb +61 -61
- data/spec/catalog_request_spec.rb +61 -61
- data/spec/catalog_spec.rb +58 -58
- data/spec/client_spec.rb +187 -187
- data/spec/http_spec.rb +59 -59
- data/spec/request_spec.rb +43 -43
- data/spec/requests_spec.rb +15 -15
- data/spec/resource_spec.rb +163 -163
- data/spec/resources_spec.rb +15 -15
- data/spec/spec_helper.rb +2 -2
- data/vmware-vra.gemspec +18 -18
- metadata +18 -17
data/spec/http_spec.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require
|
3
|
-
require
|
2
|
+
require "spec_helper"
|
3
|
+
require "webmock"
|
4
4
|
|
5
5
|
describe Vra::Http do
|
6
|
-
def expecting_request(method, url, with=nil)
|
6
|
+
def expecting_request(method, url, with = nil)
|
7
7
|
stub = stub_request(method, url)
|
8
8
|
stub.with(with) if with
|
9
9
|
yield if block_given?
|
@@ -26,114 +26,114 @@ describe Vra::Http do
|
|
26
26
|
execute :head, params
|
27
27
|
end
|
28
28
|
|
29
|
-
describe
|
30
|
-
it
|
31
|
-
headers = {
|
29
|
+
describe "#execute" do
|
30
|
+
it "makes a HEAD request" do
|
31
|
+
headers = { "X-Made-Up-Header" => "Foo AND bar? Are you sure?" }
|
32
32
|
|
33
|
-
expecting_request(:head,
|
34
|
-
head url:
|
33
|
+
expecting_request(:head, "http://test.local", headers: headers) do
|
34
|
+
head url: "http://test.local", headers: headers
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
it
|
39
|
-
headers = {
|
38
|
+
it "makes a GET request" do
|
39
|
+
headers = { "X-Made-Up-Header" => "Foo AND bar? Are you sure?" }
|
40
40
|
|
41
|
-
expecting_request(:get,
|
42
|
-
get url:
|
41
|
+
expecting_request(:get, "http://test.local", headers: headers) do
|
42
|
+
get url: "http://test.local", headers: headers
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
it
|
47
|
-
headers = {
|
48
|
-
payload =
|
46
|
+
it "makes a POST request" do
|
47
|
+
headers = { "X-Made-Up-Header" => "Foo AND bar? Are you sure?" }
|
48
|
+
payload = "withabodylikethis"
|
49
49
|
|
50
|
-
expecting_request(:post,
|
51
|
-
post url:
|
50
|
+
expecting_request(:post, "http://test.local", headers: headers, body: payload) do
|
51
|
+
post url: "http://test.local", headers: headers, payload: payload
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
it
|
56
|
-
stub_request(:head,
|
57
|
-
.to_return(headers: {
|
55
|
+
it "preserves Location" do
|
56
|
+
stub_request(:head, "http://test.local")
|
57
|
+
.to_return(headers: { "Location" => "http://test-location.local" })
|
58
58
|
|
59
|
-
response = head(url:
|
59
|
+
response = head(url: "http://test.local")
|
60
60
|
|
61
|
-
expect(response.location).to eq
|
61
|
+
expect(response.location).to eq "http://test-location.local"
|
62
62
|
end
|
63
63
|
|
64
|
-
it
|
65
|
-
stub_request(:head,
|
66
|
-
.to_return(status: [204,
|
64
|
+
it "preserves status code" do
|
65
|
+
stub_request(:head, "http://test.local")
|
66
|
+
.to_return(status: [204, "No content"])
|
67
67
|
|
68
|
-
response = head(url:
|
68
|
+
response = head(url: "http://test.local")
|
69
69
|
|
70
70
|
expect(response.code).to eq 204
|
71
71
|
end
|
72
72
|
|
73
|
-
it
|
73
|
+
it "configures ssl verification" do
|
74
74
|
allow(Net::HTTP).to receive(:start).and_wrap_original do |_http, *args|
|
75
75
|
expect(args.last).to include(verify_mode: OpenSSL::SSL::VERIFY_NONE)
|
76
|
-
double(
|
76
|
+
double("response", final?: true, success?: true)
|
77
77
|
end
|
78
78
|
|
79
|
-
execute(:get, url:
|
79
|
+
execute(:get, url: "https://test.local", verify_ssl: false)
|
80
80
|
end
|
81
81
|
|
82
|
-
context
|
83
|
-
it
|
84
|
-
stub_request(:head,
|
85
|
-
.to_return(status: [200,
|
82
|
+
context "when successful" do
|
83
|
+
it "returns a successful response given a status 200" do
|
84
|
+
stub_request(:head, "http://test.local")
|
85
|
+
.to_return(status: [200, "Whatevs"])
|
86
86
|
|
87
|
-
response = head(url:
|
87
|
+
response = head(url: "http://test.local")
|
88
88
|
|
89
89
|
expect(response.success_ok?).to be_truthy
|
90
90
|
end
|
91
91
|
|
92
|
-
it
|
93
|
-
stub_request(:head,
|
94
|
-
.to_return(status: [204,
|
92
|
+
it "returns a successful response given a status 204" do
|
93
|
+
stub_request(:head, "http://test.local")
|
94
|
+
.to_return(status: [204, "Whatevs"])
|
95
95
|
|
96
|
-
response = head(url:
|
96
|
+
response = head(url: "http://test.local")
|
97
97
|
|
98
98
|
expect(response.success_no_content?).to be_truthy
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
-
context
|
102
|
+
context "when unsuccessful" do
|
103
103
|
(400..418).each do |status|
|
104
104
|
it 'raises an exception given a status #{status}' do
|
105
|
-
stub_request(:get,
|
106
|
-
.to_return(status: [status,
|
107
|
-
body:
|
105
|
+
stub_request(:get, "http://test.local")
|
106
|
+
.to_return(status: [status, "Whatevs"],
|
107
|
+
body: "Error body")
|
108
108
|
|
109
|
-
expect { get(url:
|
109
|
+
expect { get(url: "http://test.local") }.to raise_error do |error|
|
110
110
|
expect(error).to be_a(StandardError)
|
111
111
|
expect(error.http_code).to eq status
|
112
|
-
expect(error.response).to eq
|
112
|
+
expect(error.response).to eq "Error body"
|
113
113
|
end
|
114
114
|
end
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
118
|
-
context
|
118
|
+
context "when redirected" do
|
119
119
|
[301, 302, 307].each do |status|
|
120
120
|
[:get, :head].each do |method|
|
121
121
|
it "follows #{status} redirected #{method.to_s.upcase} requests" do
|
122
|
-
stub_request(method,
|
123
|
-
.to_return(status: [status,
|
124
|
-
headers: {
|
125
|
-
expecting_request(method,
|
126
|
-
execute(method, url:
|
122
|
+
stub_request(method, "http://test.local")
|
123
|
+
.to_return(status: [status, "redirect"],
|
124
|
+
headers: { "Location" => "http://test.local/redirect" })
|
125
|
+
expecting_request(method, "http://test.local/redirect") do
|
126
|
+
execute(method, url: "http://test.local")
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
131
|
it "does not follow #{status} redirected POST requests" do
|
132
|
-
stub_request(:post,
|
133
|
-
.to_return(status: [status,
|
134
|
-
headers: {
|
132
|
+
stub_request(:post, "http://test.local")
|
133
|
+
.to_return(status: [status, "redirect"],
|
134
|
+
headers: { "Location" => "http://test.local/redirect" })
|
135
135
|
|
136
|
-
expect { post(url:
|
136
|
+
expect { post(url: "http://test.local") }.to raise_error do |error|
|
137
137
|
expect(error).to be_a(StandardError)
|
138
138
|
expect(error.http_code).to eq status
|
139
139
|
end
|
@@ -142,12 +142,12 @@ describe Vra::Http do
|
|
142
142
|
|
143
143
|
[:head, :post].each do |method|
|
144
144
|
it "converts #{method.to_s.upcase} to GET on 303 redirect" do
|
145
|
-
stub_request(method,
|
146
|
-
.to_return(status: [303,
|
147
|
-
headers: {
|
145
|
+
stub_request(method, "http://test.local")
|
146
|
+
.to_return(status: [303, "See Other"],
|
147
|
+
headers: { "Location" => "http://test.local/redirect" })
|
148
148
|
|
149
|
-
expecting_request(:get,
|
150
|
-
execute method, url:
|
149
|
+
expecting_request(:get, "http://test.local/redirect") do
|
150
|
+
execute method, url: "http://test.local"
|
151
151
|
end
|
152
152
|
end
|
153
153
|
end
|
data/spec/request_spec.rb
CHANGED
@@ -17,15 +17,15 @@
|
|
17
17
|
# limitations under the License.
|
18
18
|
#
|
19
19
|
|
20
|
-
require
|
20
|
+
require "spec_helper"
|
21
21
|
|
22
|
-
shared_examples
|
23
|
-
it
|
22
|
+
shared_examples "refresh_trigger_method" do |method|
|
23
|
+
it "calls #refresh_if_needed" do
|
24
24
|
expect(request).to receive(:refresh_if_empty)
|
25
25
|
request.send(method)
|
26
26
|
end
|
27
27
|
|
28
|
-
it
|
28
|
+
it "returns nil if request data is empty" do
|
29
29
|
allow(request).to receive(:refresh_if_empty)
|
30
30
|
allow(request).to receive(:request_empty?).and_return true
|
31
31
|
expect(request.send(method)).to eq nil
|
@@ -34,44 +34,44 @@ end
|
|
34
34
|
|
35
35
|
describe Vra::Request do
|
36
36
|
let(:client) do
|
37
|
-
Vra::Client.new(username:
|
38
|
-
password:
|
39
|
-
tenant:
|
40
|
-
base_url:
|
37
|
+
Vra::Client.new(username: "user@corp.local",
|
38
|
+
password: "password",
|
39
|
+
tenant: "tenant",
|
40
|
+
base_url: "https://vra.corp.local")
|
41
41
|
end
|
42
42
|
|
43
|
-
let(:request_id) {
|
43
|
+
let(:request_id) { "2c3df007-b1c4-4687-b332-310089c4851d" }
|
44
44
|
|
45
45
|
let(:in_progress_payload) do
|
46
46
|
{
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
}
|
47
|
+
"phase" => "IN_PROGRESS",
|
48
|
+
"requestCompletion" => {
|
49
|
+
"requestCompletionState" => nil,
|
50
|
+
"completionDetails" => nil,
|
51
|
+
},
|
52
52
|
}
|
53
53
|
end
|
54
54
|
|
55
55
|
let(:completed_payload) do
|
56
56
|
{
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
}
|
57
|
+
"phase" => "SUCCESSFUL",
|
58
|
+
"requestCompletion" => {
|
59
|
+
"requestCompletionState" => "SUCCESSFUL",
|
60
|
+
"completionDetails" => "Request succeeded. Created test-machine.",
|
61
|
+
},
|
62
62
|
}
|
63
63
|
end
|
64
64
|
|
65
65
|
let(:request) { Vra::Request.new(client, request_id) }
|
66
66
|
|
67
|
-
describe
|
68
|
-
it
|
67
|
+
describe "#initialize" do
|
68
|
+
it "sets the id" do
|
69
69
|
expect(request.id).to eq request_id
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
describe
|
74
|
-
it
|
73
|
+
describe "#refresh" do
|
74
|
+
it "calls the request API endpoint" do
|
75
75
|
expect(client).to receive(:get_parsed)
|
76
76
|
.with("/catalog-service/api/consumer/requests/#{request_id}")
|
77
77
|
.and_return(in_progress_payload)
|
@@ -80,45 +80,45 @@ describe Vra::Request do
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
describe
|
84
|
-
context
|
85
|
-
it
|
83
|
+
describe "#refresh_if_empty" do
|
84
|
+
context "request data is empty" do
|
85
|
+
it "calls #refresh" do
|
86
86
|
expect(request).to receive(:refresh)
|
87
87
|
request.refresh_if_empty
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
-
context
|
92
|
-
it
|
91
|
+
context "request data is not empty" do
|
92
|
+
it "does not call #refresh" do
|
93
93
|
allow(request).to receive(:request_empty?).and_return(false)
|
94
94
|
expect(request).to_not receive(:refresh)
|
95
95
|
end
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
|
-
describe
|
100
|
-
it_behaves_like
|
99
|
+
describe "#status" do
|
100
|
+
it_behaves_like "refresh_trigger_method", :status
|
101
101
|
end
|
102
102
|
|
103
|
-
describe
|
104
|
-
context
|
105
|
-
it
|
103
|
+
describe "#completed?" do
|
104
|
+
context "when the request is neither successful or failed yet" do
|
105
|
+
it "returns false" do
|
106
106
|
allow(request).to receive(:successful?).and_return(false)
|
107
107
|
allow(request).to receive(:failed?).and_return(false)
|
108
108
|
expect(request.completed?).to eq false
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
|
-
context
|
113
|
-
it
|
112
|
+
context "when the request is successful" do
|
113
|
+
it "returns true" do
|
114
114
|
allow(request).to receive(:successful?).and_return(true)
|
115
115
|
allow(request).to receive(:failed?).and_return(false)
|
116
116
|
expect(request.completed?).to eq true
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
context
|
121
|
-
it
|
120
|
+
context "when the request failed" do
|
121
|
+
it "returns true" do
|
122
122
|
allow(request).to receive(:successful?).and_return(false)
|
123
123
|
allow(request).to receive(:failed?).and_return(true)
|
124
124
|
expect(request.completed?).to eq true
|
@@ -126,16 +126,16 @@ describe Vra::Request do
|
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
129
|
-
describe
|
130
|
-
it_behaves_like
|
129
|
+
describe "#completion_state" do
|
130
|
+
it_behaves_like "refresh_trigger_method", :completion_state
|
131
131
|
end
|
132
132
|
|
133
|
-
describe
|
134
|
-
it_behaves_like
|
133
|
+
describe "#completion_details" do
|
134
|
+
it_behaves_like "refresh_trigger_method", :completion_details
|
135
135
|
end
|
136
136
|
|
137
|
-
describe
|
138
|
-
it
|
137
|
+
describe "#resources" do
|
138
|
+
it "calls the requests resources API endpoint" do
|
139
139
|
expect(client).to receive(:http_get_paginated_array!)
|
140
140
|
.with("/catalog-service/api/consumer/requests/#{request_id}/resources")
|
141
141
|
.and_return([])
|
data/spec/requests_spec.rb
CHANGED
@@ -17,31 +17,31 @@
|
|
17
17
|
# limitations under the License.
|
18
18
|
#
|
19
19
|
|
20
|
-
require
|
20
|
+
require "spec_helper"
|
21
21
|
|
22
22
|
describe Vra::Requests do
|
23
23
|
let(:client) do
|
24
|
-
Vra::Client.new(username:
|
25
|
-
password:
|
26
|
-
tenant:
|
27
|
-
base_url:
|
24
|
+
Vra::Client.new(username: "user@corp.local",
|
25
|
+
password: "password",
|
26
|
+
tenant: "tenant",
|
27
|
+
base_url: "https://vra.corp.local")
|
28
28
|
end
|
29
29
|
|
30
30
|
let(:requests) { Vra::Requests.new(client) }
|
31
31
|
|
32
|
-
describe
|
33
|
-
it
|
32
|
+
describe "#all_resources" do
|
33
|
+
it "calls the requests API endpoint" do
|
34
34
|
expect(client).to receive(:http_get_paginated_array!)
|
35
|
-
.with(
|
35
|
+
.with("/catalog-service/api/consumer/requests")
|
36
36
|
.and_return([])
|
37
37
|
|
38
38
|
requests.all_requests
|
39
39
|
end
|
40
40
|
|
41
|
-
it
|
41
|
+
it "returns an array of request objects" do
|
42
42
|
allow(client).to receive(:http_get_paginated_array!)
|
43
|
-
.with(
|
44
|
-
.and_return([ {
|
43
|
+
.with("/catalog-service/api/consumer/requests")
|
44
|
+
.and_return([ { "id" => "1" }, { "id" => "2" } ])
|
45
45
|
|
46
46
|
items = requests.all_requests
|
47
47
|
|
@@ -50,11 +50,11 @@ describe Vra::Requests do
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
describe
|
54
|
-
it
|
55
|
-
expect(Vra::Request).to receive(:new).with(client,
|
53
|
+
describe "#by_id" do
|
54
|
+
it "returns a request object" do
|
55
|
+
expect(Vra::Request).to receive(:new).with(client, "12345")
|
56
56
|
|
57
|
-
requests.by_id(
|
57
|
+
requests.by_id("12345")
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
data/spec/resource_spec.rb
CHANGED
@@ -17,20 +17,20 @@
|
|
17
17
|
# limitations under the License.
|
18
18
|
#
|
19
19
|
|
20
|
-
require
|
21
|
-
require
|
22
|
-
|
23
|
-
shared_examples_for
|
24
|
-
context
|
25
|
-
it
|
26
|
-
expect(resource).to receive(:action_id_by_name).with(action_name).and_return(
|
27
|
-
expect(resource).to receive(:submit_action_request).with(
|
20
|
+
require "spec_helper"
|
21
|
+
require "ffi_yajl"
|
22
|
+
|
23
|
+
shared_examples_for "a resource action" do |action_method, action_name|
|
24
|
+
context "when the action is available" do
|
25
|
+
it "calls gets the action ID and submits the request" do
|
26
|
+
expect(resource).to receive(:action_id_by_name).with(action_name).and_return("action-123")
|
27
|
+
expect(resource).to receive(:submit_action_request).with("action-123")
|
28
28
|
resource.send(action_method)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
context
|
33
|
-
it
|
32
|
+
context "when the action is not available" do
|
33
|
+
it "raises an exception" do
|
34
34
|
expect(resource).to receive(:action_id_by_name).with(action_name).and_return nil
|
35
35
|
expect { resource.send(action_method) }.to raise_error(Vra::Exception::NotFound)
|
36
36
|
end
|
@@ -39,61 +39,61 @@ end
|
|
39
39
|
|
40
40
|
describe Vra::Resource do
|
41
41
|
let(:client) do
|
42
|
-
Vra::Client.new(username:
|
43
|
-
password:
|
44
|
-
tenant:
|
45
|
-
base_url:
|
42
|
+
Vra::Client.new(username: "user@corp.local",
|
43
|
+
password: "password",
|
44
|
+
tenant: "tenant",
|
45
|
+
base_url: "https://vra.corp.local")
|
46
46
|
end
|
47
47
|
|
48
|
-
let(:resource_id) {
|
48
|
+
let(:resource_id) { "31a7badc-6562-458d-84f3-ec58d74a6953" }
|
49
49
|
let(:vm_payload) do
|
50
50
|
FFI_Yajl::Parser.parse(File.read(File.join(File.dirname(__FILE__),
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
"fixtures",
|
52
|
+
"resource",
|
53
|
+
"vm_resource.json")))
|
54
54
|
end
|
55
55
|
|
56
56
|
let(:vm_payload_no_ops) do
|
57
57
|
FFI_Yajl::Parser.parse(File.read(File.join(File.dirname(__FILE__),
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
"fixtures",
|
59
|
+
"resource",
|
60
|
+
"vm_resource_no_operations.json")))
|
61
61
|
end
|
62
62
|
|
63
63
|
let(:non_vm_payload) do
|
64
64
|
FFI_Yajl::Parser.parse(File.read(File.join(File.dirname(__FILE__),
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
"fixtures",
|
66
|
+
"resource",
|
67
|
+
"non_vm_resource.json")))
|
68
68
|
end
|
69
69
|
|
70
|
-
describe
|
71
|
-
it
|
70
|
+
describe "#initialize" do
|
71
|
+
it "raises an error if no ID or resource data have been provided" do
|
72
72
|
expect { Vra::Resource.new }.to raise_error(ArgumentError)
|
73
73
|
end
|
74
74
|
|
75
|
-
it
|
76
|
-
expect { Vra::Resource.new(id: 123, data:
|
75
|
+
it "raises an error if an ID and resource data have both been provided" do
|
76
|
+
expect { Vra::Resource.new(id: 123, data: "foo") }.to raise_error(ArgumentError)
|
77
77
|
end
|
78
78
|
|
79
|
-
context
|
80
|
-
it
|
79
|
+
context "when an ID is provided" do
|
80
|
+
it "calls fetch_resource_data" do
|
81
81
|
resource = Vra::Resource.allocate
|
82
82
|
expect(resource).to receive(:fetch_resource_data)
|
83
83
|
resource.send(:initialize, client, id: resource_id)
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
context
|
88
|
-
it
|
87
|
+
context "when resource data is provided" do
|
88
|
+
it "populates the ID correctly" do
|
89
89
|
resource = Vra::Resource.new(client, data: vm_payload)
|
90
90
|
expect(resource.id).to eq resource_id
|
91
91
|
end
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
|
-
describe
|
96
|
-
it
|
95
|
+
describe "#fetch_resource_data" do
|
96
|
+
it "calls get_parsed against the resources API endpoint" do
|
97
97
|
expect(client).to receive(:get_parsed)
|
98
98
|
.with("/catalog-service/api/consumer/resources/#{resource_id}")
|
99
99
|
.and_return({})
|
@@ -102,297 +102,297 @@ describe Vra::Resource do
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
-
context
|
105
|
+
context "when a valid VM resource instance has been created" do
|
106
106
|
let(:resource) { Vra::Resource.new(client, data: vm_payload) }
|
107
107
|
|
108
|
-
describe
|
109
|
-
it
|
110
|
-
expect(resource.name).to eq
|
108
|
+
describe "#name" do
|
109
|
+
it "returns the correct name" do
|
110
|
+
expect(resource.name).to eq "hol-dev-11"
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
-
describe
|
115
|
-
it
|
116
|
-
expect(resource.description).to eq
|
114
|
+
describe "#description" do
|
115
|
+
it "returns the correct description" do
|
116
|
+
expect(resource.description).to eq "test-description"
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
describe
|
121
|
-
it
|
122
|
-
expect(resource.status).to eq
|
120
|
+
describe "#status" do
|
121
|
+
it "returns the correct status" do
|
122
|
+
expect(resource.status).to eq "ACTIVE"
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
-
describe
|
127
|
-
context
|
128
|
-
let(:resource_data) { {
|
129
|
-
it
|
126
|
+
describe "#vm?" do
|
127
|
+
context "when the resource type is Infrastructure.Virtual" do
|
128
|
+
let(:resource_data) { { "resourceTypeRef" => { "id" => "Infrastructure.Virtual" } } }
|
129
|
+
it "returns true" do
|
130
130
|
allow(resource).to receive(:resource_data).and_return(resource_data)
|
131
131
|
expect(resource.vm?).to eq(true)
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
135
|
-
context
|
136
|
-
let(:resource_data) { {
|
137
|
-
it
|
135
|
+
context "when the resource type is Infrastructure.Cloud" do
|
136
|
+
let(:resource_data) { { "resourceTypeRef" => { "id" => "Infrastructure.Cloud" } } }
|
137
|
+
it "returns true" do
|
138
138
|
allow(resource).to receive(:resource_data).and_return(resource_data)
|
139
139
|
expect(resource.vm?).to eq(true)
|
140
140
|
end
|
141
141
|
end
|
142
142
|
|
143
|
-
context
|
144
|
-
let(:resource_data) { {
|
145
|
-
it
|
143
|
+
context "when the resource type is an unknown type" do
|
144
|
+
let(:resource_data) { { "resourceTypeRef" => { "id" => "Infrastructure.Unknown" } } }
|
145
|
+
it "returns false" do
|
146
146
|
allow(resource).to receive(:resource_data).and_return(resource_data)
|
147
147
|
expect(resource.vm?).to eq(false)
|
148
148
|
end
|
149
149
|
end
|
150
150
|
end
|
151
151
|
|
152
|
-
describe
|
153
|
-
it
|
154
|
-
expect(resource.tenant_id).to eq
|
152
|
+
describe "#tenant_id" do
|
153
|
+
it "returns the correct tenant ID" do
|
154
|
+
expect(resource.tenant_id).to eq "vsphere.local"
|
155
155
|
end
|
156
156
|
end
|
157
157
|
|
158
|
-
describe
|
159
|
-
it
|
160
|
-
expect(resource.tenant_name).to eq
|
158
|
+
describe "#tenant_name" do
|
159
|
+
it "returns the correct tenant name" do
|
160
|
+
expect(resource.tenant_name).to eq "vsphere.local"
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
-
describe
|
165
|
-
it
|
166
|
-
expect(resource.subtenant_id).to eq
|
164
|
+
describe "#subtenant_id" do
|
165
|
+
it "returns the correct subtenant ID" do
|
166
|
+
expect(resource.subtenant_id).to eq "5327ddd3-1a4e-4663-9e9d-63db86ffc8af"
|
167
167
|
end
|
168
168
|
end
|
169
169
|
|
170
|
-
describe
|
171
|
-
it
|
172
|
-
expect(resource.subtenant_name).to eq
|
170
|
+
describe "#subtenant_name" do
|
171
|
+
it "returns the correct subtenant name" do
|
172
|
+
expect(resource.subtenant_name).to eq "Rainpole Developers"
|
173
173
|
end
|
174
174
|
end
|
175
175
|
|
176
|
-
describe
|
177
|
-
it
|
178
|
-
expect(resource.owner_ids).to eq %w
|
176
|
+
describe "#owner_ids" do
|
177
|
+
it "returns the correct owner IDs" do
|
178
|
+
expect(resource.owner_ids).to eq %w{user1@corp.local user2@corp.local}
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
182
|
-
describe
|
183
|
-
it
|
184
|
-
expect(resource.owner_names).to eq [
|
182
|
+
describe "#owner_names" do
|
183
|
+
it "returns the correct owner names" do
|
184
|
+
expect(resource.owner_names).to eq [ "Joe User", "Jane User" ]
|
185
185
|
end
|
186
186
|
end
|
187
187
|
|
188
|
-
describe
|
189
|
-
context
|
190
|
-
let(:resource_data) { {
|
188
|
+
describe "#machine_status" do
|
189
|
+
context "when no MachineStatus exists" do
|
190
|
+
let(:resource_data) { { "resourceData" => { "entries" => [] } } }
|
191
191
|
|
192
|
-
it
|
192
|
+
it "raises an exception" do
|
193
193
|
allow(resource).to receive(:resource_data).and_return(resource_data)
|
194
194
|
expect { resource.machine_status }.to raise_error(RuntimeError)
|
195
195
|
end
|
196
196
|
end
|
197
197
|
|
198
|
-
context
|
198
|
+
context "when MachineStatus Exists" do
|
199
199
|
let(:resource_data) do
|
200
200
|
{
|
201
|
-
|
202
|
-
|
201
|
+
"resourceData" => {
|
202
|
+
"entries" => [
|
203
203
|
{
|
204
|
-
|
205
|
-
|
206
|
-
}
|
207
|
-
]
|
208
|
-
}
|
204
|
+
"key" => "MachineStatus",
|
205
|
+
"value" => { "type" => "string", "value" => "Off" },
|
206
|
+
},
|
207
|
+
],
|
208
|
+
},
|
209
209
|
}
|
210
210
|
end
|
211
211
|
|
212
|
-
it
|
212
|
+
it "returns the correct status value" do
|
213
213
|
allow(resource).to receive(:resource_data).and_return(resource_data)
|
214
|
-
expect(resource.machine_status).to eq(
|
214
|
+
expect(resource.machine_status).to eq("Off")
|
215
215
|
end
|
216
216
|
end
|
217
217
|
end
|
218
218
|
|
219
|
-
describe
|
220
|
-
it
|
221
|
-
allow(resource).to receive(:machine_status).and_return(
|
219
|
+
describe "#machine_on?" do
|
220
|
+
it "returns true if the machine_status is On" do
|
221
|
+
allow(resource).to receive(:machine_status).and_return("On")
|
222
222
|
expect(resource.machine_on?).to eq(true)
|
223
223
|
end
|
224
224
|
|
225
|
-
it
|
226
|
-
allow(resource).to receive(:machine_status).and_return(
|
225
|
+
it "returns false if the machine_status is not On" do
|
226
|
+
allow(resource).to receive(:machine_status).and_return("Off")
|
227
227
|
expect(resource.machine_on?).to eq(false)
|
228
228
|
end
|
229
229
|
end
|
230
230
|
|
231
|
-
describe
|
232
|
-
it
|
233
|
-
allow(resource).to receive(:machine_status).and_return(
|
231
|
+
describe "#machine_off?" do
|
232
|
+
it "returns true if the machine_status is Off" do
|
233
|
+
allow(resource).to receive(:machine_status).and_return("Off")
|
234
234
|
expect(resource.machine_off?).to eq(true)
|
235
235
|
end
|
236
236
|
|
237
|
-
it
|
238
|
-
allow(resource).to receive(:machine_status).and_return(
|
237
|
+
it "returns false if the machine_status is not Off" do
|
238
|
+
allow(resource).to receive(:machine_status).and_return("On")
|
239
239
|
expect(resource.machine_off?).to eq(false)
|
240
240
|
end
|
241
241
|
end
|
242
242
|
|
243
|
-
describe
|
244
|
-
it
|
245
|
-
allow(resource).to receive(:machine_status).and_return(
|
243
|
+
describe "#machine_turning_on?" do
|
244
|
+
it "returns true if the machine_status is TurningOn" do
|
245
|
+
allow(resource).to receive(:machine_status).and_return("TurningOn")
|
246
246
|
expect(resource.machine_turning_on?).to eq(true)
|
247
247
|
end
|
248
248
|
|
249
|
-
it
|
250
|
-
allow(resource).to receive(:machine_status).and_return(
|
249
|
+
it "returns true if the machine_status is MachineActivated" do
|
250
|
+
allow(resource).to receive(:machine_status).and_return("MachineActivated")
|
251
251
|
expect(resource.machine_turning_on?).to eq(true)
|
252
252
|
end
|
253
253
|
|
254
|
-
it
|
255
|
-
allow(resource).to receive(:machine_status).and_return(
|
254
|
+
it "returns false if the machine_status is not TurningOn" do
|
255
|
+
allow(resource).to receive(:machine_status).and_return("On")
|
256
256
|
expect(resource.machine_turning_on?).to eq(false)
|
257
257
|
end
|
258
258
|
end
|
259
259
|
|
260
|
-
describe
|
261
|
-
it
|
262
|
-
allow(resource).to receive(:machine_status).and_return(
|
260
|
+
describe "#machine_turning_off?" do
|
261
|
+
it "returns true if the machine_status is TurningOff" do
|
262
|
+
allow(resource).to receive(:machine_status).and_return("TurningOff")
|
263
263
|
expect(resource.machine_turning_off?).to eq(true)
|
264
264
|
end
|
265
265
|
|
266
|
-
it
|
267
|
-
allow(resource).to receive(:machine_status).and_return(
|
266
|
+
it "returns true if the machine_status is ShuttingDown" do
|
267
|
+
allow(resource).to receive(:machine_status).and_return("ShuttingDown")
|
268
268
|
expect(resource.machine_turning_off?).to eq(true)
|
269
269
|
end
|
270
270
|
|
271
|
-
it
|
272
|
-
allow(resource).to receive(:machine_status).and_return(
|
271
|
+
it "returns false if the machine_status is not TurningOff or ShuttingDown" do
|
272
|
+
allow(resource).to receive(:machine_status).and_return("Off")
|
273
273
|
expect(resource.machine_turning_off?).to eq(false)
|
274
274
|
end
|
275
275
|
end
|
276
276
|
|
277
|
-
describe
|
278
|
-
it
|
279
|
-
allow(resource).to receive(:machine_status).and_return(
|
277
|
+
describe "#machine_in_provisioned_state?" do
|
278
|
+
it "returns true if the machine_status is MachineProvisioned" do
|
279
|
+
allow(resource).to receive(:machine_status).and_return("MachineProvisioned")
|
280
280
|
expect(resource.machine_in_provisioned_state?).to eq(true)
|
281
281
|
end
|
282
282
|
|
283
|
-
it
|
284
|
-
allow(resource).to receive(:machine_status).and_return(
|
283
|
+
it "returns false if the machine_status is not MachineProvisioned" do
|
284
|
+
allow(resource).to receive(:machine_status).and_return("On")
|
285
285
|
expect(resource.machine_in_provisioned_state?).to eq(false)
|
286
286
|
end
|
287
287
|
end
|
288
288
|
|
289
|
-
describe
|
290
|
-
it
|
289
|
+
describe "#network_interfaces" do
|
290
|
+
it "returns an array of 2 elements" do
|
291
291
|
expect(resource.network_interfaces.size).to be 2
|
292
292
|
end
|
293
293
|
|
294
|
-
it
|
294
|
+
it "contains the correct data" do
|
295
295
|
nic1, nic2 = resource.network_interfaces
|
296
296
|
|
297
|
-
expect(nic1[
|
298
|
-
expect(nic1[
|
299
|
-
expect(nic1[
|
297
|
+
expect(nic1["NETWORK_NAME"]).to eq "VM Network"
|
298
|
+
expect(nic1["NETWORK_ADDRESS"]).to eq "192.168.110.200"
|
299
|
+
expect(nic1["NETWORK_MAC_ADDRESS"]).to eq "00:50:56:ae:95:3c"
|
300
300
|
|
301
|
-
expect(nic2[
|
302
|
-
expect(nic2[
|
303
|
-
expect(nic2[
|
301
|
+
expect(nic2["NETWORK_NAME"]).to eq "Management Network"
|
302
|
+
expect(nic2["NETWORK_ADDRESS"]).to eq "192.168.220.200"
|
303
|
+
expect(nic2["NETWORK_MAC_ADDRESS"]).to eq "00:50:56:ae:95:3d"
|
304
304
|
end
|
305
305
|
end
|
306
306
|
|
307
|
-
describe
|
308
|
-
it
|
309
|
-
skip
|
310
|
-
stub_request(:post,
|
307
|
+
describe "#ip_addresses" do
|
308
|
+
it "returns the correct IP addresses" do
|
309
|
+
skip "broken and needs to be updated per changes -JJ 2017-04-14"
|
310
|
+
stub_request(:post, "https://vra.corp.local/identity/api/tokens")
|
311
311
|
.with(body: '{"username":"user@corp.local","password":"password","tenant":"tenant"}',
|
312
|
-
headers: {
|
313
|
-
.to_return(status: 200, body:
|
314
|
-
expect(resource.ip_addresses).to eq [
|
312
|
+
headers: { "Accept" => "application/json", "Content-Type" => "application/json" })
|
313
|
+
.to_return(status: 200, body: "", headers: {})
|
314
|
+
expect(resource.ip_addresses).to eq [ "192.168.110.200", "192.168.220.200" ]
|
315
315
|
end
|
316
316
|
|
317
|
-
it
|
317
|
+
it "returns nil if there are no network interfaces" do
|
318
318
|
allow(resource).to receive(:network_interfaces).and_return nil
|
319
319
|
expect(resource.ip_addresses).to be_nil
|
320
320
|
end
|
321
321
|
end
|
322
322
|
|
323
|
-
describe
|
324
|
-
it
|
323
|
+
describe "#actions" do
|
324
|
+
it "does not call #fetch_resource_data" do
|
325
325
|
expect(resource).not_to receive(:fetch_resource_data)
|
326
326
|
resource.actions
|
327
327
|
end
|
328
328
|
end
|
329
329
|
|
330
|
-
describe
|
331
|
-
it
|
332
|
-
expect(resource.action_id_by_name(
|
330
|
+
describe "#action_id_by_name" do
|
331
|
+
it "returns the correct action ID for the destroy action" do
|
332
|
+
expect(resource.action_id_by_name("Destroy")).to eq "ace8ba42-e724-48d8-9614-9b3a62b5a464"
|
333
333
|
end
|
334
334
|
|
335
|
-
it
|
335
|
+
it "returns nil if there are no resource operations" do
|
336
336
|
allow(resource).to receive(:actions).and_return nil
|
337
|
-
expect(resource.action_id_by_name(
|
337
|
+
expect(resource.action_id_by_name("Destroy")).to be_nil
|
338
338
|
end
|
339
339
|
|
340
|
-
it
|
341
|
-
allow(resource).to receive(:actions).and_return([ {
|
342
|
-
expect(resource.action_id_by_name(
|
340
|
+
it "returns nil if there are actions, but none with the right name" do
|
341
|
+
allow(resource).to receive(:actions).and_return([ { "name" => "some action" }, { "name" => "another action" } ])
|
342
|
+
expect(resource.action_id_by_name("Destroy")).to be_nil
|
343
343
|
end
|
344
344
|
end
|
345
345
|
|
346
|
-
describe
|
347
|
-
it_behaves_like
|
346
|
+
describe "#destroy" do
|
347
|
+
it_behaves_like "a resource action", :destroy, "Destroy"
|
348
348
|
end
|
349
349
|
|
350
|
-
describe
|
351
|
-
it_behaves_like
|
350
|
+
describe "#shutdown" do
|
351
|
+
it_behaves_like "a resource action", :shutdown, "Shutdown"
|
352
352
|
end
|
353
353
|
|
354
|
-
describe
|
355
|
-
it_behaves_like
|
354
|
+
describe "#poweroff" do
|
355
|
+
it_behaves_like "a resource action", :poweroff, "Power Off"
|
356
356
|
end
|
357
357
|
|
358
|
-
describe
|
359
|
-
it_behaves_like
|
358
|
+
describe "#poweron" do
|
359
|
+
it_behaves_like "a resource action", :poweron, "Power On"
|
360
360
|
end
|
361
361
|
|
362
|
-
describe
|
362
|
+
describe "#submit_action_request" do
|
363
363
|
before do
|
364
364
|
allow(resource).to receive(:action_request_payload).and_return({})
|
365
|
-
response = double(
|
366
|
-
allow(client).to receive(:http_post).with(
|
365
|
+
response = double("response", location: "/requests/request-12345")
|
366
|
+
allow(client).to receive(:http_post).with("/catalog-service/api/consumer/requests", "{}").and_return(response)
|
367
367
|
end
|
368
368
|
|
369
|
-
it
|
370
|
-
expect(client).to receive(:http_post).with(
|
369
|
+
it "calls http_post" do
|
370
|
+
expect(client).to receive(:http_post).with("/catalog-service/api/consumer/requests", "{}")
|
371
371
|
|
372
|
-
resource.submit_action_request(
|
372
|
+
resource.submit_action_request("action-123")
|
373
373
|
end
|
374
374
|
|
375
|
-
it
|
376
|
-
expect(resource.submit_action_request(
|
375
|
+
it "returns a Vra::Request object" do
|
376
|
+
expect(resource.submit_action_request("action-123")).to be_an_instance_of(Vra::Request)
|
377
377
|
end
|
378
378
|
end
|
379
379
|
end
|
380
380
|
|
381
|
-
context
|
381
|
+
context "when a valid VM resource instance with no operations is created" do
|
382
382
|
let(:resource) { Vra::Resource.new(client, data: vm_payload_no_ops) }
|
383
383
|
|
384
|
-
describe
|
385
|
-
it
|
384
|
+
describe "#actions" do
|
385
|
+
it "calls #fetch_resource_data" do
|
386
386
|
expect(resource).to receive(:fetch_resource_data)
|
387
387
|
resource.actions
|
388
388
|
end
|
389
389
|
end
|
390
390
|
end
|
391
391
|
|
392
|
-
context
|
392
|
+
context "when a valid non-VM resource instance has been created" do
|
393
393
|
let(:resource) { Vra::Resource.new(client, data: non_vm_payload) }
|
394
394
|
|
395
|
-
it
|
395
|
+
it "returns nil for network_interfaces and ip_addresses" do
|
396
396
|
expect(resource.network_interfaces).to be_nil
|
397
397
|
expect(resource.ip_addresses).to be_nil
|
398
398
|
end
|