end
end
-subcommands = %w(keep pipeline tag ws edit create)
+
+subcommands = %w(copy create edit keep pipeline run tag ws)
def check_subcommands client, arvados, subcommand, global_opts, remaining_opts
case subcommand
+ when 'create'
+ arv_create client, arvados, global_opts, remaining_opts
+ when 'edit'
+ arv_edit client, arvados, global_opts, remaining_opts
+ when 'copy', 'tag', 'ws', 'run'
+ exec `which arv-#{subcommand}`.strip, *remaining_opts
when 'keep'
@sub = remaining_opts.shift
if ['get', 'put', 'ls', 'normalize'].index @sub then
puts "Available methods: run"
end
abort
- when 'tag'
- exec `which arv-tag`.strip, *remaining_opts
- when 'ws'
- exec `which arv-ws`.strip, *remaining_opts
- when 'edit'
- arv_edit client, arvados, global_opts, remaining_opts
- when 'create'
- arv_create client, arvados, global_opts, remaining_opts
end
end
ENV['PATH'].split(':').each {|folder| File.executable?(File.join(folder, command))}
end
-def run_editor tmp, global_opts
+def run_editor tmp_file, global_opts
need_edit = true
while need_edit
pid = Process::fork
puts "Could not find any editor to use, please set $VISUAL or $EDITOR to your desired editor."
exit 1
end
- exec editor, tmp.path
+ exec editor, tmp_file.path
else
Process.wait pid
end
if $?.exitstatus == 0
- tmp.open
- newcontent = tmp.read()
+ tmp_file.open
+ newcontent = tmp_file.read()
newobj = {}
begin
yn = $stdin.read 1
end
if yn == 'n' or yn == 'N'
- arv_edit_save_tmp tmp
+ arv_edit_save_tmp tmp_file
abort
end
end
content = results.to_yaml
end
- tmp = Tempfile.new([uuid, "." + global_opts[:format]])
- tmp.write(content)
- tmp.close
+ tmp_file = Tempfile.new([uuid, "." + global_opts[:format]])
+ tmp_file.write(content)
+ tmp_file.close
- newobj = run_editor tmp, global_opts
+ newobj = run_editor tmp_file, global_opts
begin
if newobj != results
begin
result = client.execute(:api_method => eval(api_method),
:parameters => {"uuid" => uuid},
- :body => { rsc.singularize => dumped },
+ :body_object => { rsc.singularize => dumped },
:authenticated => false,
:headers => {
authorization: 'OAuth2 '+ENV['ARVADOS_API_TOKEN']
puts "Error communicating with server, error was #{e}"
puts "Update body was:"
puts dumped
- arv_edit_save_tmp tmp
+ arv_edit_save_tmp tmp_file
abort
end
begin
results = JSON.parse result.body
rescue JSON::ParserError => e
- arv_edit_save_tmp tmp
+ arv_edit_save_tmp tmp_file
abort "Failed to parse server response:\n" + e.to_s
end
puts "Update failed. Server responded #{result.response.status}: #{results['errors']} "
puts "Update body was:"
puts dumped
- arv_edit_save_tmp tmp
+ arv_edit_save_tmp tmp_file
abort
end
else
puts "Object is unchanged, did not update."
end
ensure
- tmp.close(true)
+ tmp_file.close(true)
end
exit 0
end
rsc = rsc.first
- newobj = {object_type => {}}
+ discovered_params = arvados.discovery_document["resources"][rsc]["methods"]["create"]["parameters"]
+ method_opts = Trollop::options do
+ banner head_banner
+ banner "Usage: arv create [--project-uuid] #{object_type} [create parameters]"
+ banner ""
+ banner "This method supports the following parameters:"
+ banner ""
+ discovered_params.each do |k,v|
+ opts = Hash.new()
+ opts[:type] = v["type"].to_sym if v.include?("type")
+ if [:datetime, :text, :object, :array].index opts[:type]
+ opts[:type] = :string # else trollop bork
+ end
+ opts[:default] = v["default"] if v.include?("default")
+ opts[:default] = v["default"].to_i if opts[:type] == :integer
+ opts[:default] = to_boolean(v["default"]) if opts[:type] == :boolean
+ opts[:required] = true if v.include?("required") and v["required"]
+ description = ''
+ description = ' ' + v["description"] if v.include?("description")
+ opt k.to_sym, description, opts
+ end
+ end
+
+
+ newobj = {}
if create_opts[:project_uuid]
- newobj[object_type]["owner_uuid"] = create_opts[:project_uuid]
+ newobj["owner_uuid"] = create_opts[:project_uuid]
end
case global_opts[:format]
content = newobj.to_yaml
end
- tmp = Tempfile.new(["", ".#{global_opts[:format]}"])
- tmp.write(content)
- tmp.close
+ tmp_file = Tempfile.new(["", ".#{global_opts[:format]}"])
+ tmp_file.write(content)
+ tmp_file.close
- newobj = run_editor tmp, global_opts
+ newobj = run_editor tmp_file, global_opts
begin
api_method = 'arvados.' + rsc + '.create'
dumped = Oj.dump(newobj)
result = client.execute(:api_method => eval(api_method),
- :body_object => newobj,
+ :parameters => method_opts,
+ :body_object => {object_type => newobj},
:authenticated => false,
:headers => {
authorization: 'OAuth2 '+ENV['ARVADOS_API_TOKEN']
begin
results = JSON.parse result.body
rescue JSON::ParserError => e
- arv_edit_save_tmp tmp
+ arv_edit_save_tmp tmp_file
abort "Failed to parse server response:\n" + e.to_s
end
puts "Create failed. Server responded #{result.response.status}: #{results['errors']} "
puts "Create body was:"
puts dumped
- arv_edit_save_tmp tmp
+ arv_edit_save_tmp tmp_file
abort
end
begin
puts "Created object #{results['uuid']}"
rescue
- arv_edit_save_tmp tmp
+ arv_edit_save_tmp tmp_file
abort "Unexpected response:\n#{results}"
end
ensure
- tmp.close(true)
+ tmp_file.close(true)
end
exit 0
else
result = client.execute(:api_method => eval(api_method),
:parameters => request_parameters,
- :body => request_body,
+ :body_object => request_body,
:authenticated => false,
:headers => {
authorization: 'OAuth2 '+ENV['ARVADOS_API_TOKEN']