From d676ee1b5e89af96b08db08660b7bea9988999a8 Mon Sep 17 00:00:00 2001 From: Ares Date: Tue, 12 Mar 2024 15:50:06 +0800 Subject: [PATCH] update release/1.21-GA --- ReadME.MD | 4 +- coredns/.github/workflows/tests.yaml | 92 -- coredns/.gitignore | 6 - coredns/CONTRIBUTING.md | 34 - coredns/LICENSE | 202 --- coredns/Pipfile | 16 - coredns/Pipfile.lock | 246 --- coredns/README.md | 15 - coredns/charmcraft.yaml | 6 - coredns/config.yaml | 38 - coredns/dispatch | 3 - coredns/hooks/install | 3 - coredns/hooks/start | 3 - coredns/hooks/upgrade-charm | 3 - coredns/icon.svg | 1 - coredns/metadata.yaml | 21 - coredns/requirements.txt | 4 - coredns/revision | 1 - coredns/src/charm.py | 204 --- coredns/tests/func/test_deploy.py | 51 - coredns/tests/func/validate-dns-spec.yaml | 11 - coredns/tests/unit/test_charm.py | 42 - coredns/tox.ini | 27 - coredns/venv/PyYAML-5.3.1.dist-info/INSTALLER | 1 - coredns/venv/PyYAML-5.3.1.dist-info/LICENSE | 20 - coredns/venv/PyYAML-5.3.1.dist-info/METADATA | 41 - coredns/venv/PyYAML-5.3.1.dist-info/RECORD | 41 - coredns/venv/PyYAML-5.3.1.dist-info/REQUESTED | 0 coredns/venv/PyYAML-5.3.1.dist-info/WHEEL | 5 - .../venv/PyYAML-5.3.1.dist-info/top_level.txt | 2 - .../venv/__pycache__/oci_image.cpython-38.pyc | Bin 2056 -> 0 bytes .../venv/oci_image-1.0.0.dist-info/INSTALLER | 1 - .../venv/oci_image-1.0.0.dist-info/METADATA | 63 - coredns/venv/oci_image-1.0.0.dist-info/RECORD | 9 - .../venv/oci_image-1.0.0.dist-info/REQUESTED | 0 coredns/venv/oci_image-1.0.0.dist-info/WHEEL | 5 - .../oci_image-1.0.0.dist-info/direct_url.json | 1 - .../oci_image-1.0.0.dist-info/top_level.txt | 1 - coredns/venv/oci_image.py | 53 - coredns/venv/ops-0.10.0.dist-info/INSTALLER | 1 - coredns/venv/ops-0.10.0.dist-info/LICENSE.txt | 202 --- coredns/venv/ops-0.10.0.dist-info/METADATA | 167 -- coredns/venv/ops-0.10.0.dist-info/RECORD | 29 - coredns/venv/ops-0.10.0.dist-info/REQUESTED | 0 coredns/venv/ops-0.10.0.dist-info/WHEEL | 5 - .../venv/ops-0.10.0.dist-info/top_level.txt | 1 - coredns/venv/ops/__init__.py | 20 - .../ops/__pycache__/__init__.cpython-38.pyc | Bin 323 -> 0 bytes .../venv/ops/__pycache__/charm.cpython-38.pyc | Bin 24731 -> 0 bytes .../ops/__pycache__/framework.cpython-38.pyc | Bin 32525 -> 0 bytes .../__pycache__/jujuversion.cpython-38.pyc | Bin 3276 -> 0 bytes .../venv/ops/__pycache__/log.cpython-38.pyc | Bin 1886 -> 0 bytes .../venv/ops/__pycache__/main.cpython-38.pyc | Bin 11153 -> 0 bytes .../venv/ops/__pycache__/model.cpython-38.pyc | Bin 47206 -> 0 bytes .../ops/__pycache__/storage.cpython-38.pyc | Bin 11642 -> 0 bytes .../ops/__pycache__/testing.cpython-38.pyc | Bin 28428 -> 0 bytes .../ops/__pycache__/version.cpython-38.pyc | Bin 227 -> 0 bytes coredns/venv/ops/charm.py | 575 ------- coredns/venv/ops/framework.py | 1073 ------------ coredns/venv/ops/jujuversion.py | 106 -- coredns/venv/ops/lib/__init__.py | 262 --- .../lib/__pycache__/__init__.cpython-38.pyc | Bin 7628 -> 0 bytes coredns/venv/ops/log.py | 51 - coredns/venv/ops/main.py | 404 ----- coredns/venv/ops/model.py | 1284 --------------- coredns/venv/ops/storage.py | 318 ---- coredns/venv/ops/testing.py | 818 ---------- coredns/venv/ops/version.py | 3 - coredns/venv/yaml/__init__.py | 427 ----- .../yaml/__pycache__/__init__.cpython-38.pyc | Bin 11922 -> 0 bytes .../yaml/__pycache__/composer.cpython-38.pyc | Bin 3640 -> 0 bytes .../__pycache__/constructor.cpython-38.pyc | Bin 20899 -> 0 bytes .../yaml/__pycache__/cyaml.cpython-38.pyc | Bin 3483 -> 0 bytes .../yaml/__pycache__/dumper.cpython-38.pyc | Bin 1900 -> 0 bytes .../yaml/__pycache__/emitter.cpython-38.pyc | Bin 25430 -> 0 bytes .../yaml/__pycache__/error.cpython-38.pyc | Bin 2377 -> 0 bytes .../yaml/__pycache__/events.cpython-38.pyc | Bin 4051 -> 0 bytes .../yaml/__pycache__/loader.cpython-38.pyc | Bin 2241 -> 0 bytes .../yaml/__pycache__/nodes.cpython-38.pyc | Bin 1802 -> 0 bytes .../yaml/__pycache__/parser.cpython-38.pyc | Bin 12001 -> 0 bytes .../yaml/__pycache__/reader.cpython-38.pyc | Bin 4614 -> 0 bytes .../__pycache__/representer.cpython-38.pyc | Bin 10146 -> 0 bytes .../yaml/__pycache__/resolver.cpython-38.pyc | Bin 5555 -> 0 bytes .../yaml/__pycache__/scanner.cpython-38.pyc | Bin 25346 -> 0 bytes .../__pycache__/serializer.cpython-38.pyc | Bin 3397 -> 0 bytes .../yaml/__pycache__/tokens.cpython-38.pyc | Bin 5012 -> 0 bytes coredns/venv/yaml/composer.py | 139 -- coredns/venv/yaml/constructor.py | 748 --------- coredns/venv/yaml/cyaml.py | 101 -- coredns/venv/yaml/dumper.py | 62 - coredns/venv/yaml/emitter.py | 1137 ------------- coredns/venv/yaml/error.py | 75 - coredns/venv/yaml/events.py | 86 - coredns/venv/yaml/loader.py | 63 - coredns/venv/yaml/nodes.py | 49 - coredns/venv/yaml/parser.py | 589 ------- coredns/venv/yaml/reader.py | 185 --- coredns/venv/yaml/representer.py | 389 ----- coredns/venv/yaml/resolver.py | 227 --- coredns/venv/yaml/scanner.py | 1435 ----------------- coredns/venv/yaml/serializer.py | 111 -- coredns/venv/yaml/tokens.py | 104 -- kata/.build.manifest | 531 ------ kata/.gitignore | 4 - kata/.travis.yml | 11 - kata/.travis/profile-update.yaml | 12 - kata/CONTRIBUTING.md | 41 - kata/LICENSE | 201 --- kata/Makefile | 24 - kata/README.md | 7 - kata/actions.yaml | 2 - kata/actions/debug | 102 -- kata/bin/charm-env | 107 -- kata/bin/layer_option | 22 - kata/copyright | 16 - kata/copyright.layer-basic | 16 - kata/copyright.layer-options | 16 - kata/debug-scripts/charm-unitdata | 12 - kata/debug-scripts/filesystem | 17 - kata/debug-scripts/juju-logs | 4 - kata/debug-scripts/juju-network-get | 21 - kata/debug-scripts/network | 11 - kata/debug-scripts/packages | 7 - kata/debug-scripts/sysctl | 4 - kata/debug-scripts/systemd | 9 - kata/docs/status.md | 91 -- kata/hooks/config-changed | 22 - kata/hooks/containerd-relation-broken | 22 - kata/hooks/containerd-relation-changed | 22 - kata/hooks/containerd-relation-created | 22 - kata/hooks/containerd-relation-departed | 22 - kata/hooks/containerd-relation-joined | 22 - kata/hooks/hook.template | 22 - kata/hooks/install | 22 - kata/hooks/leader-elected | 22 - kata/hooks/leader-settings-changed | 22 - kata/hooks/post-series-upgrade | 22 - kata/hooks/pre-series-upgrade | 22 - .../relations/container-runtime/.gitignore | 104 -- .../hooks/relations/container-runtime/LICENSE | 201 --- .../relations/container-runtime/README.md | 45 - .../relations/container-runtime/__init__.py | 0 .../container-runtime/interface.yaml | 4 - .../relations/container-runtime/provides.py | 55 - .../relations/container-runtime/requires.py | 61 - .../untrusted-container-runtime/.gitignore | 104 -- .../untrusted-container-runtime/LICENSE | 201 --- .../untrusted-container-runtime/README.md | 54 - .../untrusted-container-runtime/__init__.py | 0 .../interface.yaml | 4 - .../untrusted-container-runtime/provides.py | 28 - .../untrusted-container-runtime/requires.py | 34 - kata/hooks/start | 22 - kata/hooks/stop | 22 - kata/hooks/untrusted-relation-broken | 22 - kata/hooks/untrusted-relation-changed | 22 - kata/hooks/untrusted-relation-created | 22 - kata/hooks/untrusted-relation-departed | 22 - kata/hooks/untrusted-relation-joined | 22 - kata/hooks/update-status | 22 - kata/hooks/upgrade-charm | 22 - kata/icon.svg | 279 ---- kata/layer.yaml | 20 - kata/lib/charms/layer/__init__.py | 60 - kata/lib/charms/layer/basic.py | 446 ----- kata/lib/charms/layer/execd.py | 114 -- kata/lib/charms/layer/options.py | 26 - kata/lib/charms/layer/status.py | 189 --- kata/lib/debug_script.py | 8 - kata/make_docs | 20 - kata/metadata.yaml | 29 - kata/pydocmd.yml | 16 - kata/reactive/__init__.py | 0 kata/reactive/kata.py | 136 -- kata/reactive/status.py | 4 - kata/requirements.txt | 3 - kata/revision | 1 - kata/tests/conftest.py | 4 - kata/tests/test_kata_reactive.py | 35 - kata/tox.ini | 34 - kata/version | 1 - kata/wheelhouse.txt | 21 - kata/wheelhouse/Jinja2-2.10.1.tar.gz | Bin 260956 -> 0 bytes kata/wheelhouse/MarkupSafe-1.1.1.tar.gz | Bin 19151 -> 0 bytes kata/wheelhouse/PyYAML-5.2.tar.gz | Bin 265687 -> 0 bytes kata/wheelhouse/Tempita-0.5.2.tar.gz | Bin 12648 -> 0 bytes kata/wheelhouse/certifi-2021.5.30.tar.gz | Bin 147455 -> 0 bytes kata/wheelhouse/charmhelpers-0.20.22.tar.gz | Bin 624637 -> 0 bytes kata/wheelhouse/charms.reactive-1.4.1.tar.gz | Bin 39377 -> 0 bytes .../charset-normalizer-2.0.3.tar.gz | Bin 345714 -> 0 bytes kata/wheelhouse/idna-3.2.tar.gz | Bin 243962 -> 0 bytes kata/wheelhouse/netaddr-0.7.19.tar.gz | Bin 1622835 -> 0 bytes kata/wheelhouse/pbr-5.6.0.tar.gz | Bin 125220 -> 0 bytes kata/wheelhouse/pip-18.1.tar.gz | Bin 1259370 -> 0 bytes kata/wheelhouse/pyaml-20.4.0.tar.gz | Bin 21176 -> 0 bytes kata/wheelhouse/requests-2.26.0.tar.gz | Bin 104433 -> 0 bytes kata/wheelhouse/setuptools-41.6.0.zip | Bin 852541 -> 0 bytes kata/wheelhouse/setuptools_scm-1.17.0.tar.gz | Bin 29124 -> 0 bytes kata/wheelhouse/six-1.16.0.tar.gz | Bin 34041 -> 0 bytes kata/wheelhouse/urllib3-1.26.6.tar.gz | Bin 289927 -> 0 bytes kata/wheelhouse/wheel-0.33.6.tar.gz | Bin 48130 -> 0 bytes 201 files changed, 1 insertion(+), 16612 deletions(-) delete mode 100644 coredns/.github/workflows/tests.yaml delete mode 100644 coredns/.gitignore delete mode 100644 coredns/CONTRIBUTING.md delete mode 100644 coredns/LICENSE delete mode 100644 coredns/Pipfile delete mode 100644 coredns/Pipfile.lock delete mode 100644 coredns/README.md delete mode 100644 coredns/charmcraft.yaml delete mode 100644 coredns/config.yaml delete mode 100755 coredns/dispatch delete mode 100755 coredns/hooks/install delete mode 100755 coredns/hooks/start delete mode 100755 coredns/hooks/upgrade-charm delete mode 100644 coredns/icon.svg delete mode 100644 coredns/metadata.yaml delete mode 100644 coredns/requirements.txt delete mode 100644 coredns/revision delete mode 100755 coredns/src/charm.py delete mode 100644 coredns/tests/func/test_deploy.py delete mode 100644 coredns/tests/func/validate-dns-spec.yaml delete mode 100644 coredns/tests/unit/test_charm.py delete mode 100644 coredns/tox.ini delete mode 100644 coredns/venv/PyYAML-5.3.1.dist-info/INSTALLER delete mode 100644 coredns/venv/PyYAML-5.3.1.dist-info/LICENSE delete mode 100644 coredns/venv/PyYAML-5.3.1.dist-info/METADATA delete mode 100644 coredns/venv/PyYAML-5.3.1.dist-info/RECORD delete mode 100644 coredns/venv/PyYAML-5.3.1.dist-info/REQUESTED delete mode 100644 coredns/venv/PyYAML-5.3.1.dist-info/WHEEL delete mode 100644 coredns/venv/PyYAML-5.3.1.dist-info/top_level.txt delete mode 100644 coredns/venv/__pycache__/oci_image.cpython-38.pyc delete mode 100644 coredns/venv/oci_image-1.0.0.dist-info/INSTALLER delete mode 100644 coredns/venv/oci_image-1.0.0.dist-info/METADATA delete mode 100644 coredns/venv/oci_image-1.0.0.dist-info/RECORD delete mode 100644 coredns/venv/oci_image-1.0.0.dist-info/REQUESTED delete mode 100644 coredns/venv/oci_image-1.0.0.dist-info/WHEEL delete mode 100644 coredns/venv/oci_image-1.0.0.dist-info/direct_url.json delete mode 100644 coredns/venv/oci_image-1.0.0.dist-info/top_level.txt delete mode 100644 coredns/venv/oci_image.py delete mode 100644 coredns/venv/ops-0.10.0.dist-info/INSTALLER delete mode 100644 coredns/venv/ops-0.10.0.dist-info/LICENSE.txt delete mode 100644 coredns/venv/ops-0.10.0.dist-info/METADATA delete mode 100644 coredns/venv/ops-0.10.0.dist-info/RECORD delete mode 100644 coredns/venv/ops-0.10.0.dist-info/REQUESTED delete mode 100644 coredns/venv/ops-0.10.0.dist-info/WHEEL delete mode 100644 coredns/venv/ops-0.10.0.dist-info/top_level.txt delete mode 100644 coredns/venv/ops/__init__.py delete mode 100644 coredns/venv/ops/__pycache__/__init__.cpython-38.pyc delete mode 100644 coredns/venv/ops/__pycache__/charm.cpython-38.pyc delete mode 100644 coredns/venv/ops/__pycache__/framework.cpython-38.pyc delete mode 100644 coredns/venv/ops/__pycache__/jujuversion.cpython-38.pyc delete mode 100644 coredns/venv/ops/__pycache__/log.cpython-38.pyc delete mode 100644 coredns/venv/ops/__pycache__/main.cpython-38.pyc delete mode 100644 coredns/venv/ops/__pycache__/model.cpython-38.pyc delete mode 100644 coredns/venv/ops/__pycache__/storage.cpython-38.pyc delete mode 100644 coredns/venv/ops/__pycache__/testing.cpython-38.pyc delete mode 100644 coredns/venv/ops/__pycache__/version.cpython-38.pyc delete mode 100644 coredns/venv/ops/charm.py delete mode 100644 coredns/venv/ops/framework.py delete mode 100644 coredns/venv/ops/jujuversion.py delete mode 100644 coredns/venv/ops/lib/__init__.py delete mode 100644 coredns/venv/ops/lib/__pycache__/__init__.cpython-38.pyc delete mode 100644 coredns/venv/ops/log.py delete mode 100644 coredns/venv/ops/main.py delete mode 100644 coredns/venv/ops/model.py delete mode 100644 coredns/venv/ops/storage.py delete mode 100644 coredns/venv/ops/testing.py delete mode 100644 coredns/venv/ops/version.py delete mode 100644 coredns/venv/yaml/__init__.py delete mode 100644 coredns/venv/yaml/__pycache__/__init__.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/composer.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/constructor.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/cyaml.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/dumper.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/emitter.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/error.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/events.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/loader.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/nodes.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/parser.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/reader.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/representer.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/resolver.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/scanner.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/serializer.cpython-38.pyc delete mode 100644 coredns/venv/yaml/__pycache__/tokens.cpython-38.pyc delete mode 100644 coredns/venv/yaml/composer.py delete mode 100644 coredns/venv/yaml/constructor.py delete mode 100644 coredns/venv/yaml/cyaml.py delete mode 100644 coredns/venv/yaml/dumper.py delete mode 100644 coredns/venv/yaml/emitter.py delete mode 100644 coredns/venv/yaml/error.py delete mode 100644 coredns/venv/yaml/events.py delete mode 100644 coredns/venv/yaml/loader.py delete mode 100644 coredns/venv/yaml/nodes.py delete mode 100644 coredns/venv/yaml/parser.py delete mode 100644 coredns/venv/yaml/reader.py delete mode 100644 coredns/venv/yaml/representer.py delete mode 100644 coredns/venv/yaml/resolver.py delete mode 100644 coredns/venv/yaml/scanner.py delete mode 100644 coredns/venv/yaml/serializer.py delete mode 100644 coredns/venv/yaml/tokens.py delete mode 100644 kata/.build.manifest delete mode 100644 kata/.gitignore delete mode 100644 kata/.travis.yml delete mode 100644 kata/.travis/profile-update.yaml delete mode 100644 kata/CONTRIBUTING.md delete mode 100644 kata/LICENSE delete mode 100644 kata/Makefile delete mode 100644 kata/README.md delete mode 100644 kata/actions.yaml delete mode 100755 kata/actions/debug delete mode 100755 kata/bin/charm-env delete mode 100755 kata/bin/layer_option delete mode 100644 kata/copyright delete mode 100644 kata/copyright.layer-basic delete mode 100644 kata/copyright.layer-options delete mode 100755 kata/debug-scripts/charm-unitdata delete mode 100755 kata/debug-scripts/filesystem delete mode 100755 kata/debug-scripts/juju-logs delete mode 100755 kata/debug-scripts/juju-network-get delete mode 100755 kata/debug-scripts/network delete mode 100755 kata/debug-scripts/packages delete mode 100755 kata/debug-scripts/sysctl delete mode 100755 kata/debug-scripts/systemd delete mode 100644 kata/docs/status.md delete mode 100755 kata/hooks/config-changed delete mode 100755 kata/hooks/containerd-relation-broken delete mode 100755 kata/hooks/containerd-relation-changed delete mode 100755 kata/hooks/containerd-relation-created delete mode 100755 kata/hooks/containerd-relation-departed delete mode 100755 kata/hooks/containerd-relation-joined delete mode 100644 kata/hooks/hook.template delete mode 100755 kata/hooks/install delete mode 100755 kata/hooks/leader-elected delete mode 100755 kata/hooks/leader-settings-changed delete mode 100755 kata/hooks/post-series-upgrade delete mode 100755 kata/hooks/pre-series-upgrade delete mode 100644 kata/hooks/relations/container-runtime/.gitignore delete mode 100644 kata/hooks/relations/container-runtime/LICENSE delete mode 100644 kata/hooks/relations/container-runtime/README.md delete mode 100644 kata/hooks/relations/container-runtime/__init__.py delete mode 100644 kata/hooks/relations/container-runtime/interface.yaml delete mode 100644 kata/hooks/relations/container-runtime/provides.py delete mode 100644 kata/hooks/relations/container-runtime/requires.py delete mode 100644 kata/hooks/relations/untrusted-container-runtime/.gitignore delete mode 100644 kata/hooks/relations/untrusted-container-runtime/LICENSE delete mode 100644 kata/hooks/relations/untrusted-container-runtime/README.md delete mode 100644 kata/hooks/relations/untrusted-container-runtime/__init__.py delete mode 100644 kata/hooks/relations/untrusted-container-runtime/interface.yaml delete mode 100644 kata/hooks/relations/untrusted-container-runtime/provides.py delete mode 100644 kata/hooks/relations/untrusted-container-runtime/requires.py delete mode 100755 kata/hooks/start delete mode 100755 kata/hooks/stop delete mode 100755 kata/hooks/untrusted-relation-broken delete mode 100755 kata/hooks/untrusted-relation-changed delete mode 100755 kata/hooks/untrusted-relation-created delete mode 100755 kata/hooks/untrusted-relation-departed delete mode 100755 kata/hooks/untrusted-relation-joined delete mode 100755 kata/hooks/update-status delete mode 100755 kata/hooks/upgrade-charm delete mode 100644 kata/icon.svg delete mode 100644 kata/layer.yaml delete mode 100644 kata/lib/charms/layer/__init__.py delete mode 100644 kata/lib/charms/layer/basic.py delete mode 100644 kata/lib/charms/layer/execd.py delete mode 100644 kata/lib/charms/layer/options.py delete mode 100644 kata/lib/charms/layer/status.py delete mode 100644 kata/lib/debug_script.py delete mode 100644 kata/make_docs delete mode 100644 kata/metadata.yaml delete mode 100644 kata/pydocmd.yml delete mode 100644 kata/reactive/__init__.py delete mode 100644 kata/reactive/kata.py delete mode 100644 kata/reactive/status.py delete mode 100644 kata/requirements.txt delete mode 100644 kata/revision delete mode 100644 kata/tests/conftest.py delete mode 100644 kata/tests/test_kata_reactive.py delete mode 100644 kata/tox.ini delete mode 100644 kata/version delete mode 100644 kata/wheelhouse.txt delete mode 100644 kata/wheelhouse/Jinja2-2.10.1.tar.gz delete mode 100644 kata/wheelhouse/MarkupSafe-1.1.1.tar.gz delete mode 100644 kata/wheelhouse/PyYAML-5.2.tar.gz delete mode 100644 kata/wheelhouse/Tempita-0.5.2.tar.gz delete mode 100644 kata/wheelhouse/certifi-2021.5.30.tar.gz delete mode 100644 kata/wheelhouse/charmhelpers-0.20.22.tar.gz delete mode 100644 kata/wheelhouse/charms.reactive-1.4.1.tar.gz delete mode 100644 kata/wheelhouse/charset-normalizer-2.0.3.tar.gz delete mode 100644 kata/wheelhouse/idna-3.2.tar.gz delete mode 100644 kata/wheelhouse/netaddr-0.7.19.tar.gz delete mode 100644 kata/wheelhouse/pbr-5.6.0.tar.gz delete mode 100644 kata/wheelhouse/pip-18.1.tar.gz delete mode 100644 kata/wheelhouse/pyaml-20.4.0.tar.gz delete mode 100644 kata/wheelhouse/requests-2.26.0.tar.gz delete mode 100644 kata/wheelhouse/setuptools-41.6.0.zip delete mode 100644 kata/wheelhouse/setuptools_scm-1.17.0.tar.gz delete mode 100644 kata/wheelhouse/six-1.16.0.tar.gz delete mode 100644 kata/wheelhouse/urllib3-1.26.6.tar.gz delete mode 100644 kata/wheelhouse/wheel-0.33.6.tar.gz diff --git a/ReadME.MD b/ReadME.MD index dd2686e..d66a0fe 100644 --- a/ReadME.MD +++ b/ReadME.MD @@ -9,11 +9,9 @@ charm pull cs:~containers/kubernetes-master-990 charm pull cs:~containers/kubernetes-worker-757 charm pull cs:~containers/calico-812 charm pull cs:~containers/containerd-119 -charm pull cs:~containers/kata-108 # Extend charm pull cs:~containers/kubeapi-load-balancer-786 charm pull cs:~containers/keepalived-85 -charm pull cs:~containers/coredns-20 ``` ## These are the container images used by this release: @@ -61,4 +59,4 @@ sig-storage/csi-resizer:v0.5.1 sig-storage/csi-snapshotter:v2.1.3 sig-storage/livenessprobe:v2.1.0 sonatype/nexus3:latest -``` \ No newline at end of file +``` diff --git a/coredns/.github/workflows/tests.yaml b/coredns/.github/workflows/tests.yaml deleted file mode 100644 index 9b2b55e..0000000 --- a/coredns/.github/workflows/tests.yaml +++ /dev/null @@ -1,92 +0,0 @@ -name: Test Suite for CoreDNS - -on: - - pull_request - -jobs: - lint-and-unit-tests: - name: Lint & Unit tests - runs-on: ubuntu-latest - steps: - - name: Check out code - uses: actions/checkout@v2 - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - name: Install Tox - run: pip install tox - - name: Run lint & unit tests - run: tox - - func-test: - name: Functional test with MicroK8s - runs-on: ubuntu-latest - timeout-minutes: 20 - steps: - - name: Check out code - uses: actions/checkout@v2 - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - name: Fix global gitconfig for confined snap - run: | - # GH automatically includes the git-lfs plugin and configures it in - # /etc/gitconfig. However, the confinement of the charmcraft snap - # means that it can see that this file exists but cannot read it, even - # if the file permissions should allow it; this breaks git usage within - # the snap. To get around this, we move it from the global gitconfig to - # the user's .gitconfig file. - cat /etc/gitconfig >> $HOME/.gitconfig - sudo rm /etc/gitconfig - - name: Install MicroK8s - uses: balchua/microk8s-actions@v0.1.3 - with: - rbac: 'true' - storage: 'true' - dns: 'true' # required for juju, will adjust later - - name: Install Dependencies - run: | - pip install tox - sudo snap install juju --classic - sudo snap install juju-wait --classic - sudo usermod -aG microk8s $USER - sudo snap install charmcraft --beta - sudo snap install yq - - name: Build charm - run: | - if ! charmcraft build; then - echo Build failed, full log: - cat "$(ls -1t "$HOME"/snap/charmcraft/common/charmcraft-log-* | head -n1)" - exit 1 - fi - - name: Bootstrap MicroK8s with Juju - run: sg microk8s 'juju bootstrap microk8s microk8s' - - name: Add model - run: juju add-model coredns microk8s - - name: Deploy CoreDNS - run: | - upstream_image=$(yq eval '.resources.coredns-image.upstream-source' metadata.yaml) - juju deploy ./coredns.charm --resource coredns-image=$upstream_image --config forward=8.8.8.8 - - name: Wait for stable environment - run: juju wait -wv - - name: Tell MicroK8s to use CoreDNS charm - run: | - cluster_ip=$(sudo microk8s.kubectl get svc -n coredns coredns -o jsonpath='{..spec.clusterIP}') - sudo sed -i -e "s/--cluster-dns=.*/--cluster-dns=$cluster_ip/" /var/snap/microk8s/current/args/kubelet - sudo systemctl restart snap.microk8s.daemon-kubelet - - name: Run functional test - run: tox -e func - - name: Juju Status - if: failure() - run: sudo juju status - - name: Juju Log - if: failure() - run: sudo juju debug-log --replay --no-tail -i coredns - - name: Microk8s Status - if: failure() - run: sudo microk8s.kubectl get all -A - - name: Microk8s Pod Log - if: failure() - run: sudo microk8s.kubectl logs -n coredns -l juju-app=coredns diff --git a/coredns/.gitignore b/coredns/.gitignore deleted file mode 100644 index 878f4f1..0000000 --- a/coredns/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.tox/ -__pycache__/ -*.pyc -placeholders/ -*.charm -build/ diff --git a/coredns/CONTRIBUTING.md b/coredns/CONTRIBUTING.md deleted file mode 100644 index e8f19f1..0000000 --- a/coredns/CONTRIBUTING.md +++ /dev/null @@ -1,34 +0,0 @@ -# Contributor Guide - -This Juju charm is open source ([Apache License 2.0](./LICENSE)) and we actively seek any community contibutions -for code, suggestions and documentation. -This page details a few notes, workflows and suggestions for how to make contributions most effective and help us -all build a better charm - please give them a read before working on any contributions. - -## Licensing - -This charm has been created under the [Apache License 2.0](./LICENSE), which will cover any contributions you may -make to this project. Please familiarise yourself with the terms of the license. - -Additionally, this charm uses the Harmony CLA agreement. It’s the easiest way for you to give us permission to -use your contributions. -In effect, you’re giving us a license, but you still own the copyright — so you retain the right to modify your -code and use it in other projects. Please [sign the CLA here](https://ubuntu.com/legal/contributors/agreement) before -making any contributions. - -## Code of conduct - -We have adopted the Ubuntu code of Conduct. You can read this in full [here](https://ubuntu.com/community/code-of-conduct). - -## Contributing code - -To contribute code to this project, please use the following workflow: - -1. [Submit a bug](https://bugs.launchpad.net/charm-coredns/+filebug) to explain the need for and track the change. -2. Create a branch on your fork of the repo with your changes, including a unit test covering the new or modified code. -3. Submit a PR. The PR description should include a link to the bug on Launchpad. -4. Update the Launchpad bug to include a link to the PR and the `review-needed` tag. -5. Once reviewed and merged, the change will become available on the edge channel and assigned to an appropriate milestone - for further release according to priority. - - diff --git a/coredns/LICENSE b/coredns/LICENSE deleted file mode 100644 index 7a4a3ea..0000000 --- a/coredns/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/coredns/Pipfile b/coredns/Pipfile deleted file mode 100644 index 466f522..0000000 --- a/coredns/Pipfile +++ /dev/null @@ -1,16 +0,0 @@ -[[source]] -name = "pypi" -url = "https://pypi.org/simple" -verify_ssl = true - -[dev-packages] -pytest = "*" -flake8 = "*" -ipdb = "*" - -[packages] -ops = "*" -oci-image = {git = "https://github.com/juju-solutions/resource-oci-image/"} - -[requires] -python_version = "3.8" diff --git a/coredns/Pipfile.lock b/coredns/Pipfile.lock deleted file mode 100644 index f6cd306..0000000 --- a/coredns/Pipfile.lock +++ /dev/null @@ -1,246 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "3a93ef1bf6ad71dacc9efebae3e194bb569d6bf8728161b19e95dbd7c407aa22" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.8" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "oci-image": { - "git": "https://github.com/juju-solutions/resource-oci-image/", - "ref": "c5778285d332edf3d9a538f9d0c06154b7ec1b0b" - }, - "ops": { - "hashes": [ - "sha256:23556db47b2c97a1bb72845b7c8ec88aa7a3e27717402903b5fea7b659616ab8", - "sha256:d102359496584617a00f6f42525a01d1b60269a3d41788cf025738cbe3348c99" - ], - "index": "pypi", - "version": "==0.10.0" - }, - "pyyaml": { - "hashes": [ - "sha256:02c78d77281d8f8d07a255e57abdbf43b02257f59f50cc6b636937d68efa5dd0", - "sha256:0dc9f2eb2e3c97640928dec63fd8dc1dd91e6b6ed236bd5ac00332b99b5c2ff9", - "sha256:124fd7c7bc1e95b1eafc60825f2daf67c73ce7b33f1194731240d24b0d1bf628", - "sha256:26fcb33776857f4072601502d93e1a619f166c9c00befb52826e7b774efaa9db", - "sha256:31ba07c54ef4a897758563e3a0fcc60077698df10180abe4b8165d9895c00ebf", - "sha256:3c49e39ac034fd64fd576d63bb4db53cda89b362768a67f07749d55f128ac18a", - "sha256:52bf0930903818e600ae6c2901f748bc4869c0c406056f679ab9614e5d21a166", - "sha256:5a3f345acff76cad4aa9cb171ee76c590f37394186325d53d1aa25318b0d4a09", - "sha256:5e7ac4e0e79a53451dc2814f6876c2fa6f71452de1498bbe29c0b54b69a986f4", - "sha256:7242790ab6c20316b8e7bb545be48d7ed36e26bbe279fd56f2c4a12510e60b4b", - "sha256:737bd70e454a284d456aa1fa71a0b429dd527bcbf52c5c33f7c8eee81ac16b89", - "sha256:8635d53223b1f561b081ff4adecb828fd484b8efffe542edcfdff471997f7c39", - "sha256:8b818b6c5a920cbe4203b5a6b14256f0e5244338244560da89b7b0f1313ea4b6", - "sha256:8bf38641b4713d77da19e91f8b5296b832e4db87338d6aeffe422d42f1ca896d", - "sha256:a36a48a51e5471513a5aea920cdad84cbd56d70a5057cca3499a637496ea379c", - "sha256:b2243dd033fd02c01212ad5c601dafb44fbb293065f430b0d3dbf03f3254d615", - "sha256:cc547d3ead3754712223abb7b403f0a184e4c3eae18c9bb7fd15adef1597cc4b", - "sha256:cc552b6434b90d9dbed6a4f13339625dc466fd82597119897e9489c953acbc22", - "sha256:f3790156c606299ff499ec44db422f66f05a7363b39eb9d5b064f17bd7d7c47b", - "sha256:f7a21e3d99aa3095ef0553e7ceba36fb693998fbb1226f1392ce33681047465f", - "sha256:fdc6b2cb4b19e431994f25a9160695cc59a4e861710cc6fc97161c5e845fc579" - ], - "index": "pypi", - "version": "==5.4" - } - }, - "develop": { - "attrs": { - "hashes": [ - "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", - "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" - ], - "version": "==20.3.0" - }, - "backcall": { - "hashes": [ - "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", - "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" - ], - "version": "==0.2.0" - }, - "decorator": { - "hashes": [ - "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", - "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" - ], - "version": "==4.4.2" - }, - "flake8": { - "hashes": [ - "sha256:15e351d19611c887e482fb960eae4d44845013cc142d42896e9862f775d8cf5c", - "sha256:f04b9fcbac03b0a3e58c0ab3a0ecc462e023a9faf046d57794184028123aa208" - ], - "index": "pypi", - "version": "==3.8.3" - }, - "iniconfig": { - "hashes": [ - "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", - "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" - ], - "version": "==1.1.1" - }, - "ipdb": { - "hashes": [ - "sha256:d6f46d261c45a65e65a2f7ec69288a1c511e16206edb2875e7ec6b2f66997e78" - ], - "index": "pypi", - "version": "==0.13.3" - }, - "ipython": { - "hashes": [ - "sha256:04323f72d5b85b606330b6d7e2dc8d2683ad46c3905e955aa96ecc7a99388e70", - "sha256:34207ffb2f653bced2bc8e3756c1db86e7d93e44ed049daae9814fed66d408ec" - ], - "version": "==7.21.0" - }, - "ipython-genutils": { - "hashes": [ - "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", - "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" - ], - "version": "==0.2.0" - }, - "jedi": { - "hashes": [ - "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93", - "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707" - ], - "version": "==0.18.0" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "packaging": { - "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" - ], - "version": "==20.9" - }, - "parso": { - "hashes": [ - "sha256:15b00182f472319383252c18d5913b69269590616c947747bc50bf4ac768f410", - "sha256:8519430ad07087d4c997fda3a7918f7cfa27cb58972a8c89c2a0295a1c940e9e" - ], - "version": "==0.8.1" - }, - "pexpect": { - "hashes": [ - "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", - "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" - ], - "markers": "sys_platform != 'win32'", - "version": "==4.8.0" - }, - "pickleshare": { - "hashes": [ - "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", - "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" - ], - "version": "==0.7.5" - }, - "pluggy": { - "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" - ], - "version": "==0.13.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:bf00f22079f5fadc949f42ae8ff7f05702826a97059ffcc6281036ad40ac6f04", - "sha256:e1b4f11b9336a28fa11810bc623c357420f69dfdb6d2dac41ca2c21a55c033bc" - ], - "version": "==3.0.18" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, - "py": { - "hashes": [ - "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", - "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" - ], - "version": "==1.10.0" - }, - "pycodestyle": { - "hashes": [ - "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367", - "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e" - ], - "version": "==2.6.0" - }, - "pyflakes": { - "hashes": [ - "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92", - "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8" - ], - "version": "==2.2.0" - }, - "pygments": { - "hashes": [ - "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94", - "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8" - ], - "version": "==2.8.1" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "version": "==2.4.7" - }, - "pytest": { - "hashes": [ - "sha256:1cd09785c0a50f9af72220dd12aa78cfa49cbffc356c61eab009ca189e018a33", - "sha256:d010e24666435b39a4cf48740b039885642b6c273a3f77be3e7e03554d2806b7" - ], - "index": "pypi", - "version": "==6.1.0" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "version": "==0.10.2" - }, - "traitlets": { - "hashes": [ - "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396", - "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426" - ], - "version": "==5.0.5" - }, - "wcwidth": { - "hashes": [ - "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", - "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" - ], - "version": "==0.2.5" - } - } -} diff --git a/coredns/README.md b/coredns/README.md deleted file mode 100644 index 18f5691..0000000 --- a/coredns/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# CoreDNS Operator - -[CoreDNS][] is a flexible, plugin-based DNS server, and is the recommended -solution for providing DNS to Kubernetes services within the cluster. -This operator enables integration with [Charmed Kubernetes][] via a -cross-model relation and allows for more customization than provided by the -deployment of CoreDNS provided by default by Charmed Kubernetes. - -More information on using this operator with Charmed Kubernetes can be found -[here](https://ubuntu.com/kubernetes/docs/cdk-addons#coredns), and bugs should -be filed [here](https://bugs.launchpad.net/charmed-kubernetes). - - -[CoreDNS]: https://coredns.io/ -[Charmed Kubernetes]: https://ubuntu.com/kubernetes/docs diff --git a/coredns/charmcraft.yaml b/coredns/charmcraft.yaml deleted file mode 100644 index 8ddda8d..0000000 --- a/coredns/charmcraft.yaml +++ /dev/null @@ -1,6 +0,0 @@ -type: charm -parts: - charm: - build-packages: [git] - prime: - - ./files/* diff --git a/coredns/config.yaml b/coredns/config.yaml deleted file mode 100644 index d502510..0000000 --- a/coredns/config.yaml +++ /dev/null @@ -1,38 +0,0 @@ -options: - domain: - description: The local domain for cluster DNS. - type: string - default: cluster.local - forward: - description: Where to forward non-cluster addresses. - type: string - default: /etc/resolv.conf - extra_servers: - description: Any additional servers to add to the Corefile. - type: string - default: '' - corefile: - description: >- - Configuration file to use for CoreDNS. This is interpreted as a Python - string. Template which will be given the `domain` and `forward` configs as - its context. - type: string - default: | - .:53 { - errors - health { - lameduck 5s - } - ready - kubernetes ${domain} in-addr.arpa ip6.arpa { - fallthrough in-addr.arpa ip6.arpa - pods insecure - } - prometheus :9153 - forward . ${forward} - cache 30 - loop - reload - loadbalance - } - ${extra_servers} diff --git a/coredns/dispatch b/coredns/dispatch deleted file mode 100755 index fe31c05..0000000 --- a/coredns/dispatch +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -JUJU_DISPATCH_PATH="${JUJU_DISPATCH_PATH:-$0}" PYTHONPATH=lib:venv ./src/charm.py diff --git a/coredns/hooks/install b/coredns/hooks/install deleted file mode 100755 index fe31c05..0000000 --- a/coredns/hooks/install +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -JUJU_DISPATCH_PATH="${JUJU_DISPATCH_PATH:-$0}" PYTHONPATH=lib:venv ./src/charm.py diff --git a/coredns/hooks/start b/coredns/hooks/start deleted file mode 100755 index fe31c05..0000000 --- a/coredns/hooks/start +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -JUJU_DISPATCH_PATH="${JUJU_DISPATCH_PATH:-$0}" PYTHONPATH=lib:venv ./src/charm.py diff --git a/coredns/hooks/upgrade-charm b/coredns/hooks/upgrade-charm deleted file mode 100755 index fe31c05..0000000 --- a/coredns/hooks/upgrade-charm +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -JUJU_DISPATCH_PATH="${JUJU_DISPATCH_PATH:-$0}" PYTHONPATH=lib:venv ./src/charm.py diff --git a/coredns/icon.svg b/coredns/icon.svg deleted file mode 100644 index a5bac8f..0000000 --- a/coredns/icon.svg +++ /dev/null @@ -1 +0,0 @@ -CoreDNS_Colour_Icon \ No newline at end of file diff --git a/coredns/metadata.yaml b/coredns/metadata.yaml deleted file mode 100644 index 6db0b27..0000000 --- a/coredns/metadata.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: coredns -summary: CoreDNS -maintainers: - - Cory Johns -description: | - CoreDNS provides DNS resolution for Kubernetes. -tags: - - networking -series: - - kubernetes -provides: - dns-provider: - interface: kube-dns -requires: {} -peers: {} -resources: - coredns-image: - type: oci-image - description: 'CoreDNS image' - upstream-source: coredns/coredns:1.6.7 -min-juju-version: 2.8.2 diff --git a/coredns/requirements.txt b/coredns/requirements.txt deleted file mode 100644 index d0569c4..0000000 --- a/coredns/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ --i https://pypi.org/simple -git+https://github.com/juju-solutions/resource-oci-image/@c5778285d332edf3d9a538f9d0c06154b7ec1b0b#egg=oci-image -ops==0.10.0 -pyyaml==5.3.1 diff --git a/coredns/revision b/coredns/revision deleted file mode 100644 index c227083..0000000 --- a/coredns/revision +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/coredns/src/charm.py b/coredns/src/charm.py deleted file mode 100755 index 6e4128e..0000000 --- a/coredns/src/charm.py +++ /dev/null @@ -1,204 +0,0 @@ -#!/usr/bin/env python3 - -import logging -from string import Template - -from ops.charm import CharmBase -from ops.main import main -from ops.model import ActiveStatus, MaintenanceStatus, WaitingStatus - -from oci_image import OCIImageResource, OCIImageResourceError - - -class CoreDNSCharm(CharmBase): - def __init__(self, *args): - super().__init__(*args) - if not self.unit.is_leader(): - # We can't do anything useful when not the leader, so do nothing. - self.model.unit.status = WaitingStatus('Waiting for leadership') - return - self.log = logging.getLogger(__name__) - self.image = OCIImageResource(self, 'coredns-image') - for event in [self.on.install, - self.on.leader_elected, - self.on.upgrade_charm, - self.on.config_changed]: - self.framework.observe(event, self.main) - self.framework.observe(self.on.dns_provider_relation_joined, self.provide_dns) - - def main(self, event): - try: - image_details = self.image.fetch() - except OCIImageResourceError as e: - self.model.unit.status = e.status - return - - self.model.unit.status = MaintenanceStatus('Setting pod spec') - - corefile = Template(self.model.config['corefile']) - corefile = corefile.safe_substitute(self.model.config) - - # Adapted from coredns.yaml.sed in https://github.com/coredns/ at 75a1cad - self.model.pod.set_spec({ - 'version': 3, - 'service': { - 'updateStrategy': { - 'type': 'RollingUpdate', - 'rollingUpdate': {'maxUnavailable': 1}, - }, - 'annotations': { - 'prometheus.io/port': "9153", - 'prometheus.io/scrape': "true", - }, - }, - # Dropped by a regression; see: - # https://bugs.launchpad.net/juju/+bug/1895886 - # 'priorityClassName': 'system-cluster-critical', - 'containers': [{ - 'name': 'coredns', - 'imageDetails': image_details, - 'imagePullPolicy': 'IfNotPresent', - 'args': ['-conf', '/etc/coredns/Corefile'], - 'volumeConfig': [{ - 'name': 'config-volume', - 'mountPath': '/etc/coredns', - # Not supported - # 'readOnly': True, - 'files': [{ - 'path': 'Corefile', - 'mode': 0o444, - 'content': corefile, - }], - }], - 'ports': [ - { - 'name': 'dns', - 'containerPort': 53, - 'protocol': 'UDP', - }, - { - 'name': 'dns-tcp', - 'containerPort': 53, - 'protocol': 'TCP', - }, - { - 'name': 'metrics', - 'containerPort': 9153, - 'protocol': 'TCP', - }, - ], - # Can't be specified by the charm yet; see: - # https://bugs.launchpad.net/juju/+bug/1893123 - # 'resources': { - # 'limits': {'memory': '170Mi'}, - # 'requests': {'cpu': '100m', 'memory': '70Mi'}, - # }, - 'kubernetes': { - 'securityContext': { - 'allowPrivilegeEscalation': False, - 'capabilities': { - 'add': ['NET_BIND_SERVICE'], - 'drop': ['all'], - }, - 'readOnlyRootFilesystem': True, - }, - 'livenessProbe': { - 'httpGet': { - 'path': '/health', - 'port': 8080, - 'scheme': 'HTTP', - }, - 'initialDelaySeconds': 60, - 'timeoutSeconds': 5, - 'successThreshold': 1, - 'failureThreshold': 5, - }, - 'readinessProbe': { - 'httpGet': { - 'path': '/ready', - 'port': 8181, - 'scheme': 'HTTP', - }, - }, - }, - }], - 'serviceAccount': { - 'roles': [{ - 'global': True, - 'rules': [ - { - 'apigroups': ['discovery.k8s.io'], - 'resources': [ - 'endpointslices', - ], - 'verbs': ['list', 'watch'], - }, - { - 'apigroups': [''], - 'resources': [ - 'endpoints', - 'services', - 'pods', - 'namespaces', - ], - 'verbs': ['list', 'watch'], - }, - { - 'apigroups': [''], - 'resources': ['nodes'], - 'verbs': ['get'], - }, - ], - }], - }, - 'kubernetesResources': { - 'pod': { - 'dnsPolicy': 'Default', - # Not yet supported by Juju; see: - # https://bugs.launchpad.net/juju/+bug/1895887 - # 'tolerations': [{ - # 'key': 'CriticalAddonsOnly', - # 'operator': 'Exists', - # }], - # 'affinity': { - # 'podAntiAffinity': { - # 'preferredDuringScheduling' + - # 'IgnoredDuringExecution': [{ - # 'weight': 100, - # 'podAffinityTerm': { - # 'labelSelector': { - # 'matchExpressions': [{ - # 'key': 'k8s-app', - # 'operator': 'In', - # 'values': ["kube-dns"], - # }], - # }, - # 'topologyKey': 'kubernetes.io/hostname', - # }, - # }], - # }, - # }, - # Can be done by the operator via placement (--to), but can't - # be specified by the charm yet, per same bug as above. - # 'nodeSelector': { - # 'kubernetes.io/os': 'linux', - # }, - } - } - }) - self.model.unit.status = ActiveStatus() - - def provide_dns(self, event): - provided_data = event.relation.data[self.unit] - if not provided_data.get('ingress-address'): - event.defer() - return - provided_data.update({ - 'domain': self.model.config['domain'], - 'sdn-ip': str(provided_data['ingress-address']), - 'port': "53", - }) - - -if __name__ == "__main__": - main(CoreDNSCharm) diff --git a/coredns/tests/func/test_deploy.py b/coredns/tests/func/test_deploy.py deleted file mode 100644 index 1497cc3..0000000 --- a/coredns/tests/func/test_deploy.py +++ /dev/null @@ -1,51 +0,0 @@ -import subprocess -from pathlib import Path -from time import sleep - -import pytest - - -CHARM_DIR = Path(__file__).parent.parent.parent.resolve() -SPEC_FILE = Path(__file__).parent / 'validate-dns-spec.yaml' - - -def test_charm(): - model = run('juju', 'switch').split('/')[-1] - coredns_ready = run( - 'kubectl', 'get', 'pod', '-n', model, '-l', 'juju-app=coredns', - '-o', 'jsonpath={..status.containerStatuses[0].ready}') - assert coredns_ready == 'true' - run('kubectl', 'apply', '-f', SPEC_FILE) - try: - wait_for_output('kubectl', 'get', 'pod/validate-dns', - expected='Running') - for name in ("www.ubuntu.com", "kubernetes.default.svc.cluster.local"): - run('kubectl', 'exec', 'validate-dns', '--', 'nslookup', name) - finally: - run('kubectl', 'delete', '-f', SPEC_FILE) - - -def run(*args): - args = [str(a) for a in args] - try: - res = subprocess.run(args, - check=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - return res.stdout.decode('utf8').strip() - except subprocess.CalledProcessError as e: - pytest.fail(f'Command {args} failed ({e.returncode}):\n' - f'stdout:\n{e.stdout.decode("utf8")}\n' - f'stderr:\n{e.stderr.decode("utf8")}\n') - - -def wait_for_output(*args, expected='', timeout=3 * 60): - args = [str(a) for a in args] - output = None - for attempt in range(int(timeout / 5)): - output = run(*args) - if expected in output: - break - sleep(5) - else: - pytest.fail(f'Timed out waiting for "{expected}" from {args}:\n{output}') diff --git a/coredns/tests/func/validate-dns-spec.yaml b/coredns/tests/func/validate-dns-spec.yaml deleted file mode 100644 index cfe5d27..0000000 --- a/coredns/tests/func/validate-dns-spec.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: validate-dns -spec: - containers: - - name: busybox - image: busybox - imagePullPolicy: IfNotPresent - args: ['sleep', '3600'] - restartPolicy: Always diff --git a/coredns/tests/unit/test_charm.py b/coredns/tests/unit/test_charm.py deleted file mode 100644 index f0f95fd..0000000 --- a/coredns/tests/unit/test_charm.py +++ /dev/null @@ -1,42 +0,0 @@ -import pytest - -from ops.model import ActiveStatus, BlockedStatus, WaitingStatus -from ops.testing import Harness -import yaml - -from charm import CoreDNSCharm - - -if yaml.__with_libyaml__: - _DefaultDumper = yaml.CSafeDumper -else: - _DefaultDumper = yaml.SafeDumper - - -@pytest.fixture -def harness(): - return Harness(CoreDNSCharm) - - -def test_not_leader(harness): - harness.begin() - assert isinstance(harness.charm.model.unit.status, WaitingStatus) - - -def test_missing_image(harness): - harness.set_leader(True) - harness.begin_with_initial_hooks() - assert isinstance(harness.charm.model.unit.status, BlockedStatus) - - -def test_main(harness): - harness.set_leader(True) - harness.add_oci_resource('coredns-image', { - 'registrypath': 'coredns/coredns:1.6.7', - 'username': '', - 'password': '', - }) - harness.begin_with_initial_hooks() - assert isinstance(harness.charm.model.unit.status, ActiveStatus) - # confirm that we can serialize the pod spec - yaml.dump(harness.get_pod_spec(), Dumper=_DefaultDumper) diff --git a/coredns/tox.ini b/coredns/tox.ini deleted file mode 100644 index a3006a7..0000000 --- a/coredns/tox.ini +++ /dev/null @@ -1,27 +0,0 @@ -[flake8] -max-line-length = 88 - -[tox] -skipsdist = True -envlist = lint,unit - -[testenv] -basepython = python3 -setenv = - PYTHONPATH={toxinidir}/src - PYTHONBREAKPOINT=ipdb.set_trace -passenv = HOME -deps = pipenv -commands = - pipenv install --dev --ignore-pipfile - pipenv run pytest --tb native -s {posargs:tests/unit} - -[testenv:lint] -commands = - pipenv install --dev --ignore-pipfile - pipenv run flake8 {toxinidir}/src {toxinidir}/tests - -[testenv:func] -commands = - pipenv install --dev --ignore-pipfile - pipenv run pytest --tb native -s {posargs:tests/func} diff --git a/coredns/venv/PyYAML-5.3.1.dist-info/INSTALLER b/coredns/venv/PyYAML-5.3.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/coredns/venv/PyYAML-5.3.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/coredns/venv/PyYAML-5.3.1.dist-info/LICENSE b/coredns/venv/PyYAML-5.3.1.dist-info/LICENSE deleted file mode 100644 index 3d82c28..0000000 --- a/coredns/venv/PyYAML-5.3.1.dist-info/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2017-2020 Ingy döt Net -Copyright (c) 2006-2016 Kirill Simonov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/coredns/venv/PyYAML-5.3.1.dist-info/METADATA b/coredns/venv/PyYAML-5.3.1.dist-info/METADATA deleted file mode 100644 index a70dd20..0000000 --- a/coredns/venv/PyYAML-5.3.1.dist-info/METADATA +++ /dev/null @@ -1,41 +0,0 @@ -Metadata-Version: 2.1 -Name: PyYAML -Version: 5.3.1 -Summary: YAML parser and emitter for Python -Home-page: https://github.com/yaml/pyyaml -Author: Kirill Simonov -Author-email: xi@resolvent.net -License: MIT -Download-URL: https://pypi.org/project/PyYAML/ -Platform: Any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Cython -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Text Processing :: Markup -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* - -YAML is a data serialization format designed for human readability -and interaction with scripting languages. PyYAML is a YAML parser -and emitter for Python. - -PyYAML features a complete YAML 1.1 parser, Unicode support, pickle -support, capable extension API, and sensible error messages. PyYAML -supports standard YAML tags and provides Python-specific tags that -allow to represent an arbitrary Python object. - -PyYAML is applicable for a broad range of tasks from complex -configuration files to object serialization and persistence. - diff --git a/coredns/venv/PyYAML-5.3.1.dist-info/RECORD b/coredns/venv/PyYAML-5.3.1.dist-info/RECORD deleted file mode 100644 index a01343d..0000000 --- a/coredns/venv/PyYAML-5.3.1.dist-info/RECORD +++ /dev/null @@ -1,41 +0,0 @@ -PyYAML-5.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -PyYAML-5.3.1.dist-info/LICENSE,sha256=xAESRJ8lS5dTBFklJIMT6ScO-jbSJrItgtTMbEPFfyk,1101 -PyYAML-5.3.1.dist-info/METADATA,sha256=xTsZFjd8T4M-5rC2M3BHgx_KTTpEPy5vFDIXrbzRXPQ,1758 -PyYAML-5.3.1.dist-info/RECORD,, -PyYAML-5.3.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -PyYAML-5.3.1.dist-info/WHEEL,sha256=hzx2-39jWfx-No5BPGm7YN661ryRYBuLP8gZdbxDo8I,103 -PyYAML-5.3.1.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 -yaml/__init__.py,sha256=XFUNbKTg4afAd0BETjGQ1mKQ97_g5jbE1C0WoKc74dc,13170 -yaml/__pycache__/__init__.cpython-38.pyc,, -yaml/__pycache__/composer.cpython-38.pyc,, -yaml/__pycache__/constructor.cpython-38.pyc,, -yaml/__pycache__/cyaml.cpython-38.pyc,, -yaml/__pycache__/dumper.cpython-38.pyc,, -yaml/__pycache__/emitter.cpython-38.pyc,, -yaml/__pycache__/error.cpython-38.pyc,, -yaml/__pycache__/events.cpython-38.pyc,, -yaml/__pycache__/loader.cpython-38.pyc,, -yaml/__pycache__/nodes.cpython-38.pyc,, -yaml/__pycache__/parser.cpython-38.pyc,, -yaml/__pycache__/reader.cpython-38.pyc,, -yaml/__pycache__/representer.cpython-38.pyc,, -yaml/__pycache__/resolver.cpython-38.pyc,, -yaml/__pycache__/scanner.cpython-38.pyc,, -yaml/__pycache__/serializer.cpython-38.pyc,, -yaml/__pycache__/tokens.cpython-38.pyc,, -yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883 -yaml/constructor.py,sha256=O3Uaf0_J_5GQBoeI9ZNhpJAhtdagr_X2HzDgGbZOMnw,28627 -yaml/cyaml.py,sha256=LiMkvchNonfoy1F6ec9L2BiUz3r0bwF4hympASJX1Ic,3846 -yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837 -yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006 -yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533 -yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445 -yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061 -yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440 -yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495 -yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794 -yaml/representer.py,sha256=82UM3ZxUQKqsKAF4ltWOxCS6jGPIFtXpGs7mvqyv4Xs,14184 -yaml/resolver.py,sha256=DJCjpQr8YQCEYYjKEYqTl0GrsZil2H4aFOI9b0Oe-U4,8970 -yaml/scanner.py,sha256=KeQIKGNlSyPE8QDwionHxy9CgbqE5teJEz05FR9-nAg,51277 -yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165 -yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573 diff --git a/coredns/venv/PyYAML-5.3.1.dist-info/REQUESTED b/coredns/venv/PyYAML-5.3.1.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/coredns/venv/PyYAML-5.3.1.dist-info/WHEEL b/coredns/venv/PyYAML-5.3.1.dist-info/WHEEL deleted file mode 100644 index bb3795f..0000000 --- a/coredns/venv/PyYAML-5.3.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.36.2) -Root-Is-Purelib: false -Tag: cp38-cp38-linux_x86_64 - diff --git a/coredns/venv/PyYAML-5.3.1.dist-info/top_level.txt b/coredns/venv/PyYAML-5.3.1.dist-info/top_level.txt deleted file mode 100644 index e6475e9..0000000 --- a/coredns/venv/PyYAML-5.3.1.dist-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -_yaml -yaml diff --git a/coredns/venv/__pycache__/oci_image.cpython-38.pyc b/coredns/venv/__pycache__/oci_image.cpython-38.pyc deleted file mode 100644 index 031a742bf7656398219d1dce586f373095aab9f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2056 zcmb7FUvC>l5Z~R~JD(lfSP=e%KOy`P;*cCiA|Q$oDyIorqX zIW(5TLldbVq97%Ykq|F@4L-rX^2Ap_LNK%T)lOO-SZn8Y_V#9GfAgF1w~a=Pz_|O% zZ!xP7@&_u5gM)G%rY=ATB4|eXG^7;QEMp;qr;|B-9&)?KGq>-BUcVAnDEW#AS9qsH zc#@wup$~dR_@Mi;0(uqns;GfplU2}bpf8C!=yj_v3ARIm#-HGs1k~_5ak0M*3-9)B zPbNjcOyfp2Ob(>jDdJ+JP3_iD$m~m{hAP327Kbxa^t-T-B&33b>=EfwK?OVYLq|A* zpOTP2BAkRSICf3z_RX!We!M5Yk$N~%iA+i>Xbjf~4?guPAPRCq&gg_r*g2zQ!X_jF zc)$|f4jkj^Q7)D7qbMDuMHHEanpuqoabLm-u4UE@-DE#jeN_d67t~avD9K{2qv(SC zRdfzx)ydM`PEQUF(t+;iEIyRFRNGc+xTQN`grr2wVNLm`@=zJn50pP7hlhhln;?$G#W2UXp@dtuHv#@UMit@ zW;R@SBD-$F)W3rmFHcC1^ynEt({s-0F}+6y>zow)pr&q6atyGITZM~nPXNY;>>l|D zn0Cy5WZ#kdWB_tP&%AS@@0O8udJe{yypBBaN5SXXi{)rC6Bftki1X{j)k#?K*RfW8QT z*+VkTZ6+mOT{HifvYe%3pBL1pfa2j6D=>O zA_mSh;G?N%;_3wuxTW6)K`5ikv_)5`PiwSJIY~S`&|mbru?g@2P}f54ny9u~y1f4asoq|AC{HVSC(~RmWOcLE9JnYIruN zc_{PiqlFFhfJyPGwfMioz?MI5%}Q$?hI$9~7XX-h#Sb=NmR?a0>ZXEq2Tk3Uw0apf z!^SYz>s=3.5 -Description-Content-Type: text/markdown -Requires-Dist: PyYAML - -# The Operator Framework - -The Operator Framework provides a simple, lightweight, and powerful way of -writing Juju charms, the best way to encapsulate operational experience in code. - -The framework will help you to: - -* model the integration of your services -* manage the lifecycle of your application -* create reusable and scalable components -* keep your code simple and readable - -## Getting Started - -Charms written using the operator framework are just Python code. The intention -is for it to feel very natural for somebody used to coding in Python, and -reasonably easy to pick up for somebody who might be a domain expert but not -necessarily a pythonista themselves. - -The dependencies of the operator framework are kept as minimal as possible; -currently that's Python 3.5 or greater, and `PyYAML` (both are included by -default in Ubuntu's cloud images from 16.04 on). - - -## A Quick Introduction - -Operator framework charms are just Python code. The entry point to your charm is -a particular Python file. It could be anything that makes sense to your project, -but let's assume this is `src/charm.py`. This file must be executable (and it -must have the appropriate shebang line). - -You need the usual `metadata.yaml` and (probably) `config.yaml` files, and a -`requirements.txt` for any Python dependencies. In other words, your project -might look like this: - -``` -my-charm -├── config.yaml -├── metadata.yaml -├── requirements.txt -└── src/ - └── charm.py -``` - -`src/charm.py` here is the entry point to your charm code. At a minimum, it -needs to define a subclass of `CharmBase` and pass that into the framework's -`main` function: - -```python -from ops.charm import CharmBase -from ops.main import main - -class MyCharm(CharmBase): - def __init__(self, *args): - super().__init__(*args) - self.framework.observe(self.on.start, self.on_start) - - def on_start(self, event): - # Handle the start event here. - -if __name__ == "__main__": - main(MyCharm) -``` - -That should be enough for you to be able to run - -``` -$ charmcraft build -Done, charm left in 'my-charm.charm' -$ juju deploy ./my-charm.charm -``` - -> 🛈 More information on [`charmcraft`](https://pypi.org/project/charmcraft/) can -> also be found on its [github page](https://github.com/canonical/charmcraft). - -Happy charming! - -## Testing your charms - -The operator framework provides a testing harness, so that you can test that -your charm does the right thing when presented with different scenarios, without -having to have a full deployment to do so. `pydoc3 ops.testing` has the details -for that, including this example: - -```python -harness = Harness(MyCharm) -# Do initial setup here -relation_id = harness.add_relation('db', 'postgresql') -# Now instantiate the charm to see events as the model changes -harness.begin() -harness.add_relation_unit(relation_id, 'postgresql/0') -harness.update_relation_data(relation_id, 'postgresql/0', {'key': 'val'}) -# Check that charm has properly handled the relation_joined event for postgresql/0 -self.assertEqual(harness.charm. ...) -``` - -## Talk to us - -If you need help, have ideas, or would just like to chat with us, reach out on -IRC: we're in [#smooth-operator] on freenode (or try the [webchat]). - -We also pay attention to Juju's [discourse]; most discussion at this -stage is on IRC, however. - -You can also deep dive into the [API docs] if that's your thing. - -[webchat]: https://webchat.freenode.net/#smooth-operator -[#smooth-operator]: irc://chat.freenode.net/%23smooth-operator -[discourse]: https://discourse.juju.is/c/charming -[API docs]: https://ops.rtfd.io/ - -## Operator Framework development - -If you want to work in the framework *itself* you will need Python >= 3.5 and -the dependencies declared in `requirements-dev.txt` installed in your system. -Or you can use a virtualenv: - - virtualenv --python=python3 env - source env/bin/activate - pip install -r requirements-dev.txt - -Then you can try `./run_tests`, it should all go green. - -If you see the error `yaml does not have libyaml extensions, using slower pure -Python yaml`, you need to reinstall pyyaml with the correct extensions: - - apt-get install libyaml-dev - pip install --force-reinstall --no-cache-dir pyyaml - -If you want to build the documentation you'll need the requirements from -`docs/requirements.txt`, or in your virtualenv - - pip install -r docs/requirements.txt - -and then you can run `./build_docs`. - - diff --git a/coredns/venv/ops-0.10.0.dist-info/RECORD b/coredns/venv/ops-0.10.0.dist-info/RECORD deleted file mode 100644 index fe067e0..0000000 --- a/coredns/venv/ops-0.10.0.dist-info/RECORD +++ /dev/null @@ -1,29 +0,0 @@ -ops-0.10.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -ops-0.10.0.dist-info/LICENSE.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 -ops-0.10.0.dist-info/METADATA,sha256=AI7mL-PWkkYQ4f_NCulM5VcIQrMskxPIYp108DZrOcA,5577 -ops-0.10.0.dist-info/RECORD,, -ops-0.10.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -ops-0.10.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 -ops-0.10.0.dist-info/top_level.txt,sha256=enC05wWafSg8iDKIvj3gvtAtEP2kYCyN5Gmd689q-_I,4 -ops/__init__.py,sha256=WaHb0dfp1KEe6jFV8Pm_mcdJ3ModiWujnQ6xLjNzPNQ,819 -ops/__pycache__/__init__.cpython-38.pyc,, -ops/__pycache__/charm.cpython-38.pyc,, -ops/__pycache__/framework.cpython-38.pyc,, -ops/__pycache__/jujuversion.cpython-38.pyc,, -ops/__pycache__/log.cpython-38.pyc,, -ops/__pycache__/main.cpython-38.pyc,, -ops/__pycache__/model.cpython-38.pyc,, -ops/__pycache__/storage.cpython-38.pyc,, -ops/__pycache__/testing.cpython-38.pyc,, -ops/__pycache__/version.cpython-38.pyc,, -ops/charm.py,sha256=i1fcd-pMzRV6f9AfMy0S_Jr_rZso3s9Xi-5GZWEs3nc,22512 -ops/framework.py,sha256=T9PWR4FXBI6Yd3XGwwNO51rJlyMUeO5vPdd4GmEjdzY,38298 -ops/jujuversion.py,sha256=T5KafqBHbQiHJ1OVoVbseUnZz7og4gPUz7CayXcHddk,3845 -ops/lib/__init__.py,sha256=7i2EN1jCUkVZT5NCi_q_ilBBzpCkWaW9mnBc3vBYCns,9188 -ops/lib/__pycache__/__init__.cpython-38.pyc,, -ops/log.py,sha256=7jNn71--WpFngrZIwnJoaTRiaVrNVkLHK2enVu_VRA8,1860 -ops/main.py,sha256=TcOAS3VE1nMt-jF9uUzoyDWGTNl-OoAkS7XqQraWH3c,15375 -ops/model.py,sha256=katD2gQc35VArVMfGdI2AjPobFegQjShmDqVCKeLXZc,46796 -ops/storage.py,sha256=dal0athxe35cnWE8ol9N7nEUQDMcphDgRrQrmyGQDoA,11859 -ops/testing.py,sha256=HRjgq2ikVijGRMjVN2g-HJr8oQJ0ul8QEUUZv9D2_go,34727 -ops/version.py,sha256=6wsm0bsNX30wL9YmCZai2X5ISKQZYBIFJAbgmBn2Ri4,47 diff --git a/coredns/venv/ops-0.10.0.dist-info/REQUESTED b/coredns/venv/ops-0.10.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/coredns/venv/ops-0.10.0.dist-info/WHEEL b/coredns/venv/ops-0.10.0.dist-info/WHEEL deleted file mode 100644 index b552003..0000000 --- a/coredns/venv/ops-0.10.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.34.2) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/coredns/venv/ops-0.10.0.dist-info/top_level.txt b/coredns/venv/ops-0.10.0.dist-info/top_level.txt deleted file mode 100644 index 2d81d3b..0000000 --- a/coredns/venv/ops-0.10.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -ops diff --git a/coredns/venv/ops/__init__.py b/coredns/venv/ops/__init__.py deleted file mode 100644 index f17b296..0000000 --- a/coredns/venv/ops/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2020 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""The Operator Framework.""" - -from .version import version as __version__ # noqa: F401 (imported but unused) - -# Import here the bare minimum to break the circular import between modules -from . import charm # noqa: F401 (imported but unused) diff --git a/coredns/venv/ops/__pycache__/__init__.cpython-38.pyc b/coredns/venv/ops/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index c37336cd1537bf0e538f6deb5bf37177db12fa4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 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 diff --git a/coredns/venv/ops/__pycache__/jujuversion.cpython-38.pyc b/coredns/venv/ops/__pycache__/jujuversion.cpython-38.pyc deleted file mode 100644 index be159fd617c44817d6f388e91c1b61509d352731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3276 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 diff --git a/coredns/venv/ops/__pycache__/model.cpython-38.pyc b/coredns/venv/ops/__pycache__/model.cpython-38.pyc deleted file mode 100644 index db6dc9ed5a970ab7cf948e6bee600f3a9f1cf837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47206 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