Allow dots in app names (closes #260)
Check / check (pull_request) Skipped
Check / check (pull_request) Skipped
App names may now contain dots, such as sneak.berlin: runs of lowercase letters and numbers joined by single dots or by hyphens, 2 to 63 characters. Docker accepts every such name in the app's image name, upaas-<name>; a dot needs a letter or number on both sides because Docker requires it. The rule also keeps a dot off either end, so the name is safe as a directory and log file name. The new and edit app forms use the same pattern. Their old one was not a valid regular expression under the flag browsers compile it with, so browsers ignored it. A test deploys an app named sneak.berlin against the fake Docker API and checks the image and container names with Docker's own rules. Model: opus-5-5
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
package deploy_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"slices"
|
||||
"testing"
|
||||
|
||||
"github.com/distribution/reference"
|
||||
"github.com/docker/docker/daemon/names"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"sneak.berlin/go/upaas/internal/models"
|
||||
)
|
||||
|
||||
// TestDeployAppWithDotInName deploys an app named sneak.berlin against a
|
||||
// fake Docker API and checks that Docker accepts the names of the image it
|
||||
// builds and of the container it runs, using Docker's own rules for each.
|
||||
func TestDeployAppWithDotInName(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
api := &fakeImageAPI{
|
||||
images: map[string][]string{},
|
||||
shortSHA: "abc1234",
|
||||
nextID: "sha256:built",
|
||||
}
|
||||
svc, db := newImageTestService(t, api)
|
||||
ctx := context.Background()
|
||||
|
||||
app := saveApp(t, db, "sneak.berlin", "", "")
|
||||
|
||||
deployment := models.NewDeployment(db)
|
||||
deployment.AppID = app.ID
|
||||
require.NoError(t, deployment.Save(ctx))
|
||||
|
||||
imageID, err := svc.BuildImage(ctx, app, deployment)
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, svc.DeployContainer(ctx, app, deployment, imageID))
|
||||
|
||||
images, _ := api.state()
|
||||
|
||||
api.mu.Lock()
|
||||
containers := slices.Clone(api.containers)
|
||||
api.mu.Unlock()
|
||||
|
||||
require.Equal(t, map[string][]string{
|
||||
"sha256:built": {"upaas-sneak.berlin:abc1234"},
|
||||
}, images)
|
||||
|
||||
_, err = reference.ParseNormalizedNamed("upaas-sneak.berlin:abc1234")
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, []string{"upaas-sneak.berlin"}, containers)
|
||||
assert.Regexp(t, names.RestrictedNamePattern, containers[0])
|
||||
|
||||
assert.DirExists(t, svc.GetBuildDirExported(app.Name))
|
||||
}
|
||||
Reference in New Issue
Block a user