+ tmp_file.close(true)
+ end
+
+ exit 0
+end
+
+def arv_create client, arvados, global_opts, remaining_opts
+ types = resource_types(arvados.discovery_document)
+ create_opts = Trollop::options do
+ opt :project_uuid, "Project uuid in which to create the object", :type => :string
+ stop_on resource_types(arvados.discovery_document)
+ end
+
+ object_type = remaining_opts.shift
+ if object_type.nil?
+ abort "Missing resource type, must be one of #{types.join ', '}"
+ end
+
+ rsc = arvados.discovery_document["resources"].keys.select { |k| object_type == k.singularize }
+ if rsc.empty?
+ abort "Could not determine resource type #{object_type}"
+ end
+ rsc = rsc.first
+
+ 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["owner_uuid"] = create_opts[:project_uuid]
+ end
+
+ case global_opts[:format]
+ when 'json'
+ content = Oj.dump(newobj, :indent => 1)
+ when 'yaml'
+ content = newobj.to_yaml
+ end
+
+ tmp_file = Tempfile.new(["", ".#{global_opts[:format]}"])
+ tmp_file.write(content)
+ tmp_file.close
+
+ 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),
+ :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_file
+ abort "Failed to parse server response:\n" + e.to_s
+ end
+
+ if result.response.status != 200
+ puts "Create failed. Server responded #{result.response.status}: #{results['errors']} "
+ puts "Create body was:"
+ puts dumped
+ arv_edit_save_tmp tmp_file
+ abort
+ end
+
+ begin
+ puts "Created object #{results['uuid']}"
+ rescue
+ arv_edit_save_tmp tmp_file
+ abort "Unexpected response:\n#{results}"
+ end
+ ensure
+ tmp_file.close(true)