func (s *ServerRequiredSuite) TestPutAskGet(c *C) { log.Print("TestPutAndGet start") os.Args = []string{"keepproxy", "-listen=:29950"} os.Setenv("ARVADOS_API_TOKEN", "4axaw8zxe0qm22wa6urpp5nskcne8z88cvbupv653y1njyi05h") go main() time.Sleep(100 * time.Millisecond) setupProxyService() os.Setenv("ARVADOS_EXTERNAL_CLIENT", "true") arv, err := sdk.MakeArvadosClient() kc, err := keepclient.MakeKeepClient(&arv) c.Check(kc.Arvados.External, Equals, true) c.Check(kc.Using_proxy, Equals, true) c.Check(len(kc.ServiceRoots()), Equals, 1) c.Check(kc.ServiceRoots()[0], Equals, "http://localhost:29950") c.Check(err, Equals, nil) os.Setenv("ARVADOS_EXTERNAL_CLIENT", "") log.Print("keepclient created") defer listener.Close() hash := fmt.Sprintf("%x", md5.Sum([]byte("foo"))) var hash2 string { _, _, err := kc.Ask(hash) c.Check(err, Equals, keepclient.BlockNotFound) log.Print("Ask 1") } { var rep int var err error hash2, rep, err = kc.PutB([]byte("foo")) c.Check(hash2, Equals, fmt.Sprintf("%s+3", hash)) c.Check(rep, Equals, 2) c.Check(err, Equals, nil) log.Print("PutB") } { blocklen, _, err := kc.Ask(hash2) c.Assert(err, Equals, nil) c.Check(blocklen, Equals, int64(3)) log.Print("Ask 2") } { reader, blocklen, _, err := kc.Get(hash2) c.Assert(err, Equals, nil) all, err := ioutil.ReadAll(reader) c.Check(all, DeepEquals, []byte("foo")) c.Check(blocklen, Equals, int64(3)) log.Print("Get") } log.Print("TestPutAndGet done") }
func runProxy(c *C, args []string, token string, port int) keepclient.KeepClient { os.Args = append(args, fmt.Sprintf("-listen=:%v", port)) os.Setenv("ARVADOS_API_TOKEN", "4axaw8zxe0qm22wa6urpp5nskcne8z88cvbupv653y1njyi05h") go main() time.Sleep(100 * time.Millisecond) os.Setenv("ARVADOS_KEEP_PROXY", fmt.Sprintf("http://localhost:%v", port)) os.Setenv("ARVADOS_API_TOKEN", token) arv, err := sdk.MakeArvadosClient() kc, err := keepclient.MakeKeepClient(&arv) c.Check(kc.Using_proxy, Equals, true) c.Check(len(kc.ServiceRoots()), Equals, 1) c.Check(kc.ServiceRoots()[0], Equals, fmt.Sprintf("http://localhost:%v", port)) c.Check(err, Equals, nil) os.Setenv("ARVADOS_KEEP_PROXY", "") log.Print("keepclient created") return kc }
func main() { var ( listen string no_get bool no_put bool default_replicas int pidfile string ) flagset := flag.NewFlagSet("default", flag.ExitOnError) flagset.StringVar( &listen, "listen", DEFAULT_ADDR, "Interface on which to listen for requests, in the format "+ "ipaddr:port. e.g. -listen=10.0.1.24:8000. Use -listen=:port "+ "to listen on all network interfaces.") flagset.BoolVar( &no_get, "no-get", false, "If set, disable GET operations") flagset.BoolVar( &no_put, "no-put", false, "If set, disable PUT operations") flagset.IntVar( &default_replicas, "default-replicas", 2, "Default number of replicas to write if not specified by the client.") flagset.StringVar( &pidfile, "pid", "", "Path to write pid file") flagset.Parse(os.Args[1:]) arv, err := sdk.MakeArvadosClient() if err != nil { log.Fatalf("Error setting up arvados client %s", err.Error()) } kc, err := keepclient.MakeKeepClient(&arv) if err != nil { log.Fatalf("Error setting up keep client %s", err.Error()) } if pidfile != "" { f, err := os.Create(pidfile) if err == nil { fmt.Fprint(f, os.Getpid()) f.Close() } else { log.Printf("Error writing pid file (%s): %s", pidfile, err.Error()) } } kc.Want_replicas = default_replicas listener, err = net.Listen("tcp", listen) if err != nil { log.Fatalf("Could not listen on %v", listen) } go RefreshServicesList(&kc) // Shut down the server gracefully (by closing the listener) // if SIGTERM is received. term := make(chan os.Signal, 1) go func(sig <-chan os.Signal) { s := <-sig log.Println("caught signal:", s) listener.Close() }(term) signal.Notify(term, syscall.SIGTERM) signal.Notify(term, syscall.SIGINT) if pidfile != "" { f, err := os.Create(pidfile) if err == nil { fmt.Fprint(f, os.Getpid()) f.Close() } else { log.Printf("Error writing pid file (%s): %s", pidfile, err.Error()) } } log.Printf("Arvados Keep proxy started listening on %v with server list %v", listener.Addr(), kc.ServiceRoots()) // Start listening for requests. http.Serve(listener, MakeRESTRouter(!no_get, !no_put, &kc)) log.Println("shutting down") if pidfile != "" { os.Remove(pidfile) } }