Skip to content

Commit

Permalink
Break up version.go as it contains version and api verification logic
Browse files Browse the repository at this point in the history
Signed-off-by: Natalie Arellano <[email protected]>
  • Loading branch information
natalieparellano committed May 26, 2022
1 parent ab805c8 commit 764fd44
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 114 deletions.
115 changes: 115 additions & 0 deletions cmd/apis.go
Original file line number Diff line number Diff line change
@@ -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,
)
}
6 changes: 3 additions & 3 deletions cmd/version_test.go → cmd/apis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down
111 changes: 0 additions & 111 deletions cmd/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package cmd
import (
"fmt"
"strings"

"github.com/buildpacks/lifecycle/api"
)

// The following variables are injected at compile time.
Expand All @@ -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
Expand All @@ -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,
)
}

0 comments on commit 764fd44

Please sign in to comment.