+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
+
+ newobj = {object_type => {}}
+ if create_opts[:project_uuid]
+ newobj[object_type]["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 = Tempfile.new(["", ".#{global_opts[:format]}"])
+ tmp.write(content)
+ tmp.close
+
+ newobj = run_editor tmp, global_opts
+
+ begin
+ api_method = 'arvados.' + rsc + '.create'
+ dumped = Oj.dump(newobj)
+
+ result = client.execute(:api_method => eval(api_method),
+ :body_object => 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
+ 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
+ abort
+ end
+
+ begin
+ puts "Created object #{results['uuid']}"
+ rescue
+ arv_edit_save_tmp tmp
+ abort "Unexpected response:\n#{results}"
+ end
+ ensure
+ tmp.close(true)
+ end
+
+ exit 0
+end
+