Merge branch 'master' into wtsi-hgi-feature/arv-view
authorTom Clegg <tom@curoverse.com>
Thu, 15 Oct 2015 13:18:43 +0000 (09:18 -0400)
committerTom Clegg <tom@curoverse.com>
Thu, 15 Oct 2015 13:18:43 +0000 (09:18 -0400)
Conflicts:
sdk/cli/bin/arv

1  2 
doc/sdk/cli/subcommands.html.textile.liquid
sdk/cli/bin/arv

index 80ed56a22d5ac24514cb978b74491bf22341cc82,aa7af94d5f9d4ac8527e7d3e238e15d19f177905..d2add52a325c09f2529aa32d14a4290026e39ada
@@@ -21,28 -21,6 +21,28 @@@ Options
  </pre>
  </notextile>
  
 +h3(#arv-get). arv get
 +
 +@arv get@ can be used to get a textual representation of Arvados objects from the command line. The output can be limited to a subset of the object's fields. This command can be used with only the knowledge of an object's UUID.
 +
 +<notextile>
 +<pre>
 +$ <code class="userinput">arv arv get --help</code>
 +Usage: arv get [uuid] [fields...]
 +Fetch the specified Arvados object, select the specified fields,
 +and print a text representation (json or yaml, use --format).
 +</pre>
 +</notextile>
 +*Note*: the 'format' flag is used by @arv@ (not @arv get@), as detailed on the "arv CLI overview page":{{site.baseurl}}/sdk/cli/index.html.
 +
 +This command can be used instead of the previously required:
 +
 +<notextile>
 +<pre>
 +$ <code class="userinput">EDITOR=cat arv edit [uuid]</code>
 +</pre>
 +</notextile>
 +
  h3(#arv-edit). arv edit
  
  @arv edit@ can be used to edit Arvados objects from the command line. Arv edit opens up the editor of your choice (set the EDITOR environment variable) with the json or yaml description of the object. Saving the file will update the Arvados object on the API server, if it passes validation.
@@@ -67,11 -45,11 +67,11 @@@ h3(#arv-copy). arv cop
  <notextile>
  <pre>
  $ <code class="userinput">arv copy --help</code>
- usage: arv-copy [-h] [-v] [--progress] [--no-progress] [-f] --src
-                 SOURCE_ARVADOS --dst DESTINATION_ARVADOS [--recursive]
-                 [--no-recursive] [--dst-git-repo DST_GIT_REPO]
-                 [--project-uuid PROJECT_UUID] [--retries RETRIES]
-                 object_uuid
+ usage: arv_copy.py [-h] [-v] [--progress] [--no-progress] [-f] --src
+                    SOURCE_ARVADOS --dst DESTINATION_ARVADOS [--recursive]
+                    [--no-recursive] [--dst-git-repo DST_GIT_REPO]
+                    [--project-uuid PROJECT_UUID] [--retries RETRIES]
+                    object_uuid
  
  Copy a pipeline instance, template or collection from one Arvados instance to
  another.
@@@ -86,15 -64,15 +86,15 @@@ optional arguments
    --no-progress         Do not report progress on copying collections.
    -f, --force           Perform copy even if the object appears to exist at
                          the remote destination.
-   --src SOURCE_ARVADOS  The name of the source Arvados instance (required).
-                         May be either a pathname to a config file, or the
-                         basename of a file in
-                         $HOME/.config/arvados/instance_name.conf.
+   --src SOURCE_ARVADOS  The name of the source Arvados instance (required) -
+                         points at an Arvados config file. May be either a
+                         pathname to a config file, or (for example) "foo" as
+                         shorthand for $HOME/.config/arvados/foo.conf.
    --dst DESTINATION_ARVADOS
                          The name of the destination Arvados instance
-                         (required). May be either a pathname to a config file,
-                         or the basename of a file in
-                         $HOME/.config/arvados/instance_name.conf.
+                         (required) - points at an Arvados config file. May be
+                         either a pathname to a config file, or (for example)
+                         "foo" as shorthand for $HOME/.config/arvados/foo.conf.
    --recursive           Recursively copy any dependencies for this object.
                          (default)
    --no-recursive        Do not copy any dependencies. NOTE: if this option is
@@@ -179,7 -157,7 +179,7 @@@ $ <code class="userinput">arv keep --he
  Usage: arv keep [method] [--parameters]
  Use 'arv keep [method] --help' to get more information about specific methods.
  
- Available methods: ls, get, put, less, check, docker
+ Available methods: ls, get, put, docker
  </pre>
  </notextile>
  
diff --combined sdk/cli/bin/arv
index ccdd8a8c12bc077295f336be97c1f96d30cbfb3a,2bd7f4ef465d7a3427425716c11f9e3574d9f226..c626174fbe0e2001945b255709197cc233b61951
@@@ -85,15 -85,7 +85,15 @@@ def init_confi
  end
  
  
 -subcommands = %w(copy create edit keep pipeline run tag ws)
 +subcommands = %w(copy create edit get keep pipeline run tag ws)
 +
 +def exec_bin bin, opts
 +  bin_path = `which #{bin}`.strip
 +  if bin_path.empty?
 +    raise "#{bin}: command not found"
 +  end
 +  exec bin_path, *opts
 +end
  
  def check_subcommands client, arvados, subcommand, global_opts, remaining_opts
    case subcommand
      arv_create client, arvados, global_opts, remaining_opts
    when 'edit'
      arv_edit client, arvados, global_opts, remaining_opts
 +  when 'get'
 +    arv_get client, arvados, global_opts, remaining_opts
    when 'copy', 'tag', 'ws', 'run'
 -    exec `which arv-#{subcommand}`.strip, *remaining_opts
 +    exec_bin "arv-#{subcommand}", remaining_opts
    when 'keep'
      @sub = remaining_opts.shift
      if ['get', 'put', 'ls', 'normalize'].index @sub then
        # Native Arvados
 -      exec `which arv-#{@sub}`.strip, *remaining_opts
 +      exec_bin "arv-#{@sub}", remaining_opts
-     elsif ['less', 'check'].index @sub then
-       # wh* shims
-       exec_bin "wh#{@sub}", remaining_opts
      elsif @sub == 'docker'
 -      exec `which arv-keepdocker`.strip, *remaining_opts
 +      exec_bin "arv-keepdocker", remaining_opts
      else
        puts "Usage: arv keep [method] [--parameters]\n"
        puts "Use 'arv keep [method] --help' to get more information about specific methods.\n\n"
-       puts "Available methods: ls, get, put, less, check, docker"
+       puts "Available methods: ls, get, put, docker"
      end
      abort
    when 'pipeline'
      sub = remaining_opts.shift
      if sub == 'run'
 -      exec `which arv-run-pipeline-instance`.strip, *remaining_opts
 +      exec_bin "arv-run-pipeline-instance", remaining_opts
      else
        puts "Usage: arv pipeline [method] [--parameters]\n"
        puts "Use 'arv pipeline [method] --help' to get more information about specific methods.\n\n"
@@@ -160,7 -147,14 +157,7 @@@ en
  
  def edit_and_commit_object initial_obj, tmp_stem, global_opts, &block
  
 -  content = case global_opts[:format]
 -            when 'json'
 -              Oj.dump(initial_obj, :indent => 1)
 -            when 'yaml'
 -              initial_obj.to_yaml
 -            else
 -              abort "Unrecognized format #{global_opts[:format]}"
 -            end
 +  content = get_obj_content initial_obj, global_opts
  
    tmp_file = Tempfile.new([tmp_stem, ".#{global_opts[:format]}"])
    tmp_file.write(content)
                     Oj.load(newcontent)
                   when 'yaml'
                     YAML.load(newcontent)
 +                 else
 +                   abort "Unrecognized format #{global_opts[:format]}"
                   end
  
          yield newobj
@@@ -251,7 -243,20 +248,7 @@@ def check_response resul
    results
  end
  
 -def arv_edit client, arvados, global_opts, remaining_opts
 -  uuid = remaining_opts.shift
 -  if uuid.nil? or uuid == "-h" or uuid == "--help"
 -    puts head_banner
 -    puts "Usage: arv edit [uuid] [fields...]\n\n"
 -    puts "Fetch the specified Arvados object, select the specified fields, \n"
 -    puts "open an interactive text editor on a text representation (json or\n"
 -    puts "yaml, use --format) and then update the object.  Will use 'nano'\n"
 -    puts "by default, customize with the EDITOR or VISUAL environment variable.\n"
 -    exit 255
 -  end
 -
 -  # determine controller
 -
 +def lookup_uuid_rsc arvados, uuid
    m = /([a-z0-9]{5})-([a-z0-9]{5})-([a-z0-9]{15})/.match uuid
    if !m
      if /^[a-f0-9]{32}/.match uuid
      abort "Could not determine resource type #{m[2]}"
    end
  
 +  return rsc
 +end
 +
 +def fetch_rsc_obj client, arvados, rsc, uuid, remaining_opts
 +
    begin
      result = client.execute(:api_method => eval('arvados.' + rsc + '.get'),
                              :parameters => {"uuid" => uuid},
                              :headers => {
                                authorization: 'OAuth2 '+ENV['ARVADOS_API_TOKEN']
                              })
 -    oldobj = check_response result
 +    obj = check_response result
    rescue => e
      abort "Server error: #{e}"
    end
  
    if remaining_opts.length > 0
 -    oldobj.select! { |k, v| remaining_opts.include? k }
 +    obj.select! { |k, v| remaining_opts.include? k }
    end
  
 +  return obj
 +end
 +
 +def get_obj_content obj, global_opts
 +  content = case global_opts[:format]
 +            when 'json'
 +              Oj.dump(obj, :indent => 1)
 +            when 'yaml'
 +              obj.to_yaml
 +            else
 +              abort "Unrecognized format #{global_opts[:format]}"
 +            end
 +  return content
 +end
 +
 +def arv_edit client, arvados, global_opts, remaining_opts
 +  uuid = remaining_opts.shift
 +  if uuid.nil? or uuid == "-h" or uuid == "--help"
 +    puts head_banner
 +    puts "Usage: arv edit [uuid] [fields...]\n\n"
 +    puts "Fetch the specified Arvados object, select the specified fields, \n"
 +    puts "open an interactive text editor on a text representation (json or\n"
 +    puts "yaml, use --format) and then update the object.  Will use 'nano'\n"
 +    puts "by default, customize with the EDITOR or VISUAL environment variable.\n"
 +    exit 255
 +  end
 +
 +  rsc = lookup_uuid_rsc arvados, uuid
 +  oldobj = fetch_rsc_obj client, arvados, rsc, uuid, remaining_opts
 +
    edit_and_commit_object oldobj, uuid, global_opts do |newobj|
      newobj.select! {|k| newobj[k] != oldobj[k]}
      if !newobj.empty?
    exit 0
  end
  
 +def arv_get client, arvados, global_opts, remaining_opts
 +  uuid = remaining_opts.shift
 +  if uuid.nil? or uuid == "-h" or uuid == "--help"
 +    puts head_banner
 +    puts "Usage: arv get [uuid] [fields...]\n\n"
 +    puts "Fetch the specified Arvados object, select the specified fields, \n"
 +    puts "and print a text representation (json or yaml, use --format).\n"
 +    exit 255
 +  end
 +
 +  rsc = lookup_uuid_rsc arvados, uuid
 +  obj = fetch_rsc_obj client, arvados, rsc, uuid, remaining_opts
 +  content = get_obj_content obj, global_opts
 +
 +  puts content
 +  exit 0
 +end
 +
  def arv_create client, arvados, global_opts, remaining_opts
    types = resource_types(arvados.discovery_document)
    create_opts = Trollop::options do