Selaa lähdekoodia

server: feedback before failing push on uppercase

When a username or model name is uppercase the registry will reject the
push. This is done for file-system compatibility. If we rely on the registry
error on push the message returned is 'file not found', which does not
convey why the push actually failed.
Bruce MacDonald 5 kuukautta sitten
vanhempi
commit
1be080403d
2 muutettua tiedostoa jossa 50 lisäystä ja 0 poistoa
  1. 6 0
      server/images.go
  2. 44 0
      server/images_test.go

+ 6 - 0
server/images.go

@@ -802,6 +802,12 @@ func PushModel(ctx context.Context, name string, regOpts *registryOptions, fn fu
 	if mp.ProtocolScheme == "http" && !regOpts.Insecure {
 		return errors.New("insecure protocol http")
 	}
+	if mp.Namespace != strings.ToLower(mp.Namespace) {
+		return fmt.Errorf("namespace must be lowercase, but is %s", mp.Namespace)
+	}
+	if mp.Repository != strings.ToLower(mp.Repository) {
+		return fmt.Errorf("model name must be lowercase, but is %s", mp.Repository)
+	}
 
 	manifest, _, err := GetManifest(mp)
 	if err != nil {

+ 44 - 0
server/images_test.go

@@ -0,0 +1,44 @@
+package server
+
+import (
+	"context"
+	"testing"
+
+	"github.com/ollama/ollama/api"
+	"github.com/stretchr/testify/assert"
+)
+
+func TestPushModel(t *testing.T) {
+	noOpProgress := func(resp api.ProgressResponse) {}
+
+	tests := []struct {
+		modelStr string
+		regOpts  *registryOptions
+		wantErr  string
+	}{
+		{
+			modelStr: "http://example.com/namespace/repo:tag",
+			regOpts:  &registryOptions{Insecure: false},
+			wantErr:  "insecure protocol http",
+		},
+		{
+			modelStr: "docker://Example/repo:tag",
+			regOpts:  &registryOptions{},
+			wantErr:  "namespace must be lowercase, but is Example",
+		},
+		{
+			modelStr: "docker://example/Repo:tag",
+			regOpts:  &registryOptions{},
+			wantErr:  "model name must be lowercase, but is Repo",
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.modelStr, func(t *testing.T) {
+			err := PushModel(context.Background(), tt.modelStr, tt.regOpts, noOpProgress)
+
+			assert.Error(t, err)
+			assert.EqualError(t, err, tt.wantErr)
+		})
+	}
+}