mirror of
https://github.com/kemko/nomad.git
synced 2026-01-06 10:25:42 +03:00
* artifact: enable inheriting environment variables from client
This PR adds client configuration for specifying environment variables that
should be inherited by the artifact sandbox process from the Nomad Client agent.
Most users should not need to set these values but the configuration is provided
to ensure backwards compatability. Configuration of go-getter should ideally be
done through the artifact block in a jobspec task.
e.g.
```hcl
client {
artifact {
set_environment_variables = "TMPDIR,GIT_SSH_OPTS"
}
}
```
Closes #15498
* website: update set_environment_variables text to mention PATH
162 lines
4.4 KiB
Go
162 lines
4.4 KiB
Go
package config
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/hashicorp/nomad/ci"
|
|
"github.com/hashicorp/nomad/helper/pointer"
|
|
"github.com/hashicorp/nomad/nomad/structs/config"
|
|
"github.com/shoenig/test/must"
|
|
)
|
|
|
|
func TestArtifactConfigFromAgent(t *testing.T) {
|
|
ci.Parallel(t)
|
|
|
|
testCases := []struct {
|
|
name string
|
|
config *config.ArtifactConfig
|
|
exp *ArtifactConfig
|
|
expErr string
|
|
}{
|
|
{
|
|
name: "from default",
|
|
config: config.DefaultArtifactConfig(),
|
|
exp: &ArtifactConfig{
|
|
HTTPReadTimeout: 30 * time.Minute,
|
|
HTTPMaxBytes: 100_000_000_000,
|
|
GCSTimeout: 30 * time.Minute,
|
|
GitTimeout: 30 * time.Minute,
|
|
HgTimeout: 30 * time.Minute,
|
|
S3Timeout: 30 * time.Minute,
|
|
},
|
|
},
|
|
{
|
|
name: "invalid http read timeout",
|
|
config: &config.ArtifactConfig{
|
|
HTTPReadTimeout: pointer.Of("invalid"),
|
|
HTTPMaxSize: pointer.Of("100GB"),
|
|
GCSTimeout: pointer.Of("30m"),
|
|
GitTimeout: pointer.Of("30m"),
|
|
HgTimeout: pointer.Of("30m"),
|
|
S3Timeout: pointer.Of("30m"),
|
|
},
|
|
expErr: "error parsing HTTPReadTimeout",
|
|
},
|
|
{
|
|
name: "invalid http max size",
|
|
config: &config.ArtifactConfig{
|
|
HTTPReadTimeout: pointer.Of("30m"),
|
|
HTTPMaxSize: pointer.Of("invalid"),
|
|
GCSTimeout: pointer.Of("30m"),
|
|
GitTimeout: pointer.Of("30m"),
|
|
HgTimeout: pointer.Of("30m"),
|
|
S3Timeout: pointer.Of("30m"),
|
|
},
|
|
expErr: "error parsing HTTPMaxSize",
|
|
},
|
|
{
|
|
name: "invalid gcs timeout",
|
|
config: &config.ArtifactConfig{
|
|
HTTPReadTimeout: pointer.Of("30m"),
|
|
HTTPMaxSize: pointer.Of("100GB"),
|
|
GCSTimeout: pointer.Of("invalid"),
|
|
GitTimeout: pointer.Of("30m"),
|
|
HgTimeout: pointer.Of("30m"),
|
|
S3Timeout: pointer.Of("30m"),
|
|
},
|
|
expErr: "error parsing GCSTimeout",
|
|
},
|
|
{
|
|
name: "invalid git timeout",
|
|
config: &config.ArtifactConfig{
|
|
HTTPReadTimeout: pointer.Of("30m"),
|
|
HTTPMaxSize: pointer.Of("100GB"),
|
|
GCSTimeout: pointer.Of("30m"),
|
|
GitTimeout: pointer.Of("invalid"),
|
|
HgTimeout: pointer.Of("30m"),
|
|
S3Timeout: pointer.Of("30m"),
|
|
},
|
|
expErr: "error parsing GitTimeout",
|
|
},
|
|
{
|
|
name: "invalid hg timeout",
|
|
config: &config.ArtifactConfig{
|
|
HTTPReadTimeout: pointer.Of("30m"),
|
|
HTTPMaxSize: pointer.Of("100GB"),
|
|
GCSTimeout: pointer.Of("30m"),
|
|
GitTimeout: pointer.Of("30m"),
|
|
HgTimeout: pointer.Of("invalid"),
|
|
S3Timeout: pointer.Of("30m"),
|
|
},
|
|
expErr: "error parsing HgTimeout",
|
|
},
|
|
{
|
|
name: "invalid s3 timeout",
|
|
config: &config.ArtifactConfig{
|
|
HTTPReadTimeout: pointer.Of("30m"),
|
|
HTTPMaxSize: pointer.Of("100GB"),
|
|
GCSTimeout: pointer.Of("30m"),
|
|
GitTimeout: pointer.Of("30m"),
|
|
HgTimeout: pointer.Of("30m"),
|
|
S3Timeout: pointer.Of("invalid"),
|
|
},
|
|
expErr: "error parsing S3Timeout",
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
got, err := ArtifactConfigFromAgent(tc.config)
|
|
|
|
if tc.expErr != "" {
|
|
must.Error(t, err)
|
|
must.StrContains(t, err.Error(), tc.expErr)
|
|
} else {
|
|
must.NoError(t, err)
|
|
must.Eq(t, tc.exp, got)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestArtifactConfig_Copy(t *testing.T) {
|
|
ci.Parallel(t)
|
|
|
|
ac := &ArtifactConfig{
|
|
HTTPReadTimeout: time.Minute,
|
|
HTTPMaxBytes: 1000,
|
|
GCSTimeout: 2 * time.Minute,
|
|
GitTimeout: time.Second,
|
|
HgTimeout: time.Hour,
|
|
S3Timeout: 5 * time.Minute,
|
|
DisableFilesystemIsolation: true,
|
|
SetEnvironmentVariables: "FOO,BAR",
|
|
}
|
|
|
|
// make sure values are copied.
|
|
configCopy := ac.Copy()
|
|
must.Eq(t, ac, configCopy)
|
|
|
|
// modify copy and make sure original doesn't change.
|
|
configCopy.HTTPReadTimeout = 5 * time.Minute
|
|
configCopy.HTTPMaxBytes = 2000
|
|
configCopy.GCSTimeout = 5 * time.Second
|
|
configCopy.GitTimeout = 3 * time.Second
|
|
configCopy.HgTimeout = 2 * time.Hour
|
|
configCopy.S3Timeout = 10 * time.Minute
|
|
configCopy.DisableFilesystemIsolation = false
|
|
configCopy.SetEnvironmentVariables = "BAZ"
|
|
|
|
must.Eq(t, &ArtifactConfig{
|
|
HTTPReadTimeout: time.Minute,
|
|
HTTPMaxBytes: 1000,
|
|
GCSTimeout: 2 * time.Minute,
|
|
GitTimeout: time.Second,
|
|
HgTimeout: time.Hour,
|
|
S3Timeout: 5 * time.Minute,
|
|
DisableFilesystemIsolation: true,
|
|
SetEnvironmentVariables: "FOO,BAR",
|
|
}, ac)
|
|
}
|