Class: Aspera::Faspex4GWServlet

Inherits:
WEBrick::HTTPServlet::AbstractServlet
  • Object
show all
Defined in:
lib/aspera/faspex_gw.rb

Overview

Simulate the Faspex 4 /send API and creates a package on Aspera on Cloud or Faspex 5

Constant Summary collapse

AOC_API =
'Aspera::Api::AoC'
FX_API =
'Aspera::Api::Faspex'

Instance Method Summary collapse

Constructor Details

#initialize(server, app_api, app_context) ⇒ Faspex4GWServlet

Returns a new instance of Faspex4GWServlet.

Parameters:

  • app_api (Rest)

    API object

  • app_context (String)

    workspace id (aoc only)



15
16
17
18
19
20
# File 'lib/aspera/faspex_gw.rb', line 15

def initialize(server, app_api, app_context)
  Aspera.assert_values(app_api.class.name, [AOC_API, FX_API])
  super(server)
  @app_api = app_api
  @app_context = app_context
end

Instance Method Details

#do_POST(request, response) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/aspera/faspex_gw.rb', line 67

def do_POST(request, response)
  case request.path
  when '/aspera/faspex/send'
    begin
      Aspera.assert(!request.body.nil?){'payload missing'}
      faspex_pkg_parameters = JSON.parse(request.body)
      Log.log.debug{"faspex pkg create parameters=#{faspex_pkg_parameters}"}
      # compare string, as class is not yet known here
      faspex_package_create_result =
        case @app_api.class.name
        when AOC_API
          faspex4_send_to_aoc(faspex_pkg_parameters)
        when FX_API
          faspex4_send_to_faspex5(faspex_pkg_parameters)
        else Aspera.error_unexpected_value(@app_api.class.name)
        end
      Log.log.info{"faspex_package_create_result=#{faspex_package_create_result}"}
      response.status = 200
      response.content_type = Rest::MIME_JSON
      response.body = JSON.generate(faspex_package_create_result)
    rescue => e
      response.status = 500
      response['Content-Type'] = Rest::MIME_JSON
      response.body = {error: e.message, stacktrace: e.backtrace}.to_json
      Log.log.error(e.message)
      Log.log.debug{e.backtrace.join("\n")}
    end
  else
    response.status = 400
    response['Content-Type'] = Rest::MIME_JSON
    response.body = {error: 'Unsupported endpoint'}.to_json
  end
end

#faspex4_send_to_aoc(faspex_pkg_parameters) ⇒ Object

Map Faspex 4 /send API to AoC package create parameters from user to Faspex API call developer.ibm.com/apis/catalog/aspera–aspera-faspex-client-sdk/Sending%20Packages%20(API%20v.3)



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/aspera/faspex_gw.rb', line 25

def faspex4_send_to_aoc(faspex_pkg_parameters)
  faspex_pkg_delivery = faspex_pkg_parameters['delivery']
  package_data = {
    # 'file_names'   => faspex_pkg_delivery['sources'][0]['paths'],
    'name'         => faspex_pkg_delivery['title'],
    'note'         => faspex_pkg_delivery['note'],
    'recipients'   => faspex_pkg_delivery['recipients'],
    'workspace_id' => @app_context
  }
  created_package = @app_api.create_package_simple(package_data, true, nil)
  # but we place it in a Faspex package creation response
  return {
    'links'         => {'status' => 'unused'},
    'xfer_sessions' => [created_package[:spec]]
  }
end

#faspex4_send_to_faspex5(faspex_pkg_parameters) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/aspera/faspex_gw.rb', line 42

def faspex4_send_to_faspex5(faspex_pkg_parameters)
  faspex_pkg_delivery = faspex_pkg_parameters['delivery']
  package_data = {
    'title'      => faspex_pkg_delivery['title'],
    'note'       => faspex_pkg_delivery['note'],
    'recipients' => faspex_pkg_delivery['recipients'].map{ |name| {'name'=>name}}
  }
  package = @app_api.create('packages', package_data)
  # TODO: option to send from remote source or httpgw
  transfer_spec = @app_api.call(
    operation:    'POST',
    subpath:      "packages/#{package['id']}/transfer_spec/upload",
    query:        {transfer_type: Api::Faspex::TRANSFER_CONNECT},
    content_type: Rest::MIME_JSON,
    body:         {paths: [{'destination'=>'/'}]},
    headers:      {'Accept' => Rest::MIME_JSON}
  )[:data]
  transfer_spec.delete('authentication')
  # but we place it in a Faspex package creation response
  return {
    'links'         => {'status' => 'unused'},
    'xfer_sessions' => [transfer_spec]
  }
end