zuora_api 1.7.66m → 1.7.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 898385c59ee720160006d5c40ed7853a8493d5c78491a3c907c6eea422d9e873
4
- data.tar.gz: a69076960b516476aa0f19c0518e20239357d5e0bb4ba83fcb18c2c985935bdd
3
+ metadata.gz: ff05150108e2fbba1a069083c46b53d4b43d95d95d4cfb4bcd82d10881e80091
4
+ data.tar.gz: b8543c688b33ee85357716df5e1f93b7cafef3702074914355aa30960b8726dd
5
5
  SHA512:
6
- metadata.gz: ec6f92a0334033bd1b3fdfabcf4577f50dad9f18d43253abf89db198096b9fec15977922d715949e7075fa2713901d39d4b4da89e25b5374b1495de796423f41
7
- data.tar.gz: 0217c3d47b9b7ef5f0e7b7785be8b0f0d07f3c62672e8c86181f0d24dd5c0e43c615fee8e27dbebd30d09d11b9505952457ab38ad5cffaa0a7584b8a8002c270
6
+ metadata.gz: 9b2a8309a4a1c88a13be63df6eb96c08d27e25076b379c740b7eddd1898a60f46249388e7279d98e67fd72469e49f1a6abdc5c7f3a62aa32905909c100de46ad
7
+ data.tar.gz: 0a706abfa46ed54f332f903a2af7c118dfda2aaa6f61a280b9c2f989fb19790484aefcabed72bbcdc9b5ab37a2befb46913d2771ab6a924095c34ec80a8a595c
@@ -1,4 +1,4 @@
1
- image: ruby:2.7
1
+ image: ruby:2.6
2
2
  stages:
3
3
  - setup
4
4
  - test
@@ -35,7 +35,6 @@ rspec-testing:
35
35
  script:
36
36
  - bundle install
37
37
  - rspec
38
- coverage: '/\(\d+.\d+\%\) covered/'
39
38
 
40
39
  rubygems-deploy:
41
40
  stage: deploy
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
1
  source 'https://rubygems.org'
2
- ruby "2.7.1"
2
+
3
3
  # Specify your gem's dependencies in zuora.gemspec
4
4
  gemspec
@@ -40,19 +40,6 @@ module ZuoraAPI
40
40
  def to_s
41
41
  @message || @default_message
42
42
  end
43
-
44
- def parse_message(message)
45
- case message
46
- when /^Invalid Oauth Client Id$/, /^Unable to generate token.$/
47
- @message = "Invalid login, please check client ID and Client Secret or URL endpoint"
48
- when /^Forbidden$/
49
- @message = "The user associated to OAuth credential set has been deactivated."
50
- when /^Invalid login. User name and password do not match.$/
51
- @message = "Invalid login, please check username and password or URL endpoint"
52
- else
53
- @message = message
54
- end
55
- end
56
43
  end
57
44
 
58
45
  class BadEntityError < Error
@@ -190,15 +177,14 @@ module ZuoraAPI
190
177
  end
191
178
 
192
179
  class ZuoraAPITemporaryError < Error
193
- attr_reader :code, :response, :errors
180
+ attr_reader :code, :response
194
181
  attr_writer :default_message
195
182
 
196
- def initialize(message = nil, response = nil, errors = [], successes = [], *args)
183
+ def initialize(message = nil,response=nil, errors = [], successes = [], *args)
197
184
  @code = response.class.to_s == "HTTParty::Response" ? response.code : nil
198
185
  @message = parse_message(message)
199
186
  @response = response
200
187
  @default_message = "There is a temporary error with zuora system."
201
- @errors = errors
202
188
  end
203
189
 
204
190
  def to_s
@@ -39,8 +39,8 @@ module ZuoraAPI
39
39
 
40
40
  ZUORA_SERVER_ERRORS = [
41
41
  ZuoraAPI::Exceptions::ZuoraAPIInternalServerError,
42
- ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout,
43
- ZuoraAPI::Exceptions::ZuoraAPIReadTimeout,
42
+ ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout,
43
+ ZuoraAPI::Exceptions::ZuoraAPIReadTimeout,
44
44
  ZuoraAPI::Exceptions::ZuoraUnexpectedError
45
45
  ].freeze
46
46
 
@@ -374,8 +374,8 @@ module ZuoraAPI
374
374
  return domain ? endpoint.concat(prefix).concat(url) : prefix.concat(url)
375
375
  end
376
376
 
377
- def rest_domain(endpoint: self.rest_endpoint)
378
- return URI(endpoint).host
377
+ def rest_domain
378
+ return URI(self.rest_endpoint).host
379
379
  end
380
380
 
381
381
  def fileURL(url="")
@@ -387,41 +387,10 @@ module ZuoraAPI
387
387
  end
388
388
 
389
389
  def new_session(auth_type: :basic, debug: false, zuora_track_id: nil)
390
- tries ||= 2
391
- yield
392
-
393
- rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
394
- self.status = 'Inactive/Invalid'
395
- self.current_error = ex.message
396
- raise
397
- rescue ZuoraAPI::Exceptions::ZuoraAPIError => ex
398
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(ex.message, ex.response)
399
-
400
- rescue ZuoraAPI::Exceptions::ZuoraAPIInternalServerError => ex
401
- raise ex if tries.zero?
402
-
403
- tries -= 1
404
- sleep(self.timeout_sleep)
405
- retry
406
-
407
- rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
408
- self.log(location: "BasicLogin", exception: ex, message: "Timed out", level: :error)
409
-
410
- self.current_error = "Request timed out. Try again"
411
- self.status = 'Timeout'
412
-
413
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error)
414
-
415
- rescue EOFError
416
- if self.url.match?(/.*services\d{1,}.zuora.com*/)
417
- self.current_error = "Services tenant '#{self.url.scan(/.*\/\/(services\d{1,}).zuora.com*/).last.first}' is no longer available."
418
- self.status = 'Not Available'
419
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error)
420
- end
421
-
422
390
  end
