"git.arvados.org/arvados.git/sdk/go/arvadosclient"
"git.arvados.org/arvados.git/sdk/go/arvadostest"
. "gopkg.in/check.v1"
- check "gopkg.in/check.v1"
)
// Gocheck boilerplate
}
}
+func (s *ServerRequiredSuite) TestDefaultStorageClasses(c *C) {
+ arv, err := arvadosclient.MakeArvadosClient()
+ c.Assert(err, IsNil)
+
+ cc, err := arv.ClusterConfig("StorageClasses")
+ c.Assert(err, IsNil)
+ c.Assert(cc, NotNil)
+ c.Assert(cc.(map[string]interface{})["default"], NotNil)
+
+ kc, err := MakeKeepClient(arv)
+ c.Assert(err, IsNil)
+ c.Assert(kc.DefaultStorageClasses, DeepEquals, []string{"default"})
+}
+
func (s *ServerRequiredSuite) TestDefaultReplications(c *C) {
arv, err := arvadosclient.MakeArvadosClient()
- c.Assert(err, Equals, nil)
+ c.Assert(err, IsNil)
kc, err := MakeKeepClient(arv)
c.Check(err, IsNil)
// bind to 0.0.0.0 or [::] which is not a valid address for Dial()
ks.listener, err = net.ListenTCP("tcp", &net.TCPAddr{IP: []byte{127, 0, 0, 1}, Port: 0})
if err != nil {
- panic(fmt.Sprintf("Could not listen on any port"))
+ panic("Could not listen on any port")
}
ks.url = fmt.Sprintf("http://%s", ks.listener.Addr().String())
go http.Serve(ks.listener, st)
func (s *StandaloneSuite) TestPutWithStorageClasses(c *C) {
nServers := 5
for _, trial := range []struct {
- replicas int
- clientClasses []string
- putClasses []string // putClasses takes precedence over clientClasses
- minRequests int
- maxRequests int
- success bool
+ replicas int
+ defaultClasses []string
+ clientClasses []string // clientClasses takes precedence over defaultClasses
+ putClasses []string // putClasses takes precedence over clientClasses
+ minRequests int
+ maxRequests int
+ success bool
}{
- {1, []string{"class1"}, nil, 1, 1, true},
- {2, []string{"class1"}, nil, 1, 2, true},
- {3, []string{"class1"}, nil, 2, 3, true},
- {1, []string{"class1", "class2"}, nil, 1, 1, true},
- {3, nil, []string{"class1"}, 2, 3, true},
- {1, nil, []string{"class1", "class2"}, 1, 1, true},
- {1, []string{"class404"}, []string{"class1", "class2"}, 1, 1, true},
- {1, []string{"class1"}, []string{"class404", "class2"}, nServers, nServers, false},
- {nServers*2 + 1, []string{"class1"}, nil, nServers, nServers, false},
- {1, []string{"class404"}, nil, nServers, nServers, false},
- {1, []string{"class1", "class404"}, nil, nServers, nServers, false},
- {1, nil, []string{"class1", "class404"}, nServers, nServers, false},
+ {1, []string{"class1"}, nil, nil, 1, 1, true},
+ {2, []string{"class1"}, nil, nil, 1, 2, true},
+ {3, []string{"class1"}, nil, nil, 2, 3, true},
+ {1, []string{"class1", "class2"}, nil, nil, 1, 1, true},
+
+ // defaultClasses doesn't matter when any of the others is specified.
+ {1, []string{"class1"}, []string{"class1"}, nil, 1, 1, true},
+ {2, []string{"class1"}, []string{"class1"}, nil, 1, 2, true},
+ {3, []string{"class1"}, []string{"class1"}, nil, 2, 3, true},
+ {1, []string{"class1"}, []string{"class1", "class2"}, nil, 1, 1, true},
+ {3, []string{"class1"}, nil, []string{"class1"}, 2, 3, true},
+ {1, []string{"class1"}, nil, []string{"class1", "class2"}, 1, 1, true},
+ {1, []string{"class1"}, []string{"class404"}, []string{"class1", "class2"}, 1, 1, true},
+ {1, []string{"class1"}, []string{"class1"}, []string{"class404", "class2"}, nServers, nServers, false},
+ {nServers*2 + 1, []string{}, []string{"class1"}, nil, nServers, nServers, false},
+ {1, []string{"class1"}, []string{"class404"}, nil, nServers, nServers, false},
+ {1, []string{"class1"}, []string{"class1", "class404"}, nil, nServers, nServers, false},
+ {1, []string{"class1"}, nil, []string{"class1", "class404"}, nServers, nServers, false},
+
+ // Talking to an older cluster (with no default storage classes advertising)
+ {1, nil, []string{"class1"}, nil, 1, 1, true},
+ {2, nil, []string{"class1"}, nil, 1, 2, true},
+ {3, nil, []string{"class1"}, nil, 2, 3, true},
+ {1, nil, []string{"class1", "class2"}, nil, 1, 1, true},
+ {3, nil, nil, []string{"class1"}, 2, 3, true},
+ {1, nil, nil, []string{"class1", "class2"}, 1, 1, true},
+ {1, nil, []string{"class404"}, []string{"class1", "class2"}, 1, 1, true},
+ {1, nil, []string{"class1"}, []string{"class404", "class2"}, nServers, nServers, false},
+ {nServers*2 + 1, []string{}, []string{"class1"}, nil, nServers, nServers, false},
+ {1, nil, []string{"class404"}, nil, nServers, nServers, false},
+ {1, nil, []string{"class1", "class404"}, nil, nServers, nServers, false},
+ {1, nil, nil, []string{"class1", "class404"}, nServers, nServers, false},
} {
c.Logf("%+v", trial)
st := &StubPutHandler{
kc, _ := MakeKeepClient(arv)
kc.Want_replicas = trial.replicas
kc.StorageClasses = trial.clientClasses
+ kc.DefaultStorageClasses = trial.defaultClasses
arv.ApiToken = "abc123"
localRoots := make(map[string]string)
writableLocalRoots := make(map[string]string)
StorageClasses: trial.putClasses,
})
if trial.success {
- c.Check(err, check.IsNil)
+ c.Check(err, IsNil)
} else {
- c.Check(err, check.NotNil)
+ c.Check(err, NotNil)
}
- c.Check(len(st.handled) >= trial.minRequests, check.Equals, true, check.Commentf("len(st.handled)==%d, trial.minRequests==%d", len(st.handled), trial.minRequests))
- c.Check(len(st.handled) <= trial.maxRequests, check.Equals, true, check.Commentf("len(st.handled)==%d, trial.maxRequests==%d", len(st.handled), trial.maxRequests))
- if !trial.success && trial.replicas == 1 && c.Check(len(st.requests) >= 2, check.Equals, true) {
+ c.Check(len(st.handled) >= trial.minRequests, Equals, true, Commentf("len(st.handled)==%d, trial.minRequests==%d", len(st.handled), trial.minRequests))
+ c.Check(len(st.handled) <= trial.maxRequests, Equals, true, Commentf("len(st.handled)==%d, trial.maxRequests==%d", len(st.handled), trial.maxRequests))
+ if !trial.success && trial.replicas == 1 && c.Check(len(st.requests) >= 2, Equals, true) {
// Max concurrency should be 1. First request
// should have succeeded for class1. Second
// request should only ask for class404.
- c.Check(st.requests[1].Header.Get("X-Keep-Storage-Classes"), check.Equals, "class404")
+ c.Check(st.requests[1].Header.Get("X-Keep-Storage-Classes"), Equals, "class404")
}
}
}
expectPath: hash,
expectAPIToken: "abc123",
expectBody: "foo",
- expectStorageClass: "",
+ expectStorageClass: "default",
returnStorageClasses: "",
handled: make(chan string, 5),
}
expectPath: hash,
expectAPIToken: "abc123",
expectBody: "foo",
- expectStorageClass: "",
+ expectStorageClass: "default",
returnStorageClasses: "",
handled: make(chan string, 5),
}
expectPath: hash,
expectAPIToken: "abc123",
expectBody: "foo",
- expectStorageClass: "",
+ expectStorageClass: "default",
returnStorageClasses: "",
handled: make(chan string, 4),
}
expectPath: hash,
expectAPIToken: "abc123",
expectBody: "foo",
- expectStorageClass: "",
+ expectStorageClass: "default",
returnStorageClasses: "",
handled: make(chan string, 1),
}
expectPath: hash,
expectAPIToken: "abc123",
expectBody: "foo",
- expectStorageClass: "",
+ expectStorageClass: "default",
returnStorageClasses: "",
handled: make(chan string, 5),
}
expectPath: Md5String("foo"),
expectAPIToken: "abc123",
expectBody: "foo",
- expectStorageClass: "",
+ expectStorageClass: "default",
returnStorageClasses: "",
handled: make(chan string, 5),
},