diff --git a/.github/workflows/build_and_test.yaml b/.github/workflows/build_and_test.yaml index 34b247f..08f7309 100644 --- a/.github/workflows/build_and_test.yaml +++ b/.github/workflows/build_and_test.yaml @@ -31,115 +31,152 @@ jobs: - build strategy: matrix: - k8s: [ v1.14.10, v1.15.12, v1.16.15, v1.17.17, v1.18.19, v1.19.11, v1.20.7, v1.21.2, v1.22.5, v1.23.3 ] + k8s: + [ + v1.14.10, + v1.15.12, + v1.16.15, + v1.17.17, + v1.18.19, + v1.19.11, + v1.20.7, + v1.21.2, + v1.22.5, + v1.23.3, + ] name: "Test on k8s ${{ matrix.k8s }}" runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Create k8s Kind Cluster - uses: helm/kind-action@v1.3.0 - with: - node_image: kindest/node:${{ matrix.k8s }} - config: test/kind-config.yaml - cluster_name: sidecar-testing - wait: 5m - - name: Download artifact - uses: actions/download-artifact@v3 - with: - name: images - path: /tmp - - name: Load images into kind cluster - run : | - kind load image-archive /tmp/k8s-sidecar.tar --name sidecar-testing - kind load image-archive /tmp/dummy-server.tar --name sidecar-testing - - name: Install Sidecar and Dummy Server - run: | - wait_for_pod_ready() { - while [[ $(kubectl get pods $1 -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}') != "True" ]]; do echo "waiting for pod '$1' to become ready..." && sleep 5; done - echo "Pod '$1' ready." - } - echo "Installing sidecar..." - kubectl apply -f "test/resources/sidecar.yaml" + - name: Checkout + uses: actions/checkout@v3 + - name: Create k8s Kind Cluster + uses: helm/kind-action@v1.3.0 + with: + node_image: kindest/node:${{ matrix.k8s }} + config: test/kind-config.yaml + cluster_name: sidecar-testing + wait: 5m + - name: Download artifact + uses: actions/download-artifact@v3 + with: + name: images + path: /tmp + - name: Load images into kind cluster + run: | + kind load image-archive /tmp/k8s-sidecar.tar --name sidecar-testing + kind load image-archive /tmp/dummy-server.tar --name sidecar-testing + - name: Install Sidecar and Dummy Server + run: | + wait_for_pod_ready() { + while [[ $(kubectl get pods $1 -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}') != "True" ]]; do echo "waiting for pod '$1' to become ready..." && sleep 5; done + echo "Pod '$1' ready." + } + echo "Installing sidecar..." + kubectl apply -f "test/resources/sidecar.yaml" - sleep 10 + sleep 10 - kubectl get pods + kubectl get pods - wait_for_pod_ready "sidecar" - wait_for_pod_ready "sidecar-5xx" - wait_for_pod_ready "dummy-server-pod" + wait_for_pod_ready "sidecar" + wait_for_pod_ready "sidecar-5xx" + wait_for_pod_ready "dummy-server-pod" - - name: Install Configmaps and Secrets - run: | - wait_for_pod_log() { - while [[ $(kubectl logs $1 | grep $2) == "" ]]; do echo "waiting 5 more seconds for '$2' to appear in logs of pod '$1'..." && sleep 5; done - echo "Pod '$1' logs contains '$2'" - } - # because the sidecar pods signal ready state before we actually opened up all watching subprocesses, we wait some more time - sleep 20 - echo "Installing resources..." - kubectl apply -f "test/resources/resources.yaml" - pods=("sidecar" "sidecar-5xx") - resources=("sample-configmap" "sample-secret-binary" "absolute-configmap" "relative-configmap" "url-configmap-500" "url-configmap-basic-auth" "sample-configmap") - for p in ${pods[*]}; do - for r in ${resources[*]}; do - wait_for_pod_log $p $r + - name: Install Configmaps and Secrets + run: | + wait_for_pod_log() { + while [[ $(kubectl logs $1 | grep $2) == "" ]]; do echo "waiting 5 more seconds for '$2' to appear in logs of pod '$1'..." && sleep 5; done + echo "Pod '$1' logs contains '$2'" + } + # because the sidecar pods signal ready state before we actually opened up all watching subprocesses, we wait some more time + sleep 20 + echo "Installing resources..." + kubectl apply -f "test/resources/resources.yaml" + pods=("sidecar" "sidecar-5xx") + resources=("sample-configmap" "sample-secret-binary" "absolute-configmap" "relative-configmap" "url-configmap-500" "url-configmap-basic-auth" "sample-configmap") + for p in ${pods[*]}; do + for r in ${resources[*]}; do + wait_for_pod_log $p $r + done done - done - # 5 more seconds after the last thing appeared in the logs. - sleep 5 - - name: Retrieve pod logs - run: | - kubectl logs sidecar > /tmp/sidecar.log - kubectl logs sidecar-5xx > /tmp/sidecar-5xx.log - kubectl logs dummy-server-pod > /tmp/dummy-server.log - - name: Upload artifacts - uses: actions/upload-artifact@v3 - with: - name: pod-logs_${{ matrix.k8s }} - path: /tmp/*.log - - name: Download expected files from cluster - run: | - echo "Downloading resource files from sidecar..." - kubectl cp sidecar:/tmp/hello.world /tmp/hello.world - kubectl cp sidecar:/tmp/cm-kubelogo.png /tmp/cm-kubelogo.png - kubectl cp sidecar:/tmp/secret-kubelogo.png /tmp/secret-kubelogo.png - kubectl cp sidecar:/tmp/script_result /tmp/script_result - kubectl cp sidecar:/tmp/absolute/absolute.txt /tmp/absolute.txt - kubectl cp sidecar:/tmp/relative/relative.txt /tmp/relative.txt - kubectl cp sidecar:/tmp/500.txt /tmp/500.txt || true - kubectl cp sidecar:/tmp/secured.txt /tmp/secured.txt + # 5 more seconds after the last thing appeared in the logs. + sleep 5 + - name: Retrieve pod logs + run: | + kubectl logs sidecar > /tmp/sidecar.log + kubectl logs sidecar-5xx > /tmp/sidecar-5xx.log + kubectl logs dummy-server-pod > /tmp/dummy-server.log + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: pod-logs_${{ matrix.k8s }} + path: /tmp/*.log + - name: Download expected files from cluster + run: | + echo "Downloading resource files from sidecar..." + kubectl cp sidecar:/tmp/hello.world /tmp/hello.world + kubectl cp sidecar:/tmp/cm-kubelogo.png /tmp/cm-kubelogo.png + kubectl cp sidecar:/tmp/secret-kubelogo.png /tmp/secret-kubelogo.png + kubectl cp sidecar:/tmp/script_result /tmp/script_result + kubectl cp sidecar:/tmp/absolute/absolute.txt /tmp/absolute.txt + kubectl cp sidecar:/tmp/relative/relative.txt /tmp/relative.txt + kubectl cp sidecar:/tmp/500.txt /tmp/500.txt || true + kubectl cp sidecar:/tmp/secured.txt /tmp/secured.txt - echo "Downloading resource files from sidecar-5xx..." - kubectl cp sidecar-5xx:/tmp-5xx/hello.world /tmp/5xx/hello.world - kubectl cp sidecar-5xx:/tmp-5xx/cm-kubelogo.png /tmp/5xx/cm-kubelogo.png - kubectl cp sidecar-5xx:/tmp-5xx/secret-kubelogo.png /tmp/5xx/secret-kubelogo.png - # script also generates into '/tmp' - kubectl cp sidecar-5xx:/tmp/script_result /tmp/5xx/script_result - # absolute path in configmap points to /tmp in 'absolute-configmap' - kubectl cp sidecar-5xx:/tmp/absolute/absolute.txt /tmp/5xx/absolute.txt - kubectl cp sidecar-5xx:/tmp-5xx/relative/relative.txt /tmp/5xx/relative.txt - kubectl cp sidecar-5xx:/tmp-5xx/500.txt /tmp/5xx/500.txt - kubectl cp sidecar-5xx:/tmp-5xx/secured.txt /tmp/5xx/secured.txt + echo "Downloading resource files from sidecar-5xx..." + kubectl cp sidecar-5xx:/tmp-5xx/hello.world /tmp/5xx/hello.world + kubectl cp sidecar-5xx:/tmp-5xx/cm-kubelogo.png /tmp/5xx/cm-kubelogo.png + kubectl cp sidecar-5xx:/tmp-5xx/secret-kubelogo.png /tmp/5xx/secret-kubelogo.png + # script also generates into '/tmp' + kubectl cp sidecar-5xx:/tmp/script_result /tmp/5xx/script_result + # absolute path in configmap points to /tmp in 'absolute-configmap' + kubectl cp sidecar-5xx:/tmp/absolute/absolute.txt /tmp/5xx/absolute.txt + kubectl cp sidecar-5xx:/tmp-5xx/relative/relative.txt /tmp/5xx/relative.txt + kubectl cp sidecar-5xx:/tmp-5xx/500.txt /tmp/5xx/500.txt + kubectl cp sidecar-5xx:/tmp-5xx/secured.txt /tmp/5xx/secured.txt - - name: Verify files - run: | - echo "Verifying file content from sidecar and sidecar-5xx ..." - # this needs to be the last statement so that it defines the script exit code - echo -n "Hello World!" | diff - /tmp/hello.world && - diff test/kubelogo.png /tmp/cm-kubelogo.png && - diff test/kubelogo.png /tmp/secret-kubelogo.png && - echo -n "This absolutely exists" | diff - /tmp/absolute.txt && - echo -n "This relatively exists" | diff - /tmp/relative.txt && - echo -n "allowed" | diff - /tmp/secured.txt && - echo -n '{"detail":"Not authenticated"}' | diff - /tmp/5xx/secured.txt && - [ ! -f /tmp/500.txt ] && echo "No 5xx file created" && - ls /tmp/script_result && - echo -n "Hello World!" | diff - /tmp/5xx/hello.world && - diff test/kubelogo.png /tmp/5xx/cm-kubelogo.png && - diff test/kubelogo.png /tmp/5xx/secret-kubelogo.png && - echo -n "This absolutely exists" | diff - /tmp/5xx/absolute.txt && - echo -n "This relatively exists" | diff - /tmp/5xx/relative.txt && - echo -n "500" | diff - /tmp/5xx/500.txt && - ls /tmp/5xx/script_result \ No newline at end of file + - name: Update Configmaps and Secrets + run: | + sleep 5 + current_time=$(date -u +"%Y-%m-%dT%H:%M:%SZ") + wait_for_pod_log() { + while [[ $(kubectl logs $1 --since-time ${current_time} | grep $2) == "" ]]; do echo "waiting 5 more seconds for '$2' to appear in logs of pod '$1'..." && sleep 5; done + echo "Pod '$1' logs contains '$2'" + } + echo "Updating resources..." + kubectl apply -f "test/resources/change_resources.yaml" + pods=("sidecar" "sidecar-5xx") + resources=("sample-configmap" "sample-secret-binary" "absolute-configmap" "relative-configmap" "url-configmap-500" "url-configmap-basic-auth" "sample-configmap") + for p in ${pods[*]}; do + for r in ${resources[*]}; do + wait_for_pod_log $p $r + done + done + # 20 more seconds after the last thing appeared in the logs. + sleep 20 + - name: Verify files + run: | + echo "Verifying file content from sidecar and sidecar-5xx ..." + # this needs to be the last statement so that it defines the script exit code + echo -n "Hello World!" | diff - /tmp/hello.world && + diff test/kubelogo.png /tmp/cm-kubelogo.png && + diff test/kubelogo.png /tmp/secret-kubelogo.png && + echo -n "This absolutely exists" | diff - /tmp/absolute.txt && + echo -n "This relatively exists" | diff - /tmp/relative.txt && + echo -n "allowed" | diff - /tmp/secured.txt && + echo -n '{"detail":"Not authenticated"}' | diff - /tmp/5xx/secured.txt && + [ ! -f /tmp/500.txt ] && echo "No 5xx file created" && + ls /tmp/script_result && + echo -n "Hello World!" | diff - /tmp/5xx/hello.world && + diff test/kubelogo.png /tmp/5xx/cm-kubelogo.png && + diff test/kubelogo.png /tmp/5xx/secret-kubelogo.png && + echo -n "This absolutely exists" | diff - /tmp/5xx/absolute.txt && + echo -n "This relatively exists" | diff - /tmp/5xx/relative.txt && + echo -n "500" | diff - /tmp/5xx/500.txt && + ls /tmp/5xx/script_result && + kubectl exec sidecar -- sh -c "ls /tmp/" && + kubectl exec sidecar -- sh -c "! test -e /tmp/hello.world" && kubectl exec sidecar -- sh -c "test -e /tmp/change-hello.world" && + kubectl exec sidecar -- sh -c "! test -e /tmp/cm-kubelogo.png" && kubectl exec sidecar -- sh -c "test -e /tmp/change-cm-kubelogo.png" && + kubectl exec sidecar -- sh -c "! test -e /tmp/secret-kubelogo.png" && kubectl exec sidecar -- sh -c "test -e /tmp/change-secret-kubelogo.png" && + kubectl exec sidecar -- sh -c "! test -e /tmp/absolute/absolute.txt" && kubectl exec sidecar -- sh -c "test -e /tmp/absolute/change-absolute.txt" && + kubectl exec sidecar -- sh -c "! test -e /tmp/relative/relative.txt" && kubectl exec sidecar -- sh -c "test -e /tmp/relative/change-relative.txt" diff --git a/src/resources.py b/src/resources.py index 3da08ac..14724b3 100755 --- a/src/resources.py +++ b/src/resources.py @@ -4,6 +4,7 @@ import os import signal import sys +import copy import traceback from collections import defaultdict from multiprocessing import Process @@ -30,6 +31,7 @@ }}) _resources_version_map = {} +_resources_object_map = {} # Get logger logger = get_logger() @@ -87,10 +89,12 @@ def list_resources(label, label_value, target_folder, request_url, request_metho ret = getattr(v1, _list_namespace[namespace][resource])(**additional_args) files_changed = False + exist_keys = set() # For all the found resources for item in ret.items: metadata = item.metadata + exist_keys.add(metadata.namespace + metadata.name) # Ignore already processed resource # Avoid numerous logs about useless resource processing each time the LIST loop reconnects @@ -111,6 +115,15 @@ def list_resources(label, label_value, target_folder, request_url, request_metho else: files_changed = _process_secret(dest_folder, item, resource, unique_filenames, enable_5xx) + # Clear the cache that is not listed. + for key in set(_resources_object_map.keys()) - exist_keys: + item = _resources_object_map.get(key) + + if resource == RESOURCE_CONFIGMAP: + files_changed |= _process_config_map(dest_folder, item, resource, unique_filenames, enable_5xx, True) + else: + files_changed = _process_secret(dest_folder, item, resource, unique_filenames, enable_5xx, True) + if script and files_changed: execute(script) @@ -119,11 +132,19 @@ def list_resources(label, label_value, target_folder, request_url, request_metho def _process_secret(dest_folder, secret, resource, unique_filenames, enable_5xx, is_removed=False): + files_changed = False + + old_secret = _resources_object_map.get(secret.metadata.namespace + secret.metadata.name) or copy.deepcopy(secret) + if is_removed: + _resources_object_map.pop(secret.metadata.namespace + secret.metadata.name, None) + else: + _resources_object_map[secret.metadata.namespace + secret.metadata.name] = copy.deepcopy(secret) + if secret.data is None: logger.warning(f"No data field in {resource}") - return False - else: - return _iterate_data( + + if secret.data is not None: + files_changed |= _iterate_data( secret.data, dest_folder, secret.metadata, @@ -132,12 +153,33 @@ def _process_secret(dest_folder, secret, resource, unique_filenames, enable_5xx, CONTENT_TYPE_BASE64_BINARY, enable_5xx, is_removed) + if old_secret.data is not None and not is_removed: + for key in set(old_secret.data.keys()) & set(secret.data or {}): + old_secret.data.pop(key) + files_changed |= _iterate_data( + old_secret.data, + dest_folder, + old_secret.metadata, + resource, + unique_filenames, + CONTENT_TYPE_BASE64_BINARY, + enable_5xx, + True) + return files_changed def _process_config_map(dest_folder, config_map, resource, unique_filenames, enable_5xx, is_removed=False): files_changed = False + + old_config_map = _resources_object_map.get(config_map.metadata.namespace + config_map.metadata.name) or copy.deepcopy(config_map) + if is_removed: + _resources_object_map.pop(config_map.metadata.namespace + config_map.metadata.name, None) + else: + _resources_object_map[config_map.metadata.namespace + config_map.metadata.name] = copy.deepcopy(config_map) + if config_map.data is None and config_map.binary_data is None: - logger.debug(f"No data/binaryData field in {resource}") + logger.warning(f"No data/binaryData field in {resource}") + if config_map.data is not None: logger.debug(f"Found 'data' on {resource}") files_changed |= _iterate_data( @@ -149,6 +191,18 @@ def _process_config_map(dest_folder, config_map, resource, unique_filenames, ena CONTENT_TYPE_TEXT, enable_5xx, is_removed) + if old_config_map.data is not None and not is_removed: + for key in set(old_config_map.data.keys()) & set(config_map.data or {}): + old_config_map.data.pop(key) + files_changed |= _iterate_data( + old_config_map.data, + dest_folder, + old_config_map.metadata, + resource, + unique_filenames, + CONTENT_TYPE_TEXT, + enable_5xx, + True) if config_map.binary_data is not None: logger.debug(f"Found 'binary_data' on {resource}") files_changed |= _iterate_data( @@ -160,6 +214,18 @@ def _process_config_map(dest_folder, config_map, resource, unique_filenames, ena CONTENT_TYPE_BASE64_BINARY, enable_5xx, is_removed) + if old_config_map.binary_data is not None and not is_removed: + for key in set(old_config_map.binary_data.keys()) & set(config_map.binary_data or {}): + old_config_map.binary_data.pop(key) + files_changed |= _iterate_data( + old_config_map.binary_data, + dest_folder, + old_config_map.metadata, + resource, + unique_filenames, + CONTENT_TYPE_BASE64_BINARY, + enable_5xx, + True) return files_changed diff --git a/test/resources/change_resources.yaml b/test/resources/change_resources.yaml new file mode 100644 index 0000000..527c4b5 --- /dev/null +++ b/test/resources/change_resources.yaml @@ -0,0 +1,44 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: sample-configmap + labels: + findme: "yea" +data: + change-hello.world: |- + Hello World! +binaryData: + change-cm-kubelogo.png: iVBORw0KGgoAAAANSUhEUgAAAUAAAAA5CAYAAABHyvIXAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH4QoHExgJIwx/SwAAGblJREFUeNrtnXl4FFXWxn/VW9LZgCQQEgggIMoqi4ABBEQHFB11UBwZVxAFZZsR3B2XGfcZh01EcVwQHBFGRfh0HBRB3MDIooKyiMgACRAC2dfuru+Pe5NOd6qql3QWYr3PU4+Yqq576y7vPefcc84FEyZMmPiVQmnIwvpMPdrGZncPVhWlpdWjHDrjWNvPVq1S3GY3mDBhotkSYJ+pR9vY7eqdKuoMIKZG4QdQmR9fVP7ixtfOKDO7w4QJE82GAPtNy+qIhTsVuBVwGjx6VEWdZylXFm5dklZidosJEyZOWwLsM/3oGVbF80cFpgBRIfw0B0V9Xilzzt26JDHf7B4TJkycNgR4zrTsnlaLeg8wAbDV4VUFCspih831zFdz00+a3WTChIkmS4D9Zx3qg8c6B/gDYI1g/YpUeMVitT+1dV7rbLO7TJgw0WQI8NwZR/p5FOU+VK6mfu2J5agstXrUxzKfb3fI7DYTJkw0GgEOmJU1TFXVe1CVy0L9bbskK+OGxLB6cymHclyh/rwCeMvt8Tz27aL2e83uM2HCRIMR4IBZWcNUj/IIqBeGW+Di6YkM6hbFum2l3PdaXriv8aDwtqoqj2xfmPqD2Y0mTJgIB0FtVPSbceQiRVUeUz0MBrWOjCs411O311hQGa+gXtV/5pEPPIrlLzvmp2Y2cNvFAmcDZwFfAQeawXiIrvFN3wPm4mLi10uA/aZldVQsrAIGRsrCl3XSBTg4khuRABALqnKZRVUv7T8z6w2XwzL1u7+3La6ntjofuAroLgmiQw0J+uLTlAD7Izauukvi6wRY5L0bTQI00dxh0b+lKhaF1cDASBZYVCpEv4IST2RVeZXrreWe/44fr1rrqa1+C8wCRgMdaeAwwnrCKGA2MBbobDweTJj4FRHggFnHBqkKfSNdoDNK8IbDFnn+UGDovtSsy8xuNWHCRJ1UYNWjDo9UIVYLdEqx0aG1jRG9ogEYNySG/GIPP2W7+PFQJRWVakTKsqiWi4D3zK41YSJsOBAeF79eAkRVM+qi5CkKDO0RxdiBTjLOjiIhxlfYTE20cv/vWwBQUq7y+a4yVm8uZcvu8jp+kjrUHL8mTAQ19zsgTB89gR7yv70Rpp7Xft0EqJCh9eeUllbuHp9A5t4KVnyqvd8wpHsUMy6Pp1s7e1CViIlSGN3fyej+TnYdrGTu6gK276+9ANmsMOuKBDql2HhoWR6nijTtiH0Gz8hN2LIwqcAc4yZM6GIG8A9zFdDAgBnHuqi422rdy+gexcje0YzsHU28U+GlD4t8iGz2uASuzIjRLKyw1EO8U0iCHhVUVajHNdGzo50lM5N4c2MxC9cUUulWq8nv0etacvG5IqlM384ONnynmUHLWkHZIOBjc4ybMGEiZAL0KO4hio5J7pNvy7h8sJNzOjuYOjaeuGgL894rICHGwoKpifTq6Cv17TlcyXubS/l8VxkOm8K/H2gNQHGZh9EPHqdbmo0RvaO5dJCTlJZiA9eiwHUXxNKxjY27XjmF3QpPT2xFRneRWGbz7nK++EFfVVZUy1CTAE2YMBGeCqxqq78g3FdumZ/LhedEc9fVLbh+VCy/6R+Nyy3C3KqQddLNM//O57Od5T7SXRVioy1UulR2Hqxk58FKXvigkGuGxzL1knjinML4OKxnFKsfbE2bllYUBfKKPTy+Ip9PvjXOnapaTDugCRMmAkPTDUaBIYYEo8LHO8q47pkcjuS6SWlp9SG/9TvK+P2TOT7kBxAb5S3OogiVuQpuD7y5sZhrn87hpyxvjHBKK0F+R3LdXPvUiYDkJyRAMkY+otrM7jVhwkRIEuDQu3PiS0srewXz4xMFHtZsLuH2S+Or/1ZcpvLifwopKa+tQ9ckPIA4p4XiMt+IkOyTbl5eV8STN7f0+fvKTcXk5AcdPRKXl3ekF7DD7OI6ozVwDtBejpcc4CjwLRDJYww6IqJtUoAk4IS8vgZ2R+D9VqALYpczCRHK6ABKgePAL7KcvCDelQScIeucjkj6Gy8FilPy2i6vSHr8tweGA22BZCBX9sdWYFcTHkMpwAVAqhxPJ2Xf7pDjqK4+cDFAX6APkAgkAMXy2oeIaPpZq5xaBFhSWjFYQQkqmsJmhcvP893wiI1WWD4nmQVrC1nxaTGq6nvPh6WiFY7V+H+HXWHKJXHceGFcrbJG93fyxkbf9xmKth7r0CZCgDOARw3uL0O4HVTh34gIDS2cLSerFj4EBuncS5eDIRRcCUwGhqKd47EMeAf4C7AnzLaxAzfJNupj8NxBYAkwP4TvsALDgN8AI4BzEbHOgbAXcYTDphp/GwxkyPYdjHAdCQYngbXAk3VoIytwvRwj/QyeOwS8jNjZLazjmH0O4x3il4G7AiliiNDR2bLd9IIujgFLgadle4WCLsADwHggLsCzecCXCB/hJboqsAXLkKBnSEZMtepbUq5S4VKriWzOuAT+fksrWsR6i3D6SYBVO8IAXdNsLJ+TzM0XxWGRjxWUeKqTJvTsaGdYz+Cz6ytqk7ADXgbMBVrpXNs1BlKcwfNGoWrxBr8Lx6NznJQ29BbDaEQc8XeSBEMNo+svV+aXApBflXT4OPCTJLNA6AFkAxvlBBkWJPkBdAP8d9jek/04IQTyQ0ojN0np7P4w+qAXsBPhk9cvwLPpwCPAfkn6dUGswVhqhfH5Psg2+gZYBZwXYGykAHdLCe3qEOo4GZGwY2IQ5AfQEhHyOc3QBqiiZgRbg+suiK3+9xsbipm++GR1rC/AyD7RvHVvMoO6CeLq1MZX4OyUYkNRYMLIWJbNTqZLqvf+0VNuJs7N9bH5TRgRG0onnt/I5NcXeNOAQHZKkjndPe4dwJ+BVwg+G/jlUsLqGmJZbYF1wDVBDPbWYX5PpST1SMIqCfyvIfxmjJRYzg7DZPE+cEMjjYcMYItc4EJBC+AtP21IDxOlFOcMo35fGRCgqkgRPyA6txWhbQDllSr/2ljM1n0VTJ6f62Ora93CyqJpibz9QGuu9SOw+65pwUePpzBnXAIOu1dI2Z/tYtLcXH455uLVj7x+hueeGUXL2OAEDRXaD7zjSHojDYI0qfrorUxZcjVqTgc/3QQ8FMRz/YAVUsoIl3BfRUQt1Ad+kHbB+sD9BmaKmugpTSHxdTAtvBSE1BhpdJDScnKYv7dI1XuUwTOpwDzCT0ayWZcAz515rKcUcQNieC+vRrF5d3l1dpd9WZVMlORVXYjilfb8bYit4nwJ7bsDgkSP5QkS3X2okv/JzNFWC4zoHR30l7psNIYaHCfJr73O/ULgUmmzaW64NwAxxQNvh7ly10QM8Dr1k5FnWz22jwV4IohveydItc4IUcByGi7Dj1WSdusItNHrBiaLmxGbHOHCRwL00Uk9eIK2/9VUV/2dkrNPupk0L5f5UxLp3ckedM2++KGcu185RVmF707Hlz+U02GEKK9bu+C9W6RD9IoGJAC7tHvoif8V0s6x4zQhtK+ATxG5Dh2IvIG/R+yC6klnD0pbmRZmIHZPteCRavQ/pR0rRaq6d+tMhv7AhYTu8H4MWC+/qVBO3I6SuPshdlSDRRHwMMJ4XyxJp6+0T7XQ+c0FCHud3gI4BWGH1Gujf8rrgJSGrkVsNGgZyHvIxXZtGFJwlsF9rQ2dCeinzlMlGb+I2GRKkuaf+3SIvp1836sa9y4yqNdq4FmEPbFUmkI6y3qNReTx3KtLgKhqRrCLamqi19zzU3btsz3yiz3c/9op1j7Sxtt7Kjy8PI8DR1307eJgzjgvkZdVqNz18inKNbLCHKghTaYlhZLur0E3QhTZwRfrCaSyU9edJuQ3VX6PPx6SE0rPVnyl1CJOaUjGsw0myB+kDagKJyS5rJckp7WS3h4GAb4D3KFzz6ZTjhEB+u+WLgeel3awZB0J50K0kw1ES8I3sn297tdG3wMbgP+gHdhwexgE+DdCS4ZgkQufHm6TpF2FHCkJr0PYgp069dYiwLY6ZZTIBbOyxt9OyYViPfCULEfVVYEVlKAlwKQE70+PnKhNgO2SrFw3ytfM8+pHRXyQWcqPhyp5c2Mxa7d4TS3RDoXfDnZWR4H4S5RVqAqXCxJ9ht6dE99AhPGEHKB6K/dEOflOF+hJALlSii3SuR8tJ7jWyp2o85s3/MivJjbpEDHAyAirwS4iY//7GVhscF/Pz3a4wQR/24/8auJjHbIAsRlY30EBfaV0pYU1fuRXE98gdte1MEBHinYZaF+BVONSLeYWpc3OSlbhzGC/uLSGo3OlGywWkaBgxuXxLL8rmTUPt+Ha4b4E6J/zz1/au++aFmx4si3L70pmyiXxdE+317IbukJzK7WWlFYMbgCymC7tX3rSzVQpGTQXZAErDe73DFF1eSNAeXpmjERC3yVtKBhJ+nq730buK/8Ks43iEM7f9Yn66FsL2huyhwwIcAMBoti0RH4xSyvUDGrRjT4Ka7i7/PWGlvTt7Kjl6Fxrue4TzbtflZBb4CEt0Vqd3MDnqy3QPd1O93Q7t10Sx7E8N0dOeCXA8orQnMYbKDGCURbqOxE7cs0NHwOTdO5115HW9BAfYBIZrezdgB+bYPscCvC9hNhGMQHaKMng3lkIn9P6glG9nQHqbQtQb/+F5BOEXVMLvYEvEO5DzyM2ZcqDI0BVyQiG/hJiLFw+2En3dK+pZGiP4ByUu6fbWftwG7b9VMHAblHYgtBmU1pafdTeDm1sDO0RZZgNxkf8atzECE8htuybI/aGMBktGPv8raxDPVo10fY5bnAv1oDM9bCsCbeRUb1fi3C9lyIcvo1MW0PkNU+q388i7KX6BKgo2qKjw65w65g4zunsIL21lTYtjFmrvFLl56Mu9me72J9dSUyUhVtGx2GRynaUXakl+eUVe5i3ugCnQ6Frmp0uqTY6t7XVyiINkJwg0m4Vlarsz67k0Ak3mXvL+SCzVPOoTUXlvPHjVeuqVYq7ESbBFcACRFRCc0NeCBJbDNq7lJFAUyXAUkS4YLSOelfLXEPd3Dsas41aNeB7cxEmp6VB/D4ZYZqajgi1ewa/wIOa4qem68aoPtFMGu3dqXa5Ydf/KkhN9JJheaXKQ8vz2HvYxeFcFx4/O93YgU6fbDH+yNxb4bMhUlP669nRzjOTWlUr5/uzXew5XMk5nR3ygssGObFZFVZ/VaKpbvzS/nhHhGG6odEdsQN1vuy4uuJ0OYnO3oD1VptwO3iaSN+ericY6tW7ygd0McH5lMYhonAuwS8AwRZIF8/cV86n35dRWKryybdlZO4tr870suLeZM5MsxNlV6h0Ue2w7CMbt7Mbkh/A4LMcRDuUWv5/x/LcDO8dVU1+BSUebnz2RPVzHdvYuPw8J+nJNr7eo68SWzwU13NHuQxsGd0RO2EXElz2FKNJ06IJSZNGNid/si8K0EZ1QVEzkahdBhJjXVFYz3XPQ3+Hv776dinCR/VRhC+kI4j3DUHYBcdUzbOaA/IzxJm3viO5wMOdL53SfNs7X5Rwz3ixUz15TByf7SqrJf1dNdQ3W8zr64v5538LeXZyIgO7iTonxFgY09/Je5t9Jbg4p8JtF3tV/TWbS31I8uBxFwvXFAaSD37eMr/N8XoeANOBP6K/IzkE4cpxUxDvKgkg0jcVGMV65mhIaXk69S/FOFtOIHzZjMwKhToEWEndzu/4KkTJ2R7i+3PRTxKxqA6L1PoA93+Rc+pehG/nrQgHeiNchHDjWulDgKrKA4rCiFBsNWu2lHLzRXGktLLSo4OdG0bFsfRj77fGRiuMHeiVUHPy3bz4n0LKKlSeWpXPyvtaV58JcvWwmFoEeM/VLUiMFw+UVqis2BS6IKfC3aDUt5r0CyJ+8Qv0Ix1uRPg9LazDap3ahCbrlQb3tJIJ/KxDgE6EK8RBTOxBO5TMjgj+j6QZpzJM6V4L+9CPAlkL/Lee2y0bkZDjL4gd4gcRfoR6mFBFgNXG2O3PpX2jKMqUUEotq1CZ9553vt5xaTxDamxwjB3o9EmC+sIHRdUS3C/HXLz7pZfwenSw07ODd+G5YVSsD3k+/3+FPg7RQdLf37Y/l/Z2Aw3ebAInOHgW4exqhP0G94Y3kYnaG2OftU+CJMXqtc7kPkBEj+hhToTLMnL4Hhjiu4zCB2fTcDbISkQ43EBEJElA7cVnN2rrgtSlisILoZS4blsp72eKtrRZ4ZlbvIcXXT3Uu9u/P9vFmi2+Et6SD30zR189LAZFgUmj45h1hXdDbPt+/SM4DfBxQlLa/Q08gHcD16Fvx7PLlaeNwTt2Gty7AREn2ZhogYjZtRiov1oTYrPBO6eGMVEsND9sCNBGd4T4PmuYC+1l6EekaOFzg3u/QYTWWSJU7yAVP15AxDRrIUV/EJWlzkT1yYYbEI+vyGfXQSFROx0KC6Yk8uj1Lema5jUxLlxbUMs+mFvgYdknXpV5zAAnc29NZNpl8dUbH/uyKrnzpVOaLi5GKqniYMLGRxRXIwzi9zGOi0xBP7SrajBVGpDPJkmEXaRK2RmRtTkpwt+R5mcOiUUYm7cisitjYPPREtVXoL8TrgB/BzKlqaC1xoRIR+ziPS0nbwbNDx8ikr7qtdEihOH/d2jvfsYhoifuRSTcGGdQ1g/o2wEdUm29GOGKEi3b/3w5tv2l0a/lZSQF7pB9qxXeFo04dmGWNCMZaaIzpRlpBMYbH51lnQ3Vf80Vd/CsYykuj/sbVT+lU+2Wdyr8Y3IiA86sXaet+yq4baH22I+JUnj3z21ITqjNxT8fdTFlYS4nC0OKfytVPAzbuigt0mmNnkE/DfjFfnYORaqBIw3edxP6sZ3vS3U6UohH2xA9R67OgdSKcoJLz1QgifmEzv2HCH7DI19e8fKyaUhEegvJEDmRtLA4DEnqKNrG9aMY22WLET6Q/shEPy/gZIKLHHIjok2KZBlV2Zpr4lGE07DRYhtOoMB2am+CXSHVz2Cks8Oyb2PkuPLXiJ7HL3OzztwoRthN82U7FMvFsq1s3ygD8u8JOm4JW+anHBswLesKLHxOkLnbikpVpi8+yexxCVw1NMYnqK5XJ3HY+a6DleTkuykqU3E6FNolWTmrvZ04jRC6DzJLeXJlvubhSoaNq6oTty5qV5853YIVwSdJu5cecSyQKo9WyNTjUtppCv5bdoLfFZxsQH4gzsa4lOCSgrZAP6UU1F9C1MbGy4gNpkuDUBM7BXgmUBstCZMAu0vuqKlhvYdwTQnk6aBIySw9zHoP8NNK+odR/2qi1vXL2roobVu/mVlTFFVXSqmFCpfKkyvzOXTCxZ+u9NrwouwKA7o6GNDVEdR7Psgs5c/L8kJnHYWnty9s91YTGcgHEMb9RQYTfB7i4Bh/fCltGLefRhP3SUQuxEDS5LWS+DvWsbzmSoAqInPQhgh8Y6DfL5fq5pAQ3xuNSJziH4M9HeEKNrie6p1OYDeXQMihRniqoWFy+4K0ZaAuCrWEqiwvLjds+K7M55wQTZ21QmXTTu9zp4pCP0lQVfioa3bqg01sMC+WNhs9VB08pIXpGKdUaiqoQOR7C3bD6YCUAD83CdBwkmYQeh4/f5yJsVubB+ET930Y79bKMFMkzT7L6ljvZB2iO7eO7y1AJPTNCSgBVsur5Wl/UqOyexHcaVxYLd7Dix5bkcfaLaVYLdDnDAfprW0kJ1iId1qocKnk5LvZc7iSPYddVLhU+ndxsGRmEmMGOFn8fiGlwWd++cXu9kxopHjfQKv5rYizT/VMCc/KFdOjMTjvkDaPp9DPIacHl1TBP0f/4KX9wBHC21lWpdrzIKGfSXtcTpTrEXbBzmGUvRNhBK+geaIQYVf7HcKW1yuMd2RKE4xR5pBsuQg/KjWOYMwdR9DfqCtDbHb8C+GXNzCMem/XmS9J8lvCiStfj9hk2eWvjwfE4FnHUio97swAejsA15wfwz3jW3DwuIurHs8J+hzfapFpeiKDukWx9OMiFqwJKoKnyKJYMr5Z0HZnPQ/ICwxsVyulZKOHURhnQ3kHY9tZld1llLR5JCFCj1zyykMY5A8hHIp3yytYcugp39sbkYKoDWIDLA6RVrxqQh6Xas96xKZPJNJQ2aQdajTCS7893qMXqyJIcmRZP8hJvRnjkMAk9A/W2U/o53700SGGQCfI9dPRsooJ7bB3ixx7o+XVUbZRlZ9ZHiItf1UbbUVEf/wvxO9MrdEP7WTfW2TfH5bvX4fwVwx2Zg9AuMKMRmyQJeK1i+fLuu+W9d4m+/Yng/fFI0LZxiASsfbUIcsi+c5PpWkmU1PAC7Zlzp1xpJ8H5XO0d7UAkQV6xb2tiYlS+Me7BbyxIfTIjTH9nTxxc0vcHpg490S1e42uJKAo125bkLoSE/UJhYZPOtAYZZr9cvrVuyqLTkv5Xk8NYg1YRtDOid8sbLcd1dA/h95nOIiJUigpV/lwa3iZxTftLONUkQerBQafFRVIEXrCJL8GU+V/DWWa/XL61duN9+yPnxFhqaeCLSNkN4t+M7LmK8IZsRYcdoXrL4hly57yQJKbIbqm2bior5O3NhUbbYis63I0dWwTtPuZMGHiNBJFQ8LIR1RbQW72OoRNrLGwz2MtH7Rj3hl5ZheaMGGiwQgQYNC0w0luiyVT1c98Up8ocnuU875dlLrL7D4TJkzUBWEFlH+9qH2u2+oZh3HuunqxHSiqMskkPxMmTDQaAQLsmNd+B8IBtuHYD/WvW59LXWV2mwkTJhqVAAG2LUx7Q1GVa1Thg1TfeHF7UtqjZpeZMGEiUohIsH2fOUdjrWXqcMWipke6gipqAar64/aF7b81u8uECRMmTJgwYSIC+H/DglRlbodP6AAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNy0xMC0wN1QxOToyNDowOSswMDowMFm7FUoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMTAtMDdUMTk6MjQ6MDkrMDA6MDAo5q32AAAAAElFTkSuQmCC +--- +apiVersion: v1 +kind: Secret +metadata: + name: sample-secret-binary + labels: + findme: "yea" +data: + change-secret-kubelogo.png: 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 +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: absolute-configmap + labels: + findme: "yup" + annotations: + k8s-sidecar-target-directory: /tmp/absolute/ +data: + change-absolute.txt: |- + This absolutely exists +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: relative-configmap + labels: + findme: "yup" + annotations: + k8s-sidecar-target-directory: relative +data: + change-relative.txt: |- + This relatively exists \ No newline at end of file