3551: Fix source tree layout.
authorTom Clegg <tom@curoverse.com>
Sat, 9 Aug 2014 16:30:25 +0000 (12:30 -0400)
committerTom Clegg <tom@curoverse.com>
Sat, 9 Aug 2014 16:30:25 +0000 (12:30 -0400)
* Move $GOPATH out of the source tree. ($GOPATH is a workspace. Go
  knows how to import source trees into $GOPATH/src/.) This avoids
  replicating the Go workspace structure inside our source tree, and
  allows Go programs to import our libraries the normal way.

* Add Go SDK documentation page showing how to import.

* Rename keep to keepstore.

* In Python tests, we assume keepproxy and keepstore binaries are
  already installed in $GOPATH/bin/ rather than guessing how you want
  them to be built.

* Delete go.sh wrappers. Dependencies are already installed
  automatically by Go. GOPATH is left alone.

31 files changed:
.gitignore
doc/_config.yml
doc/sdk/go/index.html.textile.liquid [new file with mode: 0644]
doc/sdk/index.html.textile.liquid
sdk/go/arvadosclient/sdk.go [moved from sdk/go/src/arvados.org/sdk/sdk.go with 100% similarity]
sdk/go/arvadosclient/sdk_test.go [moved from sdk/go/src/arvados.org/sdk/sdk_test.go with 100% similarity]
sdk/go/go.sh [deleted file]
sdk/go/keepclient/hashcheck.go [moved from sdk/go/src/arvados.org/keepclient/hashcheck.go with 100% similarity]
sdk/go/keepclient/hashcheck_test.go [moved from sdk/go/src/arvados.org/keepclient/hashcheck_test.go with 100% similarity]
sdk/go/keepclient/keepclient.go [moved from sdk/go/src/arvados.org/keepclient/keepclient.go with 97% similarity]
sdk/go/keepclient/keepclient_test.go [moved from sdk/go/src/arvados.org/keepclient/keepclient_test.go with 100% similarity]
sdk/go/keepclient/support.go [moved from sdk/go/src/arvados.org/keepclient/support.go with 99% similarity]
sdk/go/streamer/streamer.go [moved from sdk/go/src/arvados.org/streamer/streamer.go with 100% similarity]
sdk/go/streamer/streamer_test.go [moved from sdk/go/src/arvados.org/streamer/streamer_test.go with 100% similarity]
sdk/go/streamer/transfer.go [moved from sdk/go/src/arvados.org/streamer/transfer.go with 100% similarity]
sdk/python/tests/run_test_server.py
sdk/python/tests/test_arv_put.py
services/crunch/crunchstat/go.sh [deleted file]
services/crunchstat/crunchstat.go [moved from services/crunch/crunchstat/src/arvados.org/crunchstat/crunchstat.go with 100% similarity]
services/keep/go.sh [deleted file]
services/keepproxy/keepproxy.go [moved from services/keep/src/arvados.org/keepproxy/keepproxy.go with 98% similarity]
services/keepproxy/keepproxy_test.go [moved from services/keep/src/arvados.org/keepproxy/keepproxy_test.go with 95% similarity]
services/keepstore/handler_test.go [moved from services/keep/src/keep/handler_test.go with 100% similarity]
services/keepstore/handlers.go [moved from services/keep/src/keep/handlers.go with 100% similarity]
services/keepstore/keepstore.go [moved from services/keep/src/keep/keep.go with 100% similarity]
services/keepstore/keepstore_test.go [moved from services/keep/src/keep/keep_test.go with 97% similarity]
services/keepstore/perms.go [moved from services/keep/src/keep/perms.go with 100% similarity]
services/keepstore/perms_test.go [moved from services/keep/src/keep/perms_test.go with 100% similarity]
services/keepstore/volume.go [moved from services/keep/src/keep/volume.go with 100% similarity]
services/keepstore/volume_unix.go [moved from services/keep/src/keep/volume_unix.go with 100% similarity]
services/keepstore/volume_unix_test.go [moved from services/keep/src/keep/volume_unix_test.go with 100% similarity]

