ovirt-engine-sdk 4.1.13 → 4.2.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
@@ -28,12 +28,9 @@ extern VALUE ov_http_client_class;
28
28
 
29
29
  /* Content: */
30
30
  typedef struct {
31
- /* The libcurl multi handle, used to implement multiple simultaneous requests: */
31
+ /* The libcurl multi handle: */
32
32
  CURLM* handle;
33
33
 
34
- /* The libcurl share handle, used to share cookie data between multiple requests: */
35
- CURLSH* share;
36
-
37
34
  /* The logger: */
38
35
  VALUE log;
39
36
 
@@ -54,8 +51,6 @@ typedef struct {
54
51
  char* proxy_username;
55
52
  char* proxy_password;
56
53
  int timeout;
57
- int connect_timeout;
58
- char* cookies;
59
54
  } ov_http_client_object;
60
55
 
61
56
  /* Macro to get the pointer: */
@@ -40,7 +40,6 @@ static VALUE TOKEN_SYMBOL;
40
40
  static VALUE KERBEROS_SYMBOL;
41
41
  static VALUE BODY_SYMBOL;
42
42
  static VALUE TIMEOUT_SYMBOL;
43
- static VALUE CONNECT_TIMEOUT_SYMBOL;
44
43
 
45
44
  static void ov_http_request_mark(void* vptr) {
46
45
  ov_http_request_object* ptr;
@@ -56,7 +55,6 @@ static void ov_http_request_mark(void* vptr) {
56
55
  rb_gc_mark(ptr->kerberos);
57
56
  rb_gc_mark(ptr->body);
58
57
  rb_gc_mark(ptr->timeout);
59
- rb_gc_mark(ptr->connect_timeout);
60
58
  }
61
59
 
62
60
  static void ov_http_request_free(void* vptr) {
@@ -85,17 +83,16 @@ static VALUE ov_http_request_alloc(VALUE klass) {
85
83
  ov_http_request_object* ptr;
86
84
 
87
85
  ptr = ALLOC(ov_http_request_object);
88
- ptr->method = Qnil;
89
- ptr->url = Qnil;
90
- ptr->query = Qnil;
91
- ptr->headers = Qnil;
92
- ptr->username = Qnil;
93
- ptr->password = Qnil;
94
- ptr->token = Qnil;
95
- ptr->kerberos = Qnil;
96
- ptr->body = Qnil;
97
- ptr->timeout = Qnil;
98
- ptr->connect_timeout = Qnil;
86
+ ptr->method = Qnil;
87
+ ptr->url = Qnil;
88
+ ptr->query = Qnil;
89
+ ptr->headers = Qnil;
90
+ ptr->username = Qnil;
91
+ ptr->password = Qnil;
92
+ ptr->token = Qnil;
93
+ ptr->kerberos = Qnil;
94
+ ptr->body = Qnil;
95
+ ptr->timeout = Qnil;
99
96
  return TypedData_Wrap_Struct(klass, &ov_http_request_type, ptr);
100
97
  }
101
98
 
@@ -282,36 +279,6 @@ static VALUE ov_http_request_set_timeout(VALUE self, VALUE value) {
282
279
  return Qnil;
283
280
  }
284
281
 
285
- static VALUE ov_http_request_get_connect_timeout(VALUE self) {
286
- ov_http_request_object* ptr;
287
-
288
- ov_http_request_ptr(self, ptr);
289
- return ptr->connect_timeout;
290
- }
291
-
292
- static VALUE ov_http_request_set_connect_timeout(VALUE self, VALUE value) {
293
- ov_http_request_object* ptr;
294
-
295
- ov_http_request_ptr(self, ptr);
296
- if (!NIL_P(value)) {
297
- Check_Type(value, T_FIXNUM);
298
- }
299
- ptr->connect_timeout = value;
300
- return Qnil;
301
- }
302
-
303
- static VALUE ov_http_request_inspect(VALUE self) {
304
- ov_http_request_object* ptr;
305
-
306
- ov_http_request_ptr(self, ptr);
307
- return rb_sprintf(
308
- "#<%"PRIsVALUE":%"PRIsVALUE" %"PRIsVALUE">",
309
- ov_http_request_class,
310
- ptr->method,
311
- ptr->url
312
- );
313
- }
314
-
315
282
  static VALUE ov_http_request_initialize(int argc, VALUE* argv, VALUE self) {
316
283
  VALUE opts;
317
284
 
@@ -337,7 +304,6 @@ static VALUE ov_http_request_initialize(int argc, VALUE* argv, VALUE self) {
337
304
  ov_http_request_set_token(self, rb_hash_aref(opts, TOKEN_SYMBOL));
338
305
  ov_http_request_set_body(self, rb_hash_aref(opts, BODY_SYMBOL));
339
306
  ov_http_request_set_timeout(self, rb_hash_aref(opts, TIMEOUT_SYMBOL));
340
- ov_http_request_set_connect_timeout(self, rb_hash_aref(opts, CONNECT_TIMEOUT_SYMBOL));
341
307
 
342
308
  return self;
343
309
  }
@@ -351,43 +317,38 @@ void ov_http_request_define(void) {
351
317
  rb_define_method(ov_http_request_class, "initialize", ov_http_request_initialize, -1);
352
318
 
353
319
  /* Define the methods: */
354
- rb_define_method(ov_http_request_class, "method", ov_http_request_get_method, 0);
355
- rb_define_method(ov_http_request_class, "method=", ov_http_request_set_method, 1);
356
- rb_define_method(ov_http_request_class, "url", ov_http_request_get_url, 0);
357
- rb_define_method(ov_http_request_class, "url=", ov_http_request_set_url, 1);
358
- rb_define_method(ov_http_request_class, "query", ov_http_request_get_query, 0);
359
- rb_define_method(ov_http_request_class, "query=", ov_http_request_set_query, 1);
360
- rb_define_method(ov_http_request_class, "headers", ov_http_request_get_headers, 0);
361
- rb_define_method(ov_http_request_class, "headers=", ov_http_request_set_headers, 1);
362
- rb_define_method(ov_http_request_class, "username", ov_http_request_get_username, 0);
363
- rb_define_method(ov_http_request_class, "username=", ov_http_request_set_username, 1);
364
- rb_define_method(ov_http_request_class, "password", ov_http_request_get_password, 0);
365
- rb_define_method(ov_http_request_class, "password=", ov_http_request_set_password, 1);
366
- rb_define_method(ov_http_request_class, "token", ov_http_request_get_token, 0);
367
- rb_define_method(ov_http_request_class, "token=", ov_http_request_set_token, 1);
368
- rb_define_method(ov_http_request_class, "kerberos", ov_http_request_get_kerberos, 0);
369
- rb_define_method(ov_http_request_class, "kerberos=", ov_http_request_set_kerberos, 1);
370
- rb_define_method(ov_http_request_class, "body", ov_http_request_get_body, 0);
371
- rb_define_method(ov_http_request_class, "body=", ov_http_request_set_body, 1);
372
- rb_define_method(ov_http_request_class, "timeout", ov_http_request_get_timeout, 0);
373
- rb_define_method(ov_http_request_class, "timeout=", ov_http_request_set_timeout, 1);
374
- rb_define_method(ov_http_request_class, "connect_timeout", ov_http_request_get_connect_timeout, 0);
375
- rb_define_method(ov_http_request_class, "connect_timeout=", ov_http_request_set_connect_timeout, 1);
376
- rb_define_method(ov_http_request_class, "inspect", ov_http_request_inspect, 0);
377
- rb_define_method(ov_http_request_class, "to_s", ov_http_request_inspect, 0);
320
+ rb_define_method(ov_http_request_class, "method", ov_http_request_get_method, 0);
321
+ rb_define_method(ov_http_request_class, "method=", ov_http_request_set_method, 1);
322
+ rb_define_method(ov_http_request_class, "url", ov_http_request_get_url, 0);
323
+ rb_define_method(ov_http_request_class, "url=", ov_http_request_set_url, 1);
324
+ rb_define_method(ov_http_request_class, "query", ov_http_request_get_query, 0);
325
+ rb_define_method(ov_http_request_class, "query=", ov_http_request_set_query, 1);
326
+ rb_define_method(ov_http_request_class, "headers", ov_http_request_get_headers, 0);
327
+ rb_define_method(ov_http_request_class, "headers=", ov_http_request_set_headers, 1);
328
+ rb_define_method(ov_http_request_class, "username", ov_http_request_get_username, 0);
329
+ rb_define_method(ov_http_request_class, "username=", ov_http_request_set_username, 1);
330
+ rb_define_method(ov_http_request_class, "password", ov_http_request_get_password, 0);
331
+ rb_define_method(ov_http_request_class, "password=", ov_http_request_set_password, 1);
332
+ rb_define_method(ov_http_request_class, "token", ov_http_request_get_token, 0);
333
+ rb_define_method(ov_http_request_class, "token=", ov_http_request_set_token, 1);
334
+ rb_define_method(ov_http_request_class, "kerberos", ov_http_request_get_kerberos, 0);
335
+ rb_define_method(ov_http_request_class, "kerberos=", ov_http_request_set_kerberos, 1);
336
+ rb_define_method(ov_http_request_class, "body", ov_http_request_get_body, 0);
337
+ rb_define_method(ov_http_request_class, "body=", ov_http_request_set_body, 1);
338
+ rb_define_method(ov_http_request_class, "timeout", ov_http_request_get_timeout, 0);
339
+ rb_define_method(ov_http_request_class, "timeout=", ov_http_request_set_timeout, 1);
378
340
 
379
341
  /* Define the symbols for the attributes: */
380
- URL_SYMBOL = ID2SYM(rb_intern("url"));
381
- METHOD_SYMBOL = ID2SYM(rb_intern("method"));
382
- QUERY_SYMBOL = ID2SYM(rb_intern("query"));
383
- HEADERS_SYMBOL = ID2SYM(rb_intern("headers"));
384
- USERNAME_SYMBOL = ID2SYM(rb_intern("username"));
385
- PASSWORD_SYMBOL = ID2SYM(rb_intern("password"));
386
- TOKEN_SYMBOL = ID2SYM(rb_intern("token"));
387
- KERBEROS_SYMBOL = ID2SYM(rb_intern("kerberos"));
388
- BODY_SYMBOL = ID2SYM(rb_intern("body"));
389
- TIMEOUT_SYMBOL = ID2SYM(rb_intern("timeout"));
390
- CONNECT_TIMEOUT_SYMBOL = ID2SYM(rb_intern("connect_timeout"));
342
+ URL_SYMBOL = ID2SYM(rb_intern("url"));
343
+ METHOD_SYMBOL = ID2SYM(rb_intern("method"));
344
+ QUERY_SYMBOL = ID2SYM(rb_intern("query"));
345
+ HEADERS_SYMBOL = ID2SYM(rb_intern("headers"));
346
+ USERNAME_SYMBOL = ID2SYM(rb_intern("username"));
347
+ PASSWORD_SYMBOL = ID2SYM(rb_intern("password"));
348
+ TOKEN_SYMBOL = ID2SYM(rb_intern("token"));
349
+ KERBEROS_SYMBOL = ID2SYM(rb_intern("kerberos"));
350
+ BODY_SYMBOL = ID2SYM(rb_intern("body"));
351
+ TIMEOUT_SYMBOL = ID2SYM(rb_intern("timeout"));
391
352
 
392
353
  /* Define the symbols for the HTTP methods: */
393
354
  GET_SYMBOL = ID2SYM(rb_intern("GET"));
@@ -31,17 +31,16 @@ extern VALUE DELETE_SYMBOL;
31
31
 
32
32
  /* Content: */
33
33
  typedef struct {
34
- VALUE method; /* Symbol */
35
- VALUE url; /* String */
36
- VALUE query; /* Hash<String, String> */
37
- VALUE headers; /* Hash<String, String> */
38
- VALUE username; /* String */
39
- VALUE password; /* String */
40
- VALUE token; /* String */
41
- VALUE kerberos; /* Boolean */
42
- VALUE body; /* String */
43
- VALUE timeout; /* Integer */
44
- VALUE connect_timeout; /* Integer */
34
+ VALUE method; /* Symbol */
35
+ VALUE url; /* String */
36
+ VALUE query; /* Hash<String, String> */
37
+ VALUE headers; /* Hash<String, String> */
38
+ VALUE username; /* String */
39
+ VALUE password; /* String */
40
+ VALUE token; /* String */
41
+ VALUE kerberos; /* Boolean */
42
+ VALUE body; /* String */
43
+ VALUE timeout; /* Integer */
45
44
  } ov_http_request_object;
46
45
 
47
46
  /* Macro to get the pointer: */
@@ -146,18 +146,6 @@ static VALUE ov_http_response_set_message(VALUE self, VALUE value) {
146
146
  return Qnil;
147
147
  }
148
148
 
149
- static VALUE ov_http_response_inspect(VALUE self) {
150
- ov_http_response_object* ptr;
151
-
152
- ov_http_response_ptr(self, ptr);
153
- return rb_sprintf(
154
- "#<%"PRIsVALUE":%"PRIsVALUE" %"PRIsVALUE">",
155
- ov_http_response_class,
156
- ptr->code,
157
- ptr->message
158
- );
159
- }
160
-
161
149
  static VALUE ov_http_response_initialize(int argc, VALUE* argv, VALUE self) {
162
150
  VALUE opts;
163
151
 
@@ -199,8 +187,6 @@ void ov_http_response_define(void) {
199
187
  rb_define_method(ov_http_response_class, "headers=", ov_http_response_set_headers, 1);
200
188
  rb_define_method(ov_http_response_class, "message", ov_http_response_get_message, 0);
201
189
  rb_define_method(ov_http_response_class, "message=", ov_http_response_set_message, 1);
202
- rb_define_method(ov_http_response_class, "inspect", ov_http_response_inspect, 0);
203
- rb_define_method(ov_http_response_class, "to_s", ov_http_response_inspect, 0);
204
190
 
205
191
  /* Define the symbols: */
206
192
  BODY_SYMBOL = ID2SYM(rb_intern("body"));
@@ -71,21 +71,10 @@ static VALUE ov_http_transfer_alloc(VALUE klass) {
71
71
  return TypedData_Wrap_Struct(klass, &ov_http_transfer_type, ptr);
72
72
  }
73
73
 
74
- static VALUE ov_http_transfer_inspect(VALUE self) {
75
- ov_http_transfer_object* ptr;
76
-
77
- ov_http_transfer_ptr(self, ptr);
78
- return rb_sprintf("#<%"PRIsVALUE":%p>", ov_http_transfer_class, ptr);
79
- }
80
-
81
74
  void ov_http_transfer_define(void) {
82
75
  /* Define the class: */
83
76
  ov_http_transfer_class = rb_define_class_under(ov_module, "HttpTransfer", rb_cData);
84
77
 
85
78
  /* Define the constructor: */
86
79
  rb_define_alloc_func(ov_http_transfer_class, ov_http_transfer_alloc);
87
-
88
- /* Define the methods: */
89
- rb_define_method(ov_http_transfer_class, "inspect", ov_http_transfer_inspect, 0);
90
- rb_define_method(ov_http_transfer_class, "to_s", ov_http_transfer_inspect, 0);
91
80
  }
@@ -17,10 +17,10 @@ limitations under the License.
17
17
  #ifndef __OV_MODULE_H__
18
18
  #define __OV_MODULE_H__
19
19
 
20
- /* Module: */
20
+ // Module:
21
21
  extern VALUE ov_module;
22
22
 
23
- /* Initialization function: */
23
+ // Initialization function:
24
24
  extern void ov_module_define(void);
25
25
 
26
26
  #endif
@@ -16,7 +16,6 @@
16
16
 
17
17
  require 'json'
18
18
  require 'tempfile'
19
- require 'thread'
20
19
  require 'uri'
21
20
 
22
21
  module OvirtSDK4
@@ -75,11 +74,8 @@ module OvirtSDK4
75
74
  # instead of user name and password to obtain the OAuth token.
76
75
  #
77
76
  # @option opts [Integer] :timeout (0) The maximun total time to wait for the response, in seconds. A value of zero
78
- # (the default) means wait for ever. If the timeout expires before the response is received a `TimeoutError`
79
- # exception will be raised.
80
- #
81
- # @option opts [Integer] :connect_timeout (300) The maximun time to wait for connection establishment, in seconds.
82
- # If the timeout expires before the connection is established a `TimeoutError` exception will be raised.
77
+ # (the default) means wait for ever. If the timeout expires before the response is received an exception will be
78
+ # raised.
83
79
  #
84
80
  # @option opts [Boolean] :compress (true) A boolean flag indicating if the SDK should ask the server to send
85
81
  # compressed responses. Note that this is a hint for the server, and that it may return uncompressed data even
@@ -120,7 +116,6 @@ module OvirtSDK4
120
116
  @log = opts[:log]
121
117
  @kerberos = opts[:kerberos] || false
122
118
  @timeout = opts[:timeout] || 0
123
- @connect_timeout = opts[:connect_timeout] || 0
124
119
  @compress = opts[:compress] || true
125
120
  @proxy_url = opts[:proxy_url]
126
121
  @proxy_username = opts[:proxy_username]
@@ -150,9 +145,6 @@ module OvirtSDK4
150
145
  @ca_store.close
151
146
  end
152
147
 
153
- # Create the mutex that will be used to prevents simultaneous access to the same HTTP client by multiple threads:
154
- @mutex = Mutex.new
155
-
156
148
  # Create the HTTP client:
157
149
  @client = HttpClient.new(
158
150
  insecure: @insecure,
@@ -160,7 +152,6 @@ module OvirtSDK4
160
152
  debug: @debug,
161
153
  log: @log,
162
154
  timeout: @timeout,
163
- connect_timeout: @connect_timeout,
164
155
  compress: @compress,
165
156
  proxy_url: @proxy_url,
166
157
  proxy_username: @proxy_username,
@@ -193,24 +184,65 @@ module OvirtSDK4
193
184
  end
194
185
 
195
186
  #
196
- # Sends an HTTP request, making sure that multiple threads are coordinated correctly.
187
+ # Sends an HTTP request.
197
188
  #
198
189
  # @param request [HttpRequest] The request object containing the details of the HTTP request to send.
199
190
  #
200
191
  # @api private
201
192
  #
202
193
  def send(request)
203
- @mutex.synchronize { internal_send(request) }
194
+ # Add the base URL to the request:
195
+ request.url = request.url.nil? ? request.url = @url : "#{@url}#{request.url}"
196
+
197
+ # Set the headers common to all requests:
198
+ request.headers.merge!(
199
+ 'User-Agent' => "RubySDK/#{VERSION}",
200
+ 'Version' => '4',
201
+ 'Content-Type' => 'application/xml',
202
+ 'Accept' => 'application/xml'
203
+ )
204
+
205
+ # Older versions of the engine (before 4.1) required the 'all_content' as an HTTP header instead of a query
206
+ # parameter. In order to better support those older versions of the engine we need to check if this parameter is
207
+ # included in the request, and add the corresponding header.
208
+ unless request.query.nil?
209
+ all_content = request.query['all_content']
210
+ request.headers['All-Content'] = all_content unless all_content.nil?
211
+ end
212
+
213
+ # Add the global headers, but without replacing the values that may already exist:
214
+ request.headers.merge!(@headers) { |_name, local, _global| local } if @headers
215
+
216
+ # Set the authentication token:
217
+ @token ||= create_access_token
218
+ request.token = @token
219
+
220
+ # Send the request:
221
+ @client.send(request)
204
222
  end
205
223
 
206
224
  #
207
- # Waits for the response to the given request, making sure that multiple threads are coordinated correctly.
225
+ # Waits for the response to the given request.
208
226
  #
209
227
  # @param request [HttpRequest] The request object whose corresponding response you want to wait for.
210
- # @return [HttpResponse] A request object containing the details of the HTTP response received.
228
+ # @return [Response] A request object containing the details of the HTTP response received.
211
229
  #
212
230
  def wait(request)
213
- @mutex.synchronize { internal_wait(request) }
231
+ # Wait for the response:
232
+ response = @client.wait(request)
233
+ raise response if response.is_a?(Exception)
234
+
235
+ # If the request failed because of authentication, and it wasn't a request to the SSO service, then the
236
+ # most likely cause is an expired SSO token. In this case we need to request a new token, and try the original
237
+ # request again, but only once. It if fails again, we just return the failed response.
238
+ if response.code == 401 && request.token
239
+ @token = create_access_token
240
+ request.token = @token
241
+ @client.send(request)
242
+ response = @client.wait(request)
243
+ end
244
+
245
+ response
214
246
  end
215
247
 
216
248
  #
@@ -434,10 +466,17 @@ module OvirtSDK4
434
466
  end
435
467
 
436
468
  #
437
- # Releases the resources used by this connection, making sure that multiple threads are coordinated correctly.
469
+ # Releases the resources used by this connection.
438
470
  #
439
471
  def close
440
- @mutex.synchronize { internal_close }
472
+ # Revoke the SSO access token:
473
+ revoke_access_token if @token
474
+
475
+ # Close the HTTP client:
476
+ @client.close if @client
477
+
478
+ # Remove the temporary file that contains the trusted CA certificates:
479
+ @ca_store.unlink if @ca_store
441
480
  end
442
481
 
443
482
  #
@@ -514,30 +553,6 @@ module OvirtSDK4
514
553
  raise error
515
554
  end
516
555
 
517
- #
518
- # Returns a string representation of the connection.
519
- #
520
- # @return [String] The string representation.
521
- #
522
- def inspect
523
- "#<#{self.class.name}:#{@url}>"
524
- end
525
-
526
- #
527
- # Returns a string representation of the connection.
528
- #
529
- # @return [String] The string representation.
530
- #
531
- def to_s
532
- inspect
533
- end
534
-
535
- #
536
- # Returns a string representation of the connection.
537
- #
538
- # @return [String] The string representation.
539
- #
540
-
541
556
  private
542
557
 
543
558
  #
@@ -581,85 +596,5 @@ module OvirtSDK4
581
596
  end
582
597
  raise_error(response, detail)
583
598
  end
584
-
585
- #
586
- # Sends an HTTP request.
587
- #
588
- # @param request [HttpRequest] The request object containing the details of the HTTP request to send.
589
- #
590
- # @api private
591
- #
592
- def internal_send(request)
593
- # Add the base URL to the request:
594
- request.url = request.url.nil? ? request.url = @url : "#{@url}/#{request.url}"
595
-
596
- # Set the headers common to all requests:
597
- request.headers.merge!(
598
- 'User-Agent' => "RubySDK/#{VERSION}",
599
- 'Version' => '4',
600
- 'Content-Type' => 'application/xml',
601
- 'Accept' => 'application/xml'
602
- )
603
-
604
- # Older versions of the engine (before 4.1) required the 'all_content' as an HTTP header instead of a query
605
- # parameter. In order to better support those older versions of the engine we need to check if this parameter is
606
- # included in the request, and add the corresponding header.
607
- unless request.query.nil?
608
- all_content = request.query['all_content']
609
- request.headers['All-Content'] = all_content unless all_content.nil?
610
- end
611
-
612
- # Add the global headers, but without replacing the values that may already exist:
613
- request.headers.merge!(@headers) { |_name, local, _global| local } if @headers
614
-
615
- # Set the authentication token:
616
- @token ||= create_access_token
617
- request.token = @token
618
-
619
- # Send the request:
620
- @client.send(request)
621
- end
622
-
623
- #
624
- # Waits for the response to the given request.
625
- #
626
- # @param request [HttpRequest] The request object whose corresponding response you want to wait for.
627
- # @return [Response] A request object containing the details of the HTTP response received.
628
- #
629
- # @api private
630
- #
631
- def internal_wait(request)
632
- # Wait for the response:
633
- response = @client.wait(request)
634
- raise response if response.is_a?(Exception)
635
-
636
- # If the request failed because of authentication, and it wasn't a request to the SSO service, then the
637
- # most likely cause is an expired SSO token. In this case we need to request a new token, and try the original
638
- # request again, but only once. It if fails again, we just return the failed response.
639
- if response.code == 401 && request.token
640
- @token = create_access_token
641
- request.token = @token
642
- @client.send(request)
643
- response = @client.wait(request)
644
- end
645
-
646
- response
647
- end
648
-
649
- #
650
- # Releases the resources used by this connection.
651
- #
652
- # @api private
653
- #
654
- def internal_close
655
- # Revoke the SSO access token:
656
- revoke_access_token if @token
657
-
658
- # Close the HTTP client:
659
- @client.close if @client
660
-
661
- # Remove the temporary file that contains the trusted CA certificates:
662
- @ca_store.unlink if @ca_store
663
- end
664
599
  end
665
600
  end