From ce0a0485cf5808c62637ff275b76d8268d8fed4d Mon Sep 17 00:00:00 2001 From: TomerNewman Date: Wed, 11 Sep 2024 16:32:28 +0300 Subject: [PATCH] Adapt Day1 feature to support init container in worker pod Today, KMM has an init container in the worker pod. This means that the init container copies all of the .ko files to the shared volume, which will be loaded into the kernel by the worker container. This commit adds this flow to the Day1 feature. --- pkg/mcproducer/scripts/pull-image.sh | 18 ++++---------- .../scripts/replace-kernel-module.sh | 24 ++++++++++++------- .../templates/machine-config.gotmpl | 2 +- .../testdata/machineconfig-test.yaml | 6 ++--- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pkg/mcproducer/scripts/pull-image.sh b/pkg/mcproducer/scripts/pull-image.sh index 50b7e2784..9f0129d38 100644 --- a/pkg/mcproducer/scripts/pull-image.sh +++ b/pkg/mcproducer/scripts/pull-image.sh @@ -1,15 +1,13 @@ #!/bin/bash -kernel_module_image_filepath="$KERNEL_MODULE_IMAGE_FILEPATH" worker_image="$WORKER_IMAGE" kernel_module_image="$KERNEL_MODULE_IMAGE" kernel_module_image_tag=$(uname -r) full_kernel_module_image="$kernel_module_image:$kernel_module_image_tag" -if [ -e $kernel_module_image_filepath ]; then - echo "File $kernel_module_image_filepath found. Nothing to do, the file was handled, removing $kernel_module_image_filepath and $kmm_config_file_filepath" - rm -f $kernel_module_image_filepath +if [ -n "$(podman images -q $full_kernel_module_image 2> /dev/null)" ]; then + echo "Image $full_kernel_module_image exist locally. Nothing to do, removing $kmm_config_file_filepath" rm -f $kmm_config_file_filepath else podman pull --authfile /var/lib/kubelet/config.json $worker_image @@ -20,7 +18,7 @@ else exit 1 fi - echo "File $kernel_module_image_filepath is not on the filesystem, pulling image $full_kernel_module_image" + echo "Pulling image $full_kernel_module_image" podman pull --authfile /var/lib/kubelet/config.json $full_kernel_module_image if [ $? -eq 0 ]; then echo "Image $full_kernel_module_image has been successfully pulled" @@ -28,12 +26,6 @@ else echo "Failed to pull image $full_kernel_module_image" exit 1 fi - echo "Saving image $full_kernel_module_image into a file $kernel_module_image_filepath" - podman save -o $kernel_module_image_filepath $full_kernel_module_image - if [ $? -eq 0 ]; then - echo "Image $full_kernel_module_image has been successfully save on file $kernel_module_image_filepath, rebooting..." - reboot - else - echo "Failed to save image $full_kernel_module_image to file $kernel_module_image_filepath" - fi + echo "Rebooting..." + reboot fi diff --git a/pkg/mcproducer/scripts/replace-kernel-module.sh b/pkg/mcproducer/scripts/replace-kernel-module.sh index 1f3705971..64fa940d8 100644 --- a/pkg/mcproducer/scripts/replace-kernel-module.sh +++ b/pkg/mcproducer/scripts/replace-kernel-module.sh @@ -1,15 +1,17 @@ #!/bin/bash kmm_config_file_filepath="$WORKER_CONFIG_FILEPATH" -kernel_module_image_filepath="$KERNEL_MODULE_IMAGE_FILEPATH" in_tree_module_to_remove="$IN_TREE_MODULE_TO_REMOVE" kernel_module="$KERNEL_MODULE" worker_image="$WORKER_IMAGE" +kernel_module_image="$KERNEL_MODULE_IMAGE" +kernel_module_image_tag=$(uname -r) +full_kernel_module_image="$kernel_module_image:$kernel_module_image_tag" create_kmm_config() { # Write YAML content to the file cat < "$kmm_config_file_filepath" -containerImage: $kernel_module_image_filepath +containerImage: $full_kernel_module_image inTreeModuleToRemove: $in_tree_module_to_remove modprobe: dirName: /opt @@ -19,17 +21,23 @@ EOF cat "$kmm_config_file_filepath" } -echo "before checking image tar file presence" -if [ -e $kernel_module_image_filepath ]; then - echo "Image file $kernel_module_image_filepath found on the local file system, creating kmm config file" +echo "before checking image presence" +if [ -n "$(podman images -q $full_kernel_module_image 2> /dev/null)" ]; then + echo "Image $full_kernel_module_image found on the local file system, creating kmm config file" create_kmm_config - echo "running kernel-management worker image" - podman run --user=root --privileged -v /lib/modules:/lib/modules -v $kmm_config_file_filepath:/etc/kmm-worker/config.yaml -v $kernel_module_image_filepath:$kernel_module_image_filepath $worker_image kmod load --tarball /etc/kmm-worker/config.yaml + mkdir /tmp/opt + podman pod create --name kmm-pod + echo "creating init container" + podman create --pod kmm-pod --user=root --privileged --init-ctr=always -v /tmp/opt:/tmp/opt $full_kernel_module_image /bin/sh -c "mkdir -p /tmp/opt/lib/modules; cp -R /opt/lib/modules/* /tmp/opt/lib/modules;" + echo "creating worker container" + podman create --pod kmm-pod --user=root --privileged -v /tmp/opt:/tmp/opt:Z -v $kmm_config_file_filepath:/etc/kmm-worker/config.yaml $worker_image kmod load --tarball /etc/kmm-worker/config.yaml + echo "running worker pod" + podman pod start kmm-pod if [ $? -eq 0 ]; then echo "OOT kernel module $kernel_module is inserted" else echo "failed to insert OOT kernel module $kernel_module" fi else - echo "Image file $kernel_module_image_filepath is not present in local registry, will try after reboot" + echo "Image $full_kernel_module_image is not present in local registry, will try after reboot" fi diff --git a/pkg/mcproducer/templates/machine-config.gotmpl b/pkg/mcproducer/templates/machine-config.gotmpl index ca014fede..3439670b5 100644 --- a/pkg/mcproducer/templates/machine-config.gotmpl +++ b/pkg/mcproducer/templates/machine-config.gotmpl @@ -23,7 +23,7 @@ spec: EnvironmentFile=/etc/mco/proxy.env Environment="IN_TREE_MODULE_TO_REMOVE={{.InTreeModuleToRemove}}" Environment="KERNEL_MODULE={{.KernelModule}}" - Environment="KERNEL_MODULE_IMAGE_FILEPATH={{.KernelModuleImageFilepath}}" + Environment="KERNEL_MODULE_IMAGE={{.KernelModuleImage}}" Environment="WORKER_CONFIG_FILEPATH={{.WorkerConfigFilepath}}" Environment="WORKER_IMAGE={{.WorkerImage}}" ExecStartPre=ls /usr/local/bin diff --git a/pkg/mcproducer/testdata/machineconfig-test.yaml b/pkg/mcproducer/testdata/machineconfig-test.yaml index ee1da465e..d5833b6c7 100644 --- a/pkg/mcproducer/testdata/machineconfig-test.yaml +++ b/pkg/mcproducer/testdata/machineconfig-test.yaml @@ -23,7 +23,7 @@ spec: EnvironmentFile=/etc/mco/proxy.env Environment="IN_TREE_MODULE_TO_REMOVE=testInTreeKernelModuleName" Environment="KERNEL_MODULE=testKernelModuleName" - Environment="KERNEL_MODULE_IMAGE_FILEPATH=/var/lib/image_file_day1.tar" + Environment="KERNEL_MODULE_IMAGE=quay.io/project/repo:some-tag12" Environment="WORKER_CONFIG_FILEPATH=/var/lib/kmm_day1_config.yaml" Environment="WORKER_IMAGE=quay.io/edge-infrastructure/kernel-module-management-worker:latest" ExecStartPre=ls /usr/local/bin @@ -68,14 +68,14 @@ spec: user: name: "root" contents: - source: "data:text/plain;base64,IyEvYmluL2Jhc2gKCmttbV9jb25maWdfZmlsZV9maWxlcGF0aD0iJFdPUktFUl9DT05GSUdfRklMRVBBVEgiCmtlcm5lbF9tb2R1bGVfaW1hZ2VfZmlsZXBhdGg9IiRLRVJORUxfTU9EVUxFX0lNQUdFX0ZJTEVQQVRIIgppbl90cmVlX21vZHVsZV90b19yZW1vdmU9IiRJTl9UUkVFX01PRFVMRV9UT19SRU1PVkUiCmtlcm5lbF9tb2R1bGU9IiRLRVJORUxfTU9EVUxFIgp3b3JrZXJfaW1hZ2U9IiRXT1JLRVJfSU1BR0UiCgpjcmVhdGVfa21tX2NvbmZpZygpIHsKICAgICMgV3JpdGUgWUFNTCBjb250ZW50IHRvIHRoZSBmaWxlCiAgICBjYXQgPDxFT0YgPiAiJGttbV9jb25maWdfZmlsZV9maWxlcGF0aCIKY29udGFpbmVySW1hZ2U6ICRrZXJuZWxfbW9kdWxlX2ltYWdlX2ZpbGVwYXRoCmluVHJlZU1vZHVsZVRvUmVtb3ZlOiAkaW5fdHJlZV9tb2R1bGVfdG9fcmVtb3ZlCm1vZHByb2JlOgogIGRpck5hbWU6IC9vcHQKICBtb2R1bGVOYW1lOiAka2VybmVsX21vZHVsZQpFT0YKICAgIGVjaG8gImxvZ2dpbmcgY29udGVudHMgb2YgdGhlIHdvcmtlciBjb25maWcgZmlsZToiCiAgICBjYXQgIiRrbW1fY29uZmlnX2ZpbGVfZmlsZXBhdGgiCn0KCmVjaG8gImJlZm9yZSBjaGVja2luZyBpbWFnZSB0YXIgZmlsZSBwcmVzZW5jZSIKaWYgWyAtZSAka2VybmVsX21vZHVsZV9pbWFnZV9maWxlcGF0aCBdOyB0aGVuCiAgICBlY2hvICJJbWFnZSBmaWxlICRrZXJuZWxfbW9kdWxlX2ltYWdlX2ZpbGVwYXRoIGZvdW5kIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSwgY3JlYXRpbmcga21tIGNvbmZpZyBmaWxlIgogICAgY3JlYXRlX2ttbV9jb25maWcKICAgIGVjaG8gInJ1bm5pbmcga2VybmVsLW1hbmFnZW1lbnQgd29ya2VyIGltYWdlIgogICAgcG9kbWFuIHJ1biAtLXVzZXI9cm9vdCAtLXByaXZpbGVnZWQgLXYgL2xpYi9tb2R1bGVzOi9saWIvbW9kdWxlcyAtdiAka21tX2NvbmZpZ19maWxlX2ZpbGVwYXRoOi9ldGMva21tLXdvcmtlci9jb25maWcueWFtbCAtdiAka2VybmVsX21vZHVsZV9pbWFnZV9maWxlcGF0aDoka2VybmVsX21vZHVsZV9pbWFnZV9maWxlcGF0aCAkd29ya2VyX2ltYWdlIGttb2QgbG9hZCAtLXRhcmJhbGwgL2V0Yy9rbW0td29ya2VyL2NvbmZpZy55YW1sCiAgICBpZiBbICQ/IC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvICJPT1Qga2VybmVsIG1vZHVsZSAka2VybmVsX21vZHVsZSBpcyBpbnNlcnRlZCIKICAgIGVsc2UKICAgICAgICBlY2hvICJmYWlsZWQgdG8gaW5zZXJ0IE9PVCBrZXJuZWwgbW9kdWxlICRrZXJuZWxfbW9kdWxlIgogICAgZmkKZWxzZQogICAgZWNobyAiSW1hZ2UgZmlsZSAka2VybmVsX21vZHVsZV9pbWFnZV9maWxlcGF0aCBpcyBub3QgcHJlc2VudCBpbiBsb2NhbCByZWdpc3RyeSwgd2lsbCB0cnkgYWZ0ZXIgcmVib290IgpmaQo=" + source: "data:text/plain;base64,IyEvYmluL2Jhc2gKCmttbV9jb25maWdfZmlsZV9maWxlcGF0aD0iJFdPUktFUl9DT05GSUdfRklMRVBBVEgiCmluX3RyZWVfbW9kdWxlX3RvX3JlbW92ZT0iJElOX1RSRUVfTU9EVUxFX1RPX1JFTU9WRSIKa2VybmVsX21vZHVsZT0iJEtFUk5FTF9NT0RVTEUiCndvcmtlcl9pbWFnZT0iJFdPUktFUl9JTUFHRSIKa2VybmVsX21vZHVsZV9pbWFnZT0iJEtFUk5FTF9NT0RVTEVfSU1BR0UiCmtlcm5lbF9tb2R1bGVfaW1hZ2VfdGFnPSQodW5hbWUgLXIpCmZ1bGxfa2VybmVsX21vZHVsZV9pbWFnZT0iJGtlcm5lbF9tb2R1bGVfaW1hZ2U6JGtlcm5lbF9tb2R1bGVfaW1hZ2VfdGFnIgoKY3JlYXRlX2ttbV9jb25maWcoKSB7CiAgICAjIFdyaXRlIFlBTUwgY29udGVudCB0byB0aGUgZmlsZQogICAgY2F0IDw8RU9GID4gIiRrbW1fY29uZmlnX2ZpbGVfZmlsZXBhdGgiCmNvbnRhaW5lckltYWdlOiAkZnVsbF9rZXJuZWxfbW9kdWxlX2ltYWdlCmluVHJlZU1vZHVsZVRvUmVtb3ZlOiAkaW5fdHJlZV9tb2R1bGVfdG9fcmVtb3ZlCm1vZHByb2JlOgogIGRpck5hbWU6IC9vcHQKICBtb2R1bGVOYW1lOiAka2VybmVsX21vZHVsZQpFT0YKICAgIGVjaG8gImxvZ2dpbmcgY29udGVudHMgb2YgdGhlIHdvcmtlciBjb25maWcgZmlsZToiCiAgICBjYXQgIiRrbW1fY29uZmlnX2ZpbGVfZmlsZXBhdGgiCn0KCmVjaG8gImJlZm9yZSBjaGVja2luZyBpbWFnZSBwcmVzZW5jZSIKaWYgWyAtbiAiJChwb2RtYW4gaW1hZ2VzIC1xICRmdWxsX2tlcm5lbF9tb2R1bGVfaW1hZ2UgMj4gL2Rldi9udWxsKSIgXTsgdGhlbgogICAgZWNobyAiSW1hZ2UgJGZ1bGxfa2VybmVsX21vZHVsZV9pbWFnZSBmb3VuZCBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0sIGNyZWF0aW5nIGttbSBjb25maWcgZmlsZSIKICAgIGNyZWF0ZV9rbW1fY29uZmlnCiAgICBta2RpciAvdG1wL29wdAogICAgcG9kbWFuIHBvZCBjcmVhdGUgLS1uYW1lIGttbS1wb2QKICAgIGVjaG8gImNyZWF0aW5nIGluaXQgY29udGFpbmVyIgogICAgcG9kbWFuIGNyZWF0ZSAtLXBvZCBrbW0tcG9kIC0tdXNlcj1yb290IC0tcHJpdmlsZWdlZCAtLWluaXQtY3RyPWFsd2F5cyAtdiAvdG1wL29wdDovdG1wL29wdCAkZnVsbF9rZXJuZWxfbW9kdWxlX2ltYWdlIC9iaW4vc2ggLWMgIm1rZGlyIC1wIC90bXAvb3B0L2xpYi9tb2R1bGVzOyBjcCAtUiAvb3B0L2xpYi9tb2R1bGVzLyogL3RtcC9vcHQvbGliL21vZHVsZXM7IgogICAgZWNobyAiY3JlYXRpbmcgd29ya2VyIGNvbnRhaW5lciIKICAgIHBvZG1hbiBjcmVhdGUgLS1wb2Qga21tLXBvZCAtLXVzZXI9cm9vdCAtLXByaXZpbGVnZWQgLXYgL3RtcC9vcHQ6L3RtcC9vcHQ6WiAtdiAka21tX2NvbmZpZ19maWxlX2ZpbGVwYXRoOi9ldGMva21tLXdvcmtlci9jb25maWcueWFtbCAkd29ya2VyX2ltYWdlIGttb2QgbG9hZCAtLXRhcmJhbGwgL2V0Yy9rbW0td29ya2VyL2NvbmZpZy55YW1sCiAgICBlY2hvICJydW5uaW5nIHdvcmtlciBwb2QiCiAgICBwb2RtYW4gcG9kIHN0YXJ0IGttbS1wb2QKICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgogICAgICAgIGVjaG8gIk9PVCBrZXJuZWwgbW9kdWxlICRrZXJuZWxfbW9kdWxlIGlzIGluc2VydGVkIgogICAgZWxzZQogICAgICAgIGVjaG8gImZhaWxlZCB0byBpbnNlcnQgT09UIGtlcm5lbCBtb2R1bGUgJGtlcm5lbF9tb2R1bGUiCiAgICBmaQplbHNlCiAgICBlY2hvICJJbWFnZSAkZnVsbF9rZXJuZWxfbW9kdWxlX2ltYWdlIGlzIG5vdCBwcmVzZW50IGluIGxvY2FsIHJlZ2lzdHJ5LCB3aWxsIHRyeSBhZnRlciByZWJvb3QiCmZpCg==" - path: "/usr/local/bin/pull-kernel-module-image.sh" mode: 493 overwrite: true user: name: "root" contents: - source: "data:text/plain;base64,IyEvYmluL2Jhc2gKCgprZXJuZWxfbW9kdWxlX2ltYWdlX2ZpbGVwYXRoPSIkS0VSTkVMX01PRFVMRV9JTUFHRV9GSUxFUEFUSCIKd29ya2VyX2ltYWdlPSIkV09SS0VSX0lNQUdFIgprZXJuZWxfbW9kdWxlX2ltYWdlPSIkS0VSTkVMX01PRFVMRV9JTUFHRSIKa2VybmVsX21vZHVsZV9pbWFnZV90YWc9JCh1bmFtZSAtcikKZnVsbF9rZXJuZWxfbW9kdWxlX2ltYWdlPSIka2VybmVsX21vZHVsZV9pbWFnZToka2VybmVsX21vZHVsZV9pbWFnZV90YWciCgppZiBbIC1lICRrZXJuZWxfbW9kdWxlX2ltYWdlX2ZpbGVwYXRoIF07IHRoZW4KICAgIGVjaG8gIkZpbGUgJGtlcm5lbF9tb2R1bGVfaW1hZ2VfZmlsZXBhdGggZm91bmQuIE5vdGhpbmcgdG8gZG8sIHRoZSBmaWxlIHdhcyBoYW5kbGVkLCByZW1vdmluZyAka2VybmVsX21vZHVsZV9pbWFnZV9maWxlcGF0aCBhbmQgJGttbV9jb25maWdfZmlsZV9maWxlcGF0aCIKICAgIHJtIC1mICRrZXJuZWxfbW9kdWxlX2ltYWdlX2ZpbGVwYXRoCiAgICBybSAtZiAka21tX2NvbmZpZ19maWxlX2ZpbGVwYXRoCmVsc2UKICAgIHBvZG1hbiBwdWxsIC0tYXV0aGZpbGUgL3Zhci9saWIva3ViZWxldC9jb25maWcuanNvbiAkd29ya2VyX2ltYWdlCiAgICBpZiBbICQ/IC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvICJJbWFnZSAkd29ya2VyX2ltYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwdWxsZWQiCiAgICBlbHNlCiAgICAgICAgZWNobyAiRmFpbGVkIHRvIHB1bGwgaW1hZ2UgJHdvcmtlcl9pbWFnZSIKICAgICAgICBleGl0IDEKICAgIGZpCgogICAgZWNobyAiRmlsZSAka2VybmVsX21vZHVsZV9pbWFnZV9maWxlcGF0aCBpcyBub3Qgb24gdGhlIGZpbGVzeXN0ZW0sIHB1bGxpbmcgaW1hZ2UgJGZ1bGxfa2VybmVsX21vZHVsZV9pbWFnZSIKICAgIHBvZG1hbiBwdWxsIC0tYXV0aGZpbGUgL3Zhci9saWIva3ViZWxldC9jb25maWcuanNvbiAkZnVsbF9rZXJuZWxfbW9kdWxlX2ltYWdlCiAgICBpZiBbICQ/IC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvICJJbWFnZSAkZnVsbF9rZXJuZWxfbW9kdWxlX2ltYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwdWxsZWQiCiAgICBlbHNlCiAgICAgICAgZWNobyAiRmFpbGVkIHRvIHB1bGwgaW1hZ2UgJGZ1bGxfa2VybmVsX21vZHVsZV9pbWFnZSIKICAgICAgICBleGl0IDEKICAgIGZpCiAgICBlY2hvICJTYXZpbmcgaW1hZ2UgJGZ1bGxfa2VybmVsX21vZHVsZV9pbWFnZSBpbnRvIGEgZmlsZSAka2VybmVsX21vZHVsZV9pbWFnZV9maWxlcGF0aCIKICAgIHBvZG1hbiBzYXZlIC1vICRrZXJuZWxfbW9kdWxlX2ltYWdlX2ZpbGVwYXRoICRmdWxsX2tlcm5lbF9tb2R1bGVfaW1hZ2UKICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgogICAgICAgIGVjaG8gIkltYWdlICRmdWxsX2tlcm5lbF9tb2R1bGVfaW1hZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNhdmUgb24gZmlsZSAka2VybmVsX21vZHVsZV9pbWFnZV9maWxlcGF0aCwgcmVib290aW5nLi4uIgogICAgICAgIHJlYm9vdAogICAgZWxzZQogICAgICAgIGVjaG8gIkZhaWxlZCB0byBzYXZlIGltYWdlICRmdWxsX2tlcm5lbF9tb2R1bGVfaW1hZ2UgdG8gZmlsZSAka2VybmVsX21vZHVsZV9pbWFnZV9maWxlcGF0aCIKICAgIGZpCmZpCg==" + source: "data:text/plain;base64,IyEvYmluL2Jhc2gKCgp3b3JrZXJfaW1hZ2U9IiRXT1JLRVJfSU1BR0UiCmtlcm5lbF9tb2R1bGVfaW1hZ2U9IiRLRVJORUxfTU9EVUxFX0lNQUdFIgprZXJuZWxfbW9kdWxlX2ltYWdlX3RhZz0kKHVuYW1lIC1yKQpmdWxsX2tlcm5lbF9tb2R1bGVfaW1hZ2U9IiRrZXJuZWxfbW9kdWxlX2ltYWdlOiRrZXJuZWxfbW9kdWxlX2ltYWdlX3RhZyIKCmlmIFsgLW4gIiQocG9kbWFuIGltYWdlcyAtcSAkZnVsbF9rZXJuZWxfbW9kdWxlX2ltYWdlIDI+IC9kZXYvbnVsbCkiIF07IHRoZW4KICAgIGVjaG8gIkltYWdlICRmdWxsX2tlcm5lbF9tb2R1bGVfaW1hZ2UgZXhpc3QgbG9jYWxseS4gTm90aGluZyB0byBkbywgcmVtb3ZpbmcgJGttbV9jb25maWdfZmlsZV9maWxlcGF0aCIKICAgIHJtIC1mICRrbW1fY29uZmlnX2ZpbGVfZmlsZXBhdGgKZWxzZQogICAgcG9kbWFuIHB1bGwgLS1hdXRoZmlsZSAvdmFyL2xpYi9rdWJlbGV0L2NvbmZpZy5qc29uICR3b3JrZXJfaW1hZ2UKICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgogICAgICAgIGVjaG8gIkltYWdlICR3b3JrZXJfaW1hZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHB1bGxlZCIKICAgIGVsc2UKICAgICAgICBlY2hvICJGYWlsZWQgdG8gcHVsbCBpbWFnZSAkd29ya2VyX2ltYWdlIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICBlY2hvICJQdWxsaW5nIGltYWdlICRmdWxsX2tlcm5lbF9tb2R1bGVfaW1hZ2UiCiAgICBwb2RtYW4gcHVsbCAtLWF1dGhmaWxlIC92YXIvbGliL2t1YmVsZXQvY29uZmlnLmpzb24gJGZ1bGxfa2VybmVsX21vZHVsZV9pbWFnZQogICAgaWYgWyAkPyAtZXEgMCBdOyB0aGVuCiAgICAgICAgZWNobyAiSW1hZ2UgJGZ1bGxfa2VybmVsX21vZHVsZV9pbWFnZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcHVsbGVkIgogICAgZWxzZQogICAgICAgIGVjaG8gIkZhaWxlZCB0byBwdWxsIGltYWdlICRmdWxsX2tlcm5lbF9tb2R1bGVfaW1hZ2UiCiAgICAgICAgZXhpdCAxCiAgICBmaQogICAgZWNobyAiUmVib290aW5nLi4uIgogICAgcmVib290CmZpCg==" - path: "/usr/local/bin/wait-for-dispatcher.sh" mode: 493 overwrite: true