Skip to content

Commit

Permalink
New lifecycle parameter defaults
Browse files Browse the repository at this point in the history
* default layers dir -> /layers
* default app dir -> /workspace
* make defaulting consistent for all params (env can override hardcoded
default)
* prefix env var keys with CNB_ instead of PACK_

[#77]

Signed-off-by: Danny Joyce <[email protected]>
Signed-off-by: Emily Casey <[email protected]>
  • Loading branch information
Danny Joyce authored and ekcasey committed Mar 28, 2019
1 parent 9efad7e commit 439b525
Show file tree
Hide file tree
Showing 9 changed files with 59 additions and 156 deletions.
5 changes: 2 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,8 @@ RUN \
groupadd pack --gid ${pack_gid} && \
useradd --uid ${pack_uid} --gid ${pack_gid} -m -s /bin/bash pack

ENV PACK_USER_ID=${pack_uid}
ENV PACK_GROUP_ID=${pack_gid}
ENV PACK_USER_GID=${pack_gid}
ENV CNB_USER_ID=${pack_uid}
ENV CNB_GROUP_ID=${pack_gid}

COPY --from=builder /go/bin /lifecycle

Expand Down
2 changes: 1 addition & 1 deletion cmd/analyzer/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func analyzer() error {

var err error
var previousImage image.Image
factory, err := image.NewFactory(image.WithOutWriter(os.Stdout), image.WithEnvKeychain, image.WithLegacyEnvKeychain)
factory, err := image.NewFactory(image.WithOutWriter(os.Stdout), image.WithEnvKeychain)
if err != nil {
return err
}
Expand Down
91 changes: 43 additions & 48 deletions cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,92 +10,78 @@ import (
)

const (
DefaultLayersDir = "/workspace"
DefaultAppDir = "/workspace/app"
DefaultBuildpacksDir = "/buildpacks"
DefaultPlatformDir = "/platform"
DefaultOrderPath = "/buildpacks/order.toml"
DefaultGroupPath = "./group.toml"
DefaultStackPath = "/buildpacks/stack.toml"
DefaultPlanPath = "./plan.toml"
DefaultUseDaemon = false
DefaultUseCredHelpers = false

EnvRunImage = "PACK_RUN_IMAGE"
EnvUID = "PACK_USER_ID"
EnvGID = "PACK_GROUP_ID"
EnvLayersDir = "PACK_LAYERS_DIR"
EnvAppDir = "PACK_APP_DIR"
EnvLegacyRegistryAuth = "PACK_REGISTRY_AUTH"
EnvRegistryAuth = "CNB_REGISTRY_AUTH"
EnvStackPath = "CNB_STACK_PATH"
DefaultLayersDir = "/layers"
DefaultAppDir = "/workspace"
DefaultBuildpacksDir = "/buildpacks"
DefaultPlatformDir = "/platform"
DefaultOrderPath = "/buildpacks/order.toml"
DefaultGroupPath = "./group.toml"
DefaultStackPath = "/buildpacks/stack.toml"
DefaultPlanPath = "./plan.toml"

EnvLayersDir = "CNB_LAYERS_DIR"
EnvAppDir = "CNB_APP_DIR"
EnvBuildpacksDir = "CNB_BUILDPACKS_DIR"
EnvPlatformDir = "CNB_PLATFORM_DIR"
EnvOrderPath = "CNB_ORDER_PATH"
EnvGroupPath = "CNB_GROUP_PATH"
EnvStackPath = "CNB_STACK_PATH"
EnvPlanPath = "CNB_PLAN_PATH"
EnvUseDaemon = "CNB_USE_DAEMON" // defaults to false
EnvUseHelpers = "CNB_USE_CRED_HELPERS" // defaults to false
EnvRunImage = "CNB_RUN_IMAGE"
EnvCacheImage = "CNB_CACHE_IMAGE"
EnvUID = "CNB_USER_ID"
EnvGID = "CNB_GROUP_ID"
EnvRegistryAuth = "CNB_REGISTRY_AUTH"
)

type Labels map[string]string

func (l Labels) String() string {
b := strings.Builder{}
for k, v := range l {
b.WriteString(fmt.Sprintf("%s=%s ", k, v))
}
return b.String()
}

func (l Labels) Set(value string) error {
pair := strings.Split(value, "=")
if len(pair) != 2 {
return fmt.Errorf("please provide valid labels in a key=value format")
}
l[pair[0]] = pair[1]
return nil
}

func FlagLayersDir(dir *string) {
flag.StringVar(dir, "layers", DefaultLayersDir, "path to layers directory")
flag.StringVar(dir, "layers", envWithDefault(EnvLayersDir, DefaultLayersDir), "path to layers directory")
}

func FlagAppDir(dir *string) {
flag.StringVar(dir, "app", DefaultAppDir, "path to app directory")
flag.StringVar(dir, "app", envWithDefault(EnvAppDir, DefaultAppDir), "path to app directory")
}

func FlagBuildpacksDir(dir *string) {
flag.StringVar(dir, "buildpacks", DefaultBuildpacksDir, "path to buildpacks directory")
flag.StringVar(dir, "buildpacks", envWithDefault(EnvBuildpacksDir, DefaultBuildpacksDir), "path to buildpacks directory")
}

func FlagPlatformDir(dir *string) {
flag.StringVar(dir, "platform", DefaultPlatformDir, "path to platform directory")
flag.StringVar(dir, "platform", envWithDefault(EnvPlatformDir, DefaultPlatformDir), "path to platform directory")
}

func FlagOrderPath(path *string) {
flag.StringVar(path, "order", DefaultOrderPath, "path to order.toml")
flag.StringVar(path, "order", envWithDefault(EnvOrderPath, DefaultOrderPath), "path to order.toml")
}

func FlagGroupPath(path *string) {
flag.StringVar(path, "group", DefaultGroupPath, "path to group.toml")
flag.StringVar(path, "group", envWithDefault(EnvGroupPath, DefaultGroupPath), "path to group.toml")
}

func FlagStackPath(path *string) {
flag.StringVar(path, "stack", envWithDefault(EnvStackPath, DefaultStackPath), "path to stack.toml")
}

func FlagPlanPath(path *string) {
flag.StringVar(path, "plan", DefaultPlanPath, "path to plan.toml")
flag.StringVar(path, "plan", envWithDefault(EnvPlanPath, DefaultPlanPath), "path to plan.toml")
}

func FlagRunImage(image *string) {
flag.StringVar(image, "image", os.Getenv(EnvRunImage), "reference to run image")
}

func FlagCacheImage(image *string) {
flag.StringVar(image, "image", "", "cache image tag name")
flag.StringVar(image, "image", os.Getenv(EnvCacheImage), "cache image tag name")
}

func FlagUseDaemon(use *bool) {
flag.BoolVar(use, "daemon", DefaultUseDaemon, "export to docker daemon")
flag.BoolVar(use, "daemon", boolEnv(EnvUseDaemon), "export to docker daemon")
}

func FlagUseCredHelpers(use *bool) {
flag.BoolVar(use, "helpers", DefaultUseCredHelpers, "use credential helpers")
flag.BoolVar(use, "helpers", boolEnv(EnvUseHelpers), "use credential helpers")
}

func FlagUID(uid *int) {
Expand Down Expand Up @@ -167,6 +153,15 @@ func intEnv(k string) int {
return d
}

func boolEnv(k string) bool {
v := os.Getenv(k)
b, err := strconv.ParseBool(v)
if err != nil {
return false
}
return b
}

func envWithDefault(key string, defaultVal string) string {
if envVal := os.Getenv(key); envVal != "" {
return envVal
Expand Down
2 changes: 1 addition & 1 deletion cmd/exporter/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ func export() error {
ArtifactsDir: artifactsDir,
}

factory, err := image.NewFactory(image.WithOutWriter(os.Stdout), image.WithEnvKeychain, image.WithLegacyEnvKeychain)
factory, err := image.NewFactory(image.WithOutWriter(os.Stdout), image.WithEnvKeychain)
if err != nil {
return err
}
Expand Down
16 changes: 8 additions & 8 deletions exporter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,18 +287,18 @@ func testExporter(t *testing.T, when spec.G, it spec.S) {
h.AssertEq(t, metadata.Stack.RunImage.Mirrors, []string{"registry.example.com/some/run", "other.example.com/some/run"})
})

it("sets PACK_LAYERS_DIR", func() {
it("sets CNB_LAYERS_DIR", func() {
h.AssertNil(t, exporter.Export(layersDir, appDir, fakeRunImage, fakeOriginalImage, launcherPath, stack))

val, err := fakeRunImage.Env("PACK_LAYERS_DIR")
val, err := fakeRunImage.Env("CNB_LAYERS_DIR")
h.AssertNil(t, err)
h.AssertEq(t, val, layersDir)
})

it("sets PACK_APP_DIR", func() {
it("sets CNB_APP_DIR", func() {
h.AssertNil(t, exporter.Export(layersDir, appDir, fakeRunImage, fakeOriginalImage, launcherPath, stack))

val, err := fakeRunImage.Env("PACK_APP_DIR")
val, err := fakeRunImage.Env("CNB_APP_DIR")
h.AssertNil(t, err)
h.AssertEq(t, val, appDir)
})
Expand Down Expand Up @@ -497,18 +497,18 @@ func testExporter(t *testing.T, when spec.G, it spec.S) {
})
})

it("sets PACK_LAYERS_DIR", func() {
it("sets CNB_LAYERS_DIR", func() {
h.AssertNil(t, exporter.Export(layersDir, appDir, fakeRunImage, nonExistingOriginalImage, launcherPath, stack))

val, err := fakeRunImage.Env("PACK_LAYERS_DIR")
val, err := fakeRunImage.Env("CNB_LAYERS_DIR")
h.AssertNil(t, err)
h.AssertEq(t, val, layersDir)
})

it("sets PACK_APP_DIR", func() {
it("sets CNB_APP_DIR", func() {
h.AssertNil(t, exporter.Export(layersDir, appDir, fakeRunImage, nonExistingOriginalImage, launcherPath, stack))

val, err := fakeRunImage.Env("PACK_APP_DIR")
val, err := fakeRunImage.Env("CNB_APP_DIR")
h.AssertNil(t, err)
h.AssertEq(t, val, appDir)
})
Expand Down
20 changes: 0 additions & 20 deletions image/auth/legacy_env_keychain.go

This file was deleted.

67 changes: 0 additions & 67 deletions image/auth/legacy_env_keychain_test.go

This file was deleted.

4 changes: 0 additions & 4 deletions image/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,6 @@ func WithEnvKeychain(factory *Factory) {
factory.Keychain = authn.NewMultiKeychain(&auth.EnvKeychain{}, factory.Keychain)
}

func WithLegacyEnvKeychain(factory *Factory) {
factory.Keychain = authn.NewMultiKeychain(&auth.LegacyEnvKeychain{}, factory.Keychain)
}

func WithOutWriter(w io.Writer) func(factory *Factory) {
return func(factory *Factory) {
factory.Out = w
Expand Down
8 changes: 4 additions & 4 deletions layers.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ type cacheType int
const (
cacheStaleNoMetadata cacheType = iota
cacheStaleWrongSHA
cacheNotForLaunch // we can't determine whether the cache is stale for launch=false layers
cacheNotForLaunch // we can't determine whether the cache is stale for launch=false layers
cacheValid
cacheMalformed
)
Expand Down Expand Up @@ -212,14 +212,14 @@ type identifiableLayer interface {
func fixPerms(path string) error {
uid, err := strconv.Atoi(os.Getenv(cmd.EnvUID))
if err != nil {
return errors.Wrapf(err, "failed to convert PACK_USER_ID '%s' to int", os.Getenv(cmd.EnvUID))
return errors.Wrapf(err, "failed to convert %s '%s' to int", cmd.EnvUID, os.Getenv(cmd.EnvUID))
}
gid, err := strconv.Atoi(os.Getenv(cmd.EnvGID))
if err != nil {
return errors.Wrapf(err, "failed to convert PACK_GROUP_ID '%s' to int", os.Getenv(cmd.EnvGID))
return errors.Wrapf(err, "failed to convert %s '%s' to int", cmd.EnvUID, os.Getenv(cmd.EnvGID))
}
if err := recursiveChown(path, uid, gid); err != nil {
return errors.Wrapf(err, "chowning layers dir to PACK_UID/PACK_GID '%d/%d'", uid, gid)
return errors.Wrapf(err, "chowning layers dir to %s/%s '%d/%d'", cmd.EnvUID, cmd.EnvGID, uid, gid)
}
return nil
}
Expand Down

0 comments on commit 439b525

Please sign in to comment.