feat: add remote_repo_build_mode envbuilder option ()

Adds support for setting the --remote-repo-build-mode Envbuilder option. Defaults to true if not set.
This commit is contained in:
Cian Johnston 2024-08-09 10:32:30 +01:00 committed by GitHub
commit c10305910f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 30 additions and 4 deletions

View file

@ -36,7 +36,7 @@ test-registry: test-registry-container test-images-pull test-images-push
test-registry-container: .registry-cache test-registry-container: .registry-cache
if ! curl -fsSL http://localhost:5000/v2/_catalog > /dev/null 2>&1; then \ if ! curl -fsSL http://localhost:5000/v2/_catalog > /dev/null 2>&1; then \
docker rm -f tfprov-envbuilder-registry && \ docker rm -f tfprov-envbuilder-registry && \
docker run -d -p 5000:5000 --name envbuilder-registry --volume $(PWD)/.registry-cache:/var/lib/registry registry:2; \ docker run -d -p 5000:5000 --name tfprov-envbuilder-registry --volume $(PWD)/.registry-cache:/var/lib/registry registry:2; \
fi fi
# Pulls images referenced in integration tests and pushes them to the local cache. # Pulls images referenced in integration tests and pushes them to the local cache.

View file

@ -41,6 +41,7 @@ The cached image resource can be used to retrieve a cached image produced by env
- `git_username` (String) (Envbuilder option) The username to use for Git authentication. This is optional. - `git_username` (String) (Envbuilder option) The username to use for Git authentication. This is optional.
- `ignore_paths` (List of String) (Envbuilder option) The comma separated list of paths to ignore when building the workspace. - `ignore_paths` (List of String) (Envbuilder option) The comma separated list of paths to ignore when building the workspace.
- `insecure` (Boolean) (Envbuilder option) Bypass TLS verification when cloning and pulling from container registries. - `insecure` (Boolean) (Envbuilder option) Bypass TLS verification when cloning and pulling from container registries.
- `remote_repo_build_mode` (Boolean) (Envbuilder option) RemoteRepoBuildMode uses the remote repository as the source of truth when building the image. Enabling this option ignores user changes to local files and they will not be reflected in the image. This can be used to improve cache utilization when multiple users are working on the same repository. (NOTE: The Terraform provider will **always** use remote repo build mode for probing the cache repo.)
- `ssl_cert_base64` (String) (Envbuilder option) The content of an SSL cert file. This is useful for self-signed certificates. - `ssl_cert_base64` (String) (Envbuilder option) The content of an SSL cert file. This is useful for self-signed certificates.
- `verbose` (Boolean) (Envbuilder option) Enable verbose output. - `verbose` (Boolean) (Envbuilder option) Enable verbose output.
- `workspace_folder` (String) (Envbuilder option) path to the workspace folder that will be built. This is optional. - `workspace_folder` (String) (Envbuilder option) path to the workspace folder that will be built. This is optional.

View file

