vcloud-core 0.13.0 → 0.14.0
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.
- data/CHANGELOG.md +11 -0
- data/lib/vcloud/core/api_interface.rb +29 -0
- data/lib/vcloud/core/compute_metadata.rb +4 -0
- data/lib/vcloud/core/config_loader.rb +11 -0
- data/lib/vcloud/core/edge_gateway.rb +38 -0
- data/lib/vcloud/core/edge_gateway_interface.rb +7 -0
- data/lib/vcloud/core/fog.rb +12 -0
- data/lib/vcloud/core/independent_disk.rb +36 -0
- data/lib/vcloud/core/login_cli.rb +8 -0
- data/lib/vcloud/core/metadata_helper.rb +7 -0
- data/lib/vcloud/core/org_vdc_network.rb +20 -0
- data/lib/vcloud/core/query.rb +9 -0
- data/lib/vcloud/core/query_cli.rb +8 -0
- data/lib/vcloud/core/query_runner.rb +24 -1
- data/lib/vcloud/core/vapp.rb +49 -0
- data/lib/vcloud/core/vapp_template.rb +25 -0
- data/lib/vcloud/core/vdc.rb +17 -0
- data/lib/vcloud/core/version.rb +1 -1
- data/lib/vcloud/core/vm.rb +63 -0
- data/spec/integration/core/query_runner_spec.rb +18 -0
- metadata +23 -23
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
## 0.14.0 (2014-11-10)
|
2
|
+
|
3
|
+
API changes:
|
4
|
+
|
5
|
+
- Automatic pagination of `Vcloud::QueryRunner` results can now be
|
6
|
+
overridden with `page` and `pageSize` options.
|
7
|
+
|
8
|
+
Documentation:
|
9
|
+
|
10
|
+
- Documented all the public methods in vcloud-core to comply with semver.org recommendations.
|
11
|
+
|
1
12
|
## 0.13.0 (2014-10-13)
|
2
13
|
|
3
14
|
Features:
|
@@ -5,30 +5,59 @@ module Vcloud
|
|
5
5
|
# if functionality does not exist in Core
|
6
6
|
class ApiInterface
|
7
7
|
|
8
|
+
# Private interface to Fog service layer to allow direct access to Fog
|
9
|
+
# for functionality not exposed elsewhere in Vcloud::Core.
|
10
|
+
#
|
11
|
+
# @api private
|
8
12
|
def fog_service_interface
|
9
13
|
@fog_service_interface ||= Vcloud::Core::Fog::ServiceInterface.new
|
10
14
|
end
|
11
15
|
|
16
|
+
# Private interface to Fog model layer to allow direct access to Fog for
|
17
|
+
# functionality not exposed elsewhere in Vcloud::Core.
|
18
|
+
#
|
19
|
+
# @api private
|
12
20
|
def fog_model_interface
|
13
21
|
@fog_model_interface ||= Vcloud::Core::Fog::ModelInterface.new
|
14
22
|
end
|
15
23
|
|
24
|
+
# Get a vApp by name and vdc_name
|
25
|
+
#
|
26
|
+
# @param name [String] Name of the vApp
|
27
|
+
# @param vdc_name [String] Name of the vDC
|
28
|
+
# @return [String] Response body describing the vApp
|
16
29
|
def get_vapp_by_name_and_vdc_name(name, vdc_name)
|
17
30
|
fog_service_interface.get_vapp_by_name_and_vdc_name(name, vdc_name)
|
18
31
|
end
|
19
32
|
|
33
|
+
# Get a vApp by id
|
34
|
+
#
|
35
|
+
# @param id [String] ID of the vApp to get
|
36
|
+
# @return [String] Response body describing the vApp
|
20
37
|
def get_vapp(id)
|
21
38
|
fog_service_interface.get_vapp(id)
|
22
39
|
end
|
23
40
|
|
41
|
+
# Delete a vApp by id
|
42
|
+
#
|
43
|
+
# @param id [String] ID of the vApp to delete
|
44
|
+
# @return [Boolean] return true or throw error
|
24
45
|
def delete_vapp(id)
|
25
46
|
fog_service_interface.delete_vapp(id)
|
26
47
|
end
|
27
48
|
|
49
|
+
# Delete a network by id
|
50
|
+
#
|
51
|
+
# @param id [String] ID of the network to delete
|
52
|
+
# @return [Boolean] return true or throw error
|
28
53
|
def delete_network(id)
|
29
54
|
fog_service_interface.delete_network(id)
|
30
55
|
end
|
31
56
|
|
57
|
+
# Returns a Fog::Compute::VcloudDirector::Organization instance representing
|
58
|
+
# the current organization
|
59
|
+
#
|
60
|
+
# @return [Fog::Compute::VcloudDirector::Organization]
|
32
61
|
def current_organization
|
33
62
|
fog_model_interface.current_organization
|
34
63
|
end
|
@@ -2,6 +2,10 @@ module Vcloud
|
|
2
2
|
module Core
|
3
3
|
module ComputeMetadata
|
4
4
|
|
5
|
+
# Returns the metadata for a compute resource
|
6
|
+
#
|
7
|
+
# @param id [String] The ID of the vApp or VM to retrieve metadata for
|
8
|
+
# @return [Hash] Metadata keys/values
|
5
9
|
def get_metadata id
|
6
10
|
vcloud_compute_metadata = Vcloud::Core::Fog::ServiceInterface.new.get_vapp_metadata(id)
|
7
11
|
MetadataHelper.extract_metadata(vcloud_compute_metadata[:MetadataEntry])
|
@@ -4,6 +4,17 @@ module Vcloud
|
|
4
4
|
module Core
|
5
5
|
class ConfigLoader
|
6
6
|
|
7
|
+
# Loads the configuration from +config_file+, optionally rendering
|
8
|
+
# +config_file+ as a Mustache template using vars in +vars_file+ and
|
9
|
+
# optionally validating config against +schema+ supplied.
|
10
|
+
#
|
11
|
+
# @param config_file [String] Location of the YAML config file
|
12
|
+
# @param schema [String, nil] Location of the validation schema
|
13
|
+
# if nil, no validation takes place.
|
14
|
+
# @param vars_file [String, nil] Location of the vars_file (YAML),
|
15
|
+
# if nil, config_file is not rendered
|
16
|
+
# by Mustache
|
17
|
+
# @return [Hash]
|
7
18
|
def load_config(config_file, schema = nil, vars_file = nil)
|
8
19
|
if vars_file
|
9
20
|
rendered_config = Mustache.render(
|
@@ -4,6 +4,12 @@ module Vcloud
|
|
4
4
|
|
5
5
|
attr_reader :id
|
6
6
|
|
7
|
+
# Initialize a new EdgeGateway and check that the provided ID
|
8
|
+
# is in the correct format (lowercase string containing
|
9
|
+
# hexadecimal characters or hyphens)
|
10
|
+
#
|
11
|
+
# @param id [String] The ID of gateway
|
12
|
+
# @return [Vcloud::Core::EdgeGateway] an instance of an EdgeGateway
|
7
13
|
def initialize(id)
|
8
14
|
unless id =~ /^[-0-9a-f]+$/
|
9
15
|
raise "EdgeGateway id : #{id} is not in correct format"
|
@@ -11,6 +17,10 @@ module Vcloud
|
|
11
17
|
@id = id
|
12
18
|
end
|
13
19
|
|
20
|
+
# Find a list of EdgeGateway IDs that match a name
|
21
|
+
#
|
22
|
+
# @param name [String] The name of the EdgeGateway
|
23
|
+
# @return [Array] An array of IDs found.
|
14
24
|
def self.get_ids_by_name(name)
|
15
25
|
q = Vcloud::Core::QueryRunner.new
|
16
26
|
query_results = q.run('edgeGateway', :filter => "name==#{name}")
|
@@ -20,11 +30,20 @@ module Vcloud
|
|
20
30
|
end
|
21
31
|
end
|
22
32
|
|
33
|
+
|
34
|
+
# Update configuration for EdgeGateway
|
35
|
+
#
|
36
|
+
# @param config [Hash] A configuration for EdgeGateway
|
23
37
|
def update_configuration(config)
|
24
38
|
fsi = Vcloud::Core::Fog::ServiceInterface.new
|
25
39
|
fsi.post_configure_edge_gateway_services(id, config)
|
26
40
|
end
|
27
41
|
|
42
|
+
|
43
|
+
# Return the Vcloud::Core::EdgeGatewayInterface of EdgeGateway which matches an ID
|
44
|
+
#
|
45
|
+
# @param id [String] The id of the EdgeGatewayInterface
|
46
|
+
# @return [Vcloud::Core::EdgeGatewayInterface] the EdgeGatewayInterface instance
|
28
47
|
def vcloud_gateway_interface_by_id gateway_interface_id
|
29
48
|
gateway_interfaces = vcloud_attributes[:Configuration][:GatewayInterfaces][:GatewayInterface]
|
30
49
|
unless gateway_interfaces.empty?
|
@@ -34,6 +53,11 @@ module Vcloud
|
|
34
53
|
end
|
35
54
|
end
|
36
55
|
|
56
|
+
# Return the EdgeGateway instance that is the first match for the
|
57
|
+
# supplied name.
|
58
|
+
#
|
59
|
+
# @param name [String] The name of the EdgeGateway
|
60
|
+
# @return [Vcloud::Core::EdgeGateway] the EdgeGateway instance
|
37
61
|
def self.get_by_name(name)
|
38
62
|
ids = self.get_ids_by_name(name)
|
39
63
|
raise "edgeGateway #{name} not found" if ids.size == 0
|
@@ -41,19 +65,33 @@ module Vcloud
|
|
41
65
|
return self.new(ids.first)
|
42
66
|
end
|
43
67
|
|
68
|
+
# Get the vCloud attributes for EdgeGateway
|
69
|
+
#
|
70
|
+
# @return [String] Excon::Response#body from vCloud for EdgeGateway
|
44
71
|
def vcloud_attributes
|
45
72
|
fsi = Vcloud::Core::Fog::ServiceInterface.new
|
46
73
|
fsi.get_edge_gateway(id)
|
47
74
|
end
|
48
75
|
|
76
|
+
# Return the +href+ of EdgeGateway
|
77
|
+
#
|
78
|
+
# @return [String] href of EdgeGateway
|
49
79
|
def href
|
50
80
|
vcloud_attributes[:href]
|
51
81
|
end
|
52
82
|
|
83
|
+
# Return the +name+ of EdgeGateway
|
84
|
+
#
|
85
|
+
# @return [String] name of EdgeGateway
|
53
86
|
def name
|
54
87
|
vcloud_attributes[:name]
|
55
88
|
end
|
56
89
|
|
90
|
+
# For each GatewayInterfaces item in the configuration, create an
|
91
|
+
# EdgeGatewayInterface object to allow decisions based on the connected
|
92
|
+
# networks to be taken without inspecting the API details.
|
93
|
+
#
|
94
|
+
# @return [Array] An array of Vcloud::Core::EdgeGatewayInterface objects
|
57
95
|
def interfaces
|
58
96
|
gateway_config = vcloud_attributes[:Configuration]
|
59
97
|
return [] unless gateway_config[:GatewayInterfaces]
|
@@ -4,6 +4,10 @@ module Vcloud
|
|
4
4
|
|
5
5
|
attr_accessor :name, :network_href, :network_name
|
6
6
|
|
7
|
+
# Return a new instance of an EdgeGatewayInterface
|
8
|
+
#
|
9
|
+
# @param gateway_interface_hash [Hash] The configuration of EdgeGatewayInterface
|
10
|
+
# @return [Vcloud::Core::EdgeGatewayInterface]
|
7
11
|
def initialize(gateway_interface_hash)
|
8
12
|
if gateway_interface_hash.nil?
|
9
13
|
raise "EdgeGatewayInterface: gateway_interface_hash cannot be nil"
|
@@ -17,6 +21,9 @@ module Vcloud
|
|
17
21
|
@network_name = gateway_interface_hash[:Network][:name]
|
18
22
|
end
|
19
23
|
|
24
|
+
# Get the ID of EdgeGatewayInterface from the @network_href
|
25
|
+
#
|
26
|
+
# @return [String] The ID of EdgeGatewayInterface
|
20
27
|
def network_id
|
21
28
|
network_href.split('/').last
|
22
29
|
end
|
data/lib/vcloud/core/fog.rb
CHANGED
@@ -10,10 +10,18 @@ module Vcloud
|
|
10
10
|
TOKEN_ENV_VAR_NAME = 'FOG_VCLOUD_TOKEN'
|
11
11
|
FOG_CREDS_PASS_NAME = :vcloud_director_password
|
12
12
|
|
13
|
+
# Run any checks needed against the Fog credentials
|
14
|
+
# currently only used to disallow plaintext passwords
|
15
|
+
# in .fog files.
|
16
|
+
#
|
13
17
|
def self.check_credentials
|
14
18
|
check_plaintext_pass
|
15
19
|
end
|
16
20
|
|
21
|
+
# Attempt to load the password from the fog credentials file
|
22
|
+
#
|
23
|
+
# @return [String, nil] The password if it could be loaded,
|
24
|
+
# else nil.
|
17
25
|
def self.fog_credentials_pass
|
18
26
|
begin
|
19
27
|
pass = ::Fog.credentials[FOG_CREDS_PASS_NAME]
|
@@ -28,6 +36,10 @@ module Vcloud
|
|
28
36
|
|
29
37
|
private
|
30
38
|
|
39
|
+
# Check whether a plaintext password is in the Fog config
|
40
|
+
# file
|
41
|
+
#
|
42
|
+
# @return [void]
|
31
43
|
def self.check_plaintext_pass
|
32
44
|
pass = fog_credentials_pass
|
33
45
|
unless pass.nil? or pass.empty?
|
@@ -9,6 +9,10 @@ module Vcloud
|
|
9
9
|
|
10
10
|
attr_reader :id
|
11
11
|
|
12
|
+
# Return an object referring to a particular IndependentDisk
|
13
|
+
#
|
14
|
+
# @param id [String] The ID of the independent disk
|
15
|
+
# @return [Vcloud::Core::IndependentDisk]
|
12
16
|
def initialize(id)
|
13
17
|
unless id =~ /^[-0-9a-f]+$/
|
14
18
|
raise "IndependentDisk id : #{id} is not in correct format"
|
@@ -16,6 +20,11 @@ module Vcloud
|
|
16
20
|
@id = id
|
17
21
|
end
|
18
22
|
|
23
|
+
# Return the ID of an IndependentDisk referred to by name and vDC
|
24
|
+
#
|
25
|
+
# @param name [String] The name of the disk
|
26
|
+
# @param vdc [String] The name of the vDC
|
27
|
+
# @return [Vcloud::Core::IndependentDisk] An object representing the IndependentDisk
|
19
28
|
def self.get_by_name_and_vdc_name(name, vdc_name)
|
20
29
|
q = Vcloud::Core::QueryRunner.new
|
21
30
|
query_results = q.run('disk', :filter => "name==#{name};vdcName==#{vdc_name}")
|
@@ -33,6 +42,15 @@ module Vcloud
|
|
33
42
|
return self.new(query_results.first[:href].split('/').last)
|
34
43
|
end
|
35
44
|
|
45
|
+
# Create a named, sized IndependentDisk in a particular named vDC
|
46
|
+
#
|
47
|
+
# @param vdc [String] The name of the vDC
|
48
|
+
# @param name [String] The name of the IndependentDisk
|
49
|
+
# @param size [String, Integer] The size as an integer of bytes, or an
|
50
|
+
# integer with units
|
51
|
+
# (see convert_size_to_bytes)
|
52
|
+
# @return [Vcloud::Core::IndependentDisk] An object representing
|
53
|
+
# the new disk
|
36
54
|
def self.create(vdc, name, size)
|
37
55
|
vdc_name = vdc.name
|
38
56
|
begin
|
@@ -52,18 +70,31 @@ module Vcloud
|
|
52
70
|
return self.new(body[:href].split('/').last)
|
53
71
|
end
|
54
72
|
|
73
|
+
# Return all the vcloud attributes of IndependentDisk
|
74
|
+
#
|
75
|
+
# @return [Hash] a hash describing all the attributes of disk
|
55
76
|
def vcloud_attributes
|
56
77
|
Vcloud::Core::Fog::ServiceInterface.new.get_disk(id)
|
57
78
|
end
|
58
79
|
|
80
|
+
# Return the name of IndependentDisk
|
81
|
+
#
|
82
|
+
# @return [String] the name of instance
|
59
83
|
def name
|
60
84
|
vcloud_attributes[:name]
|
61
85
|
end
|
62
86
|
|
87
|
+
# Return the href of IndependentDisk
|
88
|
+
#
|
89
|
+
# @return [String] the href of instance
|
63
90
|
def href
|
64
91
|
vcloud_attributes[:href]
|
65
92
|
end
|
66
93
|
|
94
|
+
# Return an array of Vcloud::Core::Vm objects which are attached to
|
95
|
+
# independent disk
|
96
|
+
#
|
97
|
+
# @return [Array] an array of Vcloud::Core::Vm
|
67
98
|
def attached_vms
|
68
99
|
body = Vcloud::Core::Fog::ServiceInterface.new.get_vms_disk_attached_to(id)
|
69
100
|
vms = body.fetch(:VmReference)
|
@@ -74,6 +105,11 @@ module Vcloud
|
|
74
105
|
end
|
75
106
|
end
|
76
107
|
|
108
|
+
# Convert an integer and units suffix (e.g. 10mb) into an integer of bytes
|
109
|
+
# Allowed suffixes are: mb, gb, mib, gib
|
110
|
+
#
|
111
|
+
# @param size [String] the intended size of the disk (optionally with units)
|
112
|
+
# @return [Integer] the disk size in bytes
|
77
113
|
def self.convert_size_to_bytes(size)
|
78
114
|
if size.to_s =~ /^(\d+)mb$/i
|
79
115
|
Integer($1) * (10**6)
|
@@ -4,12 +4,20 @@ require 'highline'
|
|
4
4
|
module Vcloud
|
5
5
|
module Core
|
6
6
|
class LoginCli
|
7
|
+
|
8
|
+
# Create a new instance of the CLI, parsing the arguments supplied
|
9
|
+
#
|
10
|
+
# @param argv_array [Array] The Array of ARGV arguments
|
11
|
+
# @return [Vcloud::Core::LoginCLI]
|
7
12
|
def initialize(argv_array)
|
8
13
|
@usage_text = nil
|
9
14
|
|
10
15
|
parse(argv_array)
|
11
16
|
end
|
12
17
|
|
18
|
+
# Login to vCloud and print shell commands suitable for setting the vcloud_token
|
19
|
+
#
|
20
|
+
# @return [void]
|
13
21
|
def run
|
14
22
|
begin
|
15
23
|
pass = read_pass
|
@@ -2,6 +2,13 @@ module Vcloud
|
|
2
2
|
module Core
|
3
3
|
module MetadataHelper
|
4
4
|
|
5
|
+
# Convert the fog metadata into a hash of standard Ruby types
|
6
|
+
# Fog and vCloud currently expose the types used in the API, which are
|
7
|
+
# unnecessary for most needs. This class maps those custom Fog types back
|
8
|
+
# to Ruby types if possible.
|
9
|
+
#
|
10
|
+
# @param vcloud_metadata_entries [Hash] vCloud data as returned from Fog
|
11
|
+
# @return [Hash] a hash of only the metadata using Ruby types
|
5
12
|
def extract_metadata vcloud_metadata_entries
|
6
13
|
metadata = {}
|
7
14
|
vcloud_metadata_entries.each do |entry|
|
@@ -4,6 +4,10 @@ module Vcloud
|
|
4
4
|
|
5
5
|
attr_reader :id
|
6
6
|
|
7
|
+
# Return an object referring to a particular OrgVdcNetwork
|
8
|
+
#
|
9
|
+
# @param id [String] The ID of the network
|
10
|
+
# @return [Vcloud::Core::OrgVdcNetwork]
|
7
11
|
def initialize(id)
|
8
12
|
unless id =~ /^[-0-9a-f]+$/
|
9
13
|
raise "orgVdcNetwork id : #{id} is not in correct format"
|
@@ -11,6 +15,10 @@ module Vcloud
|
|
11
15
|
@id = id
|
12
16
|
end
|
13
17
|
|
18
|
+
# Configure OrgVdcNetwork
|
19
|
+
#
|
20
|
+
# @param config [Hash] the configuration to apply to network
|
21
|
+
# @return [Vcloud::Core::OrgVdcNetwork] an object referring to network
|
14
22
|
def self.provision(config)
|
15
23
|
raise "Must specify a name" unless config[:name]
|
16
24
|
raise "Must specify a vdc_name" unless config[:vdc_name]
|
@@ -45,18 +53,30 @@ module Vcloud
|
|
45
53
|
|
46
54
|
end
|
47
55
|
|
56
|
+
# Return all the vcloud attributes of OrgVdcNetwork
|
57
|
+
#
|
58
|
+
# @return [Hash] a hash describing all the attributes of OrgVdcNetwork
|
48
59
|
def vcloud_attributes
|
49
60
|
Vcloud::Core::Fog::ServiceInterface.new.get_network_complete(id)
|
50
61
|
end
|
51
62
|
|
63
|
+
# Return the name of OrgVdcNetwork
|
64
|
+
#
|
65
|
+
# @return [String] the name of instance
|
52
66
|
def name
|
53
67
|
vcloud_attributes[:name]
|
54
68
|
end
|
55
69
|
|
70
|
+
# Return the href of OrgVdcNetwork
|
71
|
+
#
|
72
|
+
# @return [String] the href of instance
|
56
73
|
def href
|
57
74
|
vcloud_attributes[:href]
|
58
75
|
end
|
59
76
|
|
77
|
+
# Delete OrgVdcNetwork
|
78
|
+
#
|
79
|
+
# @return [void]
|
60
80
|
def delete
|
61
81
|
Vcloud::Core::Fog::ServiceInterface.new.delete_network(id)
|
62
82
|
end
|
data/lib/vcloud/core/query.rb
CHANGED
@@ -4,6 +4,12 @@ module Vcloud
|
|
4
4
|
module Core
|
5
5
|
class Query
|
6
6
|
|
7
|
+
# Initialize a new Vcloud::Core::Query object
|
8
|
+
#
|
9
|
+
# @param type [String] Restrict query results to this type (see QueryRunner#available_query_types)
|
10
|
+
# @param options [Hash] key :output_type defines the output type and defaults to tsv; csv and yaml are valid options
|
11
|
+
# @param query_runner [Method] default=Vcloud::Core::QueryRunner.new
|
12
|
+
# @return [Vcloud::Core::Query]
|
7
13
|
def initialize(type=nil, options={}, query_runner = Vcloud::Core::QueryRunner.new)
|
8
14
|
@type = type
|
9
15
|
@options = options
|
@@ -11,6 +17,9 @@ module Vcloud
|
|
11
17
|
@query_runner = query_runner
|
12
18
|
end
|
13
19
|
|
20
|
+
# Run the query and print to standard out
|
21
|
+
#
|
22
|
+
# @return [void]
|
14
23
|
def run()
|
15
24
|
if @type.nil?
|
16
25
|
output_available_query_types
|
@@ -3,6 +3,11 @@ require 'optparse'
|
|
3
3
|
module Vcloud
|
4
4
|
module Core
|
5
5
|
class QueryCli
|
6
|
+
|
7
|
+
# Create a new instance of the CLI, parsing the arguments supplied
|
8
|
+
#
|
9
|
+
# @param argv_array [Array] The Array of ARGV arguments
|
10
|
+
# @return [Vcloud::Core::QueryCLI]
|
6
11
|
def initialize(argv_array)
|
7
12
|
@usage_text = nil
|
8
13
|
@type = nil
|
@@ -11,6 +16,9 @@ module Vcloud
|
|
11
16
|
parse(argv_array)
|
12
17
|
end
|
13
18
|
|
19
|
+
# Run a query and print results to standard out
|
20
|
+
#
|
21
|
+
# @return [void]
|
14
22
|
def run
|
15
23
|
begin
|
16
24
|
Vcloud::Core::Query.new(@type, @options).run
|
@@ -2,15 +2,38 @@ module Vcloud
|
|
2
2
|
module Core
|
3
3
|
class QueryRunner
|
4
4
|
|
5
|
+
# Create a new instance of the ServiceInterface as the @fsi global
|
5
6
|
def initialize
|
6
7
|
@fsi = Vcloud::Core::Fog::ServiceInterface.new
|
7
8
|
end
|
8
9
|
|
10
|
+
# Run a query (optionally for a particular entity type)
|
11
|
+
#
|
12
|
+
# @param type [String] Name of type to query for - default: nil
|
13
|
+
# See integration test of this module for examples
|
14
|
+
# @param options [Hash] options for the query API
|
15
|
+
# see Fog::Compute::VcloudDirector::Real for more
|
16
|
+
# documentation of valid options.
|
17
|
+
# Default: {}
|
18
|
+
# @option options [String] :filter Filter the query e.g. "name==foo"
|
19
|
+
# @option options [String] :format Unsupported - do not use
|
20
|
+
# @option options [String] :page Override automatic pagination
|
21
|
+
# @option options [String] :pageSize Override automatic pagination
|
22
|
+
# @return [Array] List of results
|
9
23
|
def run(type=nil, options={})
|
10
24
|
raise ArgumentError, "Query API :format option is not supported" if options[:format]
|
11
|
-
|
25
|
+
|
26
|
+
if options.has_key?(:page) || options.has_key?(:pageSize)
|
27
|
+
get_results_page(options.fetch(:page, 1), type, options) || []
|
28
|
+
else
|
29
|
+
get_all_results(type, options)
|
30
|
+
end
|
12
31
|
end
|
13
32
|
|
33
|
+
# List the available entity types which can be queried
|
34
|
+
# See integration test of this module for examples
|
35
|
+
#
|
36
|
+
# @return [Array] list of valid types
|
14
37
|
def available_query_types
|
15
38
|
query_body = @fsi.get_execute_query()
|
16
39
|
get_entity_types_in_record_format(query_body)
|
data/lib/vcloud/core/vapp.rb
CHANGED
@@ -5,6 +5,10 @@ module Vcloud
|
|
5
5
|
|
6
6
|
attr_reader :id
|
7
7
|
|
8
|
+
# Initialize a Vcloud::Core::Vapp
|
9
|
+
#
|
10
|
+
# @param id [String] the vApp ID
|
11
|
+
# @return [Vcloud::Core::Vapp]
|
8
12
|
def initialize(id)
|
9
13
|
unless id =~ /^#{self.class.id_prefix}-[-0-9a-f]+$/
|
10
14
|
raise "#{self.class.id_prefix} id : #{id} is not in correct format"
|
@@ -12,6 +16,10 @@ module Vcloud
|
|
12
16
|
@id = id
|
13
17
|
end
|
14
18
|
|
19
|
+
# Return the ID of a named vApp
|
20
|
+
#
|
21
|
+
# @param name [String] the name of the vApp to find
|
22
|
+
# @return [String] the vApp ID
|
15
23
|
def self.get_by_name(name)
|
16
24
|
q = Vcloud::Core::QueryRunner.new
|
17
25
|
query_results = q.run('vApp', :filter => "name==#{name}")
|
@@ -26,6 +34,10 @@ module Vcloud
|
|
26
34
|
end
|
27
35
|
end
|
28
36
|
|
37
|
+
# Return the ID of the vApp which contains a particular VM
|
38
|
+
#
|
39
|
+
# @param vm_id [String] the ID of the VM to find the parent for
|
40
|
+
# @return [String] the vApp ID
|
29
41
|
def self.get_by_child_vm_id(vm_id)
|
30
42
|
raise ArgumentError, "Must supply a valid Vm id" unless vm_id =~ /^vm-[-0-9a-f]+$/
|
31
43
|
vm_body = Vcloud::Core::Fog::ServiceInterface.new.get_vapp(vm_id)
|
@@ -38,6 +50,9 @@ module Vcloud
|
|
38
50
|
return self.new(parent_vapp_link.fetch(:href).split('/').last)
|
39
51
|
end
|
40
52
|
|
53
|
+
# Return the vCloud data associated with vApp
|
54
|
+
#
|
55
|
+
# @return [Hash] the complete vCloud data for vApp
|
41
56
|
def vcloud_attributes
|
42
57
|
Vcloud::Core::Fog::ServiceInterface.new.get_vapp(id)
|
43
58
|
end
|
@@ -47,33 +62,60 @@ module Vcloud
|
|
47
62
|
POWERED_OFF = 8
|
48
63
|
end
|
49
64
|
|
65
|
+
# Return the name of vApp
|
66
|
+
#
|
67
|
+
# @return [String] the name of instance
|
50
68
|
def name
|
51
69
|
vcloud_attributes[:name]
|
52
70
|
end
|
53
71
|
|
72
|
+
# Return the href of vApp
|
73
|
+
#
|
74
|
+
# @return [String] the href of instance
|
54
75
|
def href
|
55
76
|
vcloud_attributes[:href]
|
56
77
|
end
|
57
78
|
|
79
|
+
# Return the ID of the vDC containing vApp
|
80
|
+
#
|
81
|
+
# @return [String] the ID of the vDC containing vApp
|
58
82
|
def vdc_id
|
59
83
|
link = vcloud_attributes[:Link].detect { |l| l[:rel] == Fog::RELATION::PARENT && l[:type] == Fog::ContentTypes::VDC }
|
60
84
|
link ? link[:href].split('/').last : raise('a vapp without parent vdc found')
|
61
85
|
end
|
62
86
|
|
87
|
+
# Return the VMs within vApp
|
88
|
+
#
|
89
|
+
# @return [Hash] the VMs contained in the vApp
|
63
90
|
def vms
|
64
91
|
vcloud_attributes[:Children][:Vm]
|
65
92
|
end
|
66
93
|
|
94
|
+
# Return the networks connected to vApp
|
95
|
+
#
|
96
|
+
# @return [Hash] a hash describing the networks
|
67
97
|
def networks
|
68
98
|
vcloud_attributes[:'ovf:NetworkSection'][:'ovf:Network']
|
69
99
|
end
|
70
100
|
|
101
|
+
# Find a vApp by name and vDC
|
102
|
+
#
|
103
|
+
# @param name [String] name of the vApp to find
|
104
|
+
# @param vdc_name [String] name of the vDC
|
105
|
+
# @return [String] the ID of the instance
|
71
106
|
def self.get_by_name_and_vdc_name(name, vdc_name)
|
72
107
|
fog_interface = Vcloud::Core::Fog::ServiceInterface.new
|
73
108
|
attrs = fog_interface.get_vapp_by_name_and_vdc_name(name, vdc_name)
|
74
109
|
self.new(attrs[:href].split('/').last) if attrs && attrs.key?(:href)
|
75
110
|
end
|
76
111
|
|
112
|
+
# Instantiate a vApp
|
113
|
+
#
|
114
|
+
# @param name [String] Name to use when creating the vApp
|
115
|
+
# @param network_names [Array] Array of Strings with names of Networks to connect to the vApp
|
116
|
+
# @param template_id [String] The ID of the template to use when creating the vApp
|
117
|
+
# @param vdc_name [String] The name of the vDC to create vApp in
|
118
|
+
# @return [String] the id of the created vApp
|
77
119
|
def self.instantiate(name, network_names, template_id, vdc_name)
|
78
120
|
Vcloud::Core.logger.info("Instantiating new vApp #{name} in vDC '#{vdc_name}'")
|
79
121
|
fog_interface = Vcloud::Core::Fog::ServiceInterface.new
|
@@ -88,6 +130,10 @@ module Vcloud
|
|
88
130
|
self.new(attrs[:href].split('/').last) if attrs and attrs.key?(:href)
|
89
131
|
end
|
90
132
|
|
133
|
+
# Update custom_fields for vApp
|
134
|
+
#
|
135
|
+
# @param custom_fields [Array] Array of Hashes describing the custom fields
|
136
|
+
# @return [Boolean] return true or throws error
|
91
137
|
def update_custom_fields(custom_fields)
|
92
138
|
return if custom_fields.nil?
|
93
139
|
fields = custom_fields.collect do |field|
|
@@ -108,6 +154,9 @@ module Vcloud
|
|
108
154
|
Vcloud::Core::Fog::ServiceInterface.new.put_product_sections(@id, fields)
|
109
155
|
end
|
110
156
|
|
157
|
+
# Power on vApp
|
158
|
+
#
|
159
|
+
# @return [Boolean] Returns true if the VM is running, false otherwise
|
111
160
|
def power_on
|
112
161
|
raise "Cannot power on a missing vApp." unless id
|
113
162
|
return true if running?
|
@@ -4,6 +4,9 @@ module Vcloud
|
|
4
4
|
|
5
5
|
attr_reader :id
|
6
6
|
|
7
|
+
# Return the vCloud data associated with vApp
|
8
|
+
#
|
9
|
+
# @return [Hash] the complete vCloud data for vApp
|
7
10
|
def initialize(id)
|
8
11
|
unless id =~ /^#{self.class.id_prefix}-[-0-9a-f]+$/
|
9
12
|
raise "#{self.class.id_prefix} id : #{id} is not in correct format"
|
@@ -11,18 +14,32 @@ module Vcloud
|
|
11
14
|
@id = id
|
12
15
|
end
|
13
16
|
|
17
|
+
# Return the vCloud data associated with vAppTemplate
|
18
|
+
#
|
19
|
+
# @return [Hash] the complete vCloud data for vAppTemplate
|
14
20
|
def vcloud_attributes
|
15
21
|
Vcloud::Core::Fog::ServiceInterface.new.get_vapp_template(id)
|
16
22
|
end
|
17
23
|
|
24
|
+
# Return the name of vAppTemplate
|
25
|
+
#
|
26
|
+
# @return [String] the name of instance
|
18
27
|
def href
|
19
28
|
vcloud_attributes[:href]
|
20
29
|
end
|
21
30
|
|
31
|
+
# Return the name of vAppTemplate
|
32
|
+
#
|
33
|
+
# @return [String] the name of instance
|
22
34
|
def name
|
23
35
|
vcloud_attributes[:name]
|
24
36
|
end
|
25
37
|
|
38
|
+
# Get a list of templates with a particular name in a catalog
|
39
|
+
#
|
40
|
+
# @param name [String] The name of the vAppTemplate to find
|
41
|
+
# @param catalog_name [String] The name of the catalog to search
|
42
|
+
# @return [Array] an array of IDs of matching templates
|
26
43
|
def self.get_ids_by_name_and_catalog name, catalog_name
|
27
44
|
raise "provide Catalog and vAppTemplate name" unless name && catalog_name
|
28
45
|
q = Vcloud::Core::QueryRunner.new
|
@@ -33,6 +50,11 @@ module Vcloud
|
|
33
50
|
end
|
34
51
|
end
|
35
52
|
|
53
|
+
# Get a template by name and catalog
|
54
|
+
#
|
55
|
+
# @param vapp_template_name [String] The name of the vAppTemplate
|
56
|
+
# @param catalog_name [String] The name of the catalog containing vAppTemplate
|
57
|
+
# @return [String] the ID of the template
|
36
58
|
def self.get vapp_template_name, catalog_name
|
37
59
|
ids = self.get_ids_by_name_and_catalog(vapp_template_name, catalog_name)
|
38
60
|
raise 'Could not find template vApp' if ids.size == 0
|
@@ -42,6 +64,9 @@ module Vcloud
|
|
42
64
|
return self.new(ids.first)
|
43
65
|
end
|
44
66
|
|
67
|
+
# Return the id_prefix to be used for vAppTemplates
|
68
|
+
#
|
69
|
+
# @return [String] returns 'vappTemplate' as an id_prefix
|
45
70
|
def self.id_prefix
|
46
71
|
'vappTemplate'
|
47
72
|
end
|
data/lib/vcloud/core/vdc.rb
CHANGED
@@ -4,6 +4,10 @@ module Vcloud
|
|
4
4
|
|
5
5
|
attr_reader :id
|
6
6
|
|
7
|
+
# Initialize a Vcloud::Core::Vdc
|
8
|
+
#
|
9
|
+
# @param id [String] the vDC ID
|
10
|
+
# @return [Vcloud::Core::Vdc]
|
7
11
|
def initialize(id)
|
8
12
|
unless id =~ /^[-0-9a-f]+$/
|
9
13
|
raise "vdc id : #{id} is not in correct format"
|
@@ -11,6 +15,10 @@ module Vcloud
|
|
11
15
|
@id = id
|
12
16
|
end
|
13
17
|
|
18
|
+
# Get the ID of a named vDC
|
19
|
+
#
|
20
|
+
# @param name [String] The name of the vDC
|
21
|
+
# @return [String] The ID of the vDC
|
14
22
|
def self.get_by_name(name)
|
15
23
|
q = Vcloud::Core::QueryRunner.new
|
16
24
|
query_results = q.run('orgVdc', :filter => "name==#{name}")
|
@@ -19,14 +27,23 @@ module Vcloud
|
|
19
27
|
return self.new(query_results.first[:href].split('/').last)
|
20
28
|
end
|
21
29
|
|
30
|
+
# Return the vCloud data associated with vDC
|
31
|
+
#
|
32
|
+
# @return [Hash] the complete vCloud data for vDC
|
22
33
|
def vcloud_attributes
|
23
34
|
Vcloud::Core::Fog::ServiceInterface.new.get_vdc(id)
|
24
35
|
end
|
25
36
|
|
37
|
+
# Return the name of vDC
|
38
|
+
#
|
39
|
+
# @return [String] the name of instance
|
26
40
|
def name
|
27
41
|
vcloud_attributes[:name]
|
28
42
|
end
|
29
43
|
|
44
|
+
# Return the href of vDC
|
45
|
+
#
|
46
|
+
# @return [String] the href of instance
|
30
47
|
def href
|
31
48
|
vcloud_attributes[:href]
|
32
49
|
end
|
data/lib/vcloud/core/version.rb
CHANGED
data/lib/vcloud/core/vm.rb
CHANGED
@@ -5,6 +5,11 @@ module Vcloud
|
|
5
5
|
|
6
6
|
attr_reader :id
|
7
7
|
|
8
|
+
# Initialize a Vcloud::Core::Vm within a vApp
|
9
|
+
#
|
10
|
+
# @param id [String] the VM ID
|
11
|
+
# @param vapp [Vcloud::Core::Vapp] The vApp object to create VM in
|
12
|
+
# @return [Vcloud::Core::Vm]
|
8
13
|
def initialize(id, vapp)
|
9
14
|
unless id =~ /^#{self.class.id_prefix}-[-0-9a-f]+$/
|
10
15
|
raise "#{self.class.id_prefix} id : #{id} is not in correct format"
|
@@ -13,10 +18,17 @@ module Vcloud
|
|
13
18
|
@vapp = vapp
|
14
19
|
end
|
15
20
|
|
21
|
+
# Return the vCloud data associated with VM
|
22
|
+
#
|
23
|
+
# @return [Hash] the complete vCloud data for VM
|
16
24
|
def vcloud_attributes
|
17
25
|
Vcloud::Core::Fog::ServiceInterface.new.get_vapp(id)
|
18
26
|
end
|
19
27
|
|
28
|
+
# Set the amount of memory in VM which can't be nil or less than 64 (mb)
|
29
|
+
#
|
30
|
+
# @param new_memory [Integer] amount of memory for instance
|
31
|
+
# @return [Boolean] return true or throws an error
|
20
32
|
def update_memory_size_in_mb(new_memory)
|
21
33
|
return if new_memory.nil?
|
22
34
|
return if new_memory.to_i < 64
|
@@ -25,33 +37,56 @@ module Vcloud
|
|
25
37
|
end
|
26
38
|
end
|
27
39
|
|
40
|
+
# Return the amount of memory allocated to VM
|
41
|
+
#
|
42
|
+
# @return [Integer] amount of memory in megabytes
|
28
43
|
def memory
|
29
44
|
memory_item = virtual_hardware_section.detect { |i| i[:'rasd:ResourceType'] == '4' }
|
30
45
|
memory_item[:'rasd:VirtualQuantity']
|
31
46
|
end
|
32
47
|
|
48
|
+
# Return the number of CPUs allocated to the VM
|
49
|
+
#
|
50
|
+
# @return [Integer] number of virtual CPUs
|
33
51
|
def cpu
|
34
52
|
cpu_item = virtual_hardware_section.detect { |i| i[:'rasd:ResourceType'] == '3' }
|
35
53
|
cpu_item[:'rasd:VirtualQuantity']
|
36
54
|
end
|
37
55
|
|
56
|
+
# Return the name of VM
|
57
|
+
#
|
58
|
+
# @return [String] the name of instance
|
38
59
|
def name
|
39
60
|
vcloud_attributes[:name]
|
40
61
|
end
|
41
62
|
|
63
|
+
# Return the href of VM
|
64
|
+
#
|
65
|
+
# @return [String] the href of instance
|
42
66
|
def href
|
43
67
|
vcloud_attributes[:href]
|
44
68
|
end
|
45
69
|
|
70
|
+
# Update the name of VM
|
71
|
+
#
|
72
|
+
# @param new_name [String] The new name for the VM
|
73
|
+
# @return [Boolean] return true or throw an error
|
46
74
|
def update_name(new_name)
|
47
75
|
fsi = Vcloud::Core::Fog::ServiceInterface.new
|
48
76
|
fsi.put_vm(id, new_name) unless name == new_name
|
49
77
|
end
|
50
78
|
|
79
|
+
# Return the name of the vApp containing VM
|
80
|
+
#
|
81
|
+
# @return [String] the name of the vApp
|
51
82
|
def vapp_name
|
52
83
|
@vapp.name
|
53
84
|
end
|
54
85
|
|
86
|
+
# Update the number of CPUs in VM
|
87
|
+
#
|
88
|
+
# @param new_cpu_count [Integer] The number of virtual CPUs to allocate
|
89
|
+
# @return [Boolean] return true or throw an error
|
55
90
|
def update_cpu_count(new_cpu_count)
|
56
91
|
return if new_cpu_count.nil?
|
57
92
|
return if new_cpu_count.to_i == 0
|
@@ -60,6 +95,10 @@ module Vcloud
|
|
60
95
|
end
|
61
96
|
end
|
62
97
|
|
98
|
+
# Update the metadata for VM
|
99
|
+
#
|
100
|
+
# @param metadata [Hash] hash of keys, values to set
|
101
|
+
# @return [Boolean] return true or throw an error
|
63
102
|
def update_metadata(metadata)
|
64
103
|
return if metadata.nil?
|
65
104
|
fsi = Vcloud::Core::Fog::ServiceInterface.new
|
@@ -69,6 +108,10 @@ module Vcloud
|
|
69
108
|
end
|
70
109
|
end
|
71
110
|
|
111
|
+
# Attach independent disk(s) to VM
|
112
|
+
#
|
113
|
+
# @param disk_list [Array] an array of Vcloud::Core::IndependentDisk objects
|
114
|
+
# @return [Boolean] return true or throw an error
|
72
115
|
def attach_independent_disks(disk_list)
|
73
116
|
disk_list = Array(disk_list) # ensure we have an array
|
74
117
|
disk_list.each do |disk|
|
@@ -76,6 +119,10 @@ module Vcloud
|
|
76
119
|
end
|
77
120
|
end
|
78
121
|
|
122
|
+
# Detach independent disk(s) from VM
|
123
|
+
#
|
124
|
+
# @param disk_list [Array] an array of Vcloud::Core::IndependentDisk objects
|
125
|
+
# @return [Boolean] return true or throw an error
|
79
126
|
def detach_independent_disks(disk_list)
|
80
127
|
disk_list = Array(disk_list) # ensure we have an array
|
81
128
|
disk_list.each do |disk|
|
@@ -83,6 +130,10 @@ module Vcloud
|
|
83
130
|
end
|
84
131
|
end
|
85
132
|
|
133
|
+
# Add extra disks to VM
|
134
|
+
#
|
135
|
+
# @param extra_disks [Array] An array of hashes like [{ size: '20480' }]
|
136
|
+
# @return [Boolean] return true or throw an error
|
86
137
|
def add_extra_disks(extra_disks)
|
87
138
|
vm = Vcloud::Core::Fog::ModelInterface.new.get_vm_by_href(href)
|
88
139
|
if extra_disks
|
@@ -93,6 +144,10 @@ module Vcloud
|
|
93
144
|
end
|
94
145
|
end
|
95
146
|
|
147
|
+
# Configure VM network interfaces
|
148
|
+
#
|
149
|
+
# @param networks_config [Array] An array of hashes like [{ :name => 'NetworkName' }]
|
150
|
+
# @return [Boolean] return true or throw an error
|
96
151
|
def configure_network_interfaces(networks_config)
|
97
152
|
return unless networks_config
|
98
153
|
section = {PrimaryNetworkConnectionIndex: 0}
|
@@ -116,10 +171,18 @@ module Vcloud
|
|
116
171
|
Vcloud::Core::Fog::ServiceInterface.new.put_network_connection_system_section_vapp(id, section)
|
117
172
|
end
|
118
173
|
|
174
|
+
# Configure guest customisation script
|
175
|
+
#
|
176
|
+
# @param preamble [String] A script to run when the VM is created
|
177
|
+
# @return [Boolean] return true or throw an error
|
119
178
|
def configure_guest_customization_section(preamble)
|
120
179
|
Vcloud::Core::Fog::ServiceInterface.new.put_guest_customization_section(id, vapp_name, preamble)
|
121
180
|
end
|
122
181
|
|
182
|
+
# Update the storage profile of a VM
|
183
|
+
#
|
184
|
+
# @param storage_profile [String] The name of the storage profile
|
185
|
+
# @return [Boolean] return true or throw an error
|
123
186
|
def update_storage_profile storage_profile
|
124
187
|
storage_profile_href = get_storage_profile_href_by_name(storage_profile, @vapp.name)
|
125
188
|
Vcloud::Core::Fog::ServiceInterface.new.put_vm(id, name, {
|
@@ -185,6 +185,24 @@ module Vcloud
|
|
185
185
|
|
186
186
|
end
|
187
187
|
|
188
|
+
context "automatic pagination can be suppressed with page/pageSize options" do
|
189
|
+
before(:all) do
|
190
|
+
@first_vapp_name = ''
|
191
|
+
end
|
192
|
+
|
193
|
+
it "returns the first singular result" do
|
194
|
+
results = Vcloud::Core::QueryRunner.new.run('vApp', sortAsc: 'name', pageSize: 1)
|
195
|
+
expect(results).to have(1).items
|
196
|
+
@first_vapp_name = results.first.fetch(:name)
|
197
|
+
end
|
198
|
+
|
199
|
+
it "returns the next singular result which is different from the first" do
|
200
|
+
results = Vcloud::Core::QueryRunner.new.run('vApp', sortAsc: 'name', pageSize: 1, page: 2)
|
201
|
+
expect(results).to have(1).items
|
202
|
+
expect(results.first.fetch(:name)).not_to eq(@first_vapp_name)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
188
206
|
after(:all) do
|
189
207
|
IntegrationHelper.delete_vapps(@test_case_vapps)
|
190
208
|
end
|
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.
|
4
|
+
version: 0.14.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-10
|
12
|
+
date: 2014-11-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fog
|
16
|
-
requirement: &
|
16
|
+
requirement: &11276440 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.24.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *11276440
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: mustache
|
27
|
-
requirement: &
|
27
|
+
requirement: &11275840 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *11275840
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: highline
|
38
|
-
requirement: &
|
38
|
+
requirement: &11275060 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *11275060
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: gem_publisher
|
49
|
-
requirement: &
|
49
|
+
requirement: &11274300 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - =
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.2.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *11274300
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: pry
|
60
|
-
requirement: &
|
60
|
+
requirement: &11273220 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *11273220
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
|
-
requirement: &
|
71
|
+
requirement: &11272420 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *11272420
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rspec
|
82
|
-
requirement: &
|
82
|
+
requirement: &11270040 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 2.14.1
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *11270040
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rubocop
|
93
|
-
requirement: &
|
93
|
+
requirement: &11286180 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 0.23.0
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *11286180
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: simplecov
|
104
|
-
requirement: &
|
104
|
+
requirement: &11345780 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ~>
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: 0.7.1
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *11345780
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: vcloud-tools-tester
|
115
|
-
requirement: &
|
115
|
+
requirement: &11344000 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ~>
|
@@ -120,7 +120,7 @@ dependencies:
|
|
120
120
|
version: 0.2.0
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *11344000
|
124
124
|
description: Core tools for interacting with VMware vCloud Director. Includes VCloud
|
125
125
|
Query, a light wrapper round the vCloud Query API.
|
126
126
|
email:
|
@@ -229,7 +229,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
229
229
|
version: '0'
|
230
230
|
segments:
|
231
231
|
- 0
|
232
|
-
hash: -
|
232
|
+
hash: -2644317041570452992
|
233
233
|
requirements: []
|
234
234
|
rubyforge_project:
|
235
235
|
rubygems_version: 1.8.11
|