423
391
 
424
392
  def get_session(prefix: false, auth_type: :basic, zuora_track_id: nil)
393
+ Rails.logger.debug("Get session for #{auth_type} - #{self.class.to_s}") if Rails.env.to_s == 'development'
425
394
  case auth_type
426
395
  when :basic
427
396
  if self.current_session.blank?
@@ -430,13 +399,14 @@ module ZuoraAPI
430
399
  if self.bearer_token.blank? || self.oauth_expired?
431
400
  self.new_session(auth_type: :bearer, zuora_track_id: zuora_track_id)
432
401
  end
433
- self.get_z_session(zuora_track_id: zuora_track_id)
402
+ self.get_z_session(zuora_track_id: zuora_track_id) if self.status == 'Active'
434
403
  when 'ZuoraAPI::Basic'
435
404
  self.new_session(auth_type: :basic, zuora_track_id: zuora_track_id)
436
405
  else
437
406
  self.new_session(auth_type: :basic, zuora_track_id: zuora_track_id)
438
407
  end
439
408
  end
409
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error) if self.status != 'Active'
440
410
  return prefix ? "ZSession #{self.current_session}" : self.current_session.to_s
441
411
  when :bearer
442
412
  case self.class.to_s
@@ -449,6 +419,8 @@ module ZuoraAPI
449
419
  else
450
420
  raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Unknown Login, does not support Authentication of Type: #{auth_type}")
451
421
  end
422
+
423
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error) if self.status != 'Active'
452
424
  return prefix ? "Bearer #{self.bearer_token}" : self.bearer_token.to_s
453
425
  end
454
426
  end
@@ -456,18 +428,16 @@ module ZuoraAPI
456
428
  def soap_call(
457
429
  ns1: 'ns1',
458
430
  ns2: 'ns2',
459
- batch_size: nil,
460
- headers: {},
431
+ batch_size: nil,
461
432
  single_transaction: false,
462
433
  debug: false,
463
434
  zuora_track_id: nil,
464
435
  errors: [ZuoraAPI::Exceptions::ZuoraAPISessionError].concat(ZUORA_API_ERRORS),
465
436
  z_session: true,
466
437
  timeout_retry: false,
467
- timeout: 130,
438
+ timeout: 120,
468
439
  timeout_sleep_interval: self.timeout_sleep,
469
440
  output_exception_messages: true,
470
- skip_session: false,
471
441
  **keyword_args)
472
442
  tries ||= 2
473
443
  xml = Nokogiri::XML::Builder.new do |xml|
@@ -477,10 +447,8 @@ module ZuoraAPI
477
447
  'xmlns:api' => "http://api.zuora.com/",
478
448
  "xmlns:#{ns1}" => "http://api.zuora.com/") do
479
449
  xml['SOAP-ENV'].Header do
480
- if !skip_session
481
- xml["#{ns1}"].SessionHeader do
482
- xml["#{ns1}"].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: zuora_track_id)
483
- end
450
+ xml["#{ns1}"].SessionHeader do
451
+ xml["#{ns1}"].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: zuora_track_id)
484
452
  end
485
453
  if single_transaction
486
454
  xml["#{ns1}"].CallOptions do
@@ -498,11 +466,12 @@ module ZuoraAPI
498
466
  end
499
467
  end
500
468
  end
469
+
501
470
  input_xml = Nokogiri::XML(xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip)
502
471
  input_xml.xpath('//ns1:session', 'ns1' =>'http://api.zuora.com/').children.remove
503
472
  Rails.logger.debug("Request SOAP XML: #{input_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}") if debug
504
473
 
505
- headers.merge!({ 'Content-Type' => "text/xml; charset=utf-8", 'Accept' => 'text/xml'})
474
+ headers = { 'Content-Type' => "text/xml; charset=utf-8", 'Accept' => 'text/xml'}
506
475
  headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
507
476
 
