diff --git a/cmd/apis.go b/cmd/apis.go new file mode 100644 index 000000000..4c40a7ad9 --- /dev/null +++ b/cmd/apis.go @@ -0,0 +1,115 @@ +package cmd + +import ( + "fmt" + "github.com/buildpacks/lifecycle/api" +) + +var ( + DeprecationMode = EnvOrDefault(EnvDeprecationMode, DefaultDeprecationMode) + ExperimentalMode = EnvOrDefault(EnvExperimentalMode, DefaultExperimentalMode) +) + +const ( + ModeQuiet = "quiet" + ModeWarn = "warn" + ModeError = "error" +) + +func VerifyPlatformAPI(requested string) error { + requestedAPI, err := api.NewVersion(requested) + if err != nil { + return FailErrCode( + fmt.Errorf("parse platform API '%s'", requested), + CodeIncompatiblePlatformAPI, + ) + } + if api.Platform.IsSupported(requestedAPI) { + if api.Platform.IsDeprecated(requestedAPI) { + switch DeprecationMode { + case ModeQuiet: + break + case ModeError: + DefaultLogger.Errorf("Platform requested deprecated API '%s'", requested) + DefaultLogger.Errorf("Deprecated APIs are disabled by %s=%s", EnvDeprecationMode, ModeError) + return platformAPIError(requested) + case ModeWarn: + DefaultLogger.Warnf("Platform requested deprecated API '%s'", requested) + default: + DefaultLogger.Warnf("Platform requested deprecated API '%s'", requested) + } + } + if api.Platform.IsExperimental(requestedAPI) { + switch ExperimentalMode { + case ModeQuiet: + break + case ModeError: + DefaultLogger.Errorf("Platform requested experimental API '%s'", requested) + DefaultLogger.Errorf("Experimental APIs are disabled by %s=%s", EnvExperimentalMode, ModeError) + return platformAPIError(requested) + case ModeWarn: + DefaultLogger.Warnf("Platform requested experimental API '%s'", requested) + default: + DefaultLogger.Warnf("Platform requested experimental API '%s'", requested) + } + } + return nil + } + return platformAPIError(requested) +} + +func VerifyBuildpackAPI(bp string, requested string) error { + requestedAPI, err := api.NewVersion(requested) + if err != nil { + return FailErrCode( + fmt.Errorf("parse buildpack API '%s' for buildpack '%s'", requestedAPI, bp), + CodeIncompatibleBuildpackAPI, + ) + } + if api.Buildpack.IsSupported(requestedAPI) { + if api.Buildpack.IsDeprecated(requestedAPI) { + switch DeprecationMode { + case ModeQuiet: + break + case ModeError: + DefaultLogger.Errorf("Buildpack '%s' requests deprecated API '%s'", bp, requested) + DefaultLogger.Errorf("Deprecated APIs are disabled by %s=%s", EnvDeprecationMode, ModeError) + return buildpackAPIError(bp, requested) + case ModeWarn: + DefaultLogger.Warnf("Buildpack '%s' requests deprecated API '%s'", bp, requested) + default: + DefaultLogger.Warnf("Buildpack '%s' requests deprecated API '%s'", bp, requested) + } + } + if api.Buildpack.IsExperimental(requestedAPI) { + switch ExperimentalMode { + case ModeQuiet: + break + case ModeError: + DefaultLogger.Errorf("Buildpack '%s' requests experimental API '%s'", bp, requested) + DefaultLogger.Errorf("Experimental APIs are disabled by %s=%s", EnvExperimentalMode, ModeError) + return buildpackAPIError(bp, requested) + case ModeWarn: + DefaultLogger.Warnf("Buildpack '%s' requests experimental API '%s'", bp, requested) + default: + DefaultLogger.Warnf("Buildpack '%s' requests experimental API '%s'", bp, requested) + } + } + return nil + } + return buildpackAPIError(bp, requested) +} + +func platformAPIError(requested string) error { + return FailErrCode( + fmt.Errorf("set platform API: platform API version '%s' is incompatible with the lifecycle", requested), + CodeIncompatiblePlatformAPI, + ) +} + +func buildpackAPIError(bp string, requested string) error { + return FailErrCode( + fmt.Errorf("set API for buildpack '%s': buildpack API version '%s' is incompatible with the lifecycle", bp, requested), + CodeIncompatibleBuildpackAPI, + ) +} diff --git a/cmd/version_test.go b/cmd/apis_test.go similarity index 97% rename from cmd/version_test.go rename to cmd/apis_test.go index 8b198963e..5dea2b30f 100644 --- a/cmd/version_test.go +++ b/cmd/apis_test.go @@ -13,11 +13,11 @@ import ( h "github.com/buildpacks/lifecycle/testhelpers" ) -func TestPlatformAPI(t *testing.T) { - spec.Run(t, "PlatformAPI", testPlatformAPI, spec.Sequential(), spec.Report(report.Terminal{})) +func TestAPIVerifier(t *testing.T) { + spec.Run(t, "APIVerifier", testAPIVerifier, spec.Sequential(), spec.Report(report.Terminal{})) } -func testPlatformAPI(t *testing.T, when spec.G, it spec.S) { +func testAPIVerifier(t *testing.T, when spec.G, it spec.S) { var ( logHandler *memory.Handler ) diff --git a/cmd/version.go b/cmd/version.go index 487343513..3e6a4142e 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -3,8 +3,6 @@ package cmd import ( "fmt" "strings" - - "github.com/buildpacks/lifecycle/api" ) // The following variables are injected at compile time. @@ -17,17 +15,6 @@ var ( SCMRepository = "" ) -var ( - DeprecationMode = EnvOrDefault(EnvDeprecationMode, DefaultDeprecationMode) - ExperimentalMode = EnvOrDefault(EnvExperimentalMode, DefaultExperimentalMode) -) - -const ( - ModeQuiet = "quiet" - ModeWarn = "warn" - ModeError = "error" -) - // buildVersion is a display format of the version and build metadata in compliance with semver. func buildVersion() string { // noinspection GoBoolExpressions @@ -37,101 +24,3 @@ func buildVersion() string { return fmt.Sprintf("%s+%s", Version, SCMCommit) } - -func VerifyPlatformAPI(requested string) error { - requestedAPI, err := api.NewVersion(requested) - if err != nil { - return FailErrCode( - fmt.Errorf("parse platform API '%s'", requested), - CodeIncompatiblePlatformAPI, - ) - } - if api.Platform.IsSupported(requestedAPI) { - if api.Platform.IsDeprecated(requestedAPI) { - switch DeprecationMode { - case ModeQuiet: - break - case ModeError: - DefaultLogger.Errorf("Platform requested deprecated API '%s'", requested) - DefaultLogger.Errorf("Deprecated APIs are disabled by %s=%s", EnvDeprecationMode, ModeError) - return platformAPIError(requested) - case ModeWarn: - DefaultLogger.Warnf("Platform requested deprecated API '%s'", requested) - default: - DefaultLogger.Warnf("Platform requested deprecated API '%s'", requested) - } - } - if api.Platform.IsExperimental(requestedAPI) { - switch ExperimentalMode { - case ModeQuiet: - break - case ModeError: - DefaultLogger.Errorf("Platform requested experimental API '%s'", requested) - DefaultLogger.Errorf("Experimental APIs are disabled by %s=%s", EnvExperimentalMode, ModeError) - return platformAPIError(requested) - case ModeWarn: - DefaultLogger.Warnf("Platform requested experimental API '%s'", requested) - default: - DefaultLogger.Warnf("Platform requested experimental API '%s'", requested) - } - } - return nil - } - return platformAPIError(requested) -} - -func VerifyBuildpackAPI(bp string, requested string) error { - requestedAPI, err := api.NewVersion(requested) - if err != nil { - return FailErrCode( - fmt.Errorf("parse buildpack API '%s' for buildpack '%s'", requestedAPI, bp), - CodeIncompatibleBuildpackAPI, - ) - } - if api.Buildpack.IsSupported(requestedAPI) { - if api.Buildpack.IsDeprecated(requestedAPI) { - switch DeprecationMode { - case ModeQuiet: - break - case ModeError: - DefaultLogger.Errorf("Buildpack '%s' requests deprecated API '%s'", bp, requested) - DefaultLogger.Errorf("Deprecated APIs are disabled by %s=%s", EnvDeprecationMode, ModeError) - return buildpackAPIError(bp, requested) - case ModeWarn: - DefaultLogger.Warnf("Buildpack '%s' requests deprecated API '%s'", bp, requested) - default: - DefaultLogger.Warnf("Buildpack '%s' requests deprecated API '%s'", bp, requested) - } - } - if api.Buildpack.IsExperimental(requestedAPI) { - switch ExperimentalMode { - case ModeQuiet: - break - case ModeError: - DefaultLogger.Errorf("Buildpack '%s' requests experimental API '%s'", bp, requested) - DefaultLogger.Errorf("Experimental APIs are disabled by %s=%s", EnvExperimentalMode, ModeError) - return buildpackAPIError(bp, requested) - case ModeWarn: - DefaultLogger.Warnf("Buildpack '%s' requests experimental API '%s'", bp, requested) - default: - DefaultLogger.Warnf("Buildpack '%s' requests experimental API '%s'", bp, requested) - } - } - return nil - } - return buildpackAPIError(bp, requested) -} - -func platformAPIError(requested string) error { - return FailErrCode( - fmt.Errorf("set platform API: platform API version '%s' is incompatible with the lifecycle", requested), - CodeIncompatiblePlatformAPI, - ) -} - -func buildpackAPIError(bp string, requested string) error { - return FailErrCode( - fmt.Errorf("set API for buildpack '%s': buildpack API version '%s' is incompatible with the lifecycle", bp, requested), - CodeIncompatibleBuildpackAPI, - ) -}