104 lines
2.4 KiB
Go
104 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/md5"
|
|
"crypto/rand"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
|
|
"github.com/cenkalti/backoff"
|
|
"github.com/davecgh/go-spew/spew"
|
|
"github.com/go-chef/chef"
|
|
)
|
|
|
|
//random_data makes random byte slice for building junk sandbox data
|
|
func random_data(size int) (b []byte) {
|
|
b = make([]byte, size)
|
|
rand.Read(b)
|
|
return
|
|
}
|
|
|
|
func main() {
|
|
// read a client key
|
|
key, err := ioutil.ReadFile("key.pem")
|
|
if err != nil {
|
|
fmt.Println("Couldn't read key.pem:", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// build a client
|
|
client, err := chef.NewClient(&chef.Config{
|
|
Name: "foo",
|
|
Key: string(key),
|
|
// goiardi is on port 4545 by default. chef-zero is 8889
|
|
BaseURL: "http://localhost:4545",
|
|
})
|
|
if err != nil {
|
|
fmt.Println("Issue setting up client:", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// create junk files and sums
|
|
files := make(map[string][]byte)
|
|
sums := make([]string, 10)
|
|
for i := 0; i < 10; i++ {
|
|
data := random_data(1024)
|
|
hashstr := fmt.Sprintf("%x", md5.Sum(data))
|
|
files[hashstr] = data
|
|
sums[i] = hashstr
|
|
}
|
|
|
|
// post the new sums/files to the sandbox
|
|
postResp, err := client.Sandboxes.Post(sums)
|
|
if err != nil {
|
|
fmt.Println("error making request: ", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Dump the the server response data
|
|
j, err := json.MarshalIndent(postResp, "", " ")
|
|
fmt.Printf("%s", j)
|
|
|
|
// Let's upload the files that postRep thinks we should upload
|
|
for hash, item := range postResp.Checksums {
|
|
if item.Upload == true {
|
|
if hash == "" {
|
|
continue
|
|
}
|
|
// If you were writing this in your own tool you could just use the FH and let the Reader interface suck out the content instead of doing the convert.
|
|
fmt.Printf("\nUploading: %s ---> %v\n\n", hash, item)
|
|
req, err := client.NewRequest("PUT", item.Url, bytes.NewReader(files[hash]))
|
|
if err != nil {
|
|
fmt.Println("This shouldn't happen:", err.Error())
|
|
os.Exit(1)
|
|
}
|
|
|
|
// post the files
|
|
upload := func() error {
|
|
_, err = client.Do(req, nil)
|
|
return err
|
|
}
|
|
|
|
// with exp backoff !
|
|
err = backoff.Retry(upload, backoff.NewExponentialBackOff())
|
|
if err != nil {
|
|
fmt.Println("error posting files to the sandbox: ", err.Error())
|
|
}
|
|
}
|
|
}
|
|
|
|
// Now lets tell the server we have uploaded all the things.
|
|
sandbox, err := client.Sandboxes.Put(postResp.ID)
|
|
if err != nil {
|
|
fmt.Println("Error commiting sandbox: ", err.Error())
|
|
os.Exit(1)
|
|
}
|
|
|
|
// and heres yer commited sandbox
|
|
spew.Dump(sandbox)
|
|
|
|
}
|