508
477
  request = HTTParty::Request.new(
@@ -519,11 +488,7 @@ module ZuoraAPI
519
488
  Rails.logger.debug("Response SOAP XML: #{output_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}") if debug
520
489
 
521
490
  raise_errors(type: :SOAP, body: output_xml, response: response)
522
-
523
- return output_xml, input_xml, response
524
-
525
491
  rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
526
- raise if skip_session
527
492
  if !tries.zero? && z_session
528
493
  tries -= 1
529
494
  Rails.logger.debug("SOAP Call - Session Invalid")
@@ -535,33 +500,39 @@ module ZuoraAPI
535
500
  end
536
501
 
537
502
  retry
503
+ else
504
+ if errors.include?(ex.class)
505
+ raise ex
506
+ else
507
+ return output_xml, input_xml, response
508
+ end
538
509
  end
539
-
540
- raise ex if errors.include?(ex.class)
541
-
542
- return output_xml, input_xml, response
543
-
544
510
  rescue *ZUORA_API_ERRORS => ex
545
- raise ex if errors.include?(ex.class)
546
-
547
- response = ex.response unless response
548
- return output_xml, input_xml, response
549
-
511
+ if errors.include?(ex.class)
512
+ raise ex
513
+ else
514
+ response = ex.response unless response
515
+ return output_xml, input_xml, response
516
+ end
550
517
  rescue *CONNECTION_EXCEPTIONS => ex
551
- if !tries.zero?
552
- tries -= 1
553
- self.log(location: "SOAP Call", exception: ex, message: "Timed out will retry after #{timeout_sleep_interval} seconds", level: :debug)
554
- sleep(timeout_sleep_interval)
555
- retry
518
+ if tries.zero?
519
+ if output_exception_messages
520
+ if Rails.logger.class.to_s == "Ougai::Logger"
521
+ Rails.logger.error("SOAP Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
522
+ else
523
+ Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
524
+ end
525
+ end
526
+ raise ex
556
527
  end
557
528
 
558
- self.log(location: "SOAP Call", exception: ex, message: "Timed out", level: :error) if output_exception_messages
559
- raise ex
560
-
529
+ tries -= 1
530
+ sleep(timeout_sleep_interval)
531
+ retry
561
532
  rescue *CONNECTION_READ_EXCEPTIONS => ex
562
533
  if !tries.zero?
563
534
  tries -= 1
564
- self.log(location: "SOAP Call", exception: ex, message: "Timed out will retry after #{timeout_sleep_interval} seconds", level: :debug)
535
+
565
536
  if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
566
537
  retry
567
538
  elsif timeout_retry
@@ -570,79 +541,19 @@ module ZuoraAPI
570
541
  end
571
542
  end
572
543
 
573
- self.log(location: "SOAP Call", exception: ex, message: "Timed out", level: :error) if output_exception_messages
574
- ex = ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from 'https://#{rest_domain(endpoint: url)}'", nil, request) if ex.instance_of?(Net::ReadTimeout)
544
+ if output_exception_messages
545
+ if Rails.logger.class.to_s == "Ougai::Logger"
546
+ Rails.logger.error("SOAP Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
547
+ else
548
+ Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
549
+ end
550
+ end
551
+ raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}", nil, request) if ex.instance_of?(Net::ReadTimeout)
575
552
  raise ex
576
-
577
553
  rescue => ex
578
554
  raise ex
579
- ensure
580
- self.error_logger(ex) if defined?(ex) && Rails.logger.class.to_s == "Ougai::Logger"
581
- end
582
-
583
- def error_logger(ex)
584
- exception_args = Rails.logger.with_fields.merge(self.exception_args(ex))
585
- case ex
586
- when ZuoraAPI::Exceptions::ZuoraAPIUnkownError, ZuoraAPI::Exceptions::ZuoraDataIntegrity
587
- Rails.logger.error('Zuora Unknown/Integrity Error', ex, exception_args)
588
- when ZuoraAPI::Exceptions::ZuoraAPIRequestLimit
589
- Rails.logger.info('Zuora APILimit Reached', exception_args)
590
- when *(ZuoraAPI::Login::ZUORA_API_ERRORS-ZuoraAPI::Login::ZUORA_SERVER_ERRORS)
591
- #Rails.logger.debug('Zuora API Error', ex, self.exception_args(ex))
592
- when *ZuoraAPI::Login::ZUORA_SERVER_ERRORS
593
- Rails.logger.error('Zuora Server Error', ex, exception_args)
594
- end
595
- end
596
-
597
- def log(location: "Rest Call", exception: nil, message: "Timed out will retry after #{self.timeout_sleep} seconds", level: :info )
598
- level = :debug if ![:debug, :info, :warn, :error, :fatal].include?(level)
599
- if Rails.logger.class.to_s == "Ougai::Logger"
600
- Rails.logger.send(level.to_sym, "#{location} - #{message}", exception)
601
- else
602
- Rails.logger.send(level.to_sym, "#{location} - #{exception.class} #{message}")
603
- end
604
- end
605
-
606
- def exception_args(ex)
607
- args = {}
608
- if ex.class == ZuoraAPI::Exceptions::ZuoraAPIRequestLimit
609
- args.merge!({
610
- zuora_trace_id: ex.response.headers["zuora-request-id"],
611
- zuora_track_id: ex.response.request.options[:headers]["Zuora-Track-Id"]
612
- })
613
- elsif defined?(ex.response) && ex.response.present?
614
- args.merge!({
615
- request: {
616
- path: ex.response.request.path.to_s,
617
- method: ex.response.request.http_method.to_s.split("Net::HTTP::").last.upcase,
618
- params: ex.response.request.raw_body.to_s,
619
- headers: ex.response.request.options[:headers].map{|k,v| [k.to_s, k.to_s.downcase.strip == "authorization" ? "VALUE FILTERED" : v]}.to_h.to_s,
620
- },
621
- response: {
622
- status: ex.response.code,
623
- params: ex.response.body.to_s,
624
- headers: ex.response.headers.to_s,
625
- },
626
- zuora_trace_id: ex.response.headers["zuora-request-id"],
627
- zuora_track_id: ex.response.request.options[:headers]["Zuora-Track-Id"],
628
- })
629
- elsif defined?(ex.request) && ex.request.present?
630
- args.merge!({
631
- request: {
632
- path: ex.request.path.to_s,
633
- method: ex.request.http_method.to_s.split("Net::HTTP::").last.upcase,
634
- params: ex.request.options[:body],
635
- headers: ex.request.options[:headers].map{|k,v| [k.to_s, k.to_s.downcase.strip == "authorization" ? "VALUE FILTERED" : v]}.to_h.to_s
636
- }
637
- })
638
- args.merge!({
639
- zuora_track_id: ex.request.options[:headers]["Zuora-Track-Id"]
640
- }) if ex.request.options[:headers]["Zuora-Track-Id"].present?
641
- end
642
- rescue => ex
643
- Rails.logger.error("Failed to create exception arguments", ex, args)
644
- ensure
645
- return args
555
+ else
556
+ return output_xml, input_xml, response
646
557
  end
647
558
 
648
559
  def raise_errors(type: :SOAP, body: nil, response: nil)
@@ -659,13 +570,13 @@ module ZuoraAPI
659
570
  end
660
571
 
661
572
  if [502,503].include?(response.code)
662
- raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new("Received #{response.code} from 'https://#{rest_domain(endpoint: request_uri)}'", response)
573
+ raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new("Received #{response.code} from #{request_uri}", response)
663
574
  end
664
575
 
665
576
  # Check failure response code
666
577
  case response.code
667
578
  when 504
668
- raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from 'https://#{rest_domain(endpoint: request_uri)}'", response)
579
+ raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from #{request_uri}", response)
669
580
  when 429
670
581
  raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("The total number of concurrent requests has exceeded the limit allowed by the system. Please resubmit your request later.", response)
671
582
  when 401
@@ -686,10 +597,6 @@ module ZuoraAPI
686
597
  when :SOAP
687
598
  error, success, message = get_soap_error_and_message(body)
688
599
 
689
- if body.xpath('//fns:LoginFault', 'fns' =>'http://fault.api.zuora.com/').present?
690
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(message, response)
691
- end
692
-
693
600
  if body.xpath('//ns1:queryResponse', 'ns1' => 'http://api.zuora.com/').present? &&
694
601
  body.xpath(
695
602
  '//ns1:records[@xsi:type="ns2:Export"]',
@@ -697,12 +604,12 @@ module ZuoraAPI
697
604
  ).present?
698
605
  result = body.xpath('//ns2:Status', 'ns2' => 'http://object.api.zuora.com/').text
699
606
  if result == 'Failed'
700
- message = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
701
- error = 'FATAL_ERROR'
702
- if message.present?
703
- identifier, new_message = message.scan(/^([\w\d]{16})\: (.*)/).first
704
- error, message = ['UNEXPECTED_ERROR', new_message] if new_message.present?
607
+ reason = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
608
+ if reason.present?
609
+ message = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
610
+ error = message.match(/^[\w\d]{16}\: (Unexpected error.|No HTTP Response|Socket Timeout|There is an internal error, please try again later)/).present? ? 'UNEXPECTED_ERROR' : 'FATAL_ERROR'
705
611
  else
612
+ error = 'FATAL_ERROR'
706
613
  message = 'Export failed due to unknown reason. Consult api logs.'
707
614
  end
708
615
  end
@@ -751,10 +658,6 @@ module ZuoraAPI
751
658
  when /^GET::400::\/api\/rest\/v1\/reports\/(reportlabels\/)?([a-zA-Z0-9\-_]+)\/report-details$/ # Get report, capture of the id is present if needed in future error responses.
752
659
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new(reporting_message, response) if reporting_message.present?
753
660
  end
754
- when /\/objects\/batch\//
755
- if body['code'].present? && /61$/.match(body['code'].to_s).present? # if last 2 digits of code are 61
756
- raise ZuoraAPI::Exceptions::ZuoraAPITemporaryError.new(body['message'], nil, body['details'])
757
- end
758
661
  end
759
662
 
760
663
  body = body.dig("results").present? ? body["results"] : body if body.class == Hash
@@ -794,11 +697,7 @@ module ZuoraAPI
794
697
  end
795
698
 
796
699
  if body['error'] == 'Unauthorized' && body['status'] == 401
797
- if body['message'].present?
798
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(body['message'], response)
799
- else
800
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{messages_array.join(', ')}", response)
801
- end
700
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{messages_array.join(', ')}", response)
802
701
  end
803
702
  #Authentication failed
804
703
  if (codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(11) || response.code == 401) && !codes_array.include?(422)
@@ -925,8 +824,6 @@ module ZuoraAPI
925
824
  raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new(error_message, response)
926
825
  when /Client sent a bad request./, /Bad Request/, /403 Forbidden/
927
826
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(error_message, response)
928
- when /414 Request-URI Too Large/
929
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Request URL is too long", response)
930
827
  else
931
828
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(error_message, response)
932
829
  end
@@ -996,7 +893,7 @@ module ZuoraAPI
996
893
  raise ZuoraAPI::Exceptions::ZuoraAPIUnkownError.new(message, response, errors, success)
997
894
  end
998
895
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
999
- when /^INVALID_VERSION/, /invalid/, /^DUPLICATE_VALUE/, /^REQUEST_REJECTED/, /INVALID_ID/, /MAX_RECORDS_EXCEEDED/, /INVALID_FIELD/, /MALFORMED_QUERY/, /NO_PERMISSION/, /PDF_QUERY_ERROR/, /MISSING_REQUIRED_VALUE/, /INVALID_TYPE/, /TRANSACTION_FAILED/, /API_DISABLED/, /CANNOT_DELETE/, /ACCOUNTING_PERIOD_CLOSED/
896
+ when /invalid/, /^DUPLICATE_VALUE/, /^REQUEST_REJECTED/, /INVALID_ID/, /MAX_RECORDS_EXCEEDED/, /INVALID_FIELD/, /MALFORMED_QUERY/, /NO_PERMISSION/, /PDF_QUERY_ERROR/, /MISSING_REQUIRED_VALUE/, /INVALID_TYPE/, /TRANSACTION_FAILED/, /API_DISABLED/, /CANNOT_DELETE/, /ACCOUNTING_PERIOD_CLOSED/
1000
897
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
1001
898
  when /.*UNEXPECTED_ERROR/
1002
899
  raise ZuoraAPI::Exceptions::ZuoraUnexpectedError.new(message, response, errors, success)
@@ -1056,7 +953,7 @@ module ZuoraAPI
1056
953
  base = self.url.include?(".com") ? self.url.split(".com")[0].concat(".com") : self.url.split(".eu")[0].concat(".eu")
1057
954
  url = object ? "#{base}/apps/api/describe/#{object}" : "#{base}/apps/api/describe/"
1058
955
  headers = self.entity_id.present? ? {"Zuora-Entity-Ids" => self.entity_id, 'Content-Type' => "text/xml; charset=utf-8"} : {'Content-Type' => "text/xml; charset=utf-8"}
1059
- response = HTTParty.get(url, headers: {"Authorization" => self.get_session(prefix: true, auth_type: :basic)}.merge(headers), :timeout => 130)
956
+ response = HTTParty.get(url, headers: {"Authorization" => self.get_session(prefix: true, auth_type: :basic)}.merge(headers), :timeout => 120)
1060
957
 
1061
958
  raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error.present? ? self.current_error : 'Describe call 401', response) if response.code == 401
1062
959
 
@@ -1089,31 +986,35 @@ module ZuoraAPI
1089
986
  end
1090
987
  des_hash[:related_objects] = output_xml.xpath(".//related-objects").xpath(".//object").map{ |x| [x.xpath(".//name").text.to_sym, [ [:url, x.attributes["href"].value], [:label, x.xpath(".//name").text ] ].to_h] }.to_h
1091
988
  end
1092
-
1093
- return des_hash
1094
989
  rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
1095
- if !tries.zero?
1096
- tries -= 1
1097
- self.log(location: "Describe", exception: ex, message: "Timed out will retry after #{self.timeout_sleep} seconds", level: :debug)
1098
- sleep(self.timeout_sleep)
1099
- retry
990
+ if tries.zero?
991
+ if log_errors
992
+ if Rails.logger.class.to_s == "Ougai::Logger"
993
+ Rails.logger.error("Describe - Timed out will retry after #{self.timeout_sleep} seconds", ex)
994
+ else
995
+ Rails.logger.error("Describe - #{ex.class} Timed out will retry after #{self.timeout_sleep} seconds")
996
+ end
997
+ end
998
+ raise ex
1100
999
  end
1101
1000
 
1102
- self.log(location: "Describe", exception: ex, message: "Timed out", level: :error) if log_errors
1103
- raise ex
1104
-
1001
+ tries -= 1
1002
+ sleep(self.timeout_sleep)
1003
+ retry
1105
1004
  rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
1106
1005
  if !tries.zero? && self.status == 'Active'
1107
1006
  tries -= 1
1108
1007
  Rails.logger.debug("Describe session expired. Starting new session.")
1109
1008
  self.new_session
1110
1009
  retry
1010
+ else
1011
+ Rails.logger.error("Describe session expired. Starting new session.") if log_errors
1012
+ raise ex
1111
1013
  end
1112
-
1113
- Rails.logger.error("Describe session expired. Starting new session.") if log_errors
1114
- raise ex
1115
1014
  rescue => ex
1116
1015
  raise ex
1016
+ else
1017
+ return des_hash
1117
1018
  end
1118
1019
 
1119
1020
  def rest_call(
@@ -1126,12 +1027,11 @@ module ZuoraAPI
1126
1027
  z_session: true,
1127
1028
  session_type: :basic,
1128
1029
  timeout_retry: false,
1129
- timeout: 130,
1030
+ timeout: 120,
1130
1031
  timeout_sleep_interval: self.timeout_sleep,
1131
1032
  multipart: false,
1132
1033
  stream_body: false,
1133
1034
  output_exception_messages: true,
1134
- zuora_track_id: nil,
1135
1035
  **keyword_args,
1136
1036
  &block
1137
1037
  )
@@ -1141,13 +1041,12 @@ module ZuoraAPI
1141
1041
 
1142
1042
  authentication_headers = {}
1143
1043
  if z_session
1144
- authentication_headers = {"Authorization" => self.get_session(prefix: true, auth_type: session_type, zuora_track_id: zuora_track_id) }
1044
+ authentication_headers = {"Authorization" => self.get_session(prefix: true, auth_type: session_type) }
1145
1045
  if self.entity_id.present?
1146
1046
  authentication_headers["Zuora-Entity-Ids"] = self.entity_id if headers.dig("Zuora-Entity-Ids").nil?
1147
1047
  authentication_headers.delete_if { |key, value| ["entityId", "entityName"].include?(key.to_s) }
1148
1048
  end
1149
1049
  end
1150
- headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
1151
1050
 
1152
1051
  modified_headers = {'Content-Type' => "application/json; charset=utf-8"}.merge(authentication_headers).merge(headers)
1153
1052
 
@@ -1173,20 +1072,18 @@ module ZuoraAPI
1173
1072
  Rails.logger.debug("Response JSON: #{output_json}") if debug && output_json.present?
1174
1073
 
1175
1074
  raise_errors(type: :JSON, body: output_json, response: response)
1176
- rescue => ex
1075
+ rescue
1177
1076
  reset_files(body) if multipart
1178
1077
  raise
1179
1078
  end
1180
-
1181
- return [output_json, response]
1182
1079
  rescue ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError => ex
1183
1080
  if self.class.to_s == 'ZuoraAPI::Oauth' && ex.message.include?("Authentication type is not supported by this Login")
1184
1081
  session_type = :bearer
1185
1082
  retry
1083
+ else
1084
+ Rails.logger.debug("Rest Call - Session Bad Auth type")
1085
+ raise ex
1186
1086
  end
1187
- Rails.logger.debug("Rest Call - Session Bad Auth type")
1188
- raise ex
1189
-
1190
1087
  rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
1191
1088
  if !tries.zero? && z_session
1192
1089
  tries -= 1
@@ -1199,35 +1096,40 @@ module ZuoraAPI
1199
1096
  end
1200
1097
 
1201
1098
  retry
1099
+ else
1100
+ if errors.include?(ex.class)
1101
+ raise ex
1102
+ else
1103
+ return [output_json, response]
1104
+ end
1202
1105
  end
1203
-
1204
- raise ex if errors.include?(ex.class)
1205
- return [output_json, response]
1206
-
1207
1106
  rescue *ZUORA_API_ERRORS => ex
1208
- raise ex if errors.include?(ex.class)
1209
-
1210
- response = ex.response unless response
1211
- return [output_json, response]
1212
-
1107
+ if errors.include?(ex.class)
1108
+ raise ex
1109
+ else
1110
+ response = ex.response unless response
1111
+ return [output_json, response]
1112
+ end
1213
1113
  rescue ZuoraAPI::Exceptions::BadEntityError => ex
1214
1114
  raise ex
1215
1115
  rescue *CONNECTION_EXCEPTIONS => ex
1216
- if !tries.zero?
1217
- tries -= 1
1218
- self.log(location: "Rest Call", exception: ex, message: "Timed out will retry after #{timeout_sleep_interval} seconds", level: :debug)
1219
- sleep(timeout_sleep_interval)
1220
- retry
1116
+ if tries.zero?
1117
+ if output_exception_messages
1118
+ if Rails.logger.class.to_s == "Ougai::Logger"
1119
+ Rails.logger.error("Rest Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
1120
+ else
1121
+ Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
1122
+ end
1123
+ end
1124
+ raise ex
1221
1125
  end
1222
1126
 
1223
- self.log(location: "Rest Call", exception: ex, message: "Timed out", level: :error) if output_exception_messages
1224
- raise ex
1225
-
1127
+ tries -= 1
1128
+ sleep(timeout_sleep_interval)
1129
+ retry
1226
1130
  rescue *CONNECTION_READ_EXCEPTIONS => ex
1227
-
1228
1131
  if !tries.zero?
1229
1132
  tries -= 1
1230
- self.log(location: "Rest Call", exception: ex, message: "Timed out will retry after #{timeout_sleep_interval} seconds", level: :debug)
1231
1133
  if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
1232
1134
  retry
1233
1135
  elsif timeout_retry
@@ -1235,15 +1137,20 @@ module ZuoraAPI
1235
1137
  retry
1236
1138
  end
1237
1139
  end
1238
-
1239
- self.log(location: "Rest Call", exception: ex, message: "Timed out", level: :error) if output_exception_messages
1240
- ex = ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from 'https://#{rest_domain(endpoint: url)}'", nil, request) if ex.instance_of?(Net::ReadTimeout)
1140
+
1141
+ if output_exception_messages
1142
+ if Rails.logger.class.to_s == "Ougai::Logger"
1143
+ Rails.logger.error("Rest Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
1144
+ else
1145
+ Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
1146
+ end
1147
+ end
1148
+ raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}", nil, request) if ex.instance_of?(Net::ReadTimeout)
1241
1149
  raise ex
1242
-
1243
1150
  rescue => ex
1244
1151
  raise ex
1245
- ensure
1246
- self.error_logger(ex) if defined?(ex) && Rails.logger.class.to_s == "Ougai::Logger"
1152
+ else
1153
+ return [output_json, response]
1247
1154
  end
1248
1155
 
1249
1156
  def update_create_tenant
@@ -1265,9 +1172,8 @@ module ZuoraAPI
1265
1172
  while !response["nextPage"].blank?
1266
1173
  url = self.rest_endpoint(response["nextPage"].split('/v1/').last)
1267
1174
  Rails.logger.debug("Fetch Catalog URL #{url}")
1268
- output_json, response = self.rest_call(debug: false, url: url, timeout_retry: true)
1269
-
1270
- if !/(true|t|yes|y|1)$/.match(output_json['success'].to_s) || output_json['success'].class != TrueClass
1175
+ output_json, response = self.rest_call(:debug => false, :url => url, :errors => [ZuoraAPI::Exceptions::ZuoraAPISessionError], :timeout_retry => true )
1176
+ if !output_json['success'] =~ (/(true|t|yes|y|1)$/i) || output_json['success'].class != TrueClass
1271
1177
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Error Getting Catalog: #{output_json}", response)
1272
1178
  end
1273
1179
  output_json["products"].each do |product|
@@ -1293,7 +1199,7 @@ module ZuoraAPI
1293
1199
  return products, catalog_map
1294
1200
  end
1295
1201
 
1296
- def get_file(url: nil, headers: {}, z_session: true, tempfile: true, output_file_name: nil, zuora_track_id: nil, add_timestamp: true, file_path: defined?(Rails.root.join('tmp')) ? Rails.root.join('tmp') : Pathname.new(Dir.pwd), timeout_retries: 3, timeout: 130, session_type: :basic, **execute_params)
1202
+ def get_file(url: nil, headers: {}, z_session: true, tempfile: true, output_file_name: nil, zuora_track_id: nil, add_timestamp: true, file_path: defined?(Rails.root.join('tmp')) ? Rails.root.join('tmp') : Pathname.new(Dir.pwd), timeout_retries: 3, timeout: 120, session_type: :basic, **execute_params)
1297
1203
  raise "file_path must be of class Pathname" if file_path.class != Pathname
1298
1204
 
1299
1205
  retry_count ||= timeout_retries
@@ -1401,17 +1307,11 @@ module ZuoraAPI
1401
1307
  if !(retry_count -= 1).zero?
1402
1308
  self.new_session
1403
1309
  raise response.class
1310
+ else
1311
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error)
1404
1312
  end
1405
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error)
1406
- end
1407
- raise
1408
- when Net::HTTPNotFound
1409
- if url.include?(self.fileURL)
1410
- raise ZuoraAPI::Exceptions::FileDownloadError.new(
1411
- "The current tenant does not have a file with id '#{url.split('/').last}'"
1412
- )
1413
1313
  else
