mirror of
https://github.com/vmware-tanzu/velero.git
synced 2026-01-06 21:36:30 +00:00
* Add Tilt configuration to debug using Delve This change adds support to run the Velero process in Tilt using [Delve](https://github.com/go-delve/delve). This does not include support for debugging the Velero process in the restic pods, just in the Velero deployment. For an optimal debugging experience, this change also introduces a new flag (`DEBUG`) to the `hack/build.sh` script to enable a "debug" build of the Velero binary. This flag, if enabled, will build the binary without optimisations and inlining. Disabling optimisations and inlining is recommended by Delve. Two configuration options have been added to the Tilt settings. The first, `enable_debug`, is to control whether debugging should be enabled. If enabled, the process will be started by Delve, and the Delve server port (2345) will be forwarded to the local machine. The second option, `debug_continue_on_start`, is to control whether the process should "continue" when started by Delve or should be paused. By default, debugging is disabled, and if in debug mode, the process will continue. Signed-off-by: Bridget McErlean <bmcerlean@vmware.com> * Add spaces around keyword args Starlark prefers spaces around `=` in keyword arguments: https://docs.bazel.build/versions/master/skylark/bzl-style.html#keyword-arguments Signed-off-by: Bridget McErlean <bmcerlean@vmware.com> * Remove unnecessary command from Dockerfile Signed-off-by: Bridget McErlean <bmcerlean@vmware.com> * Add note to connect after Tilt is running Signed-off-by: Bridget McErlean <bmcerlean@vmware.com>
268 lines
9.3 KiB
Plaintext
268 lines
9.3 KiB
Plaintext
# -*- mode: Python -*-
|
|
|
|
k8s_yaml([
|
|
'config/crd/bases/velero.io_backups.yaml',
|
|
'config/crd/bases/velero.io_backupstoragelocations.yaml',
|
|
'config/crd/bases/velero.io_deletebackuprequests.yaml',
|
|
'config/crd/bases/velero.io_downloadrequests.yaml',
|
|
'config/crd/bases/velero.io_podvolumebackups.yaml',
|
|
'config/crd/bases/velero.io_podvolumerestores.yaml',
|
|
'config/crd/bases/velero.io_resticrepositories.yaml',
|
|
'config/crd/bases/velero.io_restores.yaml',
|
|
'config/crd/bases/velero.io_schedules.yaml',
|
|
'config/crd/bases/velero.io_serverstatusrequests.yaml',
|
|
'config/crd/bases/velero.io_volumesnapshotlocations.yaml',
|
|
])
|
|
|
|
# default values
|
|
settings = {
|
|
"default_registry": "",
|
|
"enable_restic": False,
|
|
"enable_debug": False,
|
|
"debug_continue_on_start": True, # Continue the velero process by default when in debug mode
|
|
"create_backup_locations": False,
|
|
"setup-minio": False,
|
|
}
|
|
|
|
# global settings
|
|
settings.update(read_json(
|
|
"tilt-resources/tilt-settings.json",
|
|
default = {},
|
|
))
|
|
|
|
k8s_yaml(kustomize('tilt-resources'))
|
|
k8s_yaml('tilt-resources/deployment.yaml')
|
|
if settings.get("enable_debug"):
|
|
k8s_resource('velero', port_forwards = '2345')
|
|
# TODO: Need to figure out how to apply port forwards for all restic pods
|
|
if settings.get("enable_restic"):
|
|
k8s_yaml('tilt-resources/restic.yaml')
|
|
if settings.get("create_backup_locations"):
|
|
k8s_yaml('tilt-resources/velero_v1_backupstoragelocation.yaml')
|
|
if settings.get("setup-minio"):
|
|
k8s_yaml('examples/minio/00-minio-deployment.yaml', allow_duplicates = True)
|
|
|
|
# By default, Tilt automatically allows Minikube, Docker for Desktop, Microk8s, Red Hat CodeReady Containers, Kind, K3D, and Krucible.
|
|
allow_k8s_contexts(settings.get("allowed_contexts"))
|
|
default_registry(settings.get("default_registry"))
|
|
local_goos = str(local("go env GOOS", quiet = True, echo_off = True)).strip()
|
|
git_sha = str(local("git rev-parse HEAD", quiet = True, echo_off = True)).strip()
|
|
|
|
tilt_helper_dockerfile_header = """
|
|
# Tilt image
|
|
FROM golang:1.15.3 as tilt-helper
|
|
|
|
# Support live reloading with Tilt
|
|
RUN wget --output-document /restart.sh --quiet https://raw.githubusercontent.com/windmilleng/rerun-process-wrapper/master/restart.sh && \
|
|
wget --output-document /start.sh --quiet https://raw.githubusercontent.com/windmilleng/rerun-process-wrapper/master/start.sh && \
|
|
chmod +x /start.sh && chmod +x /restart.sh
|
|
"""
|
|
|
|
additional_docker_helper_commands = """
|
|
# Install delve to allow debugging
|
|
RUN go get github.com/go-delve/delve/cmd/dlv
|
|
|
|
RUN wget -qO- https://dl.k8s.io/v1.19.2/kubernetes-client-linux-amd64.tar.gz | tar xvz
|
|
RUN wget -qO- https://get.docker.com | sh
|
|
"""
|
|
|
|
additional_docker_build_commands = """
|
|
COPY --from=tilt-helper /go/bin/dlv /usr/bin/dlv
|
|
COPY --from=tilt-helper /usr/bin/docker /usr/bin/docker
|
|
COPY --from=tilt-helper /go/kubernetes/client/bin/kubectl /usr/bin/kubectl
|
|
"""
|
|
|
|
docker_build_download_restic_commands = """
|
|
COPY ./hack/download-restic.sh /
|
|
RUN apt update && apt install -y wget
|
|
RUN mkdir -p /output/usr/bin && \
|
|
BIN=velero GOOS=linux GOARCH=amd64 RESTIC_VERSION=0.9.6 /download-restic.sh && \
|
|
mv /output/usr/bin/restic /usr/bin/restic && \
|
|
rm -rf /output/usr/bin
|
|
"""
|
|
|
|
##############################
|
|
# Setup Velero
|
|
##############################
|
|
|
|
def get_debug_flag():
|
|
"""
|
|
Returns the flag to enable debug building of Velero if debug
|
|
mode is enabled.
|
|
"""
|
|
|
|
if settings.get('enable_debug'):
|
|
return "DEBUG=1"
|
|
return ""
|
|
|
|
|
|
# Set up a local_resource build of the Velero binary. The binary is written to _tiltbuild/velero.
|
|
local_resource(
|
|
"velero_server_binary",
|
|
cmd = 'cd ' + '.' + ';mkdir -p _tiltbuild;PKG=. BIN=velero GOOS=linux GOARCH=amd64 GIT_SHA=' + git_sha + ' VERSION=main GIT_TREE_STATE=dirty OUTPUT_DIR=_tiltbuild ' + get_debug_flag() + ' ./hack/build.sh',
|
|
deps = ["cmd", "internal", "pkg"],
|
|
ignore = ["pkg/cmd"],
|
|
)
|
|
|
|
local_resource(
|
|
"velero_local_binary",
|
|
cmd = 'cd ' + '.' + ';mkdir -p _tiltbuild/local;PKG=. BIN=velero GOOS=' + local_goos + ' GOARCH=amd64 GIT_SHA=' + git_sha + ' VERSION=main GIT_TREE_STATE=dirty OUTPUT_DIR=_tiltbuild/local ' + get_debug_flag() + ' ./hack/build.sh',
|
|
deps = ["internal", "pkg/cmd"],
|
|
)
|
|
|
|
# Note: we need a distro with a bash shell to exec into the Velero container
|
|
tilt_dockerfile_header = """
|
|
FROM ubuntu:focal as tilt
|
|
WORKDIR /
|
|
COPY --from=tilt-helper /start.sh .
|
|
COPY --from=tilt-helper /restart.sh .
|
|
COPY _tiltbuild/velero .
|
|
"""
|
|
|
|
dockerfile_contents = "\n".join([
|
|
tilt_helper_dockerfile_header,
|
|
additional_docker_helper_commands,
|
|
tilt_dockerfile_header,
|
|
additional_docker_build_commands,
|
|
docker_build_download_restic_commands,
|
|
])
|
|
|
|
|
|
def get_velero_entrypoint():
|
|
"""
|
|
Returns the entrypoint for the Velero container image.
|
|
"""
|
|
|
|
entrypoint = ["sh", "/start.sh"]
|
|
|
|
if settings.get("enable_debug"):
|
|
# If debug mode is enabled, start the velero process using Delve
|
|
entrypoint.extend(
|
|
["dlv", "--listen=:2345", "--headless=true", "--api-version=2", "--accept-multiclient", "exec"])
|
|
|
|
# Set whether or not to continue the debugged process on start
|
|
# See https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv_exec.md
|
|
if settings.get("debug_continue_on_start"):
|
|
entrypoint.append("--continue")
|
|
|
|
entrypoint.append("--")
|
|
|
|
entrypoint.append("/velero")
|
|
|
|
return entrypoint
|
|
|
|
|
|
# Set up an image build for Velero. The live update configuration syncs the output from the local_resource
|
|
# build into the container.
|
|
docker_build(
|
|
ref = "velero/velero",
|
|
context = ".",
|
|
dockerfile_contents = dockerfile_contents,
|
|
target = "tilt",
|
|
entrypoint = get_velero_entrypoint(),
|
|
live_update = [
|
|
sync("./_tiltbuild/velero", "/velero"),
|
|
run("sh /restart.sh"),
|
|
])
|
|
|
|
|
|
##############################
|
|
# Setup plugins
|
|
##############################
|
|
|
|
def load_provider_tiltfiles():
|
|
all_providers = settings.get("providers", {})
|
|
enable_providers = settings.get("enable_providers", [])
|
|
providers = []
|
|
|
|
## Load settings only for providers to enable
|
|
for name in enable_providers:
|
|
repo = all_providers.get(name)
|
|
if not repo:
|
|
print("Enabled provider '{}' does not exist in list of supported providers".format(name))
|
|
continue
|
|
file = repo + "/tilt-provider.json"
|
|
if not os.path.exists(file):
|
|
print("Provider settings not found for \"{}\". Please ensure this plugin repository has a tilt-provider.json file included.".format(name))
|
|
continue
|
|
provider_details = read_json(file, default = {})
|
|
if type(provider_details) == "dict":
|
|
provider_details["name"] = name
|
|
if "context" in provider_details:
|
|
provider_details["context"] = os.path.join(repo, "/", provider_details["context"])
|
|
else:
|
|
provider_details["context"] = repo
|
|
if "go_main" not in provider_details:
|
|
provider_details["go_main"] = "main.go"
|
|
providers.append(provider_details)
|
|
|
|
return providers
|
|
|
|
|
|
# Enable each provider
|
|
def enable_providers(providers):
|
|
if not providers:
|
|
print("No providers to enable.")
|
|
return
|
|
for p in providers:
|
|
enable_provider(p)
|
|
|
|
|
|
# Configures a provider by doing the following:
|
|
#
|
|
# 1. Enables a local_resource go build of the provider's local binary
|
|
# 2. Configures a docker build for the provider, with live updating of the local binary
|
|
def enable_provider(provider):
|
|
name = provider.get("name")
|
|
plugin_name = provider.get("plugin_name")
|
|
|
|
# Note: we need a distro with a shell to do a copy of the plugin binary
|
|
tilt_dockerfile_header = """
|
|
FROM ubuntu:focal as tilt
|
|
WORKDIR /
|
|
COPY --from=tilt-helper /start.sh .
|
|
COPY --from=tilt-helper /restart.sh .
|
|
COPY """ + plugin_name + """ .
|
|
"""
|
|
|
|
dockerfile_contents = "\n".join([
|
|
tilt_helper_dockerfile_header,
|
|
additional_docker_helper_commands,
|
|
tilt_dockerfile_header,
|
|
additional_docker_build_commands,
|
|
])
|
|
|
|
context = provider.get("context")
|
|
go_main = provider.get("go_main", "main.go")
|
|
|
|
live_reload_deps = []
|
|
for d in provider.get("live_reload_deps", []):
|
|
live_reload_deps.append(os.path.join(context, "/", d))
|
|
|
|
# Set up a local_resource build of the plugin binary. The main.go path must be provided via go_main option. The binary is written to _tiltbuild/<NAME>.
|
|
local_resource(
|
|
name + "_plugin",
|
|
cmd = 'cd ' + context + ';mkdir -p _tiltbuild;PKG=' + context + ' BIN=' + go_main + ' GOOS=linux GOARCH=amd64 OUTPUT_DIR=_tiltbuild ./hack/build.sh',
|
|
deps = live_reload_deps,
|
|
)
|
|
|
|
# Set up an image build for the plugin. The live update configuration syncs the output from the local_resource
|
|
# build into the init container, and that restarts the Velero container.
|
|
docker_build(
|
|
ref = provider.get("image"),
|
|
context = os.path.join(context, "/_tiltbuild/"),
|
|
dockerfile_contents = dockerfile_contents,
|
|
target = "tilt",
|
|
entrypoint = ["/bin/bash", "-c", "cp /" + plugin_name + " /target/."],
|
|
live_update = [
|
|
sync(os.path.join(context, "/_tiltbuild/", plugin_name), os.path.join("/", plugin_name))
|
|
]
|
|
)
|
|
|
|
|
|
##############################
|
|
# Start
|
|
#############################
|
|
|
|
enable_providers(load_provider_tiltfiles())
|