Skip to content

Commit

Permalink
refs yeti-switch#362, removing cdrs exports
Browse files Browse the repository at this point in the history
  • Loading branch information
gigorok committed Sep 5, 2018
1 parent 5996940 commit fbc9114
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 1 deletion.
8 changes: 8 additions & 0 deletions app/admin/cdr/cdr_exports.rb
Expand Up @@ -8,13 +8,15 @@

action_item(:download, only: [:show]) do
link_to 'Download', { action: :download } if resource.completed?
link_to 'Delete', { action: :delete } if resource.completed?
end

index do
selectable_column
id_column
column :download do |row|
link_to 'download', { action: :download, id: row.id } if row.completed?
link_to 'delete', { action: :delete, id: row.id } if row.completed?
end
column :status
column :rows_count
Expand All @@ -34,6 +36,12 @@
render body: nil
end

member_action :delete, method: :delete do
Worker::RemoveCdrsExportFileJob.perform_later(resource.id)
flash[:notice] = 'The file will be deleted in async way!'
redirect_back fallback_location: admin_root_path
end

controller do
def build_new_resource
build_params = resource_params[0].to_h
Expand Down
36 changes: 36 additions & 0 deletions app/jobs/worker/remove_cdr_export_file_job.rb
@@ -0,0 +1,36 @@
require 'net/http'

module Worker
class RemoveCdrExportFileJob < ActiveJob::Base
class TryAgainError < RuntimeError
end

queue_as 'cdr_export'

def perform(cdr_export_id)
cdr_export = CdrExport.find(cdr_export_id)
raise 'status should be completed' unless cdr_export.completed?
url = URI.parse(delete_url(cdr_export))
req = Net::HTTP::Delete.new(url.to_s)
res = Net::HTTP.start(
url.host,
url.port,
use_ssl: url.scheme == 'https',
verify_mode: OpenSSL::SSL::VERIFY_NONE
) do |http|
http.request(req)
end
raise TryAgainError if (res.code.to_i != 200) && (res.code.to_i != 404)
cdr_export.update!(status: CdrExport::STATUS_DELETED)
end

private

def delete_url(cdr_export)
[
Rails.configuration.yeti_web.fetch('cdr_export').fetch('delete_url').chomp('/'),
"#{cdr_export.id}.csv"
].join('/')
end
end
end
4 changes: 3 additions & 1 deletion app/models/cdr_export.rb
Expand Up @@ -20,10 +20,12 @@ class CdrExport < Yeti::ActiveRecord
STATUS_PENDING = 'Pending'.freeze
STATUS_COMPLETED = 'Completed'.freeze
STATUS_FAILED = 'Failed'.freeze
STATUS_DELETED = 'Deleted'.freeze
STATUSES = [
STATUS_PENDING,
STATUS_COMPLETED,
STATUS_FAILED
STATUS_FAILED,
STATUS_DELETED
].freeze

#need for activeadmin form
Expand Down
1 change: 1 addition & 0 deletions config/yeti_web.yml.distr
Expand Up @@ -4,3 +4,4 @@ api:
token_lifetime: 600 # jwt token lifetime in seconds, empty string means permanent tokens
cdr_export:
dir_path: "/tmp"
delete_url: http://localhost/cdrs_export/
83 changes: 83 additions & 0 deletions spec/jobs/worker/remove_cdr_export_file_job_spec.rb
@@ -0,0 +1,83 @@
require 'spec_helper'

RSpec.describe Worker::RemoveCdrExportFileJob, type: :job do
subject do
described_class.perform_now(cdr_export.id)
end

let(:cdr_export) do
FactoryGirl.create(:cdr_export, status: status)
end

let(:delete_url) do
[
Rails.configuration.yeti_web.fetch('cdr_export').fetch('delete_url').chomp('/'),
"#{cdr_export.id}.csv"
].join('/')
end

context 'when status completed' do
let(:status) do
CdrExport::STATUS_COMPLETED
end

let!(:http_mock) do
stub_request(:delete, delete_url).to_return(status: http_code)
end

shared_examples :valid_deleting do
it 'http mock should be requested' do
subject
expect(http_mock).to have_been_requested.once
end

it 'nothing should be raised' do
expect { subject }.not_to raise_error
end

it 'status should be changed to Deleted' do
expect { subject }.to change { cdr_export.reload.status }.from(CdrExport::STATUS_COMPLETED).to(CdrExport::STATUS_DELETED)
end
end

context 'when http code 200' do
let(:http_code) do
200
end

include_examples :valid_deleting
end

context 'when http code 404' do
let(:http_code) do
404
end

include_examples :valid_deleting
end

context 'when http code 400' do
let(:http_code) do
400
end

it 'status should not be changed' do
expect { subject rescue nil }.not_to change { cdr_export.reload.status }
end

it 'TryAgainError should be raised' do
expect { subject }.to raise_error(Worker::RemoveCdrExportFileJob::TryAgainError)
end
end
end

context 'when status pending' do
let(:status) do
CdrExport::STATUS_PENDING
end

it 'should raise error' do
expect { subject }.to raise_error(StandardError, 'status should be completed')
end
end
end

0 comments on commit fbc9114

Please sign in to comment.