1414
- raise ZuoraAPI::Exceptions::FileDownloadError.new("File Download Failed #{response.class}")
1314
+ raise
1415
1315
  end
1416
1316
  else
1417
1317
  raise ZuoraAPI::Exceptions::FileDownloadError.new("File Download Failed #{response.class}")
@@ -1422,120 +1322,133 @@ module ZuoraAPI
1422
1322
  sleep(5)
1423
1323
  if (retry_count -= 1) >= 0
1424
1324
  retry
1325
+ else
1326
+ Rails.logger.error("File Download Failed")
1327
+ raise
1425
1328
  end
1426
- Rails.logger.error("File Download Failed")
1427
- raise
1428
1329
  end
1429
1330
 
1430
1331
  def getDataSourceExport(query, extract: true, encrypted: false, zip: true, z_track_id: "")
1431
- tries ||= 3
1432
- request = Nokogiri::XML::Builder.new do |xml|
1433
- xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1434
- xml['SOAP-ENV'].Header do
1435
- xml['ns1'].SessionHeader do
1436
- xml['ns1'].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: z_track_id)
1332
+ begin
1333
+ tries ||= 3
1334
+ request = Nokogiri::XML::Builder.new do |xml|
1335
+ xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1336
+ xml['SOAP-ENV'].Header do
1337
+ xml['ns1'].SessionHeader do
1338
+ xml['ns1'].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: z_track_id)
1339
+ end
1437
1340
  end