@ -70,6 +70,7 @@ type CachedImageResourceModel struct {
GitUsername types.String `tfsdk:"git_username"` GitUsername types.String `tfsdk:"git_username"`
IgnorePaths types.List `tfsdk:"ignore_paths"` IgnorePaths types.List `tfsdk:"ignore_paths"`
Insecure types.Bool `tfsdk:"insecure"` Insecure types.Bool `tfsdk:"insecure"`
RemoteRepoBuildMode types.Bool `tfsdk:"remote_repo_build_mode"`
SSLCertBase64 types.String `tfsdk:"ssl_cert_base64"` SSLCertBase64 types.String `tfsdk:"ssl_cert_base64"`
Verbose types.Bool `tfsdk:"verbose"` Verbose types.Bool `tfsdk:"verbose"`
WorkspaceFolder types.String `tfsdk:"workspace_folder"` WorkspaceFolder types.String `tfsdk:"workspace_folder"`
@ -203,6 +204,13 @@ func (r *CachedImageResource) Schema(ctx context.Context, req resource.SchemaReq
MarkdownDescription: "(Envbuilder option) Bypass TLS verification when cloning and pulling from container registries.", MarkdownDescription: "(Envbuilder option) Bypass TLS verification when cloning and pulling from container registries.",
Optional: true, Optional: true,
}, },
"remote_repo_build_mode": schema.BoolAttribute{
MarkdownDescription: "(Envbuilder option) RemoteRepoBuildMode uses the remote repository as the source of truth when building the image. Enabling this option ignores user changes to local files and they will not be reflected in the image. This can be used to improve cache utilization when multiple users are working on the same repository. (NOTE: The Terraform provider will **always** use remote repo build mode for probing the cache repo.)",
Optional: true,
PlanModifiers: []planmodifier.Bool{
boolplanmodifier.RequiresReplace(),
},
},
"ssl_cert_base64": schema.StringAttribute{ "ssl_cert_base64": schema.StringAttribute{
MarkdownDescription: "(Envbuilder option) The content of an SSL cert file. This is useful for self-signed certificates.", MarkdownDescription: "(Envbuilder option) The content of an SSL cert file. This is useful for self-signed certificates.",
Optional: true, Optional: true,
@ -330,6 +338,12 @@ func (r *CachedImageResource) Read(ctx context.Context, req resource.ReadRequest
if !data.GitPassword.IsNull() { if !data.GitPassword.IsNull() {
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_GIT_PASSWORD", data.GitPassword) data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_GIT_PASSWORD", data.GitPassword)
} }
// Default to remote build mode.
if data.RemoteRepoBuildMode.IsNull() {
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_REMOTE_REPO_BUILD_MODE", types.BoolValue(true))
} else {
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_REMOTE_REPO_BUILD_MODE", data.RemoteRepoBuildMode)
}
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
} }
@ -379,6 +393,12 @@ func (r *CachedImageResource) Create(ctx context.Context, req resource.CreateReq
if !data.GitPassword.IsNull() { if !data.GitPassword.IsNull() {
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_GIT_PASSWORD", data.GitPassword) data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_GIT_PASSWORD", data.GitPassword)
} }
// Default to remote build mode.
if data.RemoteRepoBuildMode.IsNull() {
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_REMOTE_REPO_BUILD_MODE", types.BoolValue(true))
} else {
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_REMOTE_REPO_BUILD_MODE", data.RemoteRepoBuildMode)
}
// Save data into Terraform state // Save data into Terraform state
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
@ -479,6 +499,8 @@ func (r *CachedImageResource) runCacheProbe(ctx context.Context, data CachedImag
GitPassword: data.GitPassword.ValueString(), GitPassword: data.GitPassword.ValueString(),
GitSSHPrivateKeyPath: data.GitSSHPrivateKeyPath.ValueString(), GitSSHPrivateKeyPath: data.GitSSHPrivateKeyPath.ValueString(),
GitHTTPProxyURL: data.GitHTTPProxyURL.ValueString(), GitHTTPProxyURL: data.GitHTTPProxyURL.ValueString(),
RemoteRepoBuildMode: data.RemoteRepoBuildMode.ValueBool(),
RemoteRepoDir: filepath.Join(tmpDir, "repo"),
SSLCertBase64: data.SSLCertBase64.ValueString(), SSLCertBase64: data.SSLCertBase64.ValueString(),
// Other options // Other options

View file

@ -95,6 +95,8 @@ func TestAccCachedImageDataSource(t *testing.T) {
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.0", "FOO=bar"), resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.0", "FOO=bar"),
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.1", fmt.Sprintf("ENVBUILDER_CACHE_REPO=%s", deps.CacheRepo)), resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.1", fmt.Sprintf("ENVBUILDER_CACHE_REPO=%s", deps.CacheRepo)),
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.2", fmt.Sprintf("ENVBUILDER_GIT_URL=%s", deps.Repo.URL)), resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.2", fmt.Sprintf("ENVBUILDER_GIT_URL=%s", deps.Repo.URL)),
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.3", "ENVBUILDER_REMOTE_REPO_BUILD_MODE=true"),
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "env.4"),
), ),
}, },
// Should produce an empty plan after apply // Should produce an empty plan after apply

View file

@ -57,7 +57,6 @@ resource "envbuilder_cached_image" "test" {
git_url = {{ quote .Repo.URL }} git_url = {{ quote .Repo.URL }}
git_ssh_private_key_path = {{ quote .Repo.Key }} git_ssh_private_key_path = {{ quote .Repo.Key }}
verbose = true verbose = true
workspace_folder = {{ quote .Repo.Dir }}
}` }`
fm := template.FuncMap{"quote": quote} fm := template.FuncMap{"quote": quote}
@ -131,10 +130,12 @@ func seedCache(ctx context.Context, t testing.TB, deps testDependencies) {
require.NoError(t, err, "failed to run envbuilder to seed cache") require.NoError(t, err, "failed to run envbuilder to seed cache")
t.Cleanup(func() { t.Cleanup(func() {
_ = cli.ContainerRemove(ctx, ctr.ID, container.RemoveOptions{ if err := cli.ContainerRemove(context.Background(), ctr.ID, container.RemoveOptions{
RemoveVolumes: true, RemoveVolumes: true,
Force: true, Force: true,
}) }); err != nil {
t.Errorf("removing container: %s", err.Error())
}
}) })
err = cli.ContainerStart(ctx, ctr.ID, container.StartOptions{}) err = cli.ContainerStart(ctx, ctr.ID, container.StartOptions{})
require.NoError(t, err) require.NoError(t, err)