Class: Aspera::Cli::Plugins::Ats

Inherits:
Base
  • Object
show all
Defined in:
lib/aspera/cli/plugins/ats.rb

Overview

Constant Summary

Constants inherited from Base

Base::FILTER_ARGS

Instance Attribute Summary

Attributes inherited from Base

#context, #help_path

Instance Method Summary collapse

Methods inherited from Base

#action_for, #add_manual_header, application_name, #bulk_result, command, command_registry, commands_under, #config, crud_commands, declare_options, define_action_method, #dispatch_child, #dispatch_from_registry, #dispatch_leaf, #entity_create, #entity_delete, entity_display_name, #entity_list, #entity_modify, #entity_res_path, #entity_show, #execute_action, #execute_leaf, file_matcher, #formatter, #generate_help, #http_config, #invoke_action, option, #options, #persistency, #presets, #progress_bar, #query_read_delete, #resolve_argument, root_setup, #transfer, use_options, used_option_sources

Constructor Details

#initialize(api: nil, **base_args) ⇒ Ats

Returns a new instance of Ats.



32
33
34
35
36
37
# File 'lib/aspera/cli/plugins/ats.rb', line 32

def initialize(api: nil, **base_args)
  super(**base_args)
  @ats_api_open = Api::Ats.new
  @ats_api_auth = api
  options.parse_options!
end

Instance Method Details

#action_access_key_cluster(access_key_id:) ⇒ Object



253
254
255
256
257
258
259
260
261
262
263
264
# File 'lib/aspera/cli/plugins/ats.rb', line 253

def action_access_key_cluster(access_key_id:, **)
  ats_url = ats_api.base_url
  api_ak_auth = Rest.new(
    base_url: ats_url,
    auth:     {
      type:     :basic,
      username: access_key_id,
      password: context.secret_finder.lookup(url: ats_url, username: access_key_id)
    }
  )
  return Result::SingleObject.new(api_ak_auth.read('servers'))
end

#action_access_key_create(params: {}) ⇒ Object



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/aspera/cli/plugins/ats.rb', line 158

def action_access_key_create(params: {}, **)
  server_data = nil
  # if transfer_server_id not provided, get it from command line options
  if !params.key?('transfer_server_id')
    server_data = server_by_cloud_region
    params['transfer_server_id'] = server_data['id']
  end
  Log.log.debug { "using params: #{params}".bg_red.gray }
  if params.key?('storage')
    case params['storage']['type']
    # here we need somehow to map storage type to field to get for auth end point
    when 'ibm-s3'
      server_data2 = nil
      if server_data.nil?
        server_data2 = @ats_api_open.all_servers.find { |s| s['id'].eql?(params['transfer_server_id']) }
        raise "no such transfer server id: #{params['transfer_server_id']}" if server_data2.nil?
      else
        server_data2 = @ats_api_open.all_servers.find do |s|
          s['cloud'].eql?(server_data['cloud']) &&
            s['region'].eql?(server_data['region']) &&
            s.key?('s3_authentication_endpoint')
        end
        raise "no such transfer server id: #{params['transfer_server_id']}" if server_data2.nil?
        # specific one do not have s3 end point in id
        params['transfer_server_id'] = server_data2['id']
      end
      params['storage']['endpoint'] = server_data2['s3_authentication_endpoint'] if !params['storage'].key?('authentication_endpoint')
    end
  end
  res = ats_api.create('access_keys', params)
  return Result::SingleObject.new(res)
  # TODO : action : modify, with "PUT"
end

#action_access_key_delete(access_key_id:) ⇒ Object



198
199
200
201
# File 'lib/aspera/cli/plugins/ats.rb', line 198

def action_access_key_delete(access_key_id:, **)
  ats_api.delete("access_keys/#{access_key_id}")
  Result::Status.new("deleted #{access_key_id}")
end

#action_access_key_entitlement(access_key_id:) ⇒ Object



203
204
205
206
207
# File 'lib/aspera/cli/plugins/ats.rb', line 203

def action_access_key_entitlement(access_key_id:, **)
  ak = ats_api.read("access_keys/#{access_key_id}")
  api_bss = Api::Alee.new(ak['license']['entitlement_id'], ak['license']['customer_id'])
  return Result::SingleObject.new(api_bss.read('entitlement'))
end

#action_access_key_modify(params:, access_key_id:) ⇒ Object



192
193
194
195
196
# File 'lib/aspera/cli/plugins/ats.rb', line 192