1438
- end
1439
- xml['SOAP-ENV'].Body do
1440
- xml['ns1'].create do
1441
- xml['ns1'].zObjects('xsi:type' => "ns2:Export") do
1442
- xml['ns2'].Format 'csv'
1443
- xml['ns2'].Zip zip
1444
- xml['ns2'].Name 'googman'
1445
- xml['ns2'].Query query
1446
- xml['ns2'].Encrypted encrypted
1341
+ xml['SOAP-ENV'].Body do
1342
+ xml['ns1'].create do
1343
+ xml['ns1'].zObjects('xsi:type' => "ns2:Export") do
1344
+ xml['ns2'].Format 'csv'
1345
+ xml['ns2'].Zip zip
1346
+ xml['ns2'].Name 'googman'
1347
+ xml['ns2'].Query query
1348
+ xml['ns2'].Encrypted encrypted
1349
+ end
1447
1350
  end
1448
1351
  end
1449
1352
  end
1450
1353
  end
1451
- end
1452
1354
 
1453
- response_query = HTTParty.post(self.url, body: request.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8", "Z-Track-Id" => z_track_id}, :timeout => 130)
1355
+ response_query = HTTParty.post(self.url, body: request.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8", "Z-Track-Id" => z_track_id}, :timeout => 120)
1454
1356
 
1455
- output_xml = Nokogiri::XML(response_query.body)
1456
- raise_errors(type: :SOAP, body: output_xml, response: response_query) if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1357
+ output_xml = Nokogiri::XML(response_query.body)
1358
+ raise_errors(type: :SOAP, body: output_xml, response: response_query) if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1457
1359
 
1458
- # raise "Export Creation Unsuccessful : #{response_query.code}: #{response_query.parsed_response}" if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1459
-
1460
- id = output_xml.xpath('//ns1:Id', 'ns1' =>'http://api.zuora.com/').text
1360
+ # raise "Export Creation Unsuccessful : #{response_query.code}: #{response_query.parsed_response}" if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1361
+
1362
+ id = output_xml.xpath('//ns1:Id', 'ns1' =>'http://api.zuora.com/').text
1461
1363
 
1462
- confirmRequest = Nokogiri::XML::Builder.new do |xml|
1463
- xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1464
- xml['SOAP-ENV'].Header do
1465
- xml['ns1'].SessionHeader do
1466
- xml['ns1'].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: z_track_id)
1364
+ confirmRequest = Nokogiri::XML::Builder.new do |xml|
1365
+ xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1366
+ xml['SOAP-ENV'].Header do
1367
+ xml['ns1'].SessionHeader do
1368
+ xml['ns1'].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: z_track_id)
1369
+ end
1467
1370
  end
