mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-14 11:03:09 +02:00
feat(cnbBuild): added dockerimage to the telemetry data (#3501)
Co-authored-by: Philipp Stehle <philipp.stehle@sap.com> Co-authored-by: Sumit Kulhadia <sumit.kulhadia@sap.com> Co-authored-by: Johannes Dillmann <j.dillmann@sap.com>
This commit is contained in:
parent
4b2f61589d
commit
e7db09db12
@ -60,6 +60,7 @@ type cnbBuildTelemetryData struct {
|
|||||||
Buildpacks cnbBuildTelemetryDataBuildpacks `json:"buildpacks"`
|
Buildpacks cnbBuildTelemetryDataBuildpacks `json:"buildpacks"`
|
||||||
ProjectDescriptor cnbBuildTelemetryDataProjectDescriptor `json:"projectDescriptor"`
|
ProjectDescriptor cnbBuildTelemetryDataProjectDescriptor `json:"projectDescriptor"`
|
||||||
BuildTool string `json:"buildTool"`
|
BuildTool string `json:"buildTool"`
|
||||||
|
Builder string `json:"builder"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type cnbBuildTelemetryDataBuildEnv struct {
|
type cnbBuildTelemetryDataBuildEnv struct {
|
||||||
@ -139,11 +140,8 @@ func cnbBuild(config cnbBuildOptions, telemetryData *telemetry.CustomData, commo
|
|||||||
utils := newCnbBuildUtils()
|
utils := newCnbBuildUtils()
|
||||||
|
|
||||||
client := &piperhttp.Client{}
|
client := &piperhttp.Client{}
|
||||||
cnbTelemetry := cnbBuildTelemetry{
|
|
||||||
Version: 2,
|
|
||||||
}
|
|
||||||
|
|
||||||
err := callCnbBuild(&config, telemetryData, &cnbTelemetry, utils, commonPipelineEnvironment, client)
|
err := callCnbBuild(&config, telemetryData, utils, commonPipelineEnvironment, client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Entry().WithError(err).Fatal("step execution failed")
|
log.Entry().WithError(err).Fatal("step execution failed")
|
||||||
}
|
}
|
||||||
@ -402,6 +400,14 @@ func addConfigTelemetryData(utils cnbutils.BuildUtils, data *cnbBuildTelemetryDa
|
|||||||
data.BuildTool = buildTool
|
data.BuildTool = buildTool
|
||||||
|
|
||||||
data.Buildpacks.FromConfig = privacy.FilterBuildpacks(config.Buildpacks)
|
data.Buildpacks.FromConfig = privacy.FilterBuildpacks(config.Buildpacks)
|
||||||
|
|
||||||
|
dockerImage, err := getDockerImageValue("cnbBuild")
|
||||||
|
if err != nil {
|
||||||
|
log.Entry().Warnf("Error while preparing telemetry: retrieving docker image failed: '%v'", err)
|
||||||
|
data.Builder = ""
|
||||||
|
} else {
|
||||||
|
data.Builder = privacy.FilterBuilder(dockerImage)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addProjectDescriptorTelemetryData(data *cnbBuildTelemetryData, descriptor project.Descriptor) {
|
func addProjectDescriptorTelemetryData(data *cnbBuildTelemetryData, descriptor project.Descriptor) {
|
||||||
@ -421,7 +427,10 @@ func addProjectDescriptorTelemetryData(data *cnbBuildTelemetryData, descriptor p
|
|||||||
data.ProjectDescriptor.ExcludeUsed = descriptor.Exclude != nil
|
data.ProjectDescriptor.ExcludeUsed = descriptor.Exclude != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func callCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData, telemetry *cnbBuildTelemetry, utils cnbutils.BuildUtils, commonPipelineEnvironment *cnbBuildCommonPipelineEnvironment, httpClient piperhttp.Sender) error {
|
func callCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData, utils cnbutils.BuildUtils, commonPipelineEnvironment *cnbBuildCommonPipelineEnvironment, httpClient piperhttp.Sender) error {
|
||||||
|
telemetry := &cnbBuildTelemetry{
|
||||||
|
Version: 3,
|
||||||
|
}
|
||||||
mergedConfigs, err := processConfigs(*config, config.MultipleImages)
|
mergedConfigs, err := processConfigs(*config, config.MultipleImages)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to process config")
|
return errors.Wrap(err, "failed to process config")
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/SAP/jenkins-library/pkg/cnbutils"
|
"github.com/SAP/jenkins-library/pkg/cnbutils"
|
||||||
|
piperconf "github.com/SAP/jenkins-library/pkg/config"
|
||||||
piperhttp "github.com/SAP/jenkins-library/pkg/http"
|
piperhttp "github.com/SAP/jenkins-library/pkg/http"
|
||||||
"github.com/SAP/jenkins-library/pkg/mock"
|
"github.com/SAP/jenkins-library/pkg/mock"
|
||||||
"github.com/SAP/jenkins-library/pkg/telemetry"
|
"github.com/SAP/jenkins-library/pkg/telemetry"
|
||||||
@ -38,7 +39,7 @@ func assertLifecycleCalls(t *testing.T, runner *mock.ExecMockRunner, callNo int)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRunCnbBuild(t *testing.T) {
|
func TestRunCnbBuild(t *testing.T) {
|
||||||
t.Parallel()
|
configOptions.openFile = piperconf.OpenPiperFile
|
||||||
|
|
||||||
t.Run("prefers direct configuration", func(t *testing.T) {
|
t.Run("prefers direct configuration", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
@ -59,7 +60,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile("project.toml", []byte(projectToml))
|
utils.FilesMock.AddFile("project.toml", []byte(projectToml))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
runner := utils.ExecMockRunner
|
runner := utils.ExecMockRunner
|
||||||
@ -90,7 +91,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
telemetryData := telemetry.CustomData{}
|
telemetryData := telemetry.CustomData{}
|
||||||
err := callCnbBuild(&config, &telemetryData, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetryData, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
runner := utils.ExecMockRunner
|
runner := utils.ExecMockRunner
|
||||||
@ -122,7 +123,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
runner := utils.ExecMockRunner
|
runner := utils.ExecMockRunner
|
||||||
@ -147,7 +148,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
runner := utils.ExecMockRunner
|
runner := utils.ExecMockRunner
|
||||||
@ -177,7 +178,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
runner := utils.ExecMockRunner
|
runner := utils.ExecMockRunner
|
||||||
@ -220,7 +221,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, client)
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, client)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
result, err := utils.FilesMock.FileRead(caCertsTmpFile)
|
result, err := utils.FilesMock.FileRead(caCertsTmpFile)
|
||||||
@ -250,7 +251,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
runner := utils.ExecMockRunner
|
runner := utils.ExecMockRunner
|
||||||
@ -277,7 +278,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile("/workspace/pom.xml", []byte("test"))
|
utils.FilesMock.AddFile("/workspace/pom.xml", []byte("test"))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
runner := utils.ExecMockRunner
|
runner := utils.ExecMockRunner
|
||||||
@ -301,7 +302,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
runner := utils.ExecMockRunner
|
runner := utils.ExecMockRunner
|
||||||
@ -324,7 +325,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":"dXNlcjpwYXNz"}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":"dXNlcjpwYXNz"}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
assert.EqualError(t, err, "failed to generate CNB_REGISTRY_AUTH: json: cannot unmarshal string into Go struct field ConfigFile.auths of type types.AuthConfig")
|
assert.EqualError(t, err, "failed to generate CNB_REGISTRY_AUTH: json: cannot unmarshal string into Go struct field ConfigFile.auths of type types.AuthConfig")
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -341,7 +342,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils := newCnbBuildTestsUtils()
|
utils := newCnbBuildTestsUtils()
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
assert.EqualError(t, err, "failed to generate CNB_REGISTRY_AUTH: could not read 'not-there/config.json'")
|
assert.EqualError(t, err, "failed to generate CNB_REGISTRY_AUTH: could not read 'not-there/config.json'")
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -358,7 +359,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils := newCnbBuildTestsUtils()
|
utils := newCnbBuildTestsUtils()
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
assert.EqualError(t, err, "failed to rename DockerConfigJSON file 'not-there': renaming file 'not-there' is not supported, since it does not exist, or is not a leaf-entry")
|
assert.EqualError(t, err, "failed to rename DockerConfigJSON file 'not-there': renaming file 'not-there' is not supported, since it does not exist, or is not a leaf-entry")
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -369,7 +370,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
|
|
||||||
utils := newCnbBuildTestsUtils()
|
utils := newCnbBuildTestsUtils()
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
assert.EqualError(t, err, "the provided dockerImage is not a valid builder: binary '/cnb/lifecycle/creator' not found")
|
assert.EqualError(t, err, "the provided dockerImage is not a valid builder: binary '/cnb/lifecycle/creator' not found")
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -389,7 +390,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
assert.EqualError(t, err, "failed to copy certificates: cannot copy '/etc/ssl/certs/ca-certificates.crt': file does not exist")
|
assert.EqualError(t, err, "failed to copy certificates: cannot copy '/etc/ssl/certs/ca-certificates.crt': file does not exist")
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -429,8 +430,7 @@ uri = "some-buildpack"`))
|
|||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
telemetryData := telemetry.CustomData{}
|
telemetryData := telemetry.CustomData{}
|
||||||
cnbTelemetry := cnbBuildTelemetry{Version: 2}
|
err := callCnbBuild(&config, &telemetryData, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
err := callCnbBuild(&config, &telemetryData, &cnbTelemetry, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
customDataAsString := telemetryData.Custom1
|
customDataAsString := telemetryData.Custom1
|
||||||
@ -438,12 +438,13 @@ uri = "some-buildpack"`))
|
|||||||
err = json.Unmarshal([]byte(customDataAsString), &customData)
|
err = json.Unmarshal([]byte(customDataAsString), &customData)
|
||||||
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, 2, customData.Version)
|
assert.Equal(t, 3, customData.Version)
|
||||||
require.Equal(t, 1, len(customData.Data))
|
require.Equal(t, 1, len(customData.Data))
|
||||||
assert.Equal(t, "3.1.5", customData.Data[0].ImageTag)
|
assert.Equal(t, "3.1.5", customData.Data[0].ImageTag)
|
||||||
assert.Equal(t, "folder", string(customData.Data[0].Path))
|
assert.Equal(t, "folder", string(customData.Data[0].Path))
|
||||||
assert.Contains(t, customData.Data[0].AdditionalTags, "latest")
|
assert.Contains(t, customData.Data[0].AdditionalTags, "latest")
|
||||||
assert.Contains(t, customData.Data[0].BindingKeys, "SECRET")
|
assert.Contains(t, customData.Data[0].BindingKeys, "SECRET")
|
||||||
|
assert.Equal(t, "paketobuildpacks/builder:full", customData.Data[0].Builder)
|
||||||
|
|
||||||
assert.Contains(t, customData.Data[0].Buildpacks.FromConfig, "paketobuildpacks/java")
|
assert.Contains(t, customData.Data[0].Buildpacks.FromConfig, "paketobuildpacks/java")
|
||||||
assert.NotContains(t, customData.Data[0].Buildpacks.FromProjectDescriptor, "paketobuildpacks/java")
|
assert.NotContains(t, customData.Data[0].Buildpacks.FromProjectDescriptor, "paketobuildpacks/java")
|
||||||
@ -490,8 +491,7 @@ uri = "some-buildpack"
|
|||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
telemetryData := telemetry.CustomData{}
|
telemetryData := telemetry.CustomData{}
|
||||||
cnbTelemetry := cnbBuildTelemetry{Version: 2}
|
err := callCnbBuild(&config, &telemetryData, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
err := callCnbBuild(&config, &telemetryData, &cnbTelemetry, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
customDataAsString := telemetryData.Custom1
|
customDataAsString := telemetryData.Custom1
|
||||||
@ -533,7 +533,7 @@ uri = "some-buildpack"
|
|||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
telemetryData := telemetry.CustomData{}
|
telemetryData := telemetry.CustomData{}
|
||||||
err := callCnbBuild(&config, &telemetryData, &cnbBuildTelemetry{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetryData, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
customDataAsString := telemetryData.Custom1
|
customDataAsString := telemetryData.Custom1
|
||||||
|
@ -17,12 +17,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type configCommandOptions struct {
|
type configCommandOptions struct {
|
||||||
output string //output format, so far only JSON
|
output string // output format, so far only JSON
|
||||||
outputFile string //if set: path to file where the output should be written to
|
outputFile string // if set: path to file where the output should be written to
|
||||||
parametersJSON string //parameters to be considered in JSON format
|
parametersJSON string // parameters to be considered in JSON format
|
||||||
stageConfig bool
|
stageConfig bool
|
||||||
stageConfigAcceptedParameters []string
|
stageConfigAcceptedParameters []string
|
||||||
stepMetadata string //metadata to be considered, can be filePath or ENV containing JSON in format 'ENV:MY_ENV_VAR'
|
stepMetadata string // metadata to be considered, can be filePath or ENV containing JSON in format 'ENV:MY_ENV_VAR'
|
||||||
stepName string
|
stepName string
|
||||||
contextConfig bool
|
contextConfig bool
|
||||||
openFile func(s string, t map[string]string) (io.ReadCloser, error)
|
openFile func(s string, t map[string]string) (io.ReadCloser, error)
|
||||||
@ -115,7 +115,7 @@ func getStageConfig() (config.StepConfig, error) {
|
|||||||
|
|
||||||
customConfig, err := configOptions.openFile(projectConfigFile, GeneralConfig.GitHubAccessTokens)
|
customConfig, err := configOptions.openFile(projectConfigFile, GeneralConfig.GitHubAccessTokens)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !os.IsNotExist(err) {
|
if !errors.Is(err, os.ErrNotExist) {
|
||||||
return stepConfig, errors.Wrapf(err, "config: open configuration file '%v' failed", projectConfigFile)
|
return stepConfig, errors.Wrapf(err, "config: open configuration file '%v' failed", projectConfigFile)
|
||||||
}
|
}
|
||||||
customConfig = nil
|
customConfig = nil
|
||||||
@ -171,7 +171,7 @@ func getConfig() (config.StepConfig, error) {
|
|||||||
|
|
||||||
customConfig, err := configOptions.openFile(projectConfigFile, GeneralConfig.GitHubAccessTokens)
|
customConfig, err := configOptions.openFile(projectConfigFile, GeneralConfig.GitHubAccessTokens)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !os.IsNotExist(err) {
|
if !errors.Is(err, os.ErrNotExist) {
|
||||||
return stepConfig, errors.Wrapf(err, "config: open configuration file '%v' failed", projectConfigFile)
|
return stepConfig, errors.Wrapf(err, "config: open configuration file '%v' failed", projectConfigFile)
|
||||||
}
|
}
|
||||||
customConfig = nil
|
customConfig = nil
|
||||||
@ -235,7 +235,7 @@ func generateConfig(utils getConfigUtils) error {
|
|||||||
|
|
||||||
func addConfigFlags(cmd *cobra.Command) {
|
func addConfigFlags(cmd *cobra.Command) {
|
||||||
|
|
||||||
//ToDo: support more output options, like https://kubernetes.io/docs/reference/kubectl/overview/#formatting-output
|
// ToDo: support more output options, like https://kubernetes.io/docs/reference/kubectl/overview/#formatting-output
|
||||||
cmd.Flags().StringVar(&configOptions.output, "output", "json", "Defines the output format")
|
cmd.Flags().StringVar(&configOptions.output, "output", "json", "Defines the output format")
|
||||||
cmd.Flags().StringVar(&configOptions.outputFile, "outputFile", "", "Defines a file path. f set, the output will be written to the defines file")
|
cmd.Flags().StringVar(&configOptions.outputFile, "outputFile", "", "Defines a file path. f set, the output will be written to the defines file")
|
||||||
|
|
||||||
@ -256,20 +256,20 @@ func defaultsAndFilters(metadata *config.StepData, stepName string) ([]io.ReadCl
|
|||||||
}
|
}
|
||||||
return []io.ReadCloser{defaults}, metadata.GetContextParameterFilters(), nil
|
return []io.ReadCloser{defaults}, metadata.GetContextParameterFilters(), nil
|
||||||
}
|
}
|
||||||
//ToDo: retrieve default values from metadata
|
// ToDo: retrieve default values from metadata
|
||||||
return []io.ReadCloser{}, metadata.GetParameterFilters(), nil
|
return []io.ReadCloser{}, metadata.GetParameterFilters(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func applyContextConditions(metadata config.StepData, stepConfig *config.StepConfig) {
|
func applyContextConditions(metadata config.StepData, stepConfig *config.StepConfig) {
|
||||||
//consider conditions for context configuration
|
// consider conditions for context configuration
|
||||||
|
|
||||||
//containers
|
// containers
|
||||||
config.ApplyContainerConditions(metadata.Spec.Containers, stepConfig)
|
config.ApplyContainerConditions(metadata.Spec.Containers, stepConfig)
|
||||||
|
|
||||||
//sidecars
|
// sidecars
|
||||||
config.ApplyContainerConditions(metadata.Spec.Sidecars, stepConfig)
|
config.ApplyContainerConditions(metadata.Spec.Sidecars, stepConfig)
|
||||||
|
|
||||||
//ToDo: remove all unnecessary sub maps?
|
// ToDo: remove all unnecessary sub maps?
|
||||||
// e.g. extract delete() from applyContainerConditions - loop over all stepConfig.Config[param.Value] and remove ...
|
// e.g. extract delete() from applyContainerConditions - loop over all stepConfig.Config[param.Value] and remove ...
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,7 +283,7 @@ func prepareOutputEnvironment(outputResources []config.StepResources, envRootPat
|
|||||||
paramPath = path.Join(paramPath, paramFields[0]["name"])
|
paramPath = path.Join(paramPath, paramFields[0]["name"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if _, err := os.Stat(filepath.Dir(paramPath)); os.IsNotExist(err) {
|
if _, err := os.Stat(filepath.Dir(paramPath)); errors.Is(err, os.ErrNotExist) {
|
||||||
log.Entry().Debugf("Creating directory: %v", filepath.Dir(paramPath))
|
log.Entry().Debugf("Creating directory: %v", filepath.Dir(paramPath))
|
||||||
os.MkdirAll(filepath.Dir(paramPath), 0777)
|
os.MkdirAll(filepath.Dir(paramPath), 0777)
|
||||||
}
|
}
|
||||||
@ -299,7 +299,7 @@ func prepareOutputEnvironment(outputResources []config.StepResources, envRootPat
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, dir := range stepOutputDirectories {
|
for _, dir := range stepOutputDirectories {
|
||||||
if _, err := os.Stat(dir); os.IsNotExist(err) {
|
if _, err := os.Stat(dir); errors.Is(err, os.ErrNotExist) {
|
||||||
log.Entry().Debugf("Creating directory: %v", dir)
|
log.Entry().Debugf("Creating directory: %v", dir)
|
||||||
os.MkdirAll(dir, 0777)
|
os.MkdirAll(dir, 0777)
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,11 @@ var allowedBuildpackSources = []struct {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FilterBuilder(builder string) string {
|
||||||
|
result := FilterBuildpacks([]string{builder})
|
||||||
|
return result[0]
|
||||||
|
}
|
||||||
|
|
||||||
// FilterBuildpacks filters a list of buildpacks to redact Personally Identifiable Information (PII) like the hostname of a personal registry
|
// FilterBuildpacks filters a list of buildpacks to redact Personally Identifiable Information (PII) like the hostname of a personal registry
|
||||||
func FilterBuildpacks(buildpacks []string) []string {
|
func FilterBuildpacks(buildpacks []string) []string {
|
||||||
result := make([]string, 0, len(buildpacks))
|
result := make([]string, 0, len(buildpacks))
|
||||||
|
@ -110,3 +110,30 @@ func TestCnbPrivacy_FilterEnv(t *testing.T) {
|
|||||||
assert.Empty(t, filteredEnv)
|
assert.Empty(t, filteredEnv)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCnbPrivacy_FilterBuilder(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
t.Run("allows paketo", func(t *testing.T) {
|
||||||
|
builder := []string{
|
||||||
|
"paketobuildpacks/builder:tiny",
|
||||||
|
"paketobuildpacks/builder:base",
|
||||||
|
"paketobuildpacks/builder:full",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, b := range builder {
|
||||||
|
filteredBuilder := privacy.FilterBuilder(b)
|
||||||
|
assert.Equal(t, b, filteredBuilder)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("filters unknown builders", func(t *testing.T) {
|
||||||
|
builder := "notpaketobuildpacks/builder:base"
|
||||||
|
|
||||||
|
filteredBuilder := privacy.FilterBuilder(builder)
|
||||||
|
|
||||||
|
assert.Equal(t, "<redacted>", filteredBuilder)
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -222,7 +222,7 @@ func (c *Config) GetStepConfig(flagValues map[string]interface{}, paramJSON stri
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Entry().Warnf("failed to parse parameters from environment: %v", err)
|
log.Entry().Warnf("failed to parse parameters from environment: %v", err)
|
||||||
} else {
|
} else {
|
||||||
//apply aliases
|
// apply aliases
|
||||||
for _, p := range parameters {
|
for _, p := range parameters {
|
||||||
params = setParamValueFromAlias(stepName, params, filters.Parameters, p.Name, p.Aliases)
|
params = setParamValueFromAlias(stepName, params, filters.Parameters, p.Name, p.Aliases)
|
||||||
}
|
}
|
||||||
@ -293,7 +293,7 @@ func (c *Config) GetStepConfig(flagValues map[string]interface{}, paramJSON stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetVaultCredentials sets the appRoleID and the appRoleSecretID or the vaultTokento load additional
|
// SetVaultCredentials sets the appRoleID and the appRoleSecretID or the vaultTokento load additional
|
||||||
//configuration from vault
|
// configuration from vault
|
||||||
// Either appRoleID and appRoleSecretID or vaultToken must be specified.
|
// Either appRoleID and appRoleSecretID or vaultToken must be specified.
|
||||||
func (c *Config) SetVaultCredentials(appRoleID, appRoleSecretID string, vaultToken string) {
|
func (c *Config) SetVaultCredentials(appRoleID, appRoleSecretID string, vaultToken string) {
|
||||||
c.vaultCredentials = VaultCredentials{
|
c.vaultCredentials = VaultCredentials{
|
||||||
@ -359,8 +359,9 @@ func GetYAML(data interface{}) (string, error) {
|
|||||||
// OpenPiperFile provides functionality to retrieve configuration via file or http
|
// OpenPiperFile provides functionality to retrieve configuration via file or http
|
||||||
func OpenPiperFile(name string, accessTokens map[string]string) (io.ReadCloser, error) {
|
func OpenPiperFile(name string, accessTokens map[string]string) (io.ReadCloser, error) {
|
||||||
if len(name) == 0 {
|
if len(name) == 0 {
|
||||||
return nil, fmt.Errorf("no filename provided")
|
return nil, errors.Wrap(os.ErrNotExist, "no filename provided")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !strings.HasPrefix(name, "http://") && !strings.HasPrefix(name, "https://") {
|
if !strings.HasPrefix(name, "http://") && !strings.HasPrefix(name, "https://") {
|
||||||
return os.Open(name)
|
return os.Open(name)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user