Skip to content

Commit 888d873

Browse files
andreasjanssonbfirsh
authored andcommitted
Throw error if user tries to upload the same version twice
Signed-off-by: andreasjansson <[email protected]>
1 parent 3093d85 commit 888d873

File tree

3 files changed

+61
-11
lines changed

3 files changed

+61
-11
lines changed

end-to-end-test/end_to_end_test/test_server.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,21 @@ def test_push_log(cog_server_port, project_dir):
124124
assert out["config"]["examples"][2]["output"] == "@cog-example-output/output.02.txt"
125125
assert out["images"][0]["arch"] == "cpu"
126126
assert out["images"][0]["run_arguments"]["text"]["type"] == "str"
127+
128+
129+
def test_repush(cog_server_port, project_dir):
130+
user = random_string(10)
131+
model_name = random_string(10)
132+
model_url = f"http://localhost:{cog_server_port}/{user}/{model_name}"
133+
134+
set_model_url(model_url, project_dir)
135+
version_id = push_with_log(project_dir)
136+
137+
_, err = subprocess.Popen(
138+
["cog", "push"],
139+
cwd=project_dir,
140+
stdout=subprocess.PIPE,
141+
stderr=subprocess.PIPE,
142+
).communicate()
143+
144+
assert f"Model version {version_id} already exists" in err.decode()

pkg/client/version_upload.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,11 @@ func (c *Client) UploadVersion(mod *model.Model, projectDir string) (*model.Vers
8080
return nil, fmt.Errorf("You are not authorized to write to model %s. Did you run cog login?", mod.String())
8181
}
8282
if resp.StatusCode != http.StatusOK {
83-
return nil, fmt.Errorf("Server returned HTTP status %d", resp.StatusCode)
83+
body, err := io.ReadAll(resp.Body)
84+
if err != nil {
85+
return nil, fmt.Errorf("Failed to read response body: %w", err)
86+
}
87+
return nil, fmt.Errorf("Push failed. %s", body)
8488
}
8589

8690
var version *model.Version

pkg/server/build.go

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,41 @@ func (s *Server) ReceiveFile(w http.ResponseWriter, r *http.Request) {
2929
user, name, _ := getModelVars(r)
3030

3131
console.Debug("Received build request")
32-
streamLogger := logger.NewStreamLogger(r.Context(), w)
33-
mod, err := s.ReceiveVersion(r, streamLogger, user, name)
32+
dir, err := s.UnzipInputToTempDir(r, user, name)
3433
if err != nil {
35-
streamLogger.WriteError(err)
34+
writeError(w, http.StatusInternalServerError, "Failed to unzip input directory")
3635
console.Error(err.Error())
3736
return
3837
}
39-
streamLogger.WriteVersion(mod)
40-
}
4138

42-
func (s *Server) ReceiveVersion(r *http.Request, logWriter logger.Logger, user string, name string) (*model.Version, error) {
43-
dir, err := s.UnzipInputToTempDir(r, user, name)
39+
id, err := ComputeID(dir)
4440
if err != nil {
45-
return nil, err
41+
writeError(w, http.StatusInternalServerError, "Failed to compute version ID")
42+
console.Error(err.Error())
43+
return
44+
}
45+
version, err := s.db.GetVersion(user, name, id)
46+
if err != nil {
47+
writeError(w, http.StatusInternalServerError, "Failed to determine if version already exists")
48+
console.Error(err.Error())
49+
return
50+
}
51+
if version != nil {
52+
writeError(w, http.StatusConflict, "Model version %s already exists", id)
53+
return
4654
}
4755

48-
id, err := ComputeID(dir)
56+
logWriter := logger.NewStreamLogger(r.Context(), w)
57+
mod, err := s.ReceiveVersion(dir, id, logWriter, user, name)
4958
if err != nil {
50-
return nil, err
59+
logWriter.WriteError(err)
60+
console.Error(err.Error())
61+
return
5162
}
63+
logWriter.WriteVersion(mod)
64+
}
65+
66+
func (s *Server) ReceiveVersion(dir string, id string, logWriter logger.Logger, user string, name string) (*model.Version, error) {
5267
logWriter.Debugf("Received version %s", id)
5368

5469
config, err := s.ReadConfig(dir)
@@ -339,3 +354,16 @@ func (s *Server) SendBuildLogs(w http.ResponseWriter, r *http.Request) {
339354
}
340355
}
341356
}
357+
358+
func writeError(w http.ResponseWriter, statusCode int, format string, args ...interface{}) {
359+
var message string
360+
if len(args) > 0 {
361+
message = fmt.Sprintf(format, args...)
362+
} else {
363+
message = format
364+
}
365+
w.WriteHeader(statusCode)
366+
if _, err := w.Write([]byte(message)); err != nil {
367+
console.Error("Failed to write to response writer")
368+
}
369+
}

0 commit comments

Comments
 (0)