def action_access_key_modify(params:, access_key_id:, **)
  params['id'] = access_key_id
  ats_api.update("access_keys/#{access_key_id}", params)
  return Result::Status.new('modified')
end

#action_api_key_delete(api_key_id:) ⇒ Object



248
249
250
251
# File 'lib/aspera/cli/plugins/ats.rb', line 248

def action_api_key_delete(api_key_id:, **)
  build_ats_ibm_api_with_instance.delete("api_keys/#{api_key_id}")
  Result::Status.new("deleted #{api_key_id}")
end

#action_api_key_instancesObject



242
243
244
245
246
# File 'lib/aspera/cli/plugins/ats.rb', line 242

def action_api_key_instances
  instances = ats_api_v2_auth_ibm.read('instances')
  Log.log.warn { "more instances remaining: #{instances['remaining']}" } unless instances['remaining'].to_i.eql?(0)
  Result::ValueList.new(instances['data'], name: 'instance')
end

#action_cluster_showObject



147
148
149
150
151
152
153
154
155
156
# File 'lib/aspera/cli/plugins/ats.rb', line 147

def action_cluster_show
  if options.get_option(:cloud) || options.get_option(:region)
    server_data = server_by_cloud_region
  else
    server_id = options.instance_identifier
    server_data = @ats_api_open.all_servers.find { |i| i['id'].eql?(server_id) }
    raise BadIdentifier.new('server', server_id) if server_data.nil?
  end
  Result::SingleObject.new(server_data)
end

#api_key_available?Boolean

api_key sub-tree is only available when authenticated via ATS key (not injected API)

Returns:

  • (Boolean)


103
104
105
# File 'lib/aspera/cli/plugins/ats.rb', line 103

def api_key_available?
  @ats_api_auth.nil?
end

#ats_apiObject

require api key only if needed



117
118
119
120
121
122
123
124
125
126
127
# File 'lib/aspera/cli/plugins/ats.rb', line 117

def ats_api
  return @ats_api_auth unless @ats_api_auth.nil?
  @ats_api_auth = Rest.new(
    base_url: "#{Api::Ats::SERVICE_BASE_URL}/pub/v1",
    auth:     {
      type:     :basic,
      username: options.get_option(:ats_key, mandatory: true),
      password: options.get_option(:ats_secret, mandatory: true)
    }
  )
end

#ats_api_v2_auth_ibm(rest_add_headers = {}) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/aspera/cli/plugins/ats.rb', line 129

def ats_api_v2_auth_ibm(rest_add_headers = {})
  return Rest.new(
    base_url: "#{Api::Ats::SERVICE_BASE_URL}/v2",
    headers:  rest_add_headers,
    auth:     {
      type:          :oauth2,
      grant_method:  :generic,
      base_url:      'https://iam.bluemix.net/identity',
      # does not work:  base_url:    'https://iam.cloud.ibm.com/identity',
      grant_type:    'urn:ibm:params:oauth:grant-type:apikey',
      response_type: 'cloud_iam',
      params:        {
        apikey: options.get_option(:ibm_api_key, mandatory: true)
      }
    }
  )
end

#server_by_cloud_regionObject

--- helpers ---



109
110
111
112
113
114
# File 'lib/aspera/cli/plugins/ats.rb', line 109

def server_by_cloud_region
  # TODO: provide list ?
  cloud = options.get_option(:cloud, mandatory: true).upcase
  region = options.get_option(:region, mandatory: true)
  return @ats_api_open.read("servers/#{cloud}/#{region}")
end

#setup_ak_node(access_key_id:) ⇒ Hash

Build the Node plugin for an ATS access key. access_key_id: is already in ctx via arguments: on the :node command.

Returns:

  • (Hash)

    context hash containing :ak_node_plugin and :ak_root_file_id



212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/aspera/cli/plugins/ats.rb', line 212

def setup_ak_node(access_key_id:, **)
  ak_data = ats_api.read("access_keys/#{access_key_id}")
  server_data = @ats_api_open.all_servers.find { |i| i['id'].start_with?(ak_data['transfer_server_id']) }
  Aspera.assert(!server_data.nil?, type: Cli::Error) { 'no such server found' }
  node_url = server_data['transfer_setup_url']
  api_node = Api::Node.new(
    base_url: node_url,
    auth:     {
      type:     :basic,
      username: access_key_id,
      password: context.secret_finder.lookup(url: node_url, username: access_key_id)
    }
  )
  {
    ak_node_plugin:  Node.new(context: context, api: api_node),
    ak_root_file_id: ak_data['root_file_id']
  }
end