class Tesults
Public Class Methods
create_s3_client(credentials)
click to toggle source
# File lib/tesults.rb, line 13 def self.create_s3_client(credentials) s3_client = Aws::S3::Client.new( region: 'us-east-1', access_key_id: credentials['AccessKeyId'], secret_access_key: credentials['SecretAccessKey'], session_token: credentials['SessionToken'] ) Aws::S3::Resource.new(client: s3_client) end
files_in_test_cases(data)
click to toggle source
# File lib/tesults.rb, line 136 def self.files_in_test_cases(data) results = data[:results] cases = results[:cases] files = [] num = 0 cases.each do |c| c_files = c[:files] if c_files == nil next else c_files.each do |f| files.push({:num => num, :file => f}) end end num += 1 end return files end
files_upload(files, keyPrefix, auth, target)
click to toggle source
# File lib/tesults.rb, line 75 def self.files_upload(files, keyPrefix, auth, target) expiration_string = auth['Expiration'] expiration = expiration_string.to_i max_active_uploads = 10 # Upload at most 10 files simultaneously to avoid hogging the client machine. while files.length != 0 || @@uploading.length != 0 do begin if @@uploading.length < max_active_uploads && files.length != 0 # Check if new credentials required. now = Time.now.to_i if now + @@expire_buffer > expiration # Check within 30 seconds of expiry. # Refresh credentials. if @@uploading.length == 0 # Wait for all current transfers to complete so we can set a new s3 client. response = refresh_credentials(target, keyPrefix) if response[:success] != true # Must stop upload due to failure to be permitted for new credentials. @@warnings.push(response[:message]) break else upload = response[:upload] key = upload['key'] upload_message = upload['message'] permit = upload['permit'] auth = upload['auth'] if permit != true # Must stop upload due to failure to be permitted for new credentials. @@warnings.push(upload_message) break else # Upload permitted. expiration_string = auth['Expiration'] expiration = expiration_string.to_i end end end end if now + @@expire_buffer < expiration # Load new file for upload. f = files.shift if File.file?(f[:file]) fname = File.basename f[:file] key = keyPrefix + '/' + f[:num].to_s + '/' + fname @@uploading.push(f[:file]) transfer(f[:file], File.size(f[:file]), key, auth) else @@warnings.push('File not found: ' + f[:file]) end end end # Check if existing upload complete - handled by each transfer. rescue => e @@warnings.push(e.message) end end return {:message => '. ' + @@files_uploaded.to_s + ' files uploaded. ' + @@bytes_uploaded.to_s + ' bytes uploaded.', :warnings => @@warnings} end
refresh_credentials(target, key)
click to toggle source
# File lib/tesults.rb, line 23 def self.refresh_credentials(target, key) data = {:target => target, :key => key} uri = URI("https://www.tesults.com/permitupload") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true req = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json') req.body = data.to_json res = http.request(req) jsonData = JSON.parse(res.body) success = false message = "" upload = nil if jsonData['error'] == nil success = true d = jsonData['data'] message = d['message'] upload = d['upload'] else success = false err = jsonData['error'] message = err['message'] end val = {:success => success, :message => message, :upload => upload} rescue => e return {:success => false, :message => e.message, :upload => nil} end
transfer(file, bytes, key, auth)
click to toggle source
# File lib/tesults.rb, line 51 def self.transfer(file, bytes, key, auth) Thread.new { s3 = create_s3_client(auth) increment = 1 bytes_increment = bytes begin result = s3.bucket('tesults-results').object(key).upload_file(file) rescue # upload failed increment = 0 bytes_increment = 0 ensure if result != true increment = 0 bytes_increment = 0 end @@files_uploaded += increment @@bytes_uploaded += bytes_increment @@uploading.delete_at @@uploading.index file end } end
upload(data)
click to toggle source
# File lib/tesults.rb, line 155 def self.upload(data) begin uri = URI("https://www.tesults.com/results") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true req = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json') req.body = data.to_json res = http.request(req) jsonData = JSON.parse(res.body) success = false message = "" if jsonData['error'] == nil success = true d = jsonData['data'] message = d['message'] upload = d['upload'] if upload == nil # No files to upload, complete. val = {:success => success, :message => message, :warnings => [], :errors => []} else # Upload files. target = data[:target] files = files_in_test_cases(data) key = upload['key'] upload_message = upload['message'] permit = upload['permit'] auth = upload['auth'] if permit != true val = {:success => success, :message => message, :warnings => [uploadMessage], :errors => []} else # Upload required and permitted. begin file_upload_return = files_upload(files, key, auth, target) # This can take a while upload_message = file_upload_return[:message] rescue => e @@warnings.push(e.message) upload_message = '. View warnings.' ensure return {:success => success, :message => "Success" + upload_message.to_s, :warnings => @@warnings, :errors => []} end end end else success = false error = jsonData['error'] message = error['message'] return {:success => success, :message => message, :warnings => [], :errors => [message]} end rescue => e return {:success => false, :message => e.message, :warnings=> [], :errors => [e.message]} end end