Project

General

Profile

Go » History » Version 5

Misha Zatsman, 12/12/2014 10:01 PM

1 1 Misha Zatsman
h1. Go
2
3
{{toc}}
4
5
h2. Using Go with Arvados
6
7
h3. Install Go
8
9
If you're installing Go on your linux machine you'll want to follow the "tarball instructions":http://golang.org/doc/install#tarball to get the latest stable version, because if you use <code>apt-get</code> you'll get an outdated version.
10
11
The first time you install Go, you'll need to set @GOPATH@ to an empty directory.  The Go toolchain will install Go packages and dependencies here. 
12
13
<pre>
14
export GOPATH=~/gocode
15
mkdir -p $GOPATH
16
</pre>
17
18
The rest of these instructions assume that you have a working Go installation on your system, and that your @GOPATH@ environment variable is set appropriately.
19
20
21
h3. Install Arvados source
22
23
Clone the Arvados git repository, if you have not already:
24
25
<pre>
26
cd
27
git clone git://git.curoverse.com/arvados.git
28
</pre>
29
30
*Note:* If you are an authorized committer, clone @git@git.curoverse.com:arvados.git@ instead so you may push directly to git.curoverse.com.
31
32
h3. Tell Go to use your local Arvados source
33
34
This step ensures that your development environment uses your locally-modified code, instead of fetching the master branch from git.curoverse.com:
35
36
<pre>
37
mkdir -p $GOPATH/src/git.curoverse.com
38
ln -s ~/arvados $GOPATH/src/git.curoverse.com/arvados.git
39
</pre>
40
41
Reason: The Keepstore and Keepproxy packages import other Go packages from the Arvados source tree. These packages have names like:
42
43
<pre>
44
git.curoverse.com/arvados.git/sdk/go/keepclient
45
git.curoverse.com/arvados.git/sdk/go/arvadosclient
46
</pre>
47
48
When the Go compiler needs to import one of these packages, it will look in @$GOPATH/src@ for the package source code. If it does not find the code locally, it will fetch the code from git.curoverse.com automatically.  This symlink ensures that Go will find your local source code under @$GOPATH/src/git.curoverse.com/arvados.git/...@
49
50
h3. Run some tests
51
52
e.g.
53
54
<pre>
55
cd ~/arvados/services/keepstore
56
go test
57
</pre>
58
59
The @go test@ command will print a few dozen lines of logging output.  If the tests succeeded, it will print PASS followed by a summary of the packages which passed testing, e.g.:
60
61
<pre>
62
PASS
63
ok  	_/home/you/arvados/services/keepstore	1.023s
64
</pre>
65
66 4 Misha Zatsman
h2. Arvados Go SDK
67
68
h3. Documentation
69
70
For more information consult the "Arvados Go SDK documentation":http://doc.arvados.org/sdk/go/
71
72
h3. Recipes
73
74 5 Misha Zatsman
This section contains code demonstrating aspects of the Arvados Go SDK. Additional examples can be found in the "Arvados Go SDK documentation":http://doc.arvados.org/sdk/go/
75 4 Misha Zatsman
76
h4. Collections filtered and ordered
77
78
This example prints collections modified after a given date, ordered by Owner UUID (sorted Ascending) and then ordered by most recent modifications (i.e. descending modification date).
79
80
<pre>
81
package main
82
83
// *******************
84
// Import the modules.
85
86
import (
87
	"git.curoverse.com/arvados.git/sdk/go/arvadosclient"
88
	"log"
89
)
90
91
type SdkCollectionInfo struct {
92
	Uuid           string   `json:"uuid"`
93
	OwnerUuid      string   `json:"owner_uuid"`
94
	Redundancy     int      `json:"redundancy"`
95
	ModifiedAt     string   `json:"modified_at"`
96
	ManifestText   string   `json:"manifest_text"`
97
}
98
99
type SdkCollectionList struct {
100
	ItemsAvailable   int                   `json:"items_available"`
101
	Items            []SdkCollectionInfo   `json:"items"`
102
}
103
104
func main() {
105
	// ********************************
106
	// Set up an API client user agent.
107
	//
108
109
	arv, err := arvadosclient.MakeArvadosClient()
110
	if err != nil {
111
		log.Fatalf("Error setting up arvados client %s", err.Error())
112
	}
113
114
	GetCollections(arv)
115
}
116
117
func GetCollections(arv arvadosclient.ArvadosClient) () {
118
	fieldsWanted := []string{"manifest_text",
119
		"owner_uuid",
120
		"uuid",
121
		"redundancy",
122
		"modified_at"}
123
124
	sdkParams := arvadosclient.Dict{
125
		"select": fieldsWanted,
126
		"order": []string{"owner_uuid ASC", "modified_at DESC"},
127
		"filter": []string{"modified_at", ">=", "1900-00-00T00:00:00Z"}}
128
129
	var collections SdkCollectionList
130
131
	err := arv.List("collections", sdkParams, &collections)
132
	if err != nil {
133
		log.Fatalf("error querying collections: %v", err)
134
	}
135
136
	for _, collection := range collections.Items {
137
		log.Printf("Seeing owner uuid, modification date: %s %s",
138
			collection.OwnerUuid,
139
			collection.ModifiedAt)
140
	}
141
	return
142
}
143
</pre>
144 3 Misha Zatsman
145 1 Misha Zatsman
h2. Learning Go
146
147
Getting good at Go, and concurrency/goroutines in particular, is an excellent use of time.
148
149
h3. Introductions
150
 
151
* "Go Tour":http://tour.golang.org/ is a great way to spend a few hours getting your feet wet.
152
* "Effective Go":http://golang.org/doc/effective_go.html The web site says that you should do both the tour and the language specification first before reading this, but honestly, I think it's ridiculous to try to read the language specification before you even start writing code in the language. I wouldn't try to read either the specification or "Effective Go" in depth before trying to write any code, but they're both at least worth skimming at this point.
153
* The slides for Rob Pike's talk on "Go Concurrency Patterns":http://talks.golang.org/2012/concurrency.slide#1. I haven't watched all of the talks yet; these slides are really nice because they show very elegant ways of using channels and goroutines to build rich and complex concurrent abstractions.
154
* "The package documentation.":http://golang.org/pkg/ Note that the package docs include links to web versions of the package source code, which help very much in learning idiomatic Go patterns.
155
156
h3. Resources
157
158
h4. Free online resources:
159
160
* http://golang.org
161
* http://golang.org/doc/code.html
162
* http://tour.golang.org/
163
* https://gobyexample.com/
164
* http://learnxinyminutes.com/docs/go/
165
166
h4. Books
167
168
* http://www.golang-book.com/ (Free!)
169
* "Programming in Go":http://www.amazon.com/Programming-Go-Creating-Applications-Developers/dp/0321774639/ref=pd_bxgy_b_img_y (a bit dated now)