index 0cddee596c4cf665b9359f1a6276c7ecdcfd3d49..9ddcf07dc41b1c908eba229aa79868f71199dad1 100644 (file)
@@ -11,9 +11,6 @@ sdk/perl/Makefile
 sdk/perl/blib
 sdk/perl/pm_to_blib
 */vendor/bundle
-services/keep/bin
-services/keep/pkg
-services/keep/src/github.com
 sdk/java/target
 *.class
 apps/workbench/vendor/bundle
index d8b0d88a0f8978b0cb3fb844b1018dda088862ff..7dc43fa5c164d882f0eb303c24f10f46a08c4cde 100644 (file)
@@ -60,6 +60,8 @@ navbar:
       - sdk/ruby/index.html.textile.liquid
     - Java:
       - sdk/java/index.html.textile.liquid
+    - Go:
+      - sdk/go/index.html.textile.liquid
     - CLI:
       - sdk/cli/index.html.textile.liquid
   api:
diff --git a/doc/sdk/go/index.html.textile.liquid b/doc/sdk/go/index.html.textile.liquid
new file mode 100644 (file)
index 0000000..27c4448
--- /dev/null
@@ -0,0 +1,65 @@
+---
+layout: default
+navsection: sdk
+navmenu: Go
+title: "Go SDK"
+
+...
+
+The Go ("Golang":http://golang.org) SDK provides a generic set of wrappers so you can make API calls easily.
+
+h3. Installation
+
+You don't need to install anything. Just import the client like this. The go tools will fetch the relevant code and dependencies for you.
+
+<notextile>
+<pre><code class="userinput">import (
+       keepclient    "git.curoverse.com/arvados.git/sdk/go/keepclient"
+       arvadosclient "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
+)
+</code></pre>
+</notextile>
+
+h3. Examples
+
+Import the module. (We import the log module here too, so we can use it in the subsequent examples.)
+
+<notextile>
+<pre><code class="userinput">import (
+       keepclient    "git.curoverse.com/arvados.git/sdk/go/keepclient"
+       arvadosclient "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
+       "log"
+)
+</code></pre>
+</notextile>
+
+Set up an API client user agent:
+
+<notextile>
+<pre><code class="userinput">  arv, err := arvadosclient.MakeArvadosClient()
+       if err != nil {
+               log.Fatalf("Error setting up arvados client %s", err.Error())
+       }
+</code></pre>
+</notextile>
+
+Get the User object for the current user:
+
+<notextile>
+<pre><code class="userinput">  type user struct {
+               Uuid         string `json:"uuid"`
+               FullName     int    `json:"full_name"`
+       }
+
+       var u user
+       err := arv.Call("GET", "users", "", "current", nil, &u)
+
+       if err != nil {
+               return err
+       }
+
+       log.Printf("Logged in as %s (uuid %s)", user.Uuid, user.FullName)
+</code></pre>
+</notextile>
+
+A few more usage examples can be found in the services/keepproxy and sdk/go/keepclient directories in the arvados source tree.
index 1b1e18ab9447fbf964e414403003ae980e69926d..db5d6f13b0cbdc08c62f1f156ca70bafdd23e88b 100644 (file)
@@ -10,6 +10,7 @@ This section documents how to access the Arvados API and Keep using various prog
 * "Perl SDK":{{site.baseurl}}/sdk/perl/index.html
 * "Ruby SDK":{{site.baseurl}}/sdk/ruby/index.html
 * "Java SDK":{{site.baseurl}}/sdk/java/index.html
+* "Go SDK":{{site.baseurl}}/sdk/go/index.html
 * "Command line SDK":{{site.baseurl}}/sdk/cli/index.html ("arv")
 
 SDKs not yet implemented:
diff --git a/sdk/go/go.sh b/sdk/go/go.sh
deleted file mode 100755 (executable)
index 5553567..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#! /bin/sh
-
-# Wraps the 'go' executable with some environment setup.  Sets GOPATH, creates
-# 'pkg' and 'bin' directories, automatically installs dependencies, then runs
-# the underlying 'go' executable with any command line parameters provided to
-# the script.
-
-rootdir=$(readlink -f $(dirname $0))
-GOPATH=$rootdir:$GOPATH
-export GOPATH
-
-mkdir -p $rootdir/pkg
-mkdir -p $rootdir/bin
-
-go get gopkg.in/check.v1
-
-go $*
similarity index 97%
rename from sdk/go/src/arvados.org/keepclient/keepclient.go
rename to sdk/go/keepclient/keepclient.go
index d43a2150f3f0950b692df0344c85983d7f4977e8..aa7e78ba8fcb00eb2ae0a9f35d6dfb8385967b77 100644 (file)
@@ -2,8 +2,8 @@
 package keepclient
 
 import (
-       "arvados.org/sdk"
-       "arvados.org/streamer"
+       streamer "git.curoverse.com/arvados.git/sdk/go/streamer"
+       arvadosclient "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
        "crypto/md5"
        "errors"
        "fmt"
@@ -33,7 +33,7 @@ const X_Keep_Replicas_Stored = "X-Keep-Replicas-Stored"
 
 // Information about Arvados and Keep servers.
 type KeepClient struct {
-       Arvados       *sdk.ArvadosClient
+       Arvados       *arvadosclient.ArvadosClient
        Want_replicas int
        Using_proxy   bool
        service_roots *[]string
@@ -43,7 +43,7 @@ type KeepClient struct {
 
 // Create a new KeepClient.  This will contact the API server to discover Keep
 // servers.
-func MakeKeepClient(arv *sdk.ArvadosClient) (kc KeepClient, err error) {
+func MakeKeepClient(arv *arvadosclient.ArvadosClient) (kc KeepClient, err error) {
        kc = KeepClient{
                Arvados:       arv,
                Want_replicas: 2,
similarity index 99%
rename from sdk/go/src/arvados.org/keepclient/support.go
rename to sdk/go/keepclient/support.go
index f3e47f92f5864d2fe3d8b1e06de92e2075f4faf9..ce15ce91adbab7926c0eca76ece43b52ab051bb2 100644 (file)
@@ -2,7 +2,7 @@
 package keepclient
 
 import (
-       "arvados.org/streamer"
+       "git.curoverse.com/arvados.git/sdk/go/streamer"
        "errors"
        "fmt"
        "io"
index dc95d8a9a5ac3f0781ed4aec9fa10d713f66479b..a82866a6739921abf22c3fd079b4a6ab68c13605 100644 (file)
@@ -20,10 +20,10 @@ if __name__ == '__main__' and os.path.exists(
 import arvados.api
 import arvados.config
 
-ARV_API_SERVER_DIR = '../../../services/api'
-KEEP_SERVER_DIR = '../../../services/keep'
+SERVICES_SRC_DIR = os.path.join(MY_DIRNAME, '../../../services')
 SERVER_PID_PATH = 'tmp/pids/webrick-test.pid'
 WEBSOCKETS_SERVER_PID_PATH = 'tmp/pids/passenger-test.pid'
+os.environ['PATH'] = os.environ['GOPATH'] + '/bin:' + os.environ['PATH']
 
 def find_server_pid(PID_PATH, wait=10):
     now = time.time()
@@ -64,7 +64,7 @@ def kill_server_pid(PID_PATH, wait=10):
 
 def run(websockets=False, reuse_server=False):
     cwd = os.getcwd()
-    os.chdir(os.path.join(MY_DIRNAME, ARV_API_SERVER_DIR))
+    os.chdir(os.path.join(SERVICES_SRC_DIR, 'api'))
 
     if websockets:
         pid_file = WEBSOCKETS_SERVER_PID_PATH
@@ -116,7 +116,7 @@ def run(websockets=False, reuse_server=False):
 
 def stop():
     cwd = os.getcwd()
-    os.chdir(os.path.join(MY_DIRNAME, ARV_API_SERVER_DIR))
+    os.chdir(os.path.join(SERVICES_SRC_DIR, 'api'))
 
     kill_server_pid(WEBSOCKETS_SERVER_PID_PATH, 0)
     kill_server_pid(SERVER_PID_PATH, 0)
@@ -135,7 +135,7 @@ def stop():
 
 def _start_keep(n, keep_args):
     keep0 = tempfile.mkdtemp()
-    keep_cmd = ["bin/keep",
+    keep_cmd = ["keepstore",
                 "-volumes={}".format(keep0),
                 "-listen=:{}".format(25107+n),
                 "-pid={}".format("tmp/keep{}.pid".format(n))]
@@ -153,15 +153,6 @@ def _start_keep(n, keep_args):
 def run_keep(blob_signing_key=None, enforce_permissions=False):
     stop_keep()
 
-    cwd = os.getcwd()
-    os.chdir(os.path.join(MY_DIRNAME, KEEP_SERVER_DIR))
-    if os.environ.get('GOPATH') == None:
-        os.environ["GOPATH"] = os.getcwd()
-    else:
-        os.environ["GOPATH"] = os.getcwd() + ":" + os.environ["GOPATH"]
-
-    subprocess.call(["./go.sh", "install", "keep"])
-
     if not os.path.exists("tmp"):
         os.mkdir("tmp")
 
@@ -191,8 +182,6 @@ def run_keep(blob_signing_key=None, enforce_permissions=False):
     api.keep_disks().create(body={"keep_disk": {"keep_service_uuid": s1["uuid"] } }).execute()
     api.keep_disks().create(body={"keep_disk": {"keep_service_uuid": s2["uuid"] } }).execute()
 
-    os.chdir(cwd)
-
 def _stop_keep(n):
     kill_server_pid("tmp/keep{}.pid".format(n), 0)
     if os.path.exists("tmp/keep{}.volume".format(n)):
@@ -203,26 +192,12 @@ def _stop_keep(n):
         os.remove("tmp/keep.blob_signing_key")
 
 def stop_keep():
-    cwd = os.getcwd()
-    os.chdir(os.path.join(MY_DIRNAME, KEEP_SERVER_DIR))
-
     _stop_keep(0)
     _stop_keep(1)
 
-    os.chdir(cwd)
-
 def run_keep_proxy(auth):
     stop_keep_proxy()
 
-    cwd = os.getcwd()
-    os.chdir(os.path.join(MY_DIRNAME, KEEP_SERVER_DIR))
-    if os.environ.get('GOPATH') == None:
-        os.environ["GOPATH"] = os.getcwd()
-    else:
-        os.environ["GOPATH"] = os.getcwd() + ":" + os.environ["GOPATH"]
-
-    subprocess.call(["./go.sh", "install", "arvados.org/keepproxy"])
-
     if not os.path.exists("tmp"):
         os.mkdir("tmp")
 
@@ -230,7 +205,8 @@ def run_keep_proxy(auth):
     os.environ["ARVADOS_API_HOST_INSECURE"] = "true"
     os.environ["ARVADOS_API_TOKEN"] = fixture("api_client_authorizations")[auth]["api_token"]
 
-    kp0 = subprocess.Popen(["bin/keepproxy", "-pid=tmp/keepproxy.pid", "-listen=:{}".format(25101)])
+    kp0 = subprocess.Popen(["keepproxy",
+                            "-pid=tmp/keepproxy.pid", "-listen=:{}".format(25101)])
 
     authorize_with("admin")
     api = arvados.api('v1', cache=False)
@@ -238,17 +214,12 @@ def run_keep_proxy(auth):
 
     arvados.config.settings()["ARVADOS_KEEP_PROXY"] = "http://localhost:25101"
 
-    os.chdir(cwd)
-
 def stop_keep_proxy():
-    cwd = os.getcwd()
-    os.chdir(os.path.join(MY_DIRNAME, KEEP_SERVER_DIR))
     kill_server_pid("tmp/keepproxy.pid", 0)
-    os.chdir(cwd)
 
 def fixture(fix):
     '''load a fixture yaml file'''
-    with open(os.path.join(MY_DIRNAME, ARV_API_SERVER_DIR, "test", "fixtures",
+    with open(os.path.join(SERVICES_SRC_DIR, 'api', "test", "fixtures",
                            fix + ".yml")) as f:
         return yaml.load(f.read())
 
index 7a827684a33aaf2686a1b947c9797285d4000ca8..9bc385d2e6645cabaf140a7573c13a7705951090 100644 (file)
@@ -466,10 +466,8 @@ class ArvPutIntegrationTest(unittest.TestCase):
         # to provision the Keep server.
         config_blob_signing_key = None
         for config_file in ['application.yml', 'application.default.yml']:
-            with open(os.path.join(os.path.dirname(__file__),
-                                   run_test_server.ARV_API_SERVER_DIR,
-                                   "config",
-                                   config_file)) as f:
+            with open(os.path.join(run_test_server.SERVICES_SRC_DIR,
+                                   "api", "config", config_file)) as f:
                 rails_config = yaml.load(f.read())
                 for config_section in ['test', 'common']:
                     try:
diff --git a/services/crunch/crunchstat/go.sh b/services/crunch/crunchstat/go.sh
deleted file mode 100755 (executable)
index 640a0d2..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#! /bin/sh
-
-# Wraps the 'go' executable with some environment setup.  Sets GOPATH, creates
-# 'pkg' and 'bin' directories, automatically installs dependencies, then runs
-# the underlying 'go' executable with any command line parameters provided to
-# the script.
-
-rootdir=$(readlink -f $(dirname $0))
-GOPATH=$rootdir:$rootdir/../../sdk/go:$GOPATH
-export GOPATH
-
-mkdir -p $rootdir/pkg
-mkdir -p $rootdir/bin
-
-go $*
diff --git a/services/keep/go.sh b/services/keep/go.sh
deleted file mode 100755 (executable)
index 156fe90..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#! /bin/sh
-
-# Wraps the 'go' executable with some environment setup.  Sets GOPATH, creates
-# 'pkg' and 'bin' directories, automatically installs dependencies, then runs
-# the underlying 'go' executable with any command line parameters provided to
-# the script.
-
-rootdir=$(readlink -f $(dirname $0))
-GOPATH=$rootdir:$rootdir/../../sdk/go:$GOPATH
-export GOPATH
-
-mkdir -p $rootdir/pkg
-mkdir -p $rootdir/bin
-
-go get github.com/gorilla/mux
-
-go $*
similarity index 98%
rename from services/keep/src/arvados.org/keepproxy/keepproxy.go
rename to services/keepproxy/keepproxy.go
index 367854bed382ec1b17589c825126d5e31a9bf6a6..367a9c560474e38bc082d18c260a4c0bf91d7126 100644 (file)
@@ -1,8 +1,8 @@
 package main
 
 import (
-       "arvados.org/keepclient"
-       "arvados.org/sdk"
+       keepclient "git.curoverse.com/arvados.git/sdk/go/keepclient"
+       arvadosclient "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
        "flag"
        "fmt"
        "github.com/gorilla/mux"
@@ -68,7 +68,7 @@ func main() {
 
        flagset.Parse(os.Args[1:])
 
-       arv, err := sdk.MakeArvadosClient()
+       arv, err := arvadosclient.MakeArvadosClient()
        if err != nil {
                log.Fatalf("Error setting up arvados client %s", err.Error())
        }
similarity index 95%
rename from services/keep/src/arvados.org/keepproxy/keepproxy_test.go
rename to services/keepproxy/keepproxy_test.go
index 4bf347890eb01edea36af772fed2bbef9f4f91d1..22b1f30f73fe6cd598a89dc02bb0106c862e7fd3 100644 (file)
@@ -1,8 +1,8 @@
 package main
 
 import (
-       "arvados.org/keepclient"
-       "arvados.org/sdk"
+       keepclient "git.curoverse.com/arvados.git/sdk/go/keepclient"
+       arvadosclient "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
        "crypto/md5"
        "crypto/tls"
        "fmt"
@@ -14,7 +14,6 @@ import (
        "net/url"
        "os"
        "os/exec"
-       "strings"
        "testing"
        "time"
 )
@@ -31,8 +30,8 @@ var _ = Suite(&ServerRequiredSuite{})
 type ServerRequiredSuite struct{}
 
 func pythonDir() string {
-       gopath := os.Getenv("GOPATH")
-       return fmt.Sprintf("%s/../../sdk/python/tests", strings.Split(gopath, ":")[0])
+       cwd, _ := os.Getwd()
+       return fmt.Sprintf("%s/../../sdk/python/tests", cwd)
 }
 
 func (s *ServerRequiredSuite) SetUpSuite(c *C) {
@@ -109,7 +108,7 @@ func runProxy(c *C, args []string, token string, port int) keepclient.KeepClient
 
        os.Setenv("ARVADOS_KEEP_PROXY", fmt.Sprintf("http://localhost:%v", port))
        os.Setenv("ARVADOS_API_TOKEN", token)
-       arv, err := sdk.MakeArvadosClient()
+       arv, err := arvadosclient.MakeArvadosClient()
        kc, err := keepclient.MakeKeepClient(&arv)
        c.Check(kc.Using_proxy, Equals, true)
        c.Check(len(kc.ServiceRoots()), Equals, 1)
@@ -131,7 +130,7 @@ func (s *ServerRequiredSuite) TestPutAskGet(c *C) {
        setupProxyService()
 
        os.Setenv("ARVADOS_EXTERNAL_CLIENT", "true")
-       arv, err := sdk.MakeArvadosClient()
+       arv, err := arvadosclient.MakeArvadosClient()
        kc, err := keepclient.MakeKeepClient(&arv)
        c.Check(kc.Arvados.External, Equals, true)
        c.Check(kc.Using_proxy, Equals, true)
similarity index 97%
rename from services/keep/src/keep/keep_test.go
rename to services/keepstore/keepstore_test.go
index de189b659c0b10db9cfac8490c689ec87537d48b..b153d6dce27309f3cb692ec0d6a84b724386891a 100644 (file)
@@ -7,6 +7,8 @@ import (
        "os"
        "path"
        "regexp"
+       "sort"
+       "strings"
        "testing"
 )
 
@@ -342,11 +344,14 @@ func TestIndex(t *testing.T) {
        vols[1].Put(TEST_HASH_2+".meta", []byte("metadata"))
 
        index := vols[0].Index("") + vols[1].Index("")
-       expected := `^` + TEST_HASH + `\+\d+ \d+\n` +
+       index_rows := strings.Split(index, "\n")
+       sort.Strings(index_rows)
+       sorted_index := strings.Join(index_rows, "\n")
+       expected := `^\n` + TEST_HASH + `\+\d+ \d+\n` +
                TEST_HASH_3 + `\+\d+ \d+\n` +
-               TEST_HASH_2 + `\+\d+ \d+\n$`
+               TEST_HASH_2 + `\+\d+ \d+$`
 
-       match, err := regexp.MatchString(expected, index)
+       match, err := regexp.MatchString(expected, sorted_index)
        if err == nil {
                if !match {
                        t.Errorf("IndexLocators returned:\n%s", index)