zuora_api 1.7.65 → 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 +4 -4
- data/lib/zuora_api/exceptions.rb +3 -2
- data/lib/zuora_api/login.rb +216 -149
- data/lib/zuora_api/logins/oauth.rb +13 -19
- data/lib/zuora_api/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ff05150108e2fbba1a069083c46b53d4b43d95d95d4cfb4bcd82d10881e80091
|
|
4
|
+
data.tar.gz: b8543c688b33ee85357716df5e1f93b7cafef3702074914355aa30960b8726dd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9b2a8309a4a1c88a13be63df6eb96c08d27e25076b379c740b7eddd1898a60f46249388e7279d98e67fd72469e49f1a6abdc5c7f3a62aa32905909c100de46ad
|
|
7
|
+
data.tar.gz: 0a706abfa46ed54f332f903a2af7c118dfda2aaa6f61a280b9c2f989fb19790484aefcabed72bbcdc9b5ab37a2befb46913d2771ab6a924095c34ec80a8a595c
|
data/lib/zuora_api/exceptions.rb
CHANGED
|
@@ -225,13 +225,14 @@ module ZuoraAPI
|
|
|
225
225
|
end
|
|
226
226
|
|
|
227
227
|
class ZuoraAPIReadTimeout < Net::ReadTimeout
|
|
228
|
-
attr_reader :code, :response
|
|
228
|
+
attr_reader :code, :response, :request
|
|
229
229
|
attr_writer :default_message
|
|
230
230
|
|
|
231
|
-
def initialize(message = nil,response=nil, errors = [], successes = [], *args)
|
|
231
|
+
def initialize(message = nil, response = nil, request = nil, errors = [], successes = [], *args)
|
|
232
232
|
@code = response.class.to_s == "HTTParty::Response" ? response.code : nil
|
|
233
233
|
@message = message
|
|
234
234
|
@response = response
|
|
235
|
+
@request = request
|
|
235
236
|
@default_message = "Authentication type is not supported by this Login"
|
|
236
237
|
end
|
|
237
238
|
|
data/lib/zuora_api/login.rb
CHANGED
|
@@ -474,12 +474,16 @@ module ZuoraAPI
|
|
|
474
474
|
headers = { 'Content-Type' => "text/xml; charset=utf-8", 'Accept' => 'text/xml'}
|
|
475
475
|
headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
|
|
476
476
|
|
|
477
|
-
|
|
477
|
+
request = HTTParty::Request.new(
|
|
478
|
+
Net::HTTP::Post,
|
|
478
479
|
self.url,
|
|
479
|
-
:
|
|
480
|
-
:
|
|
481
|
-
:
|
|
480
|
+
body: xml.doc.to_xml(:save_with => XML_SAVE_OPTIONS).strip,
|
|
481
|
+
headers: headers,
|
|
482
|
+
timeout: timeout,
|
|
482
483
|
)
|
|
484
|
+
|
|
485
|
+
response = request.perform
|
|
486
|
+
|
|
483
487
|
output_xml = Nokogiri::XML(response.body)
|
|
484
488
|
Rails.logger.debug("Response SOAP XML: #{output_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}") if debug
|
|
485
489
|
|
|
@@ -526,34 +530,26 @@ module ZuoraAPI
|
|
|
526
530
|
sleep(timeout_sleep_interval)
|
|
527
531
|
retry
|
|
528
532
|
rescue *CONNECTION_READ_EXCEPTIONS => ex
|
|
529
|
-
if tries.zero?
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
533
|
+
if !tries.zero?
|
|
534
|
+
tries -= 1
|
|
535
|
+
|
|
536
|
+
if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
|
|
537
|
+
retry
|
|
538
|
+
elsif timeout_retry
|
|
539
|
+
sleep(timeout_sleep_interval)
|
|
540
|
+
retry
|
|
536
541
|
end
|
|
537
|
-
raise ex
|
|
538
542
|
end
|
|
539
543
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
sleep(timeout_sleep_interval)
|
|
546
|
-
retry
|
|
547
|
-
else
|
|
548
|
-
if output_exception_messages
|
|
549
|
-
if Rails.logger.class.to_s == "Ougai::Logger"
|
|
550
|
-
Rails.logger.error("SOAP Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
|
|
551
|
-
else
|
|
552
|
-
Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
|
|
553
|
-
end
|
|
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")
|
|
554
549
|
end
|
|
555
|
-
raise ex
|
|
556
550
|
end
|
|
551
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}", nil, request) if ex.instance_of?(Net::ReadTimeout)
|
|
552
|
+
raise ex
|
|
557
553
|
rescue => ex
|
|
558
554
|
raise ex
|
|
559
555
|
else
|
|
@@ -561,24 +557,33 @@ module ZuoraAPI
|
|
|
561
557
|
end
|
|
562
558
|
|
|
563
559
|
def raise_errors(type: :SOAP, body: nil, response: nil)
|
|
564
|
-
|
|
565
|
-
|
|
560
|
+
request_uri, request_path, match_string = "", "", ""
|
|
561
|
+
if response.class.to_s == "HTTP::Message"
|
|
562
|
+
request_uri = response.http_header.request_uri.to_s
|
|
563
|
+
request_path = response.http_header.request_uri.path
|
|
564
|
+
match_string = "#{response.http_header.request_method}::#{response.code}::#{request_uri}"
|
|
565
|
+
else
|
|
566
|
+
request = response.request
|
|
567
|
+
request_uri = response.request.uri
|
|
568
|
+
request_path = request.path.path
|
|
569
|
+
match_string = "#{request.http_method.to_s.split("Net::HTTP::").last.upcase}::#{response.code}::#{request_path}"
|
|
570
|
+
end
|
|
566
571
|
|
|
567
572
|
if [502,503].include?(response.code)
|
|
568
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new("Received #{response.code} from #{
|
|
573
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new("Received #{response.code} from #{request_uri}", response)
|
|
569
574
|
end
|
|
570
575
|
|
|
571
576
|
# Check failure response code
|
|
572
577
|
case response.code
|
|
573
578
|
when 504
|
|
574
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from #{
|
|
579
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from #{request_uri}", response)
|
|
575
580
|
when 429
|
|
576
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)
|
|
577
582
|
when 401
|
|
578
583
|
|
|
579
584
|
else
|
|
580
585
|
if body.class == Hash
|
|
581
|
-
case
|
|
586
|
+
case request_path
|
|
582
587
|
when /^\/v1\/connections$/
|
|
583
588
|
response_headers = response.headers.to_h
|
|
584
589
|
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Missing cookies for authentication call", response) if response_headers['set-cookie'].blank?
|
|
@@ -602,7 +607,7 @@ module ZuoraAPI
|
|
|
602
607
|
reason = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
|
|
603
608
|
if reason.present?
|
|
604
609
|
message = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
|
|
605
|
-
error = message.match(/^[\w\d]{16}\: (Unexpected error.|No HTTP Response)/).present? ? 'UNEXPECTED_ERROR' : 'FATAL_ERROR'
|
|
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'
|
|
606
611
|
else
|
|
607
612
|
error = 'FATAL_ERROR'
|
|
608
613
|
message = 'Export failed due to unknown reason. Consult api logs.'
|
|
@@ -624,23 +629,10 @@ module ZuoraAPI
|
|
|
624
629
|
end
|
|
625
630
|
end
|
|
626
631
|
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
elsif response.code == 500
|
|
630
|
-
if response.headers.fetch('content-type', []).include?('application/json')
|
|
631
|
-
begin
|
|
632
|
-
output_json = JSON.parse(response.body)
|
|
633
|
-
self.raise_errors(type: :JSON, body: output_json, response: response)
|
|
634
|
-
rescue JSON::ParserError => ex
|
|
635
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
|
|
636
|
-
end
|
|
637
|
-
else
|
|
638
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
|
|
639
|
-
end
|
|
640
|
-
end
|
|
641
|
-
|
|
632
|
+
self.errors_via_content_type(response: response, type: :xml)
|
|
633
|
+
|
|
642
634
|
when :JSON
|
|
643
|
-
case
|
|
635
|
+
case request_path
|
|
644
636
|
when /^\/query\/jobs.*/ #DataQuery Paths
|
|
645
637
|
return if body.class != Hash
|
|
646
638
|
case match_string
|
|
@@ -660,7 +652,7 @@ module ZuoraAPI
|
|
|
660
652
|
if reporting_message&.include?("com.zuora.rest.RestUsageException: The user does not have permissions for this API.")
|
|
661
653
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(reporting_message, response)
|
|
662
654
|
elsif reporting_message&.include?("500 Internal Server Error")
|
|
663
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Internal Server Error. The Reporting API is down. Contact Support.")
|
|
655
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Internal Server Error. The Reporting API is down. Contact Support.", response)
|
|
664
656
|
end
|
|
665
657
|
case match_string
|
|
666
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.
|
|
@@ -726,7 +718,6 @@ module ZuoraAPI
|
|
|
726
718
|
if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(50)
|
|
727
719
|
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{messages_array.join(', ')}", response)
|
|
728
720
|
end
|
|
729
|
-
|
|
730
721
|
#Internal Server Error
|
|
731
722
|
if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(60)
|
|
732
723
|
if messages_array.uniq.size == 1
|
|
@@ -737,6 +728,11 @@ module ZuoraAPI
|
|
|
737
728
|
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("#{messages_array.join(', ')}", response)
|
|
738
729
|
end
|
|
739
730
|
|
|
731
|
+
#Retryiable Service Error
|
|
732
|
+
if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(61)
|
|
733
|
+
raise ZuoraAPI::Exceptions::ZuoraAPITemporaryError.new("#{messages_array.join(', ')}", response)
|
|
734
|
+
end
|
|
735
|
+
|
|
740
736
|
#Request exceeded limit
|
|
741
737
|
if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(70)
|
|
742
738
|
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{messages_array.join(', ')}", response)
|
|
@@ -789,26 +785,56 @@ module ZuoraAPI
|
|
|
789
785
|
end
|
|
790
786
|
end
|
|
791
787
|
|
|
788
|
+
if body.class == Hash && body['message'].present?
|
|
789
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(body['message'], response) if response.code == 500
|
|
790
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(body['message'], response) if ![200,201].include?(response.code)
|
|
791
|
+
end
|
|
792
|
+
|
|
793
|
+
self.errors_via_content_type(response: response, type: :json)
|
|
794
|
+
|
|
792
795
|
#All other errors
|
|
793
|
-
if response.code
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
796
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(response.body, response) if ![200,201].include?(response.code)
|
|
797
|
+
end
|
|
798
|
+
end
|
|
799
|
+
|
|
800
|
+
def errors_via_content_type(response: nil, type: :xml)
|
|
801
|
+
response_content_types = response.headers.transform_keys(&:downcase).fetch('content-type', []).first || ""
|
|
802
|
+
|
|
803
|
+
if response_content_types.include?('application/json') && type != :json
|
|
804
|
+
output_json = JSON.parse(response.body)
|
|
805
|
+
self.raise_errors(type: :JSON, body: output_json, response: response)
|
|
806
|
+
|
|
807
|
+
elsif (response_content_types.include?('application/xml') || response_content_types.include?('text/xml')) and type != :xml
|
|
808
|
+
output_xml = Nokogiri::XML(response.body)
|
|
809
|
+
self.raise_errors(type: :SOAP, body: output_xml, response: response)
|
|
810
|
+
|
|
811
|
+
elsif response_content_types.include?('text/html')
|
|
812
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Akamai Error", response) if response.headers.fetch('server', '') == 'AkamaiGHost'
|
|
813
|
+
|
|
814
|
+
parse_body = Nokogiri::HTML(response.body)
|
|
815
|
+
error_title = parse_body.xpath('//h2').text
|
|
816
|
+
error_title = parse_body.xpath('//h1').text if error_title.blank?
|
|
817
|
+
error_message = parse_body.xpath('//p').text
|
|
818
|
+
|
|
819
|
+
error_message = error_title if error_message.blank?
|
|
820
|
+
|
|
821
|
+
if error_title.present?
|
|
822
|
+
case error_title
|
|
823
|
+
when /Service Unavailable/
|
|
824
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new(error_message, response)
|
|
825
|
+
when /Client sent a bad request./, /Bad Request/, /403 Forbidden/
|
|
826
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(error_message, response)
|
|
827
|
+
else
|
|
828
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(error_message, response)
|
|
808
829
|
end
|
|
809
830
|
end
|
|
831
|
+
|
|
832
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Http response body is missing", response) if response.body.blank?
|
|
810
833
|
end
|
|
834
|
+
|
|
835
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response) if response.code == 500
|
|
811
836
|
end
|
|
837
|
+
|
|
812
838
|
|
|
813
839
|
def get_soap_error_and_message(body)
|
|
814
840
|
error = body.xpath('//fns:FaultCode', 'fns' =>'http://fault.api.zuora.com/').text
|
|
@@ -872,9 +898,9 @@ module ZuoraAPI
|
|
|
872
898
|
when /.*UNEXPECTED_ERROR/
|
|
873
899
|
raise ZuoraAPI::Exceptions::ZuoraUnexpectedError.new(message, response, errors, success)
|
|
874
900
|
when /.*soapenv:Server.*/
|
|
875
|
-
if /^Invalid value.*for type.*|^Id is invalid
|
|
901
|
+
if /^Invalid value.*for type.*|^Id is invalid|^date string can not be less than 19 charactors$/.match(message).present?
|
|
876
902
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
|
|
877
|
-
elsif /^Invalid white space character \(.*\) in text to output$/.match(message).present?
|
|
903
|
+
elsif /^Invalid white space character \(.*\) in text to output$|^Invalid null character in text to output$/.match(message).present?
|
|
878
904
|
raise ZuoraAPI::Exceptions::ZuoraAPIUnkownError.new(message, response, errors, success)
|
|
879
905
|
end
|
|
880
906
|
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(message, response, errors, success)
|
|
@@ -1025,7 +1051,7 @@ module ZuoraAPI
|
|
|
1025
1051
|
modified_headers = {'Content-Type' => "application/json; charset=utf-8"}.merge(authentication_headers).merge(headers)
|
|
1026
1052
|
|
|
1027
1053
|
begin
|
|
1028
|
-
|
|
1054
|
+
request = HTTParty::Request.new(
|
|
1029
1055
|
"Net::HTTP::#{method.to_s.capitalize}".constantize,
|
|
1030
1056
|
url,
|
|
1031
1057
|
body: body,
|
|
@@ -1033,7 +1059,9 @@ module ZuoraAPI
|
|
|
1033
1059
|
timeout: timeout,
|
|
1034
1060
|
multipart: multipart,
|
|
1035
1061
|
stream_body: stream_body
|
|
1036
|
-
)
|
|
1062
|
+
)
|
|
1063
|
+
|
|
1064
|
+
response = request.perform(&block)
|
|
1037
1065
|
|
|
1038
1066
|
Rails.logger.debug("Response Code: #{response.code}") if debug
|
|
1039
1067
|
begin
|
|
@@ -1100,34 +1128,25 @@ module ZuoraAPI
|
|
|
1100
1128
|
sleep(timeout_sleep_interval)
|
|
1101
1129
|
retry
|
|
1102
1130
|
rescue *CONNECTION_READ_EXCEPTIONS => ex
|
|
1103
|
-
if tries.zero?
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1131
|
+
if !tries.zero?
|
|
1132
|
+
tries -= 1
|
|
1133
|
+
if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
|
|
1134
|
+
retry
|
|
1135
|
+
elsif timeout_retry
|
|
1136
|
+
sleep(timeout_sleep_interval)
|
|
1137
|
+
retry
|
|
1110
1138
|
end
|
|
1111
|
-
raise ex
|
|
1112
1139
|
end
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
sleep(timeout_sleep_interval)
|
|
1120
|
-
retry
|
|
1121
|
-
else
|
|
1122
|
-
if output_exception_messages
|
|
1123
|
-
if Rails.logger.class.to_s == "Ougai::Logger"
|
|
1124
|
-
Rails.logger.error("Rest Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
|
|
1125
|
-
else
|
|
1126
|
-
Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
|
|
1127
|
-
end
|
|
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")
|
|
1128
1146
|
end
|
|
1129
|
-
raise ex
|
|
1130
1147
|
end
|
|
1148
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}", nil, request) if ex.instance_of?(Net::ReadTimeout)
|
|
1149
|
+
raise ex
|
|
1131
1150
|
rescue => ex
|
|
1132
1151
|
raise ex
|
|
1133
1152
|
else
|
|
@@ -1183,6 +1202,8 @@ module ZuoraAPI
|
|
|
1183
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)
|
|
1184
1203
|
raise "file_path must be of class Pathname" if file_path.class != Pathname
|
|
1185
1204
|
|
|
1205
|
+
retry_count ||= timeout_retries
|
|
1206
|
+
|
|
1186
1207
|
#Make sure directory exists
|
|
1187
1208
|
require 'fileutils'
|
|
1188
1209
|
FileUtils.mkdir_p(file_path) unless File.exists?(file_path)
|
|
@@ -1200,7 +1221,6 @@ module ZuoraAPI
|
|
|
1200
1221
|
headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
|
|
1201
1222
|
|
|
1202
1223
|
response_save = nil
|
|
1203
|
-
retry_count ||= timeout_retries
|
|
1204
1224
|
http.request_get(uri.request_uri, headers) do |response|
|
|
1205
1225
|
response_save = response
|
|
1206
1226
|
status_code = response.code if response
|
|
@@ -1308,75 +1328,122 @@ module ZuoraAPI
|
|
|
1308
1328
|
end
|
|
1309
1329
|
end
|
|
1310
1330
|
|
|
1311
|
-
def getDataSourceExport(query, extract: true, encrypted: false, zip: true)
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1331
|
+
def getDataSourceExport(query, extract: true, encrypted: false, zip: true, 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
|
|
1317
1340
|
end
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
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
|
|
1327
1350
|
end
|
|
1328
1351
|
end
|
|
1329
1352
|
end
|
|
1330
1353
|
end
|
|
1331
|
-
end
|
|
1332
1354
|
|
|
1333
|
-
|
|
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)
|
|
1334
1356
|
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
id = output_xml.xpath('//ns1:Id', 'ns1' =>'http://api.zuora.com/').text
|
|
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"
|
|
1338
1359
|
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
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
|
|
1363
|
+
|
|
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
|
|
1344
1370
|
end
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
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
|
|
1349
1375
|
end
|
|
1350
1376
|
end
|
|
1351
1377
|
end
|
|
1352
|
-
|
|
1353
|
-
result = 'Waiting'
|
|
1378
|
+
result = 'Waiting'
|
|
1354
1379
|
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
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)
|
|
1358
1383
|
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
raise "Export Creation Unsuccessful : #{output_xml.xpath('//ns1:Message', 'ns1' =>'http://api.zuora.com/').text}" if result.blank? || result == "Failed"
|
|
1363
|
-
end
|
|
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
|
|
1364
1387
|
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
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
|
|
1391
|
+
|
|
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
|
|
1416
|
+
|
|
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
|
|
1425
|
+
|
|
1426
|
+
rescue *ZUORA_API_ERRORS => ex
|
|
1427
|
+
raise ex
|
|
1428
|
+
|
|
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
|
|
1437
|
+
|
|
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
|
|
1380
1447
|
end
|
|
1381
1448
|
end
|
|
1382
1449
|
|
|
@@ -46,34 +46,28 @@ module ZuoraAPI
|
|
|
46
46
|
Rails.logger.debug {"Session Invalid"}
|
|
47
47
|
self.new_session(auth_type: :bearer)
|
|
48
48
|
retry
|
|
49
|
-
else
|
|
50
|
-
if errors.include?(ex.class)
|
|
51
|
-
raise ex
|
|
52
|
-
else
|
|
53
|
-
return [output_json, response]
|
|
54
|
-
end
|
|
55
49
|
end
|
|
50
|
+
raise ex if errors.include?(ex.class)
|
|
51
|
+
return [output_json, response]
|
|
52
|
+
|
|
56
53
|
rescue ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
|
|
57
|
-
if errors.include?(ex.class)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return [output_json, response]
|
|
61
|
-
end
|
|
54
|
+
raise ex if errors.include?(ex.class)
|
|
55
|
+
return [output_json, response]
|
|
56
|
+
|
|
62
57
|
rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
|
|
63
58
|
if !tries.zero?
|
|
64
59
|
tries -= 1
|
|
65
60
|
sleep(self.timeout_sleep)
|
|
66
61
|
retry
|
|
62
|
+
end
|
|
63
|
+
if Rails.logger.class.to_s == "Ougai::Logger"
|
|
64
|
+
Rails.logger.error("OAuthLogin - Timed out", ex)
|
|
67
65
|
else
|
|
68
|
-
|
|
69
|
-
Rails.logger.error("OAuthLogin - Timed out", ex)
|
|
70
|
-
else
|
|
71
|
-
Rails.logger.error("OAuthLogin - #{ex.class} Timed out")
|
|
72
|
-
end
|
|
73
|
-
self.current_error = "Request timed out. Try again"
|
|
74
|
-
self.status = 'Timeout'
|
|
75
|
-
return self.status
|
|
66
|
+
Rails.logger.error("OAuthLogin - #{ex.class} Timed out")
|
|
76
67
|
end
|
|
68
|
+
self.current_error = "Request timed out. Try again"
|
|
69
|
+
self.status = 'Timeout'
|
|
70
|
+
return self.status
|
|
77
71
|
end
|
|
78
72
|
|
|
79
73
|
def get_bearer_token(zuora_track_id: nil)
|
data/lib/zuora_api/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: zuora_api
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.7.
|
|
4
|
+
version: 1.7.66
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Zuora Strategic Solutions Group
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
11
|
+
date: 2020-06-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|