vsphere-automation-appliance 0.4.6 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 05f19bda6e4b73c780c19a8998ed0dcd7e059365b4dcbd10f346bd586d94fb48
4
- data.tar.gz: 8e0e35260d241327240b3ece160449c25db7b65c78619d7dbf52a90a6386de06
3
+ metadata.gz: faf7892b0e39d21399493e11547aabd8d6a7817c4c55dcddb00aa8933091a14a
4
+ data.tar.gz: 812841f77cad33dee782af14794484a3670237d56339a710b5a91a5974c2b262
5
5
  SHA512:
6
- metadata.gz: 3428ce9fb65a7bfdba9f0711fe3ab17407d6aeed78293e937684f5ce4c448651af094f52d00c9d0e85706599389873e347d0c5ae98af0d92064861e8f1816c2c
7
- data.tar.gz: 60090d942a2758a7fe1730fe125e03a970ed7ff1754fb93841711bb0dc3a7b201ba1ecc7a41a34d4dc31684378838219d3633205d8c74cda65625d6196ef8f25
6
+ metadata.gz: a65905bda60ccc35497f852882929066e4ad58439ab868e23360cd4c8f267e29f6dfe37cde94d85e938085a91d8f2c067ce2eb9388e97baa3071c24bec2057d1
7
+ data.tar.gz: 77b2cdb27f3b56bd804efa792dadf2a227318bf9643320af3624dd595430f05cdda97504a0d55fd2dd50bfc99e7130140ab108e53da8d6ab8c290eb6a9b88bc0
@@ -0,0 +1,260 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'logger'
5
+ require 'net/http'
6
+ require 'openssl'
7
+ require 'uri'
8
+ require 'vsphere-automation-runtime/configuration'
9
+ require 'vsphere-automation-runtime/version'
10
+
11
+ module VSphereAutomation
12
+ # The client responsible for communicating with the API.
13
+ class ApiClient
14
+ # The Configuration object holding settings to be used in the API client.
15
+ attr_accessor :config
16
+
17
+ # Defines the headers to be used in HTTP requests of all API calls by
18
+ # default.
19
+ #
20
+ # @return [Hash]
21
+ attr_reader :default_headers
22
+
23
+ # Creates a new instance
24
+ #
25
+ # @param config [Configuration] configuration object with values to use
26
+ def initialize(config = Configuration.default)
27
+ @config = config
28
+ @http = create_http
29
+ @user_agent = default_user_agent
30
+ @default_headers = { 'Content-Type' => 'application/json',
31
+ 'User-Agent' => @user_agent }
32
+ end
33
+
34
+ # Retrieves an instance of the object in it's default state
35
+ #
36
+ # @return [ApiClient] an instance of the object in it's default state
37
+ def self.default
38
+ DEFAULT
39
+ end
40
+
41
+ # Build the collection of parameters
42
+ def build_collection_param(params, format)
43
+ params
44
+ end
45
+
46
+ # Make a request to an API endpoint with the given options
47
+ #
48
+ # @param http_method [Symbol] the HTTP method to be used
49
+ # @param path [String] the path request will be made to
50
+ # @param opts [Hash] any additional options needed
51
+ # @return [Array<(Object, Fixnum, Hash)>] the deserialized body, status
52
+ # code, and headers.
53
+ def call_api(http_method, path, opts = {})
54
+ query_params = opts.fetch(:query_params, {})
55
+ header_params = opts.fetch(:header_params, {})
56
+ form_params = opts.fetch(:form_params, {})
57
+ add_auth(query_params, header_params, opts.fetch(:auth_names, []))
58
+
59
+ uri = build_request_uri(path, query_params)
60
+ request = Net::HTTP.const_get(http_method.capitalize).new(uri)
61
+
62
+ add_form_params(request, form_params)
63
+ add_header_params(request, header_params)
64
+ request.body = opts[:body] if opts[:body]
65
+ request.content_type = request['Content-Type'] if request['Content-Type']
66
+
67
+ if @config.debugging
68
+ @config.logger.debug("Request Body:\n#{request.body}\n")
69
+ end
70
+
71
+ response = @http.request(request)
72
+ @cookie = cookie_from_response(response)
73
+ api_key_from_response(response)
74
+
75
+ return_type = opts.fetch(:return_type, {}).fetch(response.code, nil)
76
+ data = deserialize(response, return_type)
77
+ [data, Integer(response.code), response.each_header.to_h]
78
+ end
79
+
80
+ # Takes an object and returns the object as an HTTP body
81
+ #
82
+ # @param object [Object] object to transform
83
+ # @return [String] object as JSON string
84
+ def object_to_http_body(object)
85
+ return object.map { |o| object_to_http_body(o) } if object.is_a?(Array)
86
+
87
+ return object unless object.respond_to?(:to_hash)
88
+
89
+ object.to_hash.to_json
90
+ end
91
+
92
+ # Select an Accept header to use
93
+ #
94
+ # @param types [Array] a list of suggested types
95
+ # @return [String] the Accept header value
96
+ def select_header_accept(types)
97
+ return DEFAULT_MIME_TYPE unless types.is_a?(Array)
98
+
99
+ types.find { |t| t.include?('json') } || types.join(', ')
100
+ end
101
+
102
+ # Select an Content-Type header to use
103
+ #
104
+ # @param types [Array] a list of suggested types
105
+ # @return [String] the Content-Type header value
106
+ def select_header_content_type(types)
107
+ return DEFAULT_MIME_TYPE unless types.is_a?(Array)
108
+
109
+ types.find { |t| t.include?('json') } || types.first
110
+ end
111
+
112
+ private
113
+
114
+ def add_auth(query_params, header_params, auth_names)
115
+ auth_names.map do |name|
116
+ settings = @config.auth_settings.fetch(name, {})
117
+ case settings[:in]
118
+ when 'header'
119
+ header_params[settings[:key]] = settings[:value]
120
+ api_key_from_cookie(settings) unless settings[:value]
121
+ when 'query'
122
+ query_params[settings[:key]] = settings[:value]
123
+ end
124
+ end
125
+ end
126
+
127
+ def add_form_params(request, form_params)
128
+ request.set_form_data(form_params) unless form_params.empty?
129
+ end
130
+
131
+ def add_header_params(request, headers)
132
+ header_params = @default_headers.merge(headers)
133
+ header_params.merge!(Hash(@cookie))
134
+ header_params.map { |name, value| request[name] = value }
135
+ end
136
+
137
+ def add_query_params(uri, query_params)
138
+ uri.query = URI.encode_www_form(query_params)
139
+ end
140
+
141
+ def build_request_uri(path = '', query_params = {})
142
+ path = "/#{path}".gsub(%r{/+}, '/')
143
+ uri = URI.parse(@config.base_url + path)
144
+ add_query_params(uri, query_params)
145
+ forced_query_params = path.split('?')[1]
146
+ return URI.join(uri, '?' + forced_query_params) if forced_query_params
147
+
148
+ uri
149
+ end
150
+
151
+ def create_http
152
+ uri = build_request_uri
153
+ http = Net::HTTP.new(uri.host, uri.port)
154
+ http.use_ssl = @config.scheme == 'https'
155
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless @config.verify_ssl_host
156
+ http.read_timeout = @config.timeout
157
+ http
158
+ end
159
+
160
+ # The default user agent
161
+ #
162
+ # @return [String] the default user agent
163
+ def default_user_agent
164
+ "SDK/#{VSphereAutomation::Runtime::VERSION} "\
165
+ "Ruby/#{RUBY_VERSION} "\
166
+ "(#{Gem::Platform.local.os}; "\
167
+ "#{Gem::Platform.local.version}; "\
168
+ "#{Gem::Platform.local.cpu})"
169
+ end
170
+
171
+ # Deserialize the response to the given return type
172
+ #
173
+ # @param [Response] response the HTTP response
174
+ # @param [String] return_type the type to return
175
+ # @return [Object] the response represented as the return type
176
+ def deserialize(response, return_type)
177
+ body = response.body
178
+
179
+ return nil if body.nil? || body.empty? || return_type.nil?
180
+
181
+ begin
182
+ data = JSON.parse("[#{body}]", symbolize_names: true).first
183
+ rescue JSON::ParserError => e
184
+ raise e unless %w[String Date DateTime].include?(return_type)
185
+
186
+ data = body
187
+ end
188
+
189
+ convert_to_type(data, return_type)
190
+ end
191
+
192
+ def convert_to_type(data, return_type)
193
+ return nil if data.nil?
194
+ case return_type
195
+ when 'String'
196
+ data.to_s
197
+ when 'Integer'
198
+ data.to_i
199
+ when 'Float'
200
+ data.to_f
201
+ when 'BOOLEAN'
202
+ data == true
203
+ when 'DateTime'
204
+ # parse date time (expecting ISO 8601 format)
205
+ DateTime.parse data
206
+ when 'Date'
207
+ # parse date time (expecting ISO 8601 format)
208
+ Date.parse data
209
+ when 'Object'
210
+ # generic object (usually a Hash), return directly
211
+ data
212
+ when /\AArray<(.+)>\z/
213
+ # e.g. Array<Pet>
214
+ sub_type = $1
215
+ data.map { |item| convert_to_type(item, sub_type) }
216
+ when /\AHash\<String, (.+)\>\z/
217
+ # e.g. Hash<String, Integer>
218
+ sub_type = $1
219
+ {}.tap do |hash|
220
+ data.each { |k, v| hash[k] = convert_to_type(v, sub_type) }
221
+ end
222
+ else
223
+ # models, e.g. Pet
224
+ VSphereAutomation.const_get(return_type).new.tap do |model|
225
+ model.build_from_hash data
226
+ end
227
+ end
228
+ end
229
+
230
+ # Create the Cookie header from a response
231
+ #
232
+ # @param response [Net::HTTPResponse] the response
233
+ # @return [Hash, nil] the Cookie header
234
+ def cookie_from_response(response)
235
+ { 'Cookie' => response['set-cookie'] } if response['set-cookie']
236
+ end
237
+
238
+ def api_key_from_response(response)
239
+ key = @config.auth_settings['api_key'][:key]
240
+ @config.api_key[key] = response[key] if response[key]
241
+ end
242
+
243
+ def api_key_from_cookie(auth)
244
+ return if @cookie.nil?
245
+
246
+ regex = /(?<key>#{auth[:key]})=(?<value>\w+)/
247
+ matches = Hash(@cookie)['Cookie'].match(regex)
248
+ key = @config.auth_settings['api_key'][:key]
249
+ @config.api_key[key] = matches[:value] if matches
250
+ end
251
+
252
+ # An instance of the object in it's default state
253
+ DEFAULT = new
254
+
255
+ # The default MIME type for Content-Type and Accept headers
256
+ DEFAULT_MIME_TYPE = 'application/json'
257
+
258
+ private_constant :DEFAULT, :DEFAULT_MIME_TYPE
259
+ end
260
+ end
@@ -0,0 +1,34 @@
1
+ # Copyright (c) 2018-2019 VMware, Inc. All Rights Reserved.
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ # DO NOT MODIFY. THIS CODE IS GENERATED. CHANGES WILL BE OVERWRITTEN.
5
+
6
+ # appliance - The vCenter Server Appliance is a preconfigured Linux-based virtual machine optimized for running vCenter Server and associated services.
7
+
8
+
9
+ module VSphereAutomation
10
+ class ApiError < StandardError
11
+ attr_reader :code, :response_headers, :response_body
12
+
13
+ # Usage examples:
14
+ # ApiError.new
15
+ # ApiError.new("message")
16
+ # ApiError.new(:code => 500, :response_headers => {}, :response_body => "")
17
+ # ApiError.new(:code => 404, :message => "Not Found")
18
+ def initialize(arg = nil)
19
+ if arg.is_a? Hash
20
+ if arg.key?(:message) || arg.key?('message')
21
+ super(arg[:message] || arg['message'])
22
+ else
23
+ super arg
24
+ end
25
+
26
+ arg.each do |k, v|
27
+ instance_variable_set "@#{k}", v
28
+ end
29
+ else
30
+ super arg
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,212 @@
1
+ # Copyright (c) 2018-2019 VMware, Inc. All Rights Reserved.
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ # DO NOT MODIFY. THIS CODE IS GENERATED. CHANGES WILL BE OVERWRITTEN.
5
+
6
+ # appliance - The vCenter Server Appliance is a preconfigured Linux-based virtual machine optimized for running vCenter Server and associated services.
7
+
8
+
9
+ require 'uri'
10
+
11
+ module VSphereAutomation
12
+ class Configuration
13
+ # Defines url scheme
14
+ attr_accessor :scheme
15
+
16
+ # Defines url host
17
+ attr_accessor :host
18
+
19
+ # Defines url base path
20
+ attr_accessor :base_path
21
+
22
+ # Defines API keys used with API Key authentications.
23
+ #
24
+ # @return [Hash] key: parameter name, value: parameter value (API key)
25
+ #
26
+ # @example parameter name is "api_key", API key is "xxx" (e.g. "api_key=xxx" in query string)
27
+ # config.api_key['api_key'] = 'xxx'
28
+ attr_accessor :api_key
29
+
30
+ # Defines API key prefixes used with API Key authentications.
31
+ #
32
+ # @return [Hash] key: parameter name, value: API key prefix
33
+ #
34
+ # @example parameter name is "Authorization", API key prefix is "Token" (e.g. "Authorization: Token xxx" in headers)
35
+ # config.api_key_prefix['api_key'] = 'Token'
36
+ attr_accessor :api_key_prefix
37
+
38
+ # Defines the username used with HTTP basic authentication.
39
+ #
40
+ # @return [String]
41
+ attr_accessor :username
42
+
43
+ # Defines the password used with HTTP basic authentication.
44
+ #
45
+ # @return [String]
46
+ attr_accessor :password
47
+
48
+ # Defines the access token (Bearer) used with OAuth2.
49
+ attr_accessor :access_token
50
+
51
+ # Set this to enable/disable debugging. When enabled (set to true), HTTP request/response
52
+ # details will be logged with `logger.debug` (see the `logger` attribute).
53
+ # Default to false.
54
+ #
55
+ # @return [true, false]
56
+ attr_accessor :debugging
57
+
58
+ # Defines the logger used for debugging.
59
+ # Default to `Rails.logger` (when in Rails) or logging to STDOUT.
60
+ #
61
+ # @return [#debug]
62
+ attr_accessor :logger
63
+
64
+ # Defines the temporary folder to store downloaded files
65
+ # (for API endpoints that have file response).
66
+ # Default to use `Tempfile`.
67
+ #
68
+ # @return [String]
69
+ attr_accessor :temp_folder_path
70
+
71
+ # The time limit for HTTP request in seconds.
72
+ # Default to 0 (never times out).
73
+ attr_accessor :timeout
74
+
75
+ # Set this to false to skip client side validation in the operation.
76
+ # Default to true.
77
+ # @return [true, false]
78
+ attr_accessor :client_side_validation
79
+
80
+ ### TLS/SSL setting
81
+ # Set this to false to skip verifying SSL certificate when calling API from https server.
82
+ # Default to true.
83
+ #
84
+ # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks.
85
+ #
86
+ # @return [true, false]
87
+ attr_accessor :verify_ssl
88
+
89
+ ### TLS/SSL setting
90
+ # Set this to false to skip verifying SSL host name
91
+ # Default to true.
92
+ #
93
+ # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks.
94
+ #
95
+ # @return [true, false]
96
+ attr_accessor :verify_ssl_host
97
+
98
+ ### TLS/SSL setting
99
+ # Set this to customize the certificate file to verify the peer.
100
+ #
101
+ # @return [String] the path to the certificate file
102
+ #
103
+ # @see The `cainfo` option of Typhoeus, `--cert` option of libcurl. Related source code:
104
+ # https://github.com/typhoeus/typhoeus/blob/master/lib/typhoeus/easy_factory.rb#L145
105
+ attr_accessor :ssl_ca_cert
106
+
107
+ ### TLS/SSL setting
108
+ # Client certificate file (for client certificate)
109
+ attr_accessor :cert_file
110
+
111
+ ### TLS/SSL setting
112
+ # Client private key file (for client certificate)
113
+ attr_accessor :key_file
114
+
115
+ # Set this to customize parameters encoding of array parameter with multi collectionFormat.
116
+ # Default to nil.
117
+ #
118
+ # @see The params_encoding option of Ethon. Related source code:
119
+ # https://github.com/typhoeus/ethon/blob/master/lib/ethon/easy/queryable.rb#L96
120
+ attr_accessor :params_encoding
121
+
122
+ attr_accessor :inject_format
123
+
124
+ attr_accessor :force_ending_format
125
+
126
+ def initialize
127
+ @scheme = 'https'
128
+ @host = '&lt;vcenter&gt;'
129
+ @base_path = ''
130
+ @api_key = {}
131
+ @api_key_prefix = {}
132
+ @timeout = nil
133
+ @client_side_validation = true
134
+ @verify_ssl = true
135
+ @verify_ssl_host = true
136
+ @params_encoding = :multi
137
+ @cert_file = nil
138
+ @key_file = nil
139
+ @debugging = false
140
+ @inject_format = false
141
+ @force_ending_format = false
142
+ @logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
143
+
144
+ yield(self) if block_given?
145
+ end
146
+
147
+ # The default Configuration object.
148
+ def self.default
149
+ @@default ||= Configuration.new
150
+ end
151
+
152
+ def configure
153
+ yield(self) if block_given?
154
+ end
155
+
156
+ def scheme=(scheme)
157
+ # remove :// from scheme
158
+ @scheme = scheme.sub(/:\/\//, '')
159
+ end
160
+
161
+ def host=(host)
162
+ # remove http(s):// and anything after a slash
163
+ @host = host.sub(/https?:\/\//, '').split('/').first
164
+ end
165
+
166
+ def base_path=(base_path)
167
+ # Add leading and trailing slashes to base_path
168
+ @base_path = "/#{base_path}".gsub(/\/+/, '/')
169
+ @base_path = '' if @base_path == '/'
170
+ end
171
+
172
+ def base_url
173
+ url = "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '')
174
+ URI.encode(url)
175
+ end
176
+
177
+ # Gets API key (with prefix if set).
178
+ # @param [String] param_name the parameter name of API key auth
179
+ def api_key_with_prefix(param_name)
180
+ if @api_key_prefix[param_name]
181
+ "#{@api_key_prefix[param_name]} #{@api_key[param_name]}"
182
+ else
183
+ @api_key[param_name]
184
+ end
185
+ end
186
+
187
+ # Gets Basic Auth token string
188
+ def basic_auth_token
189
+ 'Basic ' + ["#{username}:#{password}"].pack('m').delete("\r\n")
190
+ end
191
+
192
+ # Returns Auth Settings hash for api client.
193
+ def auth_settings
194
+ {
195
+ 'api_key' =>
196
+ {
197
+ type: 'api_key',
198
+ in: 'header',
199
+ key: 'vmware-api-session-id',
200
+ value: api_key_with_prefix('vmware-api-session-id')
201
+ },
202
+ 'basic_auth' =>
203
+ {
204
+ type: 'basic',
205
+ in: 'header',
206
+ key: 'Authorization',
207
+ value: basic_auth_token
208
+ },
209
+ }
210
+ end
211
+ end
212
+ end
@@ -8,6 +8,6 @@
8
8
 
9
9
  module VSphereAutomation
10
10
  module Appliance
11
- VERSION = '0.4.6'
11
+ VERSION = '0.4.7'
12
12
  end
13
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vsphere-automation-appliance
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - J.R. Garcia
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-29 00:00:00.000000000 Z
11
+ date: 2020-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: vsphere-automation-runtime
@@ -199,6 +199,9 @@ files:
199
199
  - lib/vsphere-automation-appliance/api/update_policy_api.rb
200
200
  - lib/vsphere-automation-appliance/api/update_staged_api.rb
201
201
  - lib/vsphere-automation-appliance/api/vmon_service_api.rb
202
+ - lib/vsphere-automation-appliance/api_client.rb
203
+ - lib/vsphere-automation-appliance/api_error.rb
204
+ - lib/vsphere-automation-appliance/configuration.rb
202
205
  - lib/vsphere-automation-appliance/models/appliance_access_consolecli_result.rb
203
206
  - lib/vsphere-automation-appliance/models/appliance_access_consolecli_set.rb
204
207
  - lib/vsphere-automation-appliance/models/appliance_access_dcui_result.rb
@@ -518,7 +521,7 @@ homepage: https://github.com/vmware/vsphere-automation-sdk-ruby
518
521
  licenses:
519
522
  - MIT
520
523
  metadata: {}
521
- post_install_message:
524
+ post_install_message:
522
525
  rdoc_options: []
523
526
  require_paths:
524
527
  - lib
@@ -533,8 +536,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
533
536
  - !ruby/object:Gem::Version
534
537
  version: '0'
535
538
  requirements: []
536
- rubygems_version: 3.0.3
537
- signing_key:
539
+ rubygems_version: 3.1.2
540
+ signing_key:
538
541
  specification_version: 4
539
542
  summary: A Ruby SDK for the vSphere APIs (Appliance)
540
543
  test_files: []