1468
- end
1469
- xml['SOAP-ENV'].Body do
1470
- xml['ns1'].query do
1471
- xml['ns1'].queryString "SELECT Id, CreatedById, CreatedDate, Encrypted, FileId, Format, Name, Query, Size, Status, StatusReason, UpdatedById, UpdatedDate, Zip From Export where Id = '#{id}'"
1371
+ xml['SOAP-ENV'].Body do
1372
+ xml['ns1'].query do
1373
+ xml['ns1'].queryString "SELECT Id, CreatedById, CreatedDate, Encrypted, FileId, Format, Name, Query, Size, Status, StatusReason, UpdatedById, UpdatedDate, Zip From Export where Id = '#{id}'"
1374
+ end
1472
1375
  end
1473
1376
  end
1474
1377
  end
1475
- end
1476
- result = 'Waiting'
1378
+ result = 'Waiting'
1477
1379
 
1478
- while result != "Completed"
1479
- sleep 3
1480
- response_query = HTTParty.post(self.url, body: confirmRequest.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8", "Z-Track-Id" => z_track_id}, :timeout => 130)
1380
+ while result != "Completed"
1381
+ sleep 3
1382
+ response_query = HTTParty.post(self.url, body: confirmRequest.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8", "Z-Track-Id" => z_track_id}, :timeout => 120)
1481
1383
 
1482
- output_xml = Nokogiri::XML(response_query.body)
1483
- result = output_xml.xpath('//ns2:Status', 'ns2' =>'http://object.api.zuora.com/').text
1484
- status_code = response_query.code if response_query
1384
+ output_xml = Nokogiri::XML(response_query.body)
1385
+ result = output_xml.xpath('//ns2:Status', 'ns2' =>'http://object.api.zuora.com/').text
1386
+ status_code = response_query.code if response_query
1485
1387
 
1486
- raise_errors(type: :SOAP, body: output_xml, response: response_query) if result.blank? || result == "Failed"
1487
- # raise "Export Creation Unsuccessful : #{response_query.code}: #{response_query.parsed_response}" if result.blank? || result == "Failed"
1488
- end
1388
+ raise_errors(type: :SOAP, body: output_xml, response: response_query) if result.blank? || result == "Failed"
1389
+ # raise "Export Creation Unsuccessful : #{response_query.code}: #{response_query.parsed_response}" if result.blank? || result == "Failed"
1390
+ end
1489
1391
 
1490
- file_id = output_xml.xpath('//ns2:FileId', 'ns2' =>'http://object.api.zuora.com/').text
1491
- export_file = get_file(:url => self.fileURL(file_id))
1492
- export_file_path = export_file.path
1493
- Rails.logger.debug("=====> Export path #{export_file.path}")
1494
-
1495
- if extract && zip
1496
- require "zip"
1497
- new_path = export_file_path.partition('.zip').first
1498
- zipped = Zip::File.open(export_file_path)
1499
- file_handle = zipped.entries.first
1500
- file_handle.extract(new_path)
1501
- File.delete(export_file_path)
1502
- return new_path
1503
- else
1504
- return export_file_path
1505
- end
1506
- rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
1507
- if !(tries -= 1).zero?
1508
- Rails.logger.info("Export call failed - Trace ID: #{z_track_id}")
1509
- self.new_session
1510
- retry
1511
- end
1512
- raise ex
1392
+ file_id = output_xml.xpath('//ns2:FileId', 'ns2' =>'http://object.api.zuora.com/').text
1393
+ export_file = get_file(:url => self.fileURL(file_id))
1394
+ export_file_path = export_file.path
1395
+ Rails.logger.debug("=====> Export path #{export_file.path}")
1396
+
1397
+ if extract && zip
1398
+ require "zip"
1399
+ new_path = export_file_path.partition('.zip').first
1400
+ zipped = Zip::File.open(export_file_path)
1401
+ file_handle = zipped.entries.first
1402
+ file_handle.extract(new_path)
1403
+ File.delete(export_file_path)
1404
+ return new_path
1405
+ else
1406
+ return export_file_path
1407
+ end
1408
+ rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
1409
+ if !(tries -= 1).zero?
1410
+ Rails.logger.info("Export call failed - Trace ID: #{z_track_id}")
1411
+ self.new_session
1412
+ retry
1413
+ else
1414
+ raise ex
1415
+ end
1513
1416
 
1514
- rescue ZuoraAPI::Exceptions::ZuoraUnexpectedError => ex
1515
- if !(tries -= 1).zero?
1516
- Rails.logger.info("Trace ID: #{z_track_id} UnexpectedError, will retry after 10 seconds")
1517
- sleep 10
1518
- retry
1519
- end
1520
- raise ex
1417
+ rescue ZuoraAPI::Exceptions::ZuoraUnexpectedError => ex
1418
+ if !(tries -= 1).zero?
1419
+ Rails.logger.info("Trace ID: #{z_track_id} UnexpectedError, will retry after 10 seconds")
1420
+ sleep 10
1421
+ retry
1422
+ else
1423
+ raise ex
1424
+ end
1521
1425
 
1522
- rescue *ZUORA_API_ERRORS => ex
1523
- raise ex
1426
+ rescue *ZUORA_API_ERRORS => ex
1427
+ raise ex
1524
1428
 
1525
- rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
1526
- if !(tries -= 1).zero?
1527
- Rails.logger.info("Trace ID: #{z_track_id} Timed out will retry after 5 seconds")
1528
- sleep 5
1529
- retry
1530
- end
1531
- raise ex
1429
+ rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
1430
+ if !(tries -= 1).zero?
1431
+ Rails.logger.info("Trace ID: #{z_track_id} Timed out will retry after 5 seconds")
1432
+ sleep 5
1433
+ retry
1434
+ else
1435
+ raise ex
1436
+ end
1532
1437
 
1533
- rescue ZuoraAPI::Exceptions::BadEntityError => ex
1534
- raise ex
1438
+ rescue Errno::ECONNRESET => ex
1439
+ if !(tries -= 1).zero? && ex.message.include?('SSL_connect')
1440
+ retry
1441
+ else
1442
+ raise ex
1443
+ end
1444
+
1445
+ rescue ZuoraAPI::Exceptions::BadEntityError => ex
1446
+ raise ex
1447
+ end
1535
1448
  end
1536
1449
 
1537
1450
  def query(query, parse = false)
1538
- output_xml, input_xml = self.soap_call(debug: false, timeout_retry: true) do |xml|
1451
+ output_xml, input_xml = self.soap_call({:debug => false, :timeout_retry => true}) do |xml|
1539
1452
  xml['ns1'].query do
1540
1453
  xml['ns1'].queryString query
1541
1454
  end