vcloud-core 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.0.13 (2014-04-30)
2
+
3
+ Feature:
4
+
5
+ - Remove support for Query API formats - we only ever use 'record' format.
6
+
1
7
  ## 0.0.12 (2014-04-22)
2
8
 
3
9
  Bugfix:
data/README.md CHANGED
@@ -18,6 +18,44 @@ Or install it yourself as:
18
18
 
19
19
  $ gem install vcloud-core
20
20
 
21
+ ## Credentials
22
+
23
+ vCloud Core is based around [fog](http://fog.io/). To use it you'll need to give it
24
+ credentials that allow it to talk to a vCloud Director environment.
25
+
26
+ 1. Create a '.fog' file in your home directory.
27
+
28
+ For example:
29
+
30
+ test_credentials:
31
+ vcloud_director_host: 'host.api.example.com'
32
+ vcloud_director_username: 'username@org_name'
33
+ vcloud_director_password: ''
34
+
35
+ 2. Obtain a session token. First, curl the API:
36
+
37
+ curl -D- -d '' \
38
+ -H 'Accept: application/*+xml;version=5.1' -u '<username>@<org_name>' \
39
+ https://<host.api.example.com>/api/sessions
40
+
41
+ This will prompt for your password.
42
+
43
+ From the headers returned, the value of the `x-vcloud-authorization` header is your
44
+ session token, and this will be valid for 30 minutes idle - any activity will extend
45
+ its life by another 30 minutes.
46
+
47
+ 3. Specify your credentials and session token at the beginning of the command. For example:
48
+
49
+ FOG_CREDENTIAL=test_credentials \
50
+ FOG_VCLOUD_TOKEN=AAAABBBBBCCCCCCDDDDDDEEEEEEFFFFF= \
51
+ vcloud-query
52
+
53
+ You may find it easier to export one or both of the values as environment variables.
54
+
55
+ **NB** It is also possible to sidestep the need for the session token by saving your
56
+ password in the fog file. This is **not recommended**.
57
+
58
+
21
59
  ## VCloud Query
22
60
 
23
61
  ### Get results from the vCloud Query API
@@ -49,7 +87,7 @@ NB: examples assume FOG_CREDENTIAL or FOG_VCLOUD_TOKEN has been set accordingly.
49
87
  # Get general usage info
50
88
  vcloud-query --help
51
89
 
52
- # Get a list of all queriable types (left column)
90
+ # Get a list of all queriable entity types
53
91
  vcloud-query
54
92
 
55
93
  # Get all VMs with VMware Tools less than 9282, that are not a vApp Template:
@@ -89,13 +127,29 @@ Entity metadata queries have their own subsyntax incorporating the value types:
89
127
 
90
128
  See http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.doc_51/GUID-4FD71B6D-6797-4B8E-B9F0-618F4ACBEFAC.html for details.
91
129
 
130
+ ## The vCloud API
131
+
132
+ vCloud Tools currently use version 5.1 of the [vCloud API](http://pubs.vmware.com/vcd-51/index.jsp?topic=%2Fcom.vmware.vcloud.api.doc_51%2FGUID-F4BF9D5D-EF66-4D36-A6EB-2086703F6E37.html). Version 5.5 may work but is not currently supported. You should be able to access the 5.1 API in a 5.5 environment, and this *is* currently supported.
133
+
134
+ The default version is defined in [Fog](https://github.com/fog/fog/blob/244a049918604eadbcebd3a8eaaf433424fe4617/lib/fog/vcloud_director/compute.rb#L32).
135
+
136
+ If you want to be sure you are pinning to 5.1, or use 5.5, you can set the API version to use in your fog file, e.g.
137
+
138
+ `vcloud_director_api_version: 5.1`
139
+
140
+ ## Debugging
141
+
142
+ `export EXCON_DEBUG=true` - this will print out the API requests and responses.
143
+
144
+ `export DEBUG=true` - this will show you the stack trace when there is an exception instead of just the message.
145
+
92
146
  ## Testing
93
147
 
94
148
  Default target: `bundle exec rake`
95
149
  Runs the unit tests and feature tests.
96
150
 
97
151
  * Unit tests only: `bundle exec rake spec`
98
- * Feature tests only: `bundle exec rake feature`
152
+ * Feature tests only: `bundle exec rake features`
99
153
  * Integration tests: `bundle exec rake integration`
100
154
 
101
155
  ### setting up and describing your environment for test runs
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rspec/core/rake_task'
2
2
  require 'cucumber/rake/task'
3
3
 
4
- task :default => [:spec, :feature]
4
+ task :default => [:spec, :features]
5
5
 
6
6
  RSpec::Core::RakeTask.new(:spec) do |task|
7
7
  # Set a bogus Fog credential, otherwise it's possible for the unit
@@ -12,7 +12,7 @@ RSpec::Core::RakeTask.new(:spec) do |task|
12
12
  task.pattern = FileList['spec/vcloud/**/*_spec.rb']
13
13
  end
14
14
 
15
- Cucumber::Rake::Task.new(:feature) do |t|
15
+ Cucumber::Rake::Task.new(:features) do |t|
16
16
  t.cucumber_opts = "--format pretty --no-source"
17
17
  t.fork = false
18
18
  end
data/bin/vcloud-query CHANGED
@@ -29,10 +29,6 @@ class App
29
29
  options[:fields] = v
30
30
  end
31
31
 
32
- on('--format', '=ATTRIBUTE', 'Data format to retrieve: records, idrecords, references') do |v|
33
- options[:format] = v
34
- end
35
-
36
32
  on('--filter', '=FILTER', 'Filter expression') do |v|
37
33
  options[:filter] = v
38
34
  end
data/jenkins.sh CHANGED
@@ -7,4 +7,5 @@ git clean -fdx
7
7
  bundle install --path "${HOME}/bundles/${JOB_NAME}"
8
8
 
9
9
  bundle exec rake
10
+ RUBYOPT="-r ./tools/fog_credentials" bundle exec rake integration
10
11
  bundle exec rake publish_gem
@@ -0,0 +1,4 @@
1
+ #!/bin/bash -x
2
+ set -e
3
+ bundle install --path "${HOME}/bundles/${JOB_NAME}"
4
+ RUBYOPT="-r ./tools/fog_credentials" bundle exec rake integration
@@ -32,32 +32,11 @@ module Vcloud
32
32
  end
33
33
 
34
34
  def output_available_query_types
35
- available_query_types = @query_runner.available_query_types
36
- available_queries = collate_formats_for_types(available_query_types)
37
- print_query_types(available_queries)
38
- end
39
-
40
- def collate_formats_for_types(available_queries)
41
- queries = Hash.new { |h, k| h[k]=[] }
42
- available_queries.each do |type, format|
43
- queries[type] << format
44
- end
45
- queries
46
- end
47
-
48
- def print_query_types(queries)
49
- type_width = longest_query_type(queries)
50
-
51
- queries.keys.sort.each do |type|
52
- puts "%-#{type_width}s %s" % [type, queries[type].sort.join(',')]
35
+ @query_runner.available_query_types.each do |entity_type|
36
+ puts entity_type
53
37
  end
54
38
  end
55
39
 
56
- def longest_query_type(queries)
57
- return 0 if queries.keys.empty?
58
- queries.keys.max_by{|key| key.length}.length
59
- end
60
-
61
40
  def output_header(results)
62
41
  return if results.size == 0
63
42
  case @options[:output_format]
@@ -6,21 +6,36 @@ module Vcloud
6
6
  end
7
7
 
8
8
  def run(type=nil, options={})
9
+ raise ArgumentError, "Query API :format option is not supported" if options[:format]
9
10
  get_all_results(type, options)
10
11
  end
11
12
 
12
13
  def available_query_types
13
- query_list = @fsi.get_execute_query()
14
- query_list[:Link].select do |link|
14
+ query_body = @fsi.get_execute_query()
15
+ get_entity_types_in_record_format(query_body)
16
+ end
17
+
18
+ private
19
+
20
+ def get_entity_types_in_record_format(query_body)
21
+ query_links = query_body.fetch(:Link).select do |link|
15
22
  link[:rel] == 'down'
16
- end.map do |link|
17
- href = Nokogiri::XML.fragment(link[:href])
18
- query = CGI.parse(URI.parse(href.text).query)
19
- [query['type'].first, query['format'].first]
20
23
  end
24
+ entity_types = []
25
+ query_links.each do |link|
26
+ (entity_type, query_format) = extract_query_type_and_format_from_link(link)
27
+ entity_types << entity_type if query_format == 'records'
28
+ end
29
+ entity_types
21
30
  end
22
31
 
23
- private
32
+ def extract_query_type_and_format_from_link(link)
33
+ href = Nokogiri::XML.fragment(link[:href])
34
+ query = CGI.parse(URI.parse(href.text).query)
35
+ query_format = query['format'].first
36
+ query_type = query['type'].first
37
+ [query_type, query_format]
38
+ end
24
39
 
25
40
  def get_all_results(type, options)
26
41
  results = []
@@ -1,5 +1,5 @@
1
1
  module Vcloud
2
2
  module Core
3
- VERSION = '0.0.12'
3
+ VERSION = '0.0.13'
4
4
  end
5
5
  end
@@ -114,8 +114,7 @@ module Vcloud
114
114
 
115
115
  def generate_preamble(script_path, script_post_processor, vars)
116
116
  vapp_name = @vapp.name
117
- script = ERB.new(File.read(File.expand_path(script_path)), nil, '>-')
118
- .result(binding)
117
+ script = ERB.new(File.read(File.expand_path(script_path)), nil, '>-').result(binding)
119
118
  if script_post_processor
120
119
  script = Open3.capture2(File.expand_path(script_post_processor),
121
120
  stdin_data: script).first
@@ -3,6 +3,20 @@ require 'spec_helper'
3
3
  module Vcloud
4
4
  module Core
5
5
  describe EdgeGateway do
6
+
7
+ required_env = {
8
+ 'VCLOUD_EDGE_GATEWAY' => 'to name of VSE',
9
+ }
10
+
11
+ error = false
12
+ required_env.each do |var,message|
13
+ unless ENV[var]
14
+ puts "Must set #{var} #{message}" unless ENV[var]
15
+ error = true
16
+ end
17
+ end
18
+ Kernel.exit(2) if error
19
+
6
20
  it "configure firewall service" do
7
21
  configuration = {
8
22
  :FirewallService =>
@@ -3,6 +3,22 @@ require 'spec_helper'
3
3
  module Vcloud
4
4
  module Core
5
5
  describe EdgeGateway do
6
+
7
+ required_env = {
8
+ 'VCLOUD_EDGE_GATEWAY' => 'to name of VSE',
9
+ 'VCLOUD_PROVIDER_NETWORK_ID' => 'to ID of VSE external network',
10
+ 'VCLOUD_NETWORK1_ID' => 'to the ID of a VSE internal network',
11
+ }
12
+
13
+ error = false
14
+ required_env.each do |var,message|
15
+ unless ENV[var]
16
+ puts "Must set #{var} #{message}" unless ENV[var]
17
+ error = true
18
+ end
19
+ end
20
+ Kernel.exit(2) if error
21
+
6
22
  context "get vcloud attributes for given gateway interface id " do
7
23
  before(:all) do
8
24
  @edge_gateway = EdgeGateway.get_by_name(ENV['VCLOUD_EDGE_GATEWAY'])
@@ -0,0 +1,225 @@
1
+ require 'spec_helper'
2
+
3
+ module Vcloud
4
+ module Core
5
+ describe QueryRunner do
6
+
7
+ required_env = {
8
+ 'VCLOUD_VDC_NAME' =>
9
+ 'to the name of an orgVdc to use to instantiate vApps into',
10
+ 'VCLOUD_TEMPLATE_NAME' =>
11
+ 'to the name of a vAppTemplate to use create vApps in tests',
12
+ 'VCLOUD_CATALOG_NAME' =>
13
+ 'to the name of the catalog that VCLOUD_VAPP_TEMPLATE_NAME is stored in',
14
+ }
15
+
16
+ error = false
17
+ required_env.each do |var,message|
18
+ unless ENV[var]
19
+ puts "Must set #{var} #{message}" unless ENV[var]
20
+ error = true
21
+ end
22
+ end
23
+ Kernel.exit(2) if error
24
+
25
+ before(:all) do
26
+ @vapp_template_name = ENV['VCLOUD_TEMPLATE_NAME']
27
+ @vapp_template_catalog_name = ENV['VCLOUD_CATALOG_NAME']
28
+ @vdc_name = ENV['VCLOUD_VDC_NAME']
29
+ end
30
+
31
+ context "#available_query_types" do
32
+
33
+ before(:all) do
34
+ @query_types = QueryRunner.new.available_query_types
35
+ end
36
+
37
+ context "confirm accessing the query API is functional" do
38
+
39
+ it "returns an Array of available query types" do
40
+ expect(@query_types.class).to eq(Array)
41
+ end
42
+
43
+ it "returns at least one query type" do
44
+ expect(@query_types.size).to be >= 1
45
+ end
46
+
47
+ end
48
+
49
+ context "it supports all the vCloud entity types our tools need" do
50
+
51
+ it "supports the vApp entity type" do
52
+ expect(@query_types.include?("vApp")).to be_true
53
+ end
54
+
55
+ it "supports the vm entity type" do
56
+ expect(@query_types.include?("vm")).to be_true
57
+ end
58
+
59
+ it "supports the orgVdc entity type" do
60
+ expect(@query_types.include?("orgVdc")).to be_true
61
+ end
62
+
63
+ it "supports the orgVdcNetwork entity type" do
64
+ expect(@query_types.include?("orgVdcNetwork")).to be_true
65
+ end
66
+
67
+ it "supports the edgeGateway entity type" do
68
+ expect(@query_types.include?("edgeGateway")).to be_true
69
+ end
70
+
71
+ it "supports the task entity type" do
72
+ expect(@query_types.include?("task")).to be_true
73
+ end
74
+
75
+ it "supports the catalog entity type" do
76
+ expect(@query_types.include?("catalog")).to be_true
77
+ end
78
+
79
+ it "supports the catalogItem entity type" do
80
+ expect(@query_types.include?("catalogItem")).to be_true
81
+ end
82
+
83
+ it "supports the vAppTemplate entity type" do
84
+ expect(@query_types.include?("vAppTemplate")).to be_true
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+
91
+ context "#run" do
92
+
93
+ before(:all) do
94
+ @number_of_vapps_to_create = 2
95
+ @test_case_vapps = create_test_case_vapps(
96
+ @number_of_vapps_to_create,
97
+ @vdc_name,
98
+ @vapp_template_catalog_name,
99
+ @vapp_template_name,
100
+ )
101
+ end
102
+
103
+ context "vApps are queriable with no options specified" do
104
+
105
+ before(:all) do
106
+ @all_vapps = QueryRunner.new.run('vApp')
107
+ end
108
+
109
+ it "returns an Array" do
110
+ expect(@all_vapps.class).to eq(Array)
111
+ end
112
+
113
+ it "returns at least the number of vApps that we created" do
114
+ expect(@all_vapps.size).to be >= @number_of_vapps_to_create
115
+ end
116
+
117
+ it "returns a record with a defined :name field" do
118
+ expect(@all_vapps.first[:name]).not_to be_empty
119
+ end
120
+
121
+ it "returns a record with a defined :href field" do
122
+ expect(@all_vapps.first[:href]).not_to be_empty
123
+ end
124
+
125
+ it "returns a record with a defined :vdcName field" do
126
+ expect(@all_vapps.first[:vdcName]).not_to be_empty
127
+ end
128
+
129
+ it "returns a record with a defined :status field" do
130
+ expect(@all_vapps.first[:status]).not_to be_empty
131
+ end
132
+
133
+ it "does not return a 'bogusElement' element" do
134
+ expect(@all_vapps.first.key?(:bogusElement)).to be false
135
+ end
136
+
137
+ end
138
+
139
+ context "Query output fields can be limited by supplying a comma-separated :fields list" do
140
+
141
+ before(:all) do
142
+ @results = QueryRunner.new.run('vApp', fields: "name,vdcName")
143
+ end
144
+
145
+ it "returns a record with a defined name element" do
146
+ expect(@results.first[:name]).not_to be_empty
147
+ end
148
+
149
+ it "returns a record with a defined vdcName element" do
150
+ expect(@results.first[:vdcName]).not_to be_empty
151
+ end
152
+
153
+ it "does not return a 'status' record, which we know is available for our vApp type" do
154
+ expect(@results.first.key?(:status)).to be false
155
+ end
156
+
157
+ end
158
+
159
+ context "Query API does not support an empty :fields list" do
160
+
161
+ it "raises a BadRequest exception, if empty string is supplied for :fields" do
162
+ expect { QueryRunner.new.run('vApp', fields: "") }.
163
+ to raise_exception(::Fog::Compute::VcloudDirector::BadRequest)
164
+ end
165
+
166
+ end
167
+
168
+ context "Query API returns href field regardless of filter :fields selected" do
169
+
170
+ it "returns href as well as name, if just 'name' is asked for" do
171
+ results = QueryRunner.new.run('vApp', fields: "name")
172
+ expect(results.first.keys.sort).to eq([:href, :name])
173
+ end
174
+
175
+ it "returns href, name, vdcName if 'name,vdcName' is asked for" do
176
+ results = QueryRunner.new.run('vApp', fields: "name,vdcName")
177
+ expect(results.first.keys.sort).to eq([:href, :name, :vdcName])
178
+ end
179
+
180
+ end
181
+
182
+ context "query output can be restricted by a filter expression on name" do
183
+
184
+ before(:all) do
185
+ @vapp_name = @test_case_vapps.last.name
186
+ @filtered_results = QueryRunner.new.run('vApp', filter: "name==#{@vapp_name}")
187
+ end
188
+
189
+ it "returns a single record matching our filter on name" do
190
+ expect(@filtered_results.size).to be(1)
191
+ expect(@filtered_results.first.fetch(:name)).to eq(@vapp_name)
192
+ end
193
+
194
+ end
195
+
196
+ after(:all) do
197
+ fsi = Vcloud::Fog::ServiceInterface.new()
198
+ @test_case_vapps.each do |vapp|
199
+ fsi.delete_vapp(vapp.id)
200
+ end
201
+ end
202
+
203
+ def create_test_case_vapps(quantity, vdc_name, catalog_name, vapp_template_name)
204
+ vapp_template = VappTemplate.get(catalog_name, vapp_template_name)
205
+ timestamp_in_s = Time.new.to_i
206
+ base_vapp_name = "vcloud-core-query-tests-#{timestamp_in_s}-"
207
+ network_names = []
208
+ vapp_list = []
209
+ quantity.times do |index|
210
+ vapp_list << Vapp.instantiate(
211
+ base_vapp_name + index.to_s,
212
+ network_names,
213
+ vapp_template.id,
214
+ vdc_name
215
+ )
216
+ end
217
+ vapp_list
218
+ end
219
+
220
+ end
221
+
222
+ end
223
+ end
224
+ end
225
+
@@ -8,44 +8,48 @@ describe Vcloud::QueryRunner do
8
8
  end
9
9
 
10
10
  context '#available_query_types' do
11
- it 'should return empty array if no data' do
12
- @mock_fog_interface.stub(:get_execute_query).and_return({:Link => {}})
13
11
 
12
+ it 'should return empty array if no query type links are returned from API' do
13
+ @mock_fog_interface.stub(:get_execute_query).and_return({:Link => {}})
14
14
  result = @query_runner.available_query_types
15
-
16
15
  result.size.should == 0
17
16
  end
18
17
 
19
- it 'should parse the query types returned' do
18
+ it 'should parse the format=records query hrefs into a list of entity types' do
20
19
  @mock_fog_interface.stub(:get_execute_query).and_return(
21
20
  {:Link => [
22
21
  {:rel => 'down',
23
- :href => 'query?type=alice&#38;format=references'},
22
+ :href => 'query?type=alice&#38;format=records'},
23
+ {:rel => 'down',
24
+ :href => 'query?type=bob&#38;format=records'},
25
+ {:rel => 'down',
26
+ :href => 'query?type=charlie&#38;format=records'},
24
27
  ]})
25
-
26
- result = @query_runner.available_query_types
27
-
28
- result.size.should == 1
29
- result[0][0].should == 'alice'
30
- result[0][1].should == 'references'
28
+ expect(@query_runner.available_query_types).to eq(['alice', 'bob', 'charlie'])
31
29
  end
32
30
 
33
- it 'should return the set of data' do
31
+ it 'should ignore query links with format=references and format=idrecords' do
34
32
  @mock_fog_interface.stub(:get_execute_query).and_return(
35
33
  {:Link => [
36
34
  {:rel => 'down',
37
35
  :href => 'query?type=alice&#38;format=references'},
38
36
  {:rel => 'down',
39
- :href => 'query?type=bob&#38;format=references'},
37
+ :href => 'query?type=bob&#38;format=idrecords'},
38
+ {:rel => 'down',
39
+ :href => 'query?type=charlie&#38;format=records'},
40
40
  ]})
41
-
42
- result = @query_runner.available_query_types
43
-
44
- result.size.should == 2
41
+ expect(@query_runner.available_query_types).to eq(['charlie'])
45
42
  end
43
+
46
44
  end
47
45
 
48
46
  context '#run' do
47
+
48
+ it "should raise an error if a :format option is supplied" do
49
+ expect { @query_runner.run('vApp', :format => 'references') }.
50
+ to raise_error(ArgumentError, "Query API :format option is not supported")
51
+ end
52
+
49
53
  it 'should return no results when fog returns no results' do
50
54
  @mock_fog_interface.stub(:get_execute_query).and_return({})
51
55
 
@@ -5,20 +5,14 @@ describe Vcloud::Query do
5
5
 
6
6
  context "#run called with no type set on construction" do
7
7
 
8
- it "should get and reformat query types" do
8
+ it "should output all types that are available" do
9
9
  query_runner = double(Vcloud::QueryRunner)
10
- allow(query_runner).to receive(:available_query_types) {
11
- [
12
- ['alice', 'references'],
13
- ['alice', 'records'],
14
- ['bob', 'records']
15
- ]
16
- }
10
+ allow(query_runner).to receive(:available_query_types) { [ 'alice', 'bob' ] }
17
11
 
18
12
  @query = Vcloud::Query.new(nil, {}, query_runner)
19
13
 
20
- @query.should_receive(:puts).with("alice records,references")
21
- @query.should_receive(:puts).with("bob records")
14
+ @query.should_receive(:puts).with("alice")
15
+ @query.should_receive(:puts).with("bob")
22
16
 
23
17
  @query.run
24
18
  end
@@ -0,0 +1,17 @@
1
+ # Initialiser for getting vCloud credentials into Fog from Jenkins build
2
+ # parameters, without needing to write them to disk. To be used with:
3
+ #
4
+ # RUBYOPT="-r ./tools/fog_credentials" bundle exec integration
5
+ #
6
+ # Replace with FOG_VCLOUD_TOKEN support when we have a tool:
7
+ #
8
+ # https://www.pivotaltracker.com/story/show/68989754
9
+ #
10
+ require 'bundler/setup'
11
+ require 'fog'
12
+
13
+ Fog.credentials = {
14
+ :vcloud_director_host => ENV['API_HOST'],
15
+ :vcloud_director_username => ENV['API_USERNAME'],
16
+ :vcloud_director_password => ENV['API_PASSWORD'],
17
+ }
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.0.12
4
+ version: 0.0.13
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-04-22 00:00:00.000000000 Z
12
+ date: 2014-04-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -158,6 +158,7 @@ files:
158
158
  - features/support/env.rb
159
159
  - features/vcloud-query.feature
160
160
  - jenkins.sh
161
+ - jenkins_integration_tests.sh
161
162
  - lib/vcloud/core.rb
162
163
  - lib/vcloud/core/compute_metadata.rb
163
164
  - lib/vcloud/core/config_loader.rb
@@ -181,6 +182,7 @@ files:
181
182
  - lib/vcloud/fog/service_interface.rb
182
183
  - spec/integration/edge_gateway/configure_edge_gateway_services_spec.rb
183
184
  - spec/integration/edge_gateway/edge_gateway_spec.rb
185
+ - spec/integration/query/query_runner_spec.rb
184
186
  - spec/spec_helper.rb
185
187
  - spec/support/stub_fog_interface.rb
186
188
  - spec/vcloud/core/config_loader_spec.rb
@@ -202,6 +204,7 @@ files:
202
204
  - spec/vcloud/core/vm_spec.rb
203
205
  - spec/vcloud/fog/fog_model_interface_spec.rb
204
206
  - spec/vcloud/fog/service_interface_spec.rb
207
+ - tools/fog_credentials.rb
205
208
  - vcloud-core.gemspec
206
209
  homepage: http://github.com/alphagov/vcloud-core
207
210
  licenses:
@@ -224,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
227
  version: '0'
225
228
  segments:
226
229
  - 0
227
- hash: 3087589811732903826
230
+ hash: 4282482764039593007
228
231
  requirements: []
229
232
  rubyforge_project:
230
233
  rubygems_version: 1.8.23
@@ -236,6 +239,7 @@ test_files:
236
239
  - features/vcloud-query.feature
237
240
  - spec/integration/edge_gateway/configure_edge_gateway_services_spec.rb
238
241
  - spec/integration/edge_gateway/edge_gateway_spec.rb
242
+ - spec/integration/query/query_runner_spec.rb
239
243
  - spec/spec_helper.rb
240
244
  - spec/support/stub_fog_interface.rb
241
245
  - spec/vcloud/core/config_loader_spec.rb