[
  {
    "path": ".circleci/config.yml",
    "content": "version: 2.1\n\norbs:\n  python: circleci/python@0.3.2\n  k3d: devopsspiral/k3d@0.1.5\njobs:\n  build-and-test:\n    executor: \n      name: python/default\n      tag: \"3.9\"\n    environment:\n      PYTHONPATH=./src\n    steps:\n      - checkout\n      - python/load-cache\n      - python/install-deps:\n          dependency-file: requirements-dev.txt\n      - python/save-cache\n      - python/test\n  lint-and-coverage:\n    executor: \n      name: python/default\n      tag: \"3.9\"\n    environment:\n      PYTHONPATH=./src\n    steps:\n      - checkout\n      - python/install-deps:\n          dependency-file: requirements-dev.txt\n      - run:\n          name: Linter\n          command: |\n            flake8 src/\n            flake8 test/\n      - run:\n          name: Coverage\n          command: |\n            coverage run\n            coverage report\n  test-on-k8s:\n    executor: \n      name: python/default\n      tag: \"3.9\"\n    environment:\n      PYTHONPATH=./src\n    steps:\n      - setup_remote_docker\n      - checkout\n      - run:\n          name: Build Kubelibrary container image\n          command: |\n            docker build -t kubelibrary -f testcases/Dockerfile .\n      - k3d/k3d-helpers\n      - k3d/k3d-up:\n          cluster-name: testk3d-2\n          k3s-version: latest\n          k3s-bin-version: latest\n      - k3d/k3d-run:\n          step-name: Prerequisites for 2nd cluster\n          command: |\n            kubectl version\n            kubectl create namespace test-ns-2\n      - k3d/k3d-up:\n          cluster-name: testk3d-1\n          k3s-version: latest\n          k3s-bin-version: latest\n      - k3d/k3d-run:\n          step-name: Prerequisites for 1st cluster\n          command: |\n            sleep 10\n            kubectl version\n            helm repo add grafana https://grafana.github.io/helm-charts\n            helm repo update\n            helm install grafana grafana/grafana -f /repo/testcases/grafana/values.yaml\n            export KLIB_POD_NAMESPACE=kubelib-tests\n            kubectl create namespace $KLIB_POD_NAMESPACE\n            kubectl label namespaces kubelib-tests test=test\n            helm install kubelib-test /repo/test-objects-chart -n $KLIB_POD_NAMESPACE\n      - k3d/k3d-run:\n          step-name: Run Other examples\n          command: |\n            export KLIB_POD_NAMESPACE=kubelib-tests\n            # Other tests\n            docker run --rm \\\n            --network container:k3d-${K3D_CLUSTER}-serverlb \\\n            --volumes-from kubeconfig \\\n            -e KUBECONFIG=$K3D_KUBECONFIG \\\n            -e KLIB_POD_PATTERN='busybox.*' \\\n            -e KLIB_POD_LABELS='job-name=busybox-job' \\\n            -e KLIB_POD_NAMESPACE=$KLIB_POD_NAMESPACE \\\n            kubelibrary -i other /testcases/\n      - k3d/k3d-run:\n          step-name: Run Multi cluster examples\n          command: |\n            # Multi cluster tests\n            kubectl create namespace test-ns-1\n            kubectl apply -f /repo/testcases/reload-config/sa.yaml\n            MYSA_TOKEN_SECRET=mysa-token\n            export K8S_TOKEN=$(kubectl get secret $MYSA_TOKEN_SECRET --template={{.data.token}} | base64 -d)\n            kubectl get secret $MYSA_TOKEN_SECRET -o jsonpath=\"{.data.ca\\.crt}\" | base64 -d > ca.crt\n            export K8S_CA_CRT=/.kube/ca.crt\n            export KUBE_CONFIG1=/.kube/testk3d-1\n            export KUBE_CONFIG2=/.kube/testk3d-2\n            export CLUSTER1_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' k3d-testk3d-1-server-0)\n            export CLUSTER2_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' k3d-testk3d-2-server-0)\n            export K8S_API_URL=\"https://$CLUSTER1_IP:6443\"\n            docker cp kubeconfig:$KUBE_CONFIG1 ~/kubeconfig-testk3d-1.yaml \n            docker cp kubeconfig:$KUBE_CONFIG2 ~/kubeconfig-testk3d-2.yaml \n            sed -i \"s#server: https://.*#server: https://$CLUSTER1_IP:6443#g\" ~/kubeconfig-testk3d-1.yaml\n            sed -i \"s#server: https://.*#server: https://$CLUSTER2_IP:6443#g\" ~/kubeconfig-testk3d-2.yaml\n            docker cp ~/kubeconfig-testk3d-1.yaml kubeconfig:$KUBE_CONFIG1\n            docker cp ~/kubeconfig-testk3d-2.yaml kubeconfig:$KUBE_CONFIG2\n            docker cp ca.crt kubeconfig:$K8S_CA_CRT\n            docker create --rm -it \\\n            --network k3d-testk3d-1 \\\n            --volumes-from kubeconfig \\\n            -e KUBE_CONFIG1=$KUBE_CONFIG1 \\\n            -e KUBE_CONFIG2=$KUBE_CONFIG2 \\\n            -e K8S_API_URL=$K8S_API_URL \\\n            -e K8S_TOKEN=$K8S_TOKEN \\\n            -e K8S_CA_CRT=$K8S_CA_CRT \\\n            --name kubelibrary kubelibrary -i reload-config /testcases/\n            docker network connect k3d-testk3d-2 kubelibrary\n            docker start -a kubelibrary\n      - k3d/k3d-run:\n          step-name: Run Smoke examples\n          command: |\n            K8S_VERSION=$(echo ${K3D_CLUSTER_VERSION:1} | cut -d \"-\" -f1)\n            docker run --rm \\\n            --network container:k3d-${K3D_CLUSTER}-serverlb \\\n            --volumes-from kubeconfig \\\n            -e KUBECONFIG=$K3D_KUBECONFIG \\\n            -e KUBELET_VERSION=$K8S_VERSION \\\n            kubelibrary -i smoke /testcases/\n      - k3d/k3d-run:\n          step-name: Run Grafana examples\n          command: |\n            # Grafana tests\n            K8S_VERSION=$(echo ${K3D_CLUSTER_VERSION:1} | cut -d \"-\" -f1)\n            docker run --rm \\\n            --network container:k3d-${K3D_CLUSTER}-serverlb \\\n            --volumes-from kubeconfig \\\n            -e KUBECONFIG=$K3D_KUBECONFIG \\\n            -e KLIB_POD_PATTERN='grafana.*' \\\n            -e KLIB_POD_ANNOTATIONS='{\"kubelibrary\":\"testing\"}' \\\n            -e KLIB_POD_LABELS='{\"app.kubernetes.io/name\":\"grafana\"}' \\\n            -e KLIB_POD_NAMESPACE=default \\\n            -e KLIB_RESOURCE_LIMITS_MEMORY=128Mi \\\n            -e KLIB_RESOURCE_REQUESTS_CPU=250m \\\n            -e KLIB_RESOURCE_LIMITS_CPU=500m \\\n            -e KLIB_RESOURCE_REQUESTS_MEMORY=64Mi \\\n            -e KUBELET_VERSION=$K8S_VERSION \\\n            kubelibrary -i grafana /testcases/\n  publish-to-pypi:\n    executor: \n      name: python/default\n      tag: \"3.9\"\n    environment:\n      PYTHONPATH=./src\n    steps:\n      - checkout\n      - run:\n          name: Verify setup.py version matches tag\n          command: |\n            SEMVER=\"${CIRCLE_TAG:1}\"\n            grep  \"## \\[$SEMVER\\]\" CHANGELOG.md\n      - run:\n          name: Publish on Pypi\n          command: |\n            pip install twine\n            python3 setup.py sdist bdist_wheel\n            python3 -m twine upload dist/*\nworkflows:\n  main:\n    jobs:\n      - build-and-test:\n          filters:\n            tags:\n              only: /.*/\n      - lint-and-coverage:\n          filters:\n            tags:\n              only: /.*/\n      - test-on-k8s:\n          filters:\n            tags:\n              only: /.*/\n      - publish-to-pypi:\n          requires:\n            - build-and-test\n            - lint-and-coverage\n            - test-on-k8s\n          filters:\n            branches:\n              ignore: /.*/\n            tags:\n              only: /^v.*/\n"
  },
  {
    "path": ".coveragerc",
    "content": "[run]\ncommand_line = -m unittest discover\nsource =\n    src/\n[report]\nfail_under = 84\n"
  },
  {
    "path": ".flake8",
    "content": "[flake8]\nmax-line-length = 160"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "\\<Remember to add meaningful title\\>\n\n\\<Short description of the PR\\>\n\nFixes #\\<issue number\\>\n\nBefore merge following needs to be applied:\n- [ ] At least one example testcase added in testcases/\n- [ ] Library Documentation regenerated according to [Generate docs](https://github.com/devopsspiral/KubeLibrary#generate-docs)\n- [ ] PR entry added in CHANGELOG.md in **In progress** section\n- [ ] All new testcases tagged as **prerelease** along other tags to exclude it from execution until released on PyPI\n- [ ] Coverage threshold increased in [.coveragerc](https://github.com/devopsspiral/KubeLibrary/blob/master/.coveragerc) if new coverage is higher than actual, see the lint-and-coverage step in CI\n```\nfail_under = 86\n```\n"
  },
  {
    "path": ".gitignore",
    "content": ".venv\n.idea\n.vscode\n.coverage\n*.pyc\n*.pyo\nsrc/robotframework_kubelibrary.egg-info/\ndist/\nbuild/\n\nlog.html\noutput.xml\nreport.html\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change Log\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](http://keepachangelog.com/)\nand this project adheres to [Semantic Versioning](http://semver.org/).\n\n## In progress\n\n## [0.8.10] - 2025-12-16\n### Added\n- Add a keyword to get the Kubernetes Cluster Version\n\n## [0.8.9] - 2025-07-17\n### Fixed\n- Fixed proxy settings which are now handled by kubernetes python client\n\n## [0.8.8] - 2024-10-07\n### Added\n- update create keyword to return created object [#143](https://github.com/devopsspiral/KubeLibrary/pull/143) by [@aisonaku]\n\n## [0.8.7] - 2023-11-19\n### Added\n- update read_namespaced_pod_log keyword with new optional parameter 'since_seconds' [#136](https://github.com/devopsspiral/KubeLibrary/pull/136) by [@LissaGreense] \n- google-auth>=2.5.0 [#138](https://github.com/devopsspiral/KubeLibrary/pull/138) by [@angegar] \n\n## [0.8.6] - 2023-05-27\n### Added\n- add new keyword to list all namespaced custom objects [#133] (https://github.com/devopsspiral/KubeLibrary/pull/133) by [@kutayy]\n## [0.8.5] - 2023-04-22\n### Fixed\n- Fixed no_proxy setting\n\n## [0.8.4] - 2023-04-10\n### Fixed\n- Fixed proxy setting\n- Deprecating batch/v1beta1, discovery.k8s.io/v1beta1 \n\n## [0.8.3] - 2022-12-19\nrevert\n\n- Add proxy configuration fetched from `HTTP_PROXY` or `http_proxy` environment variable by [@LissaGreense]\n## [0.8.0] - 2022-10-27\n### Added\n- Add function list_namespaced_stateful_set_by_pattern [#114](https://github.com/devopsspiral/KubeLibrary/pull/113) by [@siaomingjeng](https://github.com/siaomingjeng)\n- Add function list_namespaced_persistent_volume_claim_by_pattern [#112](https://github.com/devopsspiral/KubeLibrary/pull/112) by [@siaomingjeng](https://github.com/siaomingjeng)\n\n### Changed\n- batchv1_beta1 deprecated\n- ci uses latest default k8s and latest k3s\n- octopus test helm chart removed as not working\n## [0.7.0] - 2022-04-01\n### Added\n- Added keyword for handling kubectl exec [#102](https://github.com/devopsspiral/KubeLibrary/pull/101) by [@MarcinMaciaszek](https://github.com/MarcinMaciaszek)\n### Changed\n- networkingv1api used instead of extensionsv1beta1\n## [0.6.2] - 2022-02-25\n\n### Fixed\n- Fix the kubernetes lib version (21.7.0) to still support extension/v1beta1 (ingress)\n\n## [0.6.1] - 2022-01-27\n### Changed\n- Refactored setup.py & requirements, moved library scope to GLOBAL, sperated exceptions [#101](https://github.com/devopsspiral/KubeLibrary/pull/101) by [@MarcinMaciaszek](https://github.com/MarcinMaciaszek)\n\n### Fixed\n- Generate keyword documentation without a kubernetes cluster [#103](https://github.com/devopsspiral/KubeLibrary/pull/103) by [bli74](https://github.com/bli74)\n## [0.6.0] - 2021-11-30\n### Changed\n- Helpers and keywords unification [#75](https://github.com/devopsspiral/KubeLibrary/pull/75) by [@m-wcislo](https://github.com/m-wcislo)\n## [0.5.0] - 2021-10-03\n### Added\n- Dynamic client support and some utilities [#93](https://github.com/devopsspiral/KubeLibrary/pull/93) by [@mertkayhan](https://github.com/mertkayhan)\n- Keyword for getting Horizontal Pod Autoscalers [#80](https://github.com/devopsspiral/KubeLibrary/pull/80 )by [@Nilsty](https://github.com/Nilsty)\n- Keyword for list cluster role and cluster role binding [#58](https://github.com/devopsspiral/KubeLibrary/pull/58) by [@satish-nubolab](https://github.com/satish-nubolab)\n- Keyword for getiing role and rolebinding [#56](https://github.com/devopsspiral/KubeLibrary/pull/56) by [@satish-nubolab](https://github.com/satish-nubolab)\n- Bearer token authentication [#39](https://github.com/devopsspiral/KubeLibrary/pull/39) by [@m-wcislo](https://github.com/m-wcislo)\n- Keyoword for create and delete a cronjob [#71](https://github.com/devopsspiral/KubeLibrary/pull/71) by [@satish-nubolab](https://github.com/satish-nubolab)\n- Keywords for get replicaset in a namespace [#82](https://github.com/devopsspiral/KubeLibrary/pull/92) by [@hello2ray](https://github.com/hello2ray)\n## [0.4.0] - 2021-03-12\n### Added\n- Kubeconfig context support [#36](https://github.com/devopsspiral/KubeLibrary/pull/36) by [@m-wcislo](https://github.com/m-wcislo)\n- Keyword for getting secrets [#31](https://github.com/devopsspiral/KubeLibrary/pull/31 )by [@Nilsty](https://github.com/Nilsty)\n- Keyword for cluster healthcheck [#40](https://github.com/devopsspiral/KubeLibrary/pull/40) by [@satish-nubolab](https://github.com/satish-nubolab)\n- Extend cluster healthcheck [#47](https://github.com/devopsspiral/KubeLibrary/pull/47) by [@mika-b](https://github.com/mika-b)\n- Keyword for list ingress [#38](https://github.com/devopsspiral/KubeLibrary/pull/38) by [@satish-nubolab](https://github.com/satish-nubolab)\n- Keyword for list cronjob [#48](https://github.com/devopsspiral/KubeLibrary/pull/48) by [@satish-nubolab](https://github.com/satish-nubolab)\n- Keyword for list daemonset [#50](https://github.com/devopsspiral/KubeLibrary/pull/50) by [@satish-nubolab](https://github.com/satish-nubolab)\n- Keyword for CustomObjectsApi [#54](https://github.com/devopsspiral/KubeLibrary/pull/54) by [@mika-b](https://github.com/mika-b)\n- Example tests for Ambassador CRDs [#63](https://github.com/devopsspiral/KubeLibrary/pull/63) by [@Nilsty](https://github.com/Nilsty)\n\n### Fixed\n- Fix for cert validation disabling not being possible for all api clients [#61](https://github.com/devopsspiral/KubeLibrary/pull/61) by [@m-wcislo](https://github.com/m-wcislo)\n\n### Fixed\n- cert_validation=False was not affecting all used APIs\n## [0.3.0] - 2021-02-01\n\n### Added\n- CI implementation [#14](https://github.com/devopsspiral/KubeLibrary/pull/14) by [@m-wcislo](https://github.com/m-wcislo)\n- keywords to list deployments [#13](https://github.com/devopsspiral/KubeLibrary/pull/13) by [@Nilsty](https://github.com/Nilsty)\n- keywords for get/create/delete service accounts [#28](https://github.com/devopsspiral/KubeLibrary/pull/28) by [@kutayy](https://github.com/kutayy)\n\n\n## [0.2.0] - 2020-09-03\n\n### Added\n- Update docs with latest libdoc version [#11](https://github.com/devopsspiral/KubeLibrary/pull/11) by [@Nilsty](https://github.com/Nilsty)\n- Example test case to connect to a GKE cluster [#10](https://github.com/devopsspiral/KubeLibrary/pull/10) by [@Nilsty](https://github.com/Nilsty)\n- Adding label selectors [#9](https://github.com/devopsspiral/KubeLibrary/pull/9) by [@Nilsty](https://github.com/Nilsty)\n- Adding keyword to Reload the configuration of the KubeLibrary [#8](https://github.com/devopsspiral/KubeLibrary/pull/8) by [@Nilsty](https://github.com/Nilsty)\n- Adding keyword and tests for \"Get Pod Logs\" [#7](https://github.com/devopsspiral/KubeLibrary/pull/7) by [@Nilsty](https://github.com/Nilsty)\n- Adding keyword to read jobs [#6](https://github.com/devopsspiral/KubeLibrary/pull/6) by [@Nilsty](https://github.com/Nilsty)\n\n\n## [0.1.4] - 2020-07-28\n\n### Added\n- pod generic testcases added, should be extended in future\n- add kw for getting configmaps, update docs [#5](https://github.com/devopsspiral/KubeLibrary/pull/5) by [@Nilsty](https://github.com/Nilsty)\n\n### Changed\n- reorganized library functions to getters, filters and asserts\n- python unit tests\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\nWe welcome contributions of all types including:\n* Proposing new features\n* Reporting a bug\n* Fixing a bug\n* Enhancing documentation\n* Materials describing the usage of KubeLibrary that we could link from this repository\n\n## Reporting issues\nWe use [GitHub issues](https://github.com/devopsspiral/KubeLibrary/issues) for reporting bugs, feature proposals and discussions.\nWhen reporting a bug, please include following information:\n\n* Summary of the problem and context\n* Steps to reproduce. We are mostly using k3s/k3d and kind as a test clusters, if you could reproduce your problem there that \nwould be easier for others to follow. Attach logs, files and anything that was used and might be helpful in investigation.\n* What you expected\n* What actually happened\n* Comments, including your understanding of a problem, possible fix, etc.\n\n## Pull Request checklist\n* Create an issue first if you expect the topic needs some more discussion.\n* Provide meaningful subject of a PR so that it could become commit message.\n* Provide good description, context and link to issues which are resolved.\n* Create examples of new funtionality. We keep them in testcases/ dir, and they are all executed as a part of CI. \nThis is part of our documentation and verification. We encourage you to use existing test setup (helm deployed services) but suggestions for\nchange or adding new ones are ok.\n* It would be perfect to write unit tests for what you are adding. It is not always needed for simple k8s object getters, but are mandatory\n for more complex logic.\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 DevOps Spiral\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# KubeLibrary\n[![CircleCI Build Status](https://circleci.com/gh/devopsspiral/KubeLibrary.svg?style=shield)](https://circleci.com/gh/devopsspiral/KubeLibrary)[![PyPI](https://img.shields.io/pypi/v/robotframework-kubelibrary)](https://pypi.org/project/robotframework-kubelibrary/)[![PyPi downloads](https://img.shields.io/pypi/dm/robotframework-kubelibrary.svg)](https://pypi.python.org/pypi/robotframework-kubelibrary)[![GitHub License](https://img.shields.io/badge/license-MIT-lightgrey.svg)](https://raw.githubusercontent.com/devopsspiral/k3d-orb/master/LICENSE)[![Slack](https://img.shields.io/badge/slack-robotframework%2F%23kubernetes-blue)](https://robotframework.slack.com/archives/C017AKKS06R)\n\n\nRobotFramework library for testing Kubernetes cluster\n\n## Quick start\n\n```\n# install library itself\npip install robotframework-kubelibrary\n\n# export KUBECONFIG\nexport KUBECONFIG=~/.kube/config\n\n# run example tests\npip install robotframework-requests\ngit clone https://github.com/devopsspiral/KubeLibrary.git\ncd KubeLibrary\nrobot -e prerelease testcases\n```\n\n## Documentation\n\n[Library docs](http://devopsspiral.com/KubeLibrary/)\n\n## Example testcase\n\n```\ntestcases/system_smoke.robot\n\n*** Settings ***\n(1)Resource          ./system_smoke_kw.robot\n\n*** Variables ***\n(2)${KUBELET_VERSION}     %{KUBELET_VERSION}\n${NUM_NODES}           2\n${NUM_WORKERS}         1\n\n*** Test Cases ***\n\n(3)Pods in kube-system are ok\n(4)    [Documentation]  Test if all pods in kube-system initiated correctly and are running or succeeded\n(5)    [Tags]    cluster    smoke\n(6)    Given kubernetes API responds\n(7)    When getting all pods names in \"kube-system\"\n(8)    Then all pods in \"kube-system\" are running or succeeded\n\n```\n\n1 - keyword definitions in separate file relative to testcase file\n\n2 - defining local variable taking value from environment variable\n\n3 - testcase definition\n\n4 - Documentation/comments\n\n5 - Tags, you can include (-i) and exclude (-e) tests by tag.\n\n6(7,8) - Given, When, Then clause. It is only way of organizing your test steps, given, when, then are just omitted, real keywords definition needs to match 'kubernetes API responds', 'getting all pods names in ...' etc.(see testcases/system_smoke_kw.robot)\n\n7 - kube-system in quotes is treated as parameter for 'getting all pods names in ...' keyword.\n\nMore examples in testcases/ directory.\n\nTo see all the tests passing execute below commands.\n\n\n### Cluster Tests\n```\n# run cluster tests\nrobot -i cluster -e prerelease testcases/\n```\n\n### Grafana Tests\n```\nhelm repo add grafana https://grafana.github.io/helm-charts\nhelm repo update\nhelm install grafana grafana/grafana -f testcases/grafana/values.yaml\n\n# run grafana tests\nexport KLIB_POD_PATTERN='grafana.*'\nexport KLIB_POD_ANNOTATIONS='{\"kubelibrary\":\"testing\"}'\nexport KLIB_POD_NAMESPACE=default\n\nrobot -i grafana -e prerelease testcases/\n```\n### Other Tests\nThese tests require the kubelib-test helm-chart to be installed in your test cluster.\n```\n# run other library tests\nexport KLIB_POD_PATTERN='busybox.*'\nexport KLIB_POD_NAMESPACE=kubelib-tests\nexport KLIB_POD_LABELS='job-name=busybox-job'\n\nkubectl create namespace $KLIB_POD_NAMESPACE\nkubectl label namespaces kubelib-tests test=test\nhelm install kubelib-test ./test-objects-chart -n $KLIB_POD_NAMESPACE\n\nrobot -i other -e prerelease testcases/\n```\n### Multi Cluster Tests\nThese tests require more than one cluster and utilize [KinD](https://kind.sigs.k8s.io/) as a setup.\n[Download KinD and install it.](https://kind.sigs.k8s.io/docs/user/quick-start/)\n```\n# Create Test Cluster 1\nkind create cluster --kubeconfig ./cluster1-conf --name kind-cluster-1\n\n# Create namespace in Test Cluster 1\nkubectl create namespace test-ns-1 --context kind-kind-cluster-1 --kubeconfig ./cluster1-conf\n# For bearer token auth\nkubectl apply -f testcases/reload-config/sa.yaml\nMYSA_TOKEN_SECRET=$(kubectl get sa mysa -o jsonpath=\"{.secrets[0].name}\")\nexport K8S_TOKEN=$(kubectl get secret $MYSA_TOKEN_SECRET --template={{.data.token}} | base64 -d)\nkubectl get secret $MYSA_TOKEN_SECRET -o jsonpath=\"{.data.ca\\.crt}\" | base64 -d > ca.crt\nexport K8S_API_URL=$(kubectl config view -o jsonpath='{.clusters[0].cluster.server}')\nexport K8S_CA_CRT=./ca.crt\n\n# Create Test Cluster 2\nkind create cluster --kubeconfig ./cluster2-conf --name kind-cluster-2\n\n# Create namespace in Test Cluster 2\nkubectl create namespace test-ns-2 --context kind-kind-cluster-2 --kubeconfig ./cluster2-conf\n\nrobot -i reload-config -e prerelease testcases/\n\n# Clean up\nkind delete cluster --name kind-cluster-1\nkind delete cluster --name kind-cluster-2\n```\n\n## Keywords documentation\n\nKeywords documentation can be found in docs/.\n\n## Proxy configuration\n\nTo access cluster via proxy set `http_proxy` or `HTTP_PROXY` environment variable. \n\nIn similar way you can set `no_proxy` or `NO_PROXY` variable to specify hosts that should be excluded from proxying.\n\n**IMPORTANT:** Lowercase environment variables have higher priority than uppercase\n\n## Further reading\n\n[DevOps spiral article on KubeLibrary](https://devopsspiral.com/articles/k8s/robotframework-kubelibrary/)\n\n[KubeLibrary: Testing Kubernetes with RobotFramework  | Humanitec](https://humanitec.com/blog/kubelibrary-testing-kubernetes-with-robotframework)\n\n[RobotFramework User Guide](https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html)\n\n## Development\n\n```\n# clone repo\ngit clone https://github.com/devopsspiral/KubeLibrary.git\ncd KubeLibrary\n\n# create virtualenv\nvirtualenv .venv\n. .venv/bin/activate\npip install -r requirements-dev.txt\n```\n\nCreate keyword and test file, import KubeLibrary using below to point to library under development.\n\n```\n*** Settings ***\n\nLibrary    ../src/KubeLibrary/KubeLibrary.py\n```\n\nFor development cluster you can use k3s/k3d as described in [DevOps spiral article on K3d and skaffold](https://devopsspiral.com/articles/k8s/k3d-skaffold/).\n\n### Generate docs\n\n```\n(\n    # To generate keyword documentation a connection\n    # to a cluster is not necessary. Skip to load a\n    # cluster configuration.\n    #\n    # Set the variable local for the libdoc call only\n    export INIT_FOR_LIBDOC_ONLY=1\n    python -m robot.libdoc src/KubeLibrary docs/index.html\n)\n```\n"
  },
  {
    "path": "docs/index.html",
    "content": "<!doctype html>\n<html id=\"library-documentation-top\" lang=\"en\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=0\">\n    <meta http-equiv=\"Pragma\" content=\"no-cache\">\n    <meta http-equiv=\"Expires\" content=\"-1\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"Generator\" content>\n<script type=\"text/javascript\">\nlibdoc = {\"specversion\": 3, \"name\": \"KubeLibrary\", \"doc\": \"<p>KubeLibrary is a Robot Framework test library for Kubernetes.</p>\\n<p>The approach taken by this library is to provide easy to access kubernetes objects representation that can be then accessed to define highlevel keywords for tests.</p>\\n<h2 id=\\\"Kubeconfigs\\\">Kubeconfigs</h2>\\n<p>By default ~/.kube/config is used. Kubeconfig location can also be passed by setting KUBECONFIG environment variable or as Library argument.</p>\\n<pre>\\n<b>***</b> Settings <b>***</b>\\nLibrary           KubeLibrary          /path/to/kubeconfig\\n</pre>\\n<h2 id=\\\"Context\\\">Context</h2>\\n<p>By default current context from kubeconfig is used. Setting multiple contexts in different test suites allows working on multiple clusters.</p>\\n<pre>\\n<b>***</b> Settings <b>***</b>\\nLibrary           KubeLibrary          context=k3d-k3d-cluster2\\n</pre>\\n<h2 id=\\\"Bearer token authentication\\\">Bearer token authentication</h2>\\n<p>It is possible to authenticate using bearer token by passing API url, bearer token and optionally CA certificate.</p>\\n<pre>\\n<b>***</b> Settings <b>***</b>\\nLibrary           KubeLibrary          api_url=%{K8S_API_URL}    bearer_token=%{K8S_TOKEN}    ca_cert=%{K8S_CA_CRT}\\n</pre>\\n<h2 id=\\\"In cluster execution\\\">In cluster execution</h2>\\n<p>If tests are supposed to be executed from within cluster, KubeLibrary can be configured to use standard token authentication. Just set incluster parameter to True.</p>\\n<h2 id=\\\"Auth methods precedence\\\">Auth methods precedence</h2>\\n<p>If enabled, auth methods takes precedence in following order: 1. Incluster 2. Bearer Token 3. Kubeconfig</p>\\n<pre>\\n<b>***</b> Settings <b>***</b>\\nLibrary           KubeLibrary          None    True\\n</pre>\", \"version\": \"0.8.9\", \"generated\": \"2025-12-08T13:55:48+00:00\", \"type\": \"LIBRARY\", \"scope\": \"GLOBAL\", \"docFormat\": \"HTML\", \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/__init__.py\", \"lineno\": 28, \"tags\": [], \"inits\": [{\"name\": \"__init__\", \"args\": [{\"name\": \"kube_config\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"kube_config=None\"}, {\"name\": \"context\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"context=None\"}, {\"name\": \"api_url\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"api_url=None\"}, {\"name\": \"bearer_token\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"bearer_token=None\"}, {\"name\": \"ca_cert\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"ca_cert=None\"}, {\"name\": \"incluster\", \"type\": null, \"defaultValue\": \"False\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"incluster=False\"}, {\"name\": \"cert_validation\", \"type\": null, \"defaultValue\": \"True\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"cert_validation=True\"}], \"returnType\": null, \"doc\": \"<p>KubeLibrary can be configured with several optional arguments.</p>\\n<ul>\\n<li><code>kube_config</code>: Path pointing to kubeconfig of target Kubernetes cluster.</li>\\n<li><code>context</code>: Active context. If None current_context from kubeconfig is used.</li>\\n<li><code>api_url</code>: K8s API url, used for bearer token authenticaiton.</li>\\n<li><code>bearer_token</code>: Bearer token, used for bearer token authenticaiton. Do not include 'Bearer ' prefix.</li>\\n<li><code>ca_cert</code>: Optional CA certificate file path, used for bearer token authenticaiton.</li>\\n<li><code>incuster</code>: Default False. Indicates if used from within k8s cluster. Overrides kubeconfig.</li>\\n<li><code>cert_validation</code>: Default True. Can be set to False for self-signed certificates.</li>\\n</ul>\\n<p>Environment variables:</p>\\n<ul>\\n<li>INIT_FOR_LIBDOC_ONLY: Set to '1' to generate keyword documentation and skip to load a kube config..</li>\\n</ul>\", \"shortdoc\": \"KubeLibrary can be configured with several optional arguments. - ``kube_config``:   Path pointing to kubeconfig of target Kubernetes cluster. - ``context``:   Active context. If None current_context from kubeconfig is used. - ``api_url``:   K8s API url, used for bearer token authenticaiton. - ``bearer_token``:   Bearer token, used for bearer token authenticaiton. Do not include 'Bearer ' prefix. - ``ca_cert``:   Optional CA certificate file path, used for bearer token authenticaiton. - ``incuster``:   Default False. Indicates if used from within k8s cluster. Overrides kubeconfig. - ``cert_validation``:   Default True. Can be set to False for self-signed certificates.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/__init__.py\", \"lineno\": 74}], \"keywords\": [{\"name\": \"Assert Container Has Env Vars\", \"args\": [{\"name\": \"container\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"container\"}, {\"name\": \"env_vars_json\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"env_vars_json\"}], \"returnType\": null, \"doc\": \"<p>Assert container has env vars.</p>\\n<p>Returns True/False</p>\\n<ul>\\n<li><code>container</code>: Container object.</li>\\n<li><code>env_var_json</code>: JSON representing env vars i.e.: {\\\"EXAMPLE_VAR\\\": \\\"examplevalue\\\"}</li>\\n</ul>\", \"shortdoc\": \"Assert container has env vars.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 914}, {\"name\": \"Assert Pod Has Annotations\", \"args\": [{\"name\": \"pod\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"pod\"}, {\"name\": \"annotations_json\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"annotations_json\"}], \"returnType\": null, \"doc\": \"<p>Assert pod has annotations.</p>\\n<p>Returns True/False</p>\\n<ul>\\n<li><code>pod</code>: Pod object.</li>\\n<li><code>annotations_json</code>: JSON representing annotations</li>\\n</ul>\", \"shortdoc\": \"Assert pod has annotations.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 887}, {\"name\": \"Assert Pod Has Labels\", \"args\": [{\"name\": \"pod\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"pod\"}, {\"name\": \"labels_json\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"labels_json\"}], \"returnType\": null, \"doc\": \"<p>Assert pod has labels.</p>\\n<p>Returns True/False</p>\\n<ul>\\n<li><code>pod</code>: Pod object.</li>\\n<li><code>labels_json</code>: JSON representing labels</li>\\n</ul>\", \"shortdoc\": \"Assert pod has labels.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 861}, {\"name\": \"Create\", \"args\": [{\"name\": \"api_version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"api_version\"}, {\"name\": \"kind\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"kind\"}, {\"name\": \"kwargs\", \"type\": null, \"defaultValue\": null, \"kind\": \"VAR_NAMED\", \"required\": false, \"repr\": \"**kwargs\"}], \"returnType\": null, \"doc\": \"<p>Creates resource instances based on the provided configuration.</p>\\n<p>If the resource is namespaced (ie, not cluster-level), then one of <code>namespace</code>, <code>label_selector</code>, or <code>field_selector</code> is required. If the resource is cluster-level, then one of <code>name</code>, <code>label_selector</code>, or <code>field_selector</code> is required. Can be optionally given a kubernetes manifest (<code>body</code>) which respects the above considerations.</p>\\n<p>Returns created object</p>\\n<ul>\\n<li><code>api_version</code>: Api version of the desired kubernetes resource</li>\\n<li><code>kind</code>: Kind of the desired kubernetes resource</li>\\n<li><code>**kwargs</code>: Keyword arguments for argument forwarding</li>\\n</ul>\", \"shortdoc\": \"Creates resource instances based on the provided configuration.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 165}, {\"name\": \"Create Cron Job In Namespace\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"body\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"body\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use create_namespaced_cron_job.</p>\\n<p>Creates cron_job in a namespace</p>\\n<p>Returns created cron_job</p>\\n<ul>\\n<li><code>body</code>: Cron_job object.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use create_namespaced_cron_job.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1682, \"deprecated\": true}, {\"name\": \"Create Namespaced Cron Job\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"body\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"body\"}], \"returnType\": null, \"doc\": \"<p>Creates cron_job in a namespace</p>\\n<p>Returns created cron_job</p>\\n<ul>\\n<li><code>body</code>: Cron_job object.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Creates cron_job in a namespace\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1670}, {\"name\": \"Create Namespaced Service Account\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"body\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"body\"}], \"returnType\": null, \"doc\": \"<p>Creates service account in a namespace</p>\\n<p>Returns created service account</p>\\n<ul>\\n<li><code>body</code>: Service Account object.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Creates service account in a namespace\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1213}, {\"name\": \"Create Service Account In Namespace\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"body\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"body\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use create_namespaced_service_account.</p>\\n<p>Creates service account in a namespace</p>\\n<p>Returns created service account</p>\\n<ul>\\n<li><code>body</code>: Service Account object.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use create_namespaced_service_account.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1226, \"deprecated\": true}, {\"name\": \"Delete\", \"args\": [{\"name\": \"api_version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"api_version\"}, {\"name\": \"kind\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"kind\"}, {\"name\": \"kwargs\", \"type\": null, \"defaultValue\": null, \"kind\": \"VAR_NAMED\", \"required\": false, \"repr\": \"**kwargs\"}], \"returnType\": null, \"doc\": \"<p>Deletes resource instances based on the provided configuration.</p>\\n<p>Can be optionally given a <code>namespace</code>, <code>name</code>, <code>label_selector</code>, <code>body</code> and <code>field_selector</code>.</p>\\n<ul>\\n<li><code>api_version</code>: Api version of the desired kubernetes resource</li>\\n<li><code>kind</code>: Kind of the desired kubernetes resource</li>\\n<li><code>**kwargs</code>: Keyword arguments for argument forwarding</li>\\n</ul>\", \"shortdoc\": \"Deletes resource instances based on the provided configuration.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 185}, {\"name\": \"Delete Cron Job In Namespace\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use delete_namespaced_cron_job.</p>\\n<p>Deletes cron_job in a namespace</p>\\n<p>Returns V1 status</p>\\n<ul>\\n<li><code>name</code>: Cron Job name</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use delete_namespaced_cron_job.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1708, \"deprecated\": true}, {\"name\": \"Delete Namespaced Cron Job\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Deletes cron_job in a namespace</p>\\n<p>Returns V1 status</p>\\n<ul>\\n<li><code>name</code>: Cron Job name</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Deletes cron_job in a namespace\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1696}, {\"name\": \"Delete Namespaced Service Account\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Deletes service account in a namespace</p>\\n<p>Returns V1status</p>\\n<ul>\\n<li><code>name</code>: Service Account name</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Deletes service account in a namespace\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1241}, {\"name\": \"Delete Service Account In Namespace\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use delete_namespaced_service_account.</p>\\n<p>Deletes service account in a namespace</p>\\n<p>Returns V1status</p>\\n<ul>\\n<li><code>name</code>: Service Account name</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use delete_namespaced_service_account.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1255, \"deprecated\": true}, {\"name\": \"Evaluate Callable From K8s Client\", \"args\": [{\"name\": \"attr_name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"attr_name\"}, {\"name\": \"args\", \"type\": null, \"defaultValue\": null, \"kind\": \"VAR_POSITIONAL\", \"required\": false, \"repr\": \"*args\"}, {\"name\": \"kwargs\", \"type\": null, \"defaultValue\": null, \"kind\": \"VAR_NAMED\", \"required\": false, \"repr\": \"**kwargs\"}], \"returnType\": null, \"doc\": \"<p>Evaluates a callable from kubernetes client.</p>\\n<p>Returns the output of the client callable.</p>\\n<ul>\\n<li><code>attr_name</code>: Callable name</li>\\n<li><code>*args</code>: Positional arguments for argument forwarding</li>\\n<li><code>**kwargs</code>: Keyword arguments for argument forwarding</li>\\n</ul>\", \"shortdoc\": \"Evaluates a callable from kubernetes client.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 122}, {\"name\": \"Filter By Key\", \"args\": [{\"name\": \"objects\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"objects\"}, {\"name\": \"key\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"key\"}, {\"name\": \"match\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"match\"}], \"returnType\": null, \"doc\": \"<p>Filter object with key matching value for list of k8s objects.</p>\\n<p>Returns list of objects.</p>\\n<ul>\\n<li><code>objects</code>: List of k8s objects</li>\\n<li><code>key</code>: Key to match</li>\\n<li><code>match</code>: Value of the key based on which objects will be included</li>\\n</ul>\", \"shortdoc\": \"Filter object with key matching value for list of k8s objects.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 713}, {\"name\": \"Filter Configmap Names\", \"args\": [{\"name\": \"configmaps\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"configmaps\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. See examples in TBD. Filter configmap  names for list of configmaps. Returns list of strings.</p>\\n<ul>\\n<li><code>configmaps</code>: List of configmap objects</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. See examples in TBD. Filter configmap  names for list of configmaps. Returns list of strings. - ``configmaps``:   List of configmap objects\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 765, \"deprecated\": true}, {\"name\": \"Filter Containers Images\", \"args\": [{\"name\": \"containers\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"containers\"}], \"returnType\": null, \"doc\": \"<p>Filters container images for given lists of containers.</p>\\n<p>Returns list of images.</p>\\n<ul>\\n<li><code>containers</code>: List of containers</li>\\n</ul>\", \"shortdoc\": \"Filters container images for given lists of containers.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 800}, {\"name\": \"Filter Containers Resources\", \"args\": [{\"name\": \"containers\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"containers\"}], \"returnType\": null, \"doc\": \"<p>Filters container resources for given lists of containers.</p>\\n<p>Returns list of resources.</p>\\n<ul>\\n<li><code>containers</code>: List of containers</li>\\n</ul>\", \"shortdoc\": \"Filters container resources for given lists of containers.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 811}, {\"name\": \"Filter Deployments Names\", \"args\": [{\"name\": \"deployments\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"deployments\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. See examples in TBD. Returns list of strings.</p>\\n<ul>\\n<li><code>deployments</code>: List of deployments objects</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. See examples in TBD. Returns list of strings. - ``deployments``:   List of deployments objects\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 727, \"deprecated\": true}, {\"name\": \"Filter Endpoints Names\", \"args\": [{\"name\": \"endpoints\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"endpoints\"}], \"returnType\": null, \"doc\": \"<p>Filter endpoints names for list of endpoints. Returns list of strings.</p>\\n<ul>\\n<li><code>endpoints</code>:</li>\\n</ul>\\n<p>List of endpoint objects</p>\", \"shortdoc\": \"Filter endpoints names for list of endpoints. Returns list of strings. - ``endpoints``: List of endpoint objects\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 774}, {\"name\": \"Filter Names\", \"args\": [{\"name\": \"objects\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"objects\"}], \"returnType\": null, \"doc\": \"<p>Filter .metadata.name for list of k8s objects.</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>objects</code>: List of k8s objects</li>\\n</ul>\", \"shortdoc\": \"Filter .metadata.name for list of k8s objects.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 703}, {\"name\": \"Filter Pods Containers By Name\", \"args\": [{\"name\": \"pods\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"pods\"}, {\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}], \"returnType\": null, \"doc\": \"<p>Filters pods containers by name for given list of pods.</p>\\n<p>Returns lists of containers (flattens).</p>\\n<ul>\\n<li><code>pods</code>: List of pods objects</li>\\n</ul>\", \"shortdoc\": \"Filters pods containers by name for given list of pods.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 783}, {\"name\": \"Filter Pods Containers Statuses By Name\", \"args\": [{\"name\": \"pods\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"pods\"}, {\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}], \"returnType\": null, \"doc\": \"<p>Filters pods containers statuses by container name for given list of pods.</p>\\n<p>Returns lists of containers statuses.</p>\\n<ul>\\n<li><code>pods</code>: List of pods objects</li>\\n</ul>\", \"shortdoc\": \"Filters pods containers statuses by container name for given list of pods.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 822}, {\"name\": \"Filter Pods Names\", \"args\": [{\"name\": \"pods\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"pods\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. See examples in TBD. Filter pod names for list of pods.</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>pods</code>: List of pods objects</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. See examples in TBD. Filter pod names for list of pods.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 743, \"deprecated\": true}, {\"name\": \"Filter Replicasets Names\", \"args\": [{\"name\": \"replicasets\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"replicasets\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. See examples in TBD. Returns list of strings.</p>\\n<ul>\\n<li><code>replicasets</code>: List of replicasets objects</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. See examples in TBD. Returns list of strings. - ``replicasets``:   List of replicasets objects\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 735, \"deprecated\": true}, {\"name\": \"Filter Service Accounts Names\", \"args\": [{\"name\": \"service_accounts\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"service_accounts\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. See examples in TBD. Filter service accounts names for list of service accounts.</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>service_accounts</code>: List of service accounts objects</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. See examples in TBD. Filter service accounts names for list of service accounts.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 754, \"deprecated\": true}, {\"name\": \"Generate Alphanumeric Str\", \"args\": [{\"name\": \"size\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"size\"}], \"returnType\": null, \"doc\": \"<p>Generates a random alphanumeric string with given size.</p>\\n<p>Returns a string.</p>\\n<ul>\\n<li><code>size</code>: Desired size of the output string</li>\\n</ul>\", \"shortdoc\": \"Generates a random alphanumeric string with given size.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 111}, {\"name\": \"Get\", \"args\": [{\"name\": \"api_version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"api_version\"}, {\"name\": \"kind\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"kind\"}, {\"name\": \"kwargs\", \"type\": null, \"defaultValue\": null, \"kind\": \"VAR_NAMED\", \"required\": false, \"repr\": \"**kwargs\"}], \"returnType\": null, \"doc\": \"<p>Retrieves resource instances based on the provided parameters.</p>\\n<p>Can be optionally given a <code>namespace</code>, <code>name</code>, <code>label_selector</code>, <code>body</code> and <code>field_selector</code>.</p>\\n<p>Returns a resource list.</p>\\n<ul>\\n<li><code>api_version</code>: Api version of the desired kubernetes resource</li>\\n<li><code>kind</code>: Kind of the desired kubernetes resource</li>\\n<li><code>**kwargs</code>: Keyword arguments for argument forwarding</li>\\n</ul>\", \"shortdoc\": \"Retrieves resource instances based on the provided parameters.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 148}, {\"name\": \"Get Cluster Custom Object\", \"args\": [{\"name\": \"group\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"group\"}, {\"name\": \"version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"version\"}, {\"name\": \"plural\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"plural\"}, {\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}], \"returnType\": null, \"doc\": \"<p>Get cluster level custom object.</p>\\n<p>Returns an object.</p>\\n<ul>\\n<li><code>group</code>: API Group, e.g. 'scheduling.k8s.io'</li>\\n<li><code>version</code>: API version, e.g. 'v1'</li>\\n<li><code>plural</code>: e.g. 'priorityclasses'</li>\\n<li><code>name</code>: e.g. 'system-node-critical'</li>\\n</ul>\\n<p>As in <code>GET /apis/{group}/{version}/{plural}/{name}</code></p>\\n<p><a href=\\\"https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\\\">https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md</a></p>\", \"shortdoc\": \"Get cluster level custom object.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1584}, {\"name\": \"Get Cluster Role Bindings\", \"args\": [], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_cluster_role_binding.</p>\\n<p>Gets a list of cluster_role_bindings.</p>\\n<p>Returns list of cluster_role_bindings.</p>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_cluster_role_binding.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1488, \"deprecated\": true}, {\"name\": \"Get Cluster Roles\", \"args\": [], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_cluster_role.</p>\\n<p>Gets a list of cluster_roles.</p>\\n<p>Returns list of cluster_roles.</p>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_cluster_role.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1470, \"deprecated\": true}, {\"name\": \"Get Configmaps In Namespace\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_config_map_by_pattern. Gets configmaps matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of configmaps.</p>\\n<ul>\\n<li><code>name_pattern</code>: configmap name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_config_map_by_pattern. Gets configmaps matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 471, \"deprecated\": true}, {\"name\": \"Get Cron Job Details In Namespace\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use read_namespaced_cron_job.</p>\\n<p>Gets cron job details in given namespace.</p>\\n<p>Returns Cron job object representation.</p>\\n<ul>\\n<li><code>name</code>: Name of cron job.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_cron_job.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1391, \"deprecated\": true}, {\"name\": \"Get Cron Jobs In Namespace\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_cron_job.</p>\\n<p>Gets cron jobs in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_cron_job.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1363, \"deprecated\": true}, {\"name\": \"Get Custom Object In Namespace\", \"args\": [{\"name\": \"group\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"group\"}, {\"name\": \"version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"version\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"plural\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"plural\"}, {\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use get_namespaced_custom_object.</p>\\n<p>Get custom object in namespace.</p>\\n<p>Returns an object.</p>\\n<ul>\\n<li><code>group</code>: API Group, e.g. 'k8s.cni.cncf.io'</li>\\n<li><code>version</code>: API version, e.g. 'v1'</li>\\n<li><code>namespace</code>: Namespace, e.g. 'default'</li>\\n<li><code>plural</code>: e.g. 'network-attachment-definitions'</li>\\n<li><code>name</code>: e.g. 'my-network'</li>\\n</ul>\\n<p>As in <code>GET /apis/{group}/{version}/namespaces/{namespace}/{plural}/{name}</code></p>\\n<p><a href=\\\"https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\\\">https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md</a></p>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use get_namespaced_custom_object.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1646, \"deprecated\": true}, {\"name\": \"Get Daemonset Details In Namespace\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use read_namespaced_daemon_set.</p>\\n<p>Gets deamonset details in given namespace.</p>\\n<p>Returns daemonset object representation.</p>\\n<ul>\\n<li><code>name</code>: Name of the daemonset</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_daemon_set.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1447, \"deprecated\": true}, {\"name\": \"Get Daemonsets In Namespace\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_daemon_set.</p>\\n<p>Gets a list of available daemonsets.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of deaemonsets.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_daemon_set.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1419, \"deprecated\": true}, {\"name\": \"Get Deployments In Namespace\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_deployment_by_pattern. Gets deployments matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of deployments.</p>\\n<ul>\\n<li><code>name_pattern</code>: deployment name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_deployment_by_pattern. Gets deployments matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 541, \"deprecated\": true}, {\"name\": \"Get Dynamic Resource\", \"args\": [{\"name\": \"api_version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"api_version\"}, {\"name\": \"kind\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"kind\"}], \"returnType\": null, \"doc\": \"<p>Returns a dynamic resource based on the provided api version and kind.</p>\\n<ul>\\n<li><code>api_version</code>: Api version of the desired kubernetes resource</li>\\n<li><code>kind</code>: Kind of the desired kubernetes resource</li>\\n</ul>\", \"shortdoc\": \"Returns a dynamic resource based on the provided api version and kind.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 138}, {\"name\": \"Get Endpoints In Namespace\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use read_namespaced_endpoints.</p>\\n<p>Gets endpoint details in given namespace.</p>\\n<p>Returns Endpoint object representation. Can be accessed using</p>\\n<table border=\\\"1\\\">\\n<tr>\\n<td>Should Match</td>\\n<td>${endpoint_details.subsets[0].addresses[0].target_ref.name}</td>\\n<td>pod-name-123456</td>\\n</tr>\\n</table>\\n<ul>\\n<li><code>name</code>: Name of endpoint.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_endpoints.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1080, \"deprecated\": true}, {\"name\": \"Get Healthcheck\", \"args\": [{\"name\": \"endpoint\", \"type\": null, \"defaultValue\": \"/readyz\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"endpoint=/readyz\"}, {\"name\": \"verbose\", \"type\": null, \"defaultValue\": \"False\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"verbose=False\"}], \"returnType\": null, \"doc\": \"<p>Performs GET on /readyz or /livez for simple health check.</p>\\n<p>Can be used to verify the readiness/current status of the API server Returns tuple of (response data, response status and response headers)</p>\\n<ul>\\n<li><code>endpoint</code>: /readyz, /livez or induvidual endpoints like '/livez/etcd'. defaults to /readyz</li>\\n<li><code>verbose</code>: More detailed output.</li>\\n</ul>\\n<p><a href=\\\"https://kubernetes.io/docs/reference/using-api/health-checks\\\">https://kubernetes.io/docs/reference/using-api/health-checks</a></p>\", \"shortdoc\": \"Performs GET on /readyz or /livez for simple health check.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1271}, {\"name\": \"Get Healthy Nodes Count\", \"args\": [{\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Counts node with KubeletReady and status True.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Can be used to check number of healthy nodes. Can be used as prerequisite in tests.</p>\", \"shortdoc\": \"Counts node with KubeletReady and status True.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 353}, {\"name\": \"Get Hpa Details In Namespace\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_horizontal_pod_autoscaler.</p>\\n<p>Gets Horizontal Pod Autoscaler details in given namespace.</p>\\n<p>Returns Horizontal Pod Autoscaler object representation. Can be accessed using</p>\\n<table border=\\\"1\\\">\\n<tr>\\n<td>Should Be Equal As integers</td>\\n<td>${hpa_details.spec.target_cpu_utilization_percentage}</td>\\n<td>50</td>\\n</tr>\\n</table>\\n<ul>\\n<li><code>name</code>: Name of Horizontal Pod Autoscaler</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_horizontal_pod_autoscaler.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1048, \"deprecated\": true}, {\"name\": \"Get Hpas In Namespace\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_horizontal_pod_autoscaler.</p>\\n<p>Gets Horizontal Pod Autoscalers in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_horizontal_pod_autoscaler.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1017, \"deprecated\": true}, {\"name\": \"Get Ingress Details In Namespace\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use read_namespaced_ingress.</p>\\n<p>Gets ingress details in given namespace.</p>\\n<p>Returns Ingress object representation. Name of ingress.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_ingress.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1337, \"deprecated\": true}, {\"name\": \"Get Ingresses In Namespace\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_ingress.</p>\\n<p>Gets ingresses in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_ingress.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1313, \"deprecated\": true}, {\"name\": \"Get Jobs In Namespace\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_job_by_pattern. Gets jobs matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of jobs.</p>\\n<ul>\\n<li><code>name_pattern</code>: job name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_job_by_pattern. Gets jobs matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 611, \"deprecated\": true}, {\"name\": \"Get Kubelet Version\", \"args\": [{\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Gets list of kubelet versions on each node.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\", \"shortdoc\": \"Gets list of kubelet versions on each node.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1203}, {\"name\": \"Get Namespaced Custom Object\", \"args\": [{\"name\": \"group\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"group\"}, {\"name\": \"version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"version\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"plural\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"plural\"}, {\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}], \"returnType\": null, \"doc\": \"<p>Get custom object in namespace.</p>\\n<p>Returns an object.</p>\\n<ul>\\n<li><code>group</code>: API Group, e.g. 'k8s.cni.cncf.io'</li>\\n<li><code>version</code>: API version, e.g. 'v1'</li>\\n<li><code>namespace</code>: Namespace, e.g. 'default'</li>\\n<li><code>plural</code>: e.g. 'network-attachment-definitions'</li>\\n<li><code>name</code>: e.g. 'my-network'</li>\\n</ul>\\n<p>As in <code>GET /apis/{group}/{version}/namespaces/{namespace}/{plural}/{name}</code></p>\\n<p><a href=\\\"https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\\\">https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md</a></p>\", \"shortdoc\": \"Get custom object in namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1604}, {\"name\": \"Get Namespaced Pod Exec\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"argv_cmd\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"argv_cmd\"}, {\"name\": \"container\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"container=None\"}], \"returnType\": null, \"doc\": \"<p>Exec command on selected container for POD.</p>\\n<p>Returns command stdout/stderr</p>\\n<ul>\\n<li><code>name</code>: pod name</li>\\n<li><code>namespace</code>: namespace to check</li>\\n<li><code>argv_cmd</code>: command to be executed using argv syntax: [\\\"/bin/sh\\\", \\\"-c\\\", \\\"ls\\\"] it do not use shell as default!</li>\\n<li><code>container</code>: container on which we run exec, default: None</li>\\n</ul>\", \"shortdoc\": \"Exec command on selected container for POD.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 664}, {\"name\": \"Get Namespaces\", \"args\": [{\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespace. Gets a list of available namespaces.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of namespaces names.</p>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespace. Gets a list of available namespaces.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 343, \"deprecated\": true}, {\"name\": \"Get No Proxy\", \"args\": [], \"returnType\": null, \"doc\": \"\", \"shortdoc\": \"\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 107}, {\"name\": \"Get Pod Logs\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"container\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"container\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use read_namespaced_pod_log. Gets container logs of given pod in given namespace.</p>\\n<p>Returns logs.</p>\\n<ul>\\n<li><code>name</code>: Pod name to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n<li><code>container</code>: Container to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_pod_log. Gets container logs of given pod in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 438, \"deprecated\": true}, {\"name\": \"Get Pod Names In Namespace\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_pod_by_pattern. Gets pod name matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>name_pattern</code>: Pod name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_pod_by_pattern. Gets pod name matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 368, \"deprecated\": true}, {\"name\": \"Get Pod Status In Namespace\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use read_namespaced_pod_status.</p>\\n<ul>\\n<li><code>name</code>: Name of pod.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_pod_status.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 849, \"deprecated\": true}, {\"name\": \"Get Pods In Namespace\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_pod_by_pattern. Gets pods matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of pods.</p>\\n<ul>\\n<li><code>name_pattern</code>: Pod name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_pod_by_pattern. Gets pods matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 402, \"deprecated\": true}, {\"name\": \"Get Proxy\", \"args\": [], \"returnType\": null, \"doc\": \"\", \"shortdoc\": \"\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 102}, {\"name\": \"Get Pvc Capacity\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use read_namespaced_persistent_volume_claim.</p>\\n<p>Gets PVC details in given namespace.</p>\\n<p>Returns PVC object representation. Can be accessed using</p>\\n<table border=\\\"1\\\">\\n<tr>\\n<td>Should Be Equal As strings</td>\\n<td>${pvc.status.capacity.storage}</td>\\n<td>1Gi</td>\\n</tr>\\n</table>\\n<ul>\\n<li><code>name</code>: Name of PVC.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_persistent_volume_claim.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1186, \"deprecated\": true}, {\"name\": \"Get Pvc In Namespace\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_persistent_volume_claim.</p>\\n<p>Gets pvcs in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_persistent_volume_claim.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1156, \"deprecated\": true}, {\"name\": \"Get Replicasets In Namespace\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_replica_set_by_pattern. Gets replicasets matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of  replicasets.</p>\\n<ul>\\n<li><code>name_pattern</code>: replicaset name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_replica_set_by_pattern. Gets replicasets matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 576, \"deprecated\": true}, {\"name\": \"Get Role Bindings In Namespace\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_role_binding.</p>\\n<p>Gets role_bindings in given namespace.</p>\\n<p>Returns list of role_bindings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_role_binding.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1533, \"deprecated\": true}, {\"name\": \"Get Roles In Namespace\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_role.</p>\\n<p>Gets roles in given namespace.</p>\\n<p>Returns list of roles.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_role.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1509, \"deprecated\": true}, {\"name\": \"Get Secrets In Namespace\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_secret_by_pattern. Gets secrets matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of secrets.</p>\\n<ul>\\n<li><code>name_pattern</code>: secret name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_secret_by_pattern. Gets secrets matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 646, \"deprecated\": true}, {\"name\": \"Get Service Accounts In Namespace\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_service_account_by_pattern. Gets service accounts matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of service accounts.</p>\\n<ul>\\n<li><code>name_pattern</code>: Service Account name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_service_account_by_pattern. Gets service accounts matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 506, \"deprecated\": true}, {\"name\": \"Get Service Details In Namespace\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use read_namespaced_service.</p>\\n<p>Gets service details in given namespace.</p>\\n<p>Returns Service object representation. Can be accessed using</p>\\n<table border=\\\"1\\\">\\n<tr>\\n<td>Should Be Equal As integers</td>\\n<td>${service_details.spec.ports[0].port}</td>\\n<td>8080</td>\\n</tr>\\n</table>\\n<ul>\\n<li><code>name</code>: Name of service.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_service.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 986, \"deprecated\": true}, {\"name\": \"Get Services In Namespace\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_namespaced_service.</p>\\n<p>Gets services in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_service.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 956, \"deprecated\": true}, {\"name\": \"K8s Api Ping\", \"args\": [], \"returnType\": null, \"doc\": \"<p>Performs GET on /api/v1/ for simple check of API availability.</p>\\n<p>Returns tuple of (response data, response status, response headers). Can be used as prerequisite in tests.</p>\", \"shortdoc\": \"Performs GET on /api/v1/ for simple check of API availability.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 294}, {\"name\": \"K8s Version\", \"args\": [], \"returnType\": null, \"doc\": \"<p>Performs GET on /version to show the k8s cluster version.</p>\\n<p>Returns a dict of kubernetes version information, similar to <span class=\\\"name\\\">kubectl version</span>.</p>\", \"shortdoc\": \"Performs GET on /version to show the k8s cluster version.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 313}, {\"name\": \"List Cluster Custom Object\", \"args\": [{\"name\": \"group\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"group\"}, {\"name\": \"version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"version\"}, {\"name\": \"plural\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"plural\"}], \"returnType\": null, \"doc\": \"<p>Lists cluster level custom objects.</p>\\n<p>Returns an object.</p>\\n<ul>\\n<li><code>group</code>: API Group, e.g. 'k8s.cni.cncf.io'</li>\\n<li><code>version</code>: API version, e.g. 'v1'</li>\\n<li><code>plural</code>: e.g. 'network-attachment-definitions'</li>\\n</ul>\\n<p>As in <code>GET /apis/{group}/{version}/{plural}</code></p>\\n<p><a href=\\\"https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\\\">https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md</a></p>\", \"shortdoc\": \"Lists cluster level custom objects.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1546}, {\"name\": \"List Cluster Custom Objects\", \"args\": [{\"name\": \"group\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"group\"}, {\"name\": \"version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"version\"}, {\"name\": \"plural\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"plural\"}], \"returnType\": null, \"doc\": \"<p><b>DEPRECATED</b> Will be removed in v1.0.0. Use list_cluster_custom_object.</p>\\n<p>Lists cluster level custom objects.</p>\\n<p>Returns an object.</p>\\n<ul>\\n<li><code>group</code>: API Group, e.g. 'k8s.cni.cncf.io'</li>\\n<li><code>version</code>: API version, e.g. 'v1'</li>\\n<li><code>plural</code>: e.g. 'network-attachment-definitions'</li>\\n</ul>\\n<p>As in <code>GET /apis/{group}/{version}/{plural}</code></p>\\n<p><a href=\\\"https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\\\">https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md</a></p>\", \"shortdoc\": \"*DEPRECATED* Will be removed in v1.0.0. Use list_cluster_custom_object.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1564, \"deprecated\": true}, {\"name\": \"List Cluster Role\", \"args\": [], \"returnType\": null, \"doc\": \"<p>Gets a list of cluster_roles.</p>\\n<p>Returns list of cluster_roles.</p>\", \"shortdoc\": \"Gets a list of cluster_roles.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1462}, {\"name\": \"List Cluster Role Binding\", \"args\": [], \"returnType\": null, \"doc\": \"<p>Gets a list of cluster_role_bindings.</p>\\n<p>Returns list of cluster_role_bindings.</p>\", \"shortdoc\": \"Gets a list of cluster_role_bindings.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1480}, {\"name\": \"List Namespace\", \"args\": [{\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Lists available namespaces.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of namespaces.</p>\", \"shortdoc\": \"Lists available namespaces.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 333}, {\"name\": \"List Namespaced Config Map By Pattern\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Lists configmaps matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of configmaps.</p>\\n<ul>\\n<li><code>name_pattern</code>: configmap name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Lists configmaps matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 454}, {\"name\": \"List Namespaced Cron Job\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Gets cron jobs in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets cron jobs in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1350}, {\"name\": \"List Namespaced Custom Object\", \"args\": [{\"name\": \"group\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"group\"}, {\"name\": \"version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"version\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"plural\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"plural\"}], \"returnType\": null, \"doc\": \"<p>List custom objects in namespace.</p>\\n<p>Returns an object.</p>\\n<ul>\\n<li><code>group</code>: API Group, e.g. 'k8s.cni.cncf.io'</li>\\n<li><code>version</code>: API version, e.g. 'v1'</li>\\n<li><code>namespace</code>: Namespace, e.g. 'default'</li>\\n<li><code>plural</code>: e.g. 'network-attachment-definitions'</li>\\n</ul>\\n<p>As in <code>GET /apis/{group}/{version}/namespaces/{namespace}/{plural}</code></p>\\n<p><a href=\\\"https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\\\">https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md</a></p>\", \"shortdoc\": \"List custom objects in namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1626}, {\"name\": \"List Namespaced Daemon Set\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Gets a list of available daemonsets.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of deaemonsets.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets a list of available daemonsets.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1406}, {\"name\": \"List Namespaced Deployment By Pattern\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Gets deployments matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of deployments.</p>\\n<ul>\\n<li><code>name_pattern</code>: deployment name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets deployments matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 524}, {\"name\": \"List Namespaced Horizontal Pod Autoscaler\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Gets Horizontal Pod Autoscalers in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets Horizontal Pod Autoscalers in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1003}, {\"name\": \"List Namespaced Ingress\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Gets ingresses in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets ingresses in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1302}, {\"name\": \"List Namespaced Job By Pattern\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Gets jobs matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of jobs.</p>\\n<ul>\\n<li><code>name_pattern</code>: job name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets jobs matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 594}, {\"name\": \"List Namespaced Persistent Volume Claim\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Gets pvcs in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets pvcs in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1097}, {\"name\": \"List Namespaced Persistent Volume Claim By Pattern\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Gets pvcs in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n<li><code>name_pattern</code>: pvc name pattern to check</li>\\n</ul>\", \"shortdoc\": \"Gets pvcs in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1110}, {\"name\": \"List Namespaced Pod By Pattern\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>List pods matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of pods.</p>\\n<ul>\\n<li><code>name_pattern</code>: Pod name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"List pods matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 385}, {\"name\": \"List Namespaced Replica Set By Pattern\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Lists replicasets matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of  replicasets.</p>\\n<ul>\\n<li><code>name_pattern</code>: replicaset name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Lists replicasets matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 559}, {\"name\": \"List Namespaced Role\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Gets roles in given namespace.</p>\\n<p>Returns list of roles.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets roles in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1498}, {\"name\": \"List Namespaced Role Binding\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Gets role_bindings in given namespace.</p>\\n<p>Returns list of role_bindings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets role_bindings in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1522}, {\"name\": \"List Namespaced Secret By Pattern\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Lists secrets matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of secrets.</p>\\n<ul>\\n<li><code>name_pattern</code>: secret name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Lists secrets matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 629}, {\"name\": \"List Namespaced Service\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Gets services in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of strings.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets services in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 943}, {\"name\": \"List Namespaced Service Account By Pattern\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Lists service accounts matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of service accounts.</p>\\n<ul>\\n<li><code>name_pattern</code>: Service Account name pattern to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Lists service accounts matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 489}, {\"name\": \"List Namespaced Stateful Set\", \"args\": [{\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Lists statefulsets in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of  statefulsets.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Lists statefulsets in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1126}, {\"name\": \"List Namespaced Stateful Set By Pattern\", \"args\": [{\"name\": \"name_pattern\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name_pattern\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"label_selector\", \"type\": null, \"defaultValue\": \"\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"label_selector=\"}], \"returnType\": null, \"doc\": \"<p>Lists statefulsets matching pattern in given namespace.</p>\\n<p>Can be optionally filtered by label. e.g. label_selector=label_key=label_value</p>\\n<p>Returns list of  statefulsets.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n<li><code>name_pattern</code>: statefulset name pattern to check</li>\\n</ul>\", \"shortdoc\": \"Lists statefulsets matching pattern in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1139}, {\"name\": \"Patch\", \"args\": [{\"name\": \"api_version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"api_version\"}, {\"name\": \"kind\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"kind\"}, {\"name\": \"kwargs\", \"type\": null, \"defaultValue\": null, \"kind\": \"VAR_NAMED\", \"required\": false, \"repr\": \"**kwargs\"}], \"returnType\": null, \"doc\": \"<p>Patches resource instances based on the provided parameters.</p>\\n<p>Can be optionally given a <code>namespace</code>, <code>name</code>, <code>label_selector</code>, <code>body</code> and <code>field_selector</code>.</p>\\n<ul>\\n<li><code>api_version</code>: Api version of the desired kubernetes resource</li>\\n<li><code>kind</code>: Kind of the desired kubernetes resource</li>\\n<li><code>**kwargs</code>: Keyword arguments for argument forwarding</li>\\n</ul>\", \"shortdoc\": \"Patches resource instances based on the provided parameters.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 200}, {\"name\": \"Read Namespaced Cron Job\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Gets cron job details in given namespace.</p>\\n<p>Returns Cron job object representation.</p>\\n<ul>\\n<li><code>name</code>: Name of cron job.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets cron job details in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1378}, {\"name\": \"Read Namespaced Daemon Set\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Gets deamonset details in given namespace.</p>\\n<p>Returns daemonset object representation.</p>\\n<ul>\\n<li><code>name</code>: Name of the daemonset</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets deamonset details in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1434}, {\"name\": \"Read Namespaced Endpoints\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Gets endpoint details in given namespace.</p>\\n<p>Returns Endpoint object representation. Can be accessed using</p>\\n<table border=\\\"1\\\">\\n<tr>\\n<td>Should Match</td>\\n<td>${endpoint_details.subsets[0].addresses[0].target_ref.name}</td>\\n<td>pod-name-123456</td>\\n</tr>\\n</table>\\n<ul>\\n<li><code>name</code>: Name of endpoint.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets endpoint details in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1065}, {\"name\": \"Read Namespaced Horizontal Pod Autoscaler\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Gets Horizontal Pod Autoscaler details in given namespace.</p>\\n<p>Returns Horizontal Pod Autoscaler object representation. Can be accessed using</p>\\n<table border=\\\"1\\\">\\n<tr>\\n<td>Should Be Equal As integers</td>\\n<td>${hpa_details.spec.target_cpu_utilization_percentage}</td>\\n<td>50</td>\\n</tr>\\n</table>\\n<ul>\\n<li><code>name</code>: Name of Horizontal Pod Autoscaler</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets Horizontal Pod Autoscaler details in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1033}, {\"name\": \"Read Namespaced Ingress\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Gets ingress details in given namespace.</p>\\n<p>Returns Ingress object representation. Name of ingress.</p>\\n<ul>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets ingress details in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1326}, {\"name\": \"Read Namespaced Persistent Volume Claim\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Gets PVC details in given namespace.</p>\\n<p>Returns PVC object representation. Can be accessed using</p>\\n<table border=\\\"1\\\">\\n<tr>\\n<td>Should Be Equal As strings</td>\\n<td>${pvc.status.capacity.storage}</td>\\n<td>1Gi</td>\\n</tr>\\n</table>\\n<ul>\\n<li><code>name</code>: Name of PVC.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets PVC details in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 1171}, {\"name\": \"Read Namespaced Pod Log\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}, {\"name\": \"container\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"container\"}, {\"name\": \"since_seconds\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"since_seconds=None\"}], \"returnType\": null, \"doc\": \"<p>Gets container logs of given pod in given namespace.</p>\\n<p>Can be optionally filtered by time in seconds. e.g. since_seconds=1000.</p>\\n<p>Returns logs.</p>\\n<ul>\\n<li><code>name</code>: Pod name to check</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n<li><code>container</code>: Container to check</li>\\n</ul>\", \"shortdoc\": \"Gets container logs of given pod in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 420}, {\"name\": \"Read Namespaced Pod Status\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Reads pod status in given namespace.</p>\\n<ul>\\n<li><code>name</code>: Name of pod.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Reads pod status in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 838}, {\"name\": \"Read Namespaced Service\", \"args\": [{\"name\": \"name\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"name\"}, {\"name\": \"namespace\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"namespace\"}], \"returnType\": null, \"doc\": \"<p>Gets service details in given namespace.</p>\\n<p>Returns Service object representation. Can be accessed using</p>\\n<table border=\\\"1\\\">\\n<tr>\\n<td>Should Be Equal As integers</td>\\n<td>${service_details.spec.ports[0].port}</td>\\n<td>8080</td>\\n</tr>\\n</table>\\n<ul>\\n<li><code>name</code>: Name of service.</li>\\n<li><code>namespace</code>: Namespace to check</li>\\n</ul>\", \"shortdoc\": \"Gets service details in given namespace.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 971}, {\"name\": \"Reload Config\", \"args\": [{\"name\": \"kube_config\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"kube_config=None\"}, {\"name\": \"context\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"context=None\"}, {\"name\": \"api_url\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"api_url=None\"}, {\"name\": \"bearer_token\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"bearer_token=None\"}, {\"name\": \"ca_cert\", \"type\": null, \"defaultValue\": \"None\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"ca_cert=None\"}, {\"name\": \"incluster\", \"type\": null, \"defaultValue\": \"False\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"incluster=False\"}, {\"name\": \"cert_validation\", \"type\": null, \"defaultValue\": \"True\", \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": false, \"repr\": \"cert_validation=True\"}], \"returnType\": null, \"doc\": \"<p>Reload the KubeLibrary to be configured with different optional arguments. This can be used to connect to a different cluster during the same test.</p>\\n<ul>\\n<li><code>kube_config</code>: Path pointing to kubeconfig of target Kubernetes cluster.</li>\\n<li><code>context</code>: Active context. If None current_context from kubeconfig is used.</li>\\n<li><code>api_url</code>: K8s API url, used for bearer token authenticaiton.</li>\\n<li><code>bearer_token</code>: Bearer token, used for bearer token authenticaiton. Do not include 'Bearer ' prefix.</li>\\n<li><code>ca_cert</code>: Optional CA certificate file path, used for bearer token authenticaiton.</li>\\n<li><code>incuster</code>: Default False. Indicates if used from within k8s cluster. Overrides kubeconfig.</li>\\n<li><code>cert_validation</code>: Default True. Can be set to False for self-signed certificates.</li>\\n</ul>\\n<p>Environment variables:</p>\\n<ul>\\n<li>HTTP_PROXY: Proxy URL</li>\\n</ul>\", \"shortdoc\": \"Reload the KubeLibrary to be configured with different optional arguments.    This can be used to connect to a different cluster during the same test. - ``kube_config``:   Path pointing to kubeconfig of target Kubernetes cluster. - ``context``:   Active context. If None current_context from kubeconfig is used. - ``api_url``:   K8s API url, used for bearer token authenticaiton. - ``bearer_token``:   Bearer token, used for bearer token authenticaiton. Do not include 'Bearer ' prefix. - ``ca_cert``:   Optional CA certificate file path, used for bearer token authenticaiton. - ``incuster``:   Default False. Indicates if used from within k8s cluster. Overrides kubeconfig. - ``cert_validation``:   Default True. Can be set to False for self-signed certificates.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 230}, {\"name\": \"Replace\", \"args\": [{\"name\": \"api_version\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"api_version\"}, {\"name\": \"kind\", \"type\": null, \"defaultValue\": null, \"kind\": \"POSITIONAL_OR_NAMED\", \"required\": true, \"repr\": \"kind\"}, {\"name\": \"kwargs\", \"type\": null, \"defaultValue\": null, \"kind\": \"VAR_NAMED\", \"required\": false, \"repr\": \"**kwargs\"}], \"returnType\": null, \"doc\": \"<p>Replaces resource instances based on the provided parameters.</p>\\n<p>Can be optionally given a <code>namespace</code>, <code>name</code>, <code>label_selector</code>, <code>body</code> and <code>field_selector</code>.</p>\\n<ul>\\n<li><code>api_version</code>: Api version of the desired kubernetes resource</li>\\n<li><code>kind</code>: Kind of the desired kubernetes resource</li>\\n<li><code>**kwargs</code>: Keyword arguments for argument forwarding</li>\\n</ul>\", \"shortdoc\": \"Replaces resource instances based on the provided parameters.\", \"tags\": [], \"source\": \"/home/nils/workspace/nilsty/KubeLibrary/src/KubeLibrary/KubeLibrary.py\", \"lineno\": 215}], \"typedocs\": []}\n</script>\n    <link rel=\"icon\" type=\"image/x-icon\" href=\"data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAqAAAAAAAAAAAAAAAAAAAALIAAAD/AAAA4AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA4AAAAP8AAACxAAAAAAAAAKYAAAD/AAAAuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/AAAA/wAAAKkAAAD6AAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN8AAAD/AAAA+gAAAMMAAAAAAAAAAgAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAADAAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAAIsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANEAAAAAAAAA2gAAAP8AAAD6AAAAwwAAAAAAAAAAAAAAMgAAADIAAAAyAAAAMgAAADIAAAAyAAAAMgAAADIAAAAFAAAAAAAAANoAAAD/AAAA+gAAAMMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAADwAAAB8AAAAAAAAAGAAAABcAAAAAAAAAH8AAABKAAAAAAAAAAAAAAAAAAAA2gAAAP8AAAD6AAAAwwAAAAAAAADCAAAA/wAAACkAAADqAAAA4QAAAAAAAAD7AAAA/wAAALAAAAAGAAAAAAAAANoAAAD/AAAA+gAAAMMAAAAAAAAAIwAAAP4AAAD/AAAA/wAAAGAAAAAAAAAAAAAAAMkAAAD/AAAAigAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAAAAAAAAIAAAAcAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAA2gAAAP8AAAD7AAAAywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN4AAAD/AAAAqwAAAP8AAACvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAAAD/AAAAsgAAAAAAAAC5AAAA/wAAAMoAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMkAAAD/AAAAvAAAAAAAAAAAAAAAAAAAAKwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAArQAAAAAAAAAAwAMAAIABAAAf+AAAP/wAAD/8AAAgBAAAP/wAAD/8AAA//AAAJIwAADHEAAA//AAAP/wAAB/4AACAAQAAwAMAAA==\">\n  </head>\n  <body>\n    <style>#javascript-disabled{color:#000;background:#eee;border:1px solid #ccc;width:600px;margin:100px auto 0;padding:20px}#javascript-disabled h1{float:none;width:100%}#javascript-disabled ul{font-size:1.2em}#javascript-disabled li{margin:.5em 0}#javascript-disabled b{font-style:italic}</style>\n\n    <div id=\"javascript-disabled\">\n      <h1>Opening library documentation failed</h1>\n      <ul>\n        <li>Verify that you have <b>JavaScript enabled</b> in your browser.</li>\n        <li>\n          Make sure you are using a <b>modern enough browser</b>. If using\n          Internet Explorer, version 11 is required.\n        </li>\n        <li>\n          Check are there messages in your browser's\n          <b>JavaScript error log</b>. Please report the problem if you suspect\n          you have encountered a bug.\n        </li>\n      </ul>\n    </div>\n\n    <script type=\"text/javascript\">document.getElementById(\"javascript-disabled\").style.display=\"none\",window.addEventListener(\"hashchange\",function(){document.getElementsByClassName(\"hamburger-menu\")[0].checked=!1},!1),window.addEventListener(\"hashchange\",function(){if(0==window.location.hash.indexOf(\"#type-\")){let e=\"#type-modal-\"+decodeURI(window.location.hash.slice(6)),n=document.querySelector(\".data-types\").querySelector(e);n&&showModal(n)}},!1);</script>\n\n    <style>:root{--background-color:white;--text-color:black;--border-color:#e0e0e2;--light-background-color:#f3f3f3;--robot-highlight:#00c0b5;--highlighted-color:var(--text-color);--highlighted-background-color:yellow;--less-important-text-color:gray;--link-color:#00e}[data-theme=dark]{--background-color:#1c2227;--text-color:#e2e1d7;--border-color:#4e4e4e;--light-background-color:#002b36;--robot-highlight:yellow;--highlighted-color:var(--background-color);--highlighted-background-color:yellow;--less-important-text-color:#5b6a6f;--link-color:#52adff;--lightningcss-light: ;--lightningcss-dark:initial;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}body{background:var(--background-color);color:var(--text-color);margin:0;font-family:system-ui,-apple-system,sans-serif}input,button,select{background:var(--background-color);color:var(--text-color)}a{color:var(--link-color)}.base-container{display:flex}.libdoc-overview{background:#fff;background:var(--background-color);flex-direction:column;height:100vh;display:flex;position:sticky;top:0}.libdoc-overview h4{margin-top:.5rem;margin-bottom:.5rem}.keyword-search-box{border:1px solid var(--border-color);border-radius:3px;justify-content:space-between;height:30px;margin-top:.5rem;display:flex}#tags-shortcuts-container{border:1px solid var(--border-color);border-radius:3px;height:30px;margin-top:.5rem}.search-input{text-indent:4px;border:none;flex:1}.clear-search{border:none}#shortcuts-container{flex-direction:column;height:100%;display:flex}.libdoc-details{max-width:1000px;margin-top:60px;padding-left:2%;padding-right:2%;overflow:auto}.libdoc-title{color:var(--text-color);align-items:center;width:300px;height:36px;margin:.5rem;padding:.5rem;text-decoration:none;display:flex;position:fixed;top:0;left:0}#language-container{z-index:1000;position:fixed;top:0;right:0}#language-container button{border:none;padding-top:15px;padding-right:15px}#language-container svg{width:20px;height:20px}#language-container svg path{stroke:var(--text-color);fill:var(--background-color)}#language-container ul{background-color:var(--background-color);margin:0;padding:10px;list-style:none}#language-container a{cursor:pointer;color:var(--less-important-text-color);text-decoration:none}#language-container a.selected{color:var(--text-color)}.hamburger-menu{z-index:100;display:none;position:fixed}input.hamburger-menu{cursor:pointer;opacity:0;z-index:2;-webkit-touch-callout:none;width:67px;height:46px;display:none;position:fixed;top:0;right:0}span.hamburger-menu{background:#000;background:var(--text-color);z-index:1;transform-origin:4px 0;border-radius:2px;width:31px;height:2px;margin-bottom:5px;transition:transform .3s cubic-bezier(.77,.2,.05,1),opacity .35s;position:fixed;right:20px}span.hamburger-menu-1{transform-origin:0 0;top:14px}span.hamburger-menu-2{top:24px}span.hamburger-menu-3{transform-origin:0 100%;top:34px}input.hamburger-menu:checked~span.hamburger-menu-1{opacity:1;background:var(--text-color);transform:rotate(45deg)translate(2px,-3px)}input.hamburger-menu:checked~span.hamburger-menu-2{opacity:0;transform:rotate(0)scale(.2)}input.hamburger-menu:checked~span.hamburger-menu-3{background:var(--text-color);transform:rotate(-45deg)translate(2px,3px)}.libdoc-title>svg{width:42px;height:42px;padding-top:2px}#robot-svg-path{fill:var(--text-color);stroke:none;fill-opacity:1;fill-rule:nonzero}.keywords-overview{border:1px solid var(--border-color);border-radius:3px;flex-direction:column;flex:1;height:0;max-height:calc(100vh - 60px - .5rem);margin:60px 0 .5rem .5rem;padding-left:.5rem;padding-right:.5rem;display:flex}.keywords-overview-header-row{justify-content:space-between;display:flex}.shortcuts{flex:1;max-width:320px;margin:0;padding-left:0;font-size:.9em;list-style:none;overflow:auto}.shortcuts.keyword-wall{flex:unset}.shortcuts a{white-space:nowrap;color:var(--text-color);padding:.5rem;text-decoration:none;display:block}.shortcuts a:hover{background:var(--light-background-color)}.shortcuts a:first-letter{letter-spacing:.1em;font-weight:700}.shortcuts.keyword-wall a{padding:0 .5rem .5rem 0}.shortcuts.keyword-wall a:after{content:\"·\";padding-left:.5rem}.enum-type-members,.dt-usages-list{padding-left:1em;list-style:none}.dt-usages-list>li{margin-bottom:.2em}.dt-usages a{color:var(--text-color);font-size:.9em;text-decoration:none;display:inline-block}.dt-usages a:first-letter{letter-spacing:.1em;font-weight:700}.arguments-list-container{margin-bottom:1.33rem;overflow-y:auto}.arguments-list{display:-ms-inline-grid;-ms-grid-columns:1fr 1fr 1fr;grid-template-columns:auto auto auto;row-gap:3px;display:inline-grid}.typed-dict-annotation>span,.enum-type-members span,.arguments-list .arg-name{-ms-grid-column:1;white-space:nowrap;border-radius:3px;grid-column:1;justify-self:start;padding-left:.5rem;padding-right:.5rem}.arguments-list .arg-default-container{-ms-grid-column:2;grid-column:2;display:flex}.optional-key{font-style:italic}.arguments-list .arg-default-eq{background:var(--background-color);margin-left:2rem;margin-right:.5rem}.arguments-list .arg-default-value{border-radius:3px;padding-left:.5rem;padding-right:.5rem}.arguments-list .base-arg-data{min-width:150px;display:flex}.arguments-list .arg-type,.return-type .arg-type{-ms-grid-column:3;background:var(--background-color);white-space:nowrap;-webkit-text-size-adjust:none;grid-column:3;margin-left:2rem}.tags .kw-tags{margin-left:2rem;display:flex}.tag-link{cursor:pointer}.tag-link:hover{text-decoration:underline}.arguments-list .arg-kind{color:#0000;text-shadow:0 0 0 var(--less-important-text-color);padding:0;font-size:.8em}@media only screen and (width>=900px){.libdoc-details{z-index:1;background:var(--background-color)}#toggle-keyword-shortcuts{border:1px solid var(--border-color);border-radius:3px;margin-top:3px;margin-bottom:3px}#toggle-keyword-shortcuts:hover{background:var(--light-background-color)}.shortcuts.keyword-wall{flex-wrap:wrap;width:320px;max-width:none;display:flex}}@media only screen and (width>=1200px){.shortcuts.keyword-wall{width:640px}}@media only screen and (width<=899px){.libdoc-overview,#toggle-keyword-shortcuts{display:none}.libdoc-title{border-bottom:1px solid var(--border-color);background:#fff;background:var(--background-color);width:100%;margin:0;padding:.5rem}.libdoc-title>svg{margin-right:60px}.libdoc-details{padding-left:.5rem}input.hamburger-menu,.hamburger-menu{display:block}.hamburger-menu:checked~.libdoc-overview{width:100%;height:100vh;display:block;position:fixed}.keywords-overview{border:none;margin:60px 0 0}.shortcuts{overscroll-behavior:none;max-width:100vw}}.metadata{margin-top:.5rem}.metadata th{text-align:left;padding-right:1em}a.name,span.name{font-style:italic}.libdoc-details a img{border:1px solid #c30!important}a:hover,a:active{color:var(--text-color);text-decoration:underline}a:hover{text-decoration:underline!important}.normal-first-letter:first-letter{letter-spacing:0!important;font-weight:400!important}.shortcut-list-toggle,.tag-list-toggle{margin-bottom:1em;font-size:.9em}input.switch{display:none}.slider{background-color:var(--border-color);width:36px;height:18px;display:inline-block;position:relative;top:5px}.slider:before{background-color:var(--background-color);content:\"\";width:12px;height:12px;position:absolute;top:3px;left:3px}input.switch:checked+.slider:before{background-color:var(--background-color);left:21px}.keywords{flex-direction:column;display:flex}.kw-overview{flex-direction:column;justify-content:start;display:flex}@media only screen and (width>=899px){.kw-overview{max-width:850px;margin-right:1.5rem}}.kw-docs{flex-direction:column;display:flex;overflow-y:auto}.dt-name:link,.kw-name:link,.dt-name:visited,.kw-name:visited{color:var(--text-color);text-decoration:none}.kw{align-items:baseline;min-width:250px;display:flex}h4{margin-right:.5rem}.keyword-container{border:1px solid var(--border-color);border-radius:3px;flex-direction:column;margin-bottom:.5rem;padding:.5rem 1rem;scroll-margin-top:60px;display:flex}.keyword-container:target{box-shadow:0 0 4px var(--robot-highlight)}.data-type-content,.keyword-content{flex-direction:column;display:flex}.data-type-container{border-top:1px solid var(--border-color);flex-direction:column;margin-bottom:.5rem;padding:.5rem 1rem;scroll-margin-top:60px;display:flex}.kw-row{border:1px solid var(--border-color);border-radius:3px;flex-direction:column;justify-content:start;margin-bottom:.5rem;padding:.5rem 1rem;text-decoration:none;display:flex}.kw a{color:inherit;font-weight:700;text-decoration:none}.args{min-width:200px}.enum-type-members span,.args span,.return-type span,.args a{background:var(--light-background-color);padding:0 .1em;font-family:monospace;font-size:1.1em}.arg-type,span.type,a.type{background:0 0;padding:0;font-size:1em}.typed-dict-item .td-type:after{content:\",\"}.typed-dict-item .td-type:nth-last-child(2):after{content:\"\"}.td-item:before{content:\"  \";white-space:pre}.typed-dict-item{background:var(--light-background-color);padding:.4rem;font-family:monospace;font-size:1.1em;display:block}.args span .highlight{background:var(--highlighted-background-color);color:var(--highlighted-color)}.tags,.return-type{align-items:baseline;display:flex}.tags a{color:inherit;padding:0 .1em;text-decoration:none}.footer{font-size:.9em}.doc div>:last-child{margin-bottom:0}.highlight{background:var(--highlighted-background-color);color:var(--highlighted-color)}.data-type{font-style:italic}.no-match{color:var(--less-important-text-color)!important}.no-match .dt-name,.no-match .kw-name{color:var(--less-important-text-color)}.modal-icon{cursor:pointer;background:url(\"data:image/svg+xml;utf8,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" height=\\\"100%\\\" width=\\\"100%\\\"><path stroke=\\\"black\\\" fill=\\\"none\\\" stroke-width=\\\"2px\\\" stroke-linecap=\\\"round\\\" d=\\\"M1 8 L1 1 L8 1 M16 1 L23 1 L23 8 M23 16 L23 23 L16 23 M8 23 L1 23 L1 16\\\"></path><path fill=\\\"black\\\" stroke=\\\"none\\\" stroke-width=\\\"1px\\\" transform=\\\"scale(1.3) translate(-3 -2.5)\\\" d=\\\"M19 7.97zm-8 9.2-4-2.3v-4.63l4 2.33v4.6zm1-6.33L8.04 8.53 12 6.25l3.96 2.28L12 10.84zm5 4.03-4 2.3v-4.6l4-2.33v4.63z\\\"></path></svg>\");border:none;width:1rem;height:1rem;margin:0 .25rem;padding:0;font-size:12px;font-weight:600}@media (prefers-color-scheme:dark){.modal-icon{background:url(\"data:image/svg+xml;utf8,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" height=\\\"100%\\\" width=\\\"100%\\\"><path stroke=\\\"%23e2e1d7\\\" fill=\\\"none\\\" stroke-width=\\\"2px\\\" stroke-linecap=\\\"round\\\" d=\\\"M1 8 L1 1 L8 1 M16 1 L23 1 L23 8 M23 16 L23 23 L16 23 M8 23 L1 23 L1 16\\\"></path><path fill=\\\"%23e2e1d7\\\" stroke=\\\"none\\\" stroke-width=\\\"1px\\\" transform=\\\"scale(1.3) translate(-3 -2.5)\\\" d=\\\"M19 7.97zm-8 9.2-4-2.3v-4.63l4 2.33v4.6zm1-6.33L8.04 8.53 12 6.25l3.96 2.28L12 10.84zm5 4.03-4 2.3v-4.6l4-2.33v4.63z\\\"></path></svg>\")}}.modal-background,.modal{opacity:0;pointer-events:none;transition:opacity .2s}.modal-background{z-index:1;background-color:#000000b3;position:fixed;inset:0}.modal{background-color:var(--background-color);border:1px solid var(--border-color);z-index:2;border-radius:3px;flex-flow:column;width:720px;max-width:calc(100vw - 2rem);height:calc(100vh - 6rem);margin:0 auto;transition-delay:.1s;display:flex;overflow:auto}.modal-content{margin-bottom:3rem}.modal>.modal-content>.data-type-container{border-top:none}.modal-close-button-wrapper{justify-content:flex-end;display:flex}.modal-close-button-container{width:720px;max-width:calc(100vw - 2rem);margin:0 auto;overflow:auto}.modal-close-button{border:1px solid var(--border-color);cursor:pointer;border-radius:3px;margin:.5rem 0;padding:.25rem .5rem}.modal-background.visible,.modal.visible{opacity:1;pointer-events:all}#data-types-container,.hidden{display:none}</style>\n    <style>#introduction-container>h2,.doc>h1,.doc>h2,.section>h1,.section>h2{margin-top:4rem;margin-bottom:1rem}.doc>h3,.section>h3{margin-top:3rem;margin-bottom:1rem}.doc>h4,.section>h4{margin-top:2rem;margin-bottom:1rem}.doc>p,.section>p{margin-top:1rem;margin-bottom:.5rem}.doc>:first-child{margin-top:.1em}.doc table{border-collapse:collapse;empty-cells:show;background:0 0;border:none;font-size:.9em;display:block;overflow-y:auto}.doc table th,.doc table td{border:1px solid var(--border-color);background:0 0;height:1.2em;padding:.1em .3em}.doc table th{text-align:center;letter-spacing:.1em}.doc pre{letter-spacing:.05em;background:var(--light-background-color);border-radius:3px;padding:.3rem;font-size:1.1em;overflow-y:auto}.kwdoc pre{margin-left:-90px}.doc code,.docutils.literal{letter-spacing:.05em;background:var(--light-background-color);border-radius:3px;padding:1px;font-size:1.1em}.doc li{list-style-type:square;list-style-position:inside}.doc img{border:1px solid #ccc}.doc hr{background:#ccc;border:0;height:1px}</style>\n    <style>.code .hll{background-color:#ffc}.code{background:#f8f8f8}.code .c{color:#408080;font-style:italic}.code .err{border:1px solid red}.code .k{color:green;font-weight:700}.code .o{color:#666}.code .ch,.code .cm{color:#408080;font-style:italic}.code .cp{color:#bc7a00}.code .cpf,.code .c1,.code .cs{color:#408080;font-style:italic}.code .gd{color:#a00000}.code .ge{font-style:italic}.code .gr{color:red}.code .gh{color:navy;font-weight:700}.code .gi{color:#00a000}.code .go{color:#888}.code .gp{color:navy;font-weight:700}.code .gs{font-weight:700}.code .gu{color:purple;font-weight:700}.code .gt{color:#04d}.code .kc,.code .kd,.code .kn{color:green;font-weight:700}.code .kp{color:green}.code .kr{color:green;font-weight:700}.code .kt{color:#b00040}.code .m{color:#666}.code .s{color:#ba2121}.code .na{color:#7d9029}.code .nb{color:green}.code .nc{color:#00f;font-weight:700}.code .no{color:#800}.code .nd{color:#a2f}.code .ni{color:#999;font-weight:700}.code .ne{color:#d2413a;font-weight:700}.code .nf{color:#00f}.code .nl{color:#a0a000}.code .nn{color:#00f;font-weight:700}.code .nt{color:green;font-weight:700}.code .nv{color:#19177c}.code .ow{color:#a2f;font-weight:700}.code .w{color:#bbb}.code .mb,.code .mf,.code .mh,.code .mi,.code .mo{color:#666}.code .sa,.code .sb,.code .sc,.code .dl{color:#ba2121}.code .sd{color:#ba2121;font-style:italic}.code .s2{color:#ba2121}.code .se{color:#b62;font-weight:700}.code .sh{color:#ba2121}.code .si{color:#b68;font-weight:700}.code .sx{color:green}.code .sr{color:#b68}.code .s1{color:#ba2121}.code .ss{color:#19177c}.code .bp{color:green}.code .fm{color:#00f}.code .vc,.code .vg,.code .vi,.code .vm{color:#19177c}.code .il{color:#666}@media (prefers-color-scheme:dark){.code .hll{background-color:#073642}.code{color:#839496;background:#002b36}.code .c{color:#586e75;font-style:italic}.code .err{color:#839496;background-color:#dc322f}.code .esc,.code .g{color:#839496}.code .k{color:#859900}.code .l,.code .n{color:#839496}.code .o{color:#586e75}.code .x,.code .p{color:#839496}.code .ch,.code .cm{color:#586e75;font-style:italic}.code .cp{color:#d33682}.code .cpf{color:#586e75}.code .c1,.code .cs{color:#586e75;font-style:italic}.code .gd{color:#dc322f}.code .ge{color:#839496;font-style:italic}.code .gr{color:#dc322f}.code .gh{color:#839496;font-weight:700}.code .gi{color:#859900}.code .go,.code .gp{color:#839496}.code .gs{color:#839496;font-weight:700}.code .gu{color:#839496;text-decoration:underline}.code .gt{color:#268bd2}.code .kc,.code .kd{color:#2aa198}.code .kn{color:#cb4b16}.code .kp,.code .kr{color:#859900}.code .kt{color:#b58900}.code .ld{color:#839496}.code .m,.code .s{color:#2aa198}.code .na{color:#839496}.code .nb,.code .nc,.code .no,.code .nd,.code .ni,.code .ne,.code .nf,.code .nl,.code .nn{color:#268bd2}.code .nx,.code .py{color:#839496}.code .nt,.code .nv{color:#268bd2}.code .ow{color:#859900}.code .w{color:#839496}.code .mb,.code .mf,.code .mh,.code .mi,.code .mo,.code .sa,.code .sb,.code .sc,.code .dl{color:#2aa198}.code .sd{color:#586e75}.code .s2,.code .se,.code .sh,.code .si,.code .sx{color:#2aa198}.code .sr{color:#cb4b16}.code .s1,.code .ss{color:#2aa198}.code .bp,.code .fm,.code .vc,.code .vg,.code .vi,.code .vm{color:#268bd2}.code .il{color:#2aa198}}</style>\n    <style media=\"print\">body{margin:0;padding:0;font-size:8pt}a{text-decoration:none}#search,#open-search{display:none}</style>\n\n    <div id=\"root\"></div>\n    <script type=\"text/x-handlebars-template\" id=\"base-template\">\n      <div class=\"base-container\">\n        <div id=\"language-container\">\n        </div>\n        <input\n          id=\"hamburger-menu-input\"\n          class=\"hamburger-menu\"\n          type=\"checkbox\"\n        />\n        <span class=\"hamburger-menu hamburger-menu-1\"></span>\n        <span class=\"hamburger-menu hamburger-menu-2\"></span>\n        <span class=\"hamburger-menu hamburger-menu-3\"></span>\n        <div class=\"libdoc-overview\"><div id=\"shortcuts-container\"></div></div>\n        <div class=\"libdoc-details\">\n          <table class=\"metadata\">\n            {{#if version}}<tr><th>{{t \"libVersion\"}}:</th><td\n                >{{version}}</td></tr>{{/if}}\n            {{#if scope}}<tr><th>{{t \"libScope\"}}:</th><td\n                >{{scope}}</td></tr>{{/if}}\n          </table>\n          <div id=\"introduction-container\">\n            <h2 id=\"introduction\">{{t \"intro\"}}</h2>\n            <div class=\"doc\">{{{doc}}}</div>\n          </div>\n          <div id=\"importing-container\"></div>\n          <div id=\"keywords-container\"></div>\n          <div id=\"data-types-container\"></div>\n          <div id=\"footer-container\"></div>\n        </div>\n        <a class=\"libdoc-title\" href=\"#library-documentation-top\">\n          <h1>{{name}}</h1>\n          <svg\n            xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n            xmlns:cc=\"http://creativecommons.org/ns#\"\n            xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n            xmlns:svg=\"http://www.w3.org/2000/svg\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n            viewBox=\"0 0 202.4325 202.34125\"\n            height=\"42\"\n            width=\"42\"\n            xml:space=\"preserve\"\n            version=\"1.1\"\n          ><metadata id=\"metadata8\"><rdf:RDF><cc:Work rdf:about=\"\"><dc:format\n                  >image/svg+xml</dc:format><dc:type\n                    rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"\n                  /></cc:Work></rdf:RDF></metadata><defs id=\"defs6\"><clipPath\n                id=\"clipPath16\"\n                clipPathUnits=\"userSpaceOnUse\"\n              ><path\n                  id=\"path18\"\n                  d=\"m 0,161.873 161.946,0 L 161.946,0 0,0 0,161.873 Z\"\n                /></clipPath></defs><g\n              transform=\"matrix(1.25,0,0,-1.25,0,202.34125)\"\n              id=\"g10\"\n            ><g id=\"g12\"><g clip-path=\"url(#clipPath16)\" id=\"g14\"><g\n                    transform=\"translate(52.4477,88.1268)\"\n                    id=\"g20\"\n                  ><path\n                      id=\"robot-svg-path\"\n                      d=\"m 0,0 c 0,7.6 6.179,13.779 13.77,13.779 7.6,0 13.779,-6.179 13.779,-13.779 0,-2.769 -2.238,-5.007 -4.998,-5.007 -2.761,0 -4.999,2.238 -4.999,5.007 0,2.078 -1.695,3.765 -3.782,3.765 C 11.693,3.765 9.997,2.078 9.997,0 9.997,-2.769 7.76,-5.007 4.999,-5.007 2.238,-5.007 0,-2.769 0,0 m 57.05,-23.153 c 0,-2.771 -2.237,-5.007 -4.998,-5.007 l -46.378,0 c -2.761,0 -4.999,2.236 -4.999,5.007 0,2.769 2.238,5.007 4.999,5.007 l 46.378,0 c 2.761,0 4.998,-2.238 4.998,-5.007 M 35.379,-2.805 c -1.545,2.291 -0.941,5.398 1.35,6.943 l 11.594,7.83 c 2.273,1.58 5.398,0.941 6.943,-1.332 1.545,-2.29 0.941,-5.398 -1.35,-6.943 l -11.594,-7.83 c -0.852,-0.586 -1.829,-0.87 -2.788,-0.87 -1.607,0 -3.187,0.781 -4.155,2.202 m 31.748,-30.786 c 0,-0.945 -0.376,-1.852 -1.045,-2.522 l -8.617,-8.617 c -0.669,-0.668 -1.576,-1.045 -2.523,-1.045 l -52.833,0 c -0.947,0 -1.854,0.377 -2.523,1.045 l -8.617,8.617 c -0.669,0.67 -1.045,1.577 -1.045,2.522 l 0,52.799 c 0,0.947 0.376,1.854 1.045,2.522 l 8.617,8.619 c 0.669,0.668 1.576,1.044 2.523,1.044 l 52.833,0 c 0.947,0 1.854,-0.376 2.523,-1.044 l 8.617,-8.619 c 0.669,-0.668 1.045,-1.575 1.045,-2.522 l 0,-52.799 z m 7.334,61.086 -11.25,11.25 c -1.705,1.705 -4.018,2.663 -6.428,2.663 l -56.523,0 c -2.412,0 -4.725,-0.959 -6.43,-2.665 L -17.412,27.494 c -1.704,-1.705 -2.661,-4.016 -2.661,-6.427 l 0,-56.515 c 0,-2.411 0.958,-4.725 2.663,-6.428 l 11.25,-11.25 c 1.705,-1.705 4.017,-2.662 6.428,-2.662 l 56.515,0 c 2.41,0 4.723,0.957 6.428,2.662 l 11.25,11.25 c 1.705,1.703 2.663,4.017 2.663,6.428 l 0,56.514 c 0,2.412 -0.958,4.724 -2.663,6.429\"\n                    /></g></g></g></g></svg>\n        </a>\n      </div>\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"language-template\">\n      <button title=\"{{t 'chooseLanguage'}}\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 420 420\">\n        <path stroke-width=\"26\"\n              d=\"M209,15a195,195 0 1,0 2,0z\"/>\n        <path stroke-width=\"18\"\n              d=\"m210,15v390m195-195H15M59,90a260,260 0 0,0 302,0 m0,240 a260,260 0 0,0-302,0M195,20a250,250 0 0,0 0,382 m30,0 a250,250 0 0,0 0-382\"/>\n      </svg>\n      </button>\n      <ul class=\"hidden\">\n        {{#each languages}}\n          <li class=\"{{#ifEquals this selected}}selected{{/ifEquals}}\"><a>{{this}}</a></li>\n        {{/each}}\n      </ul>\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"importing-template\">\n      <h2 id=\"Importing\">{{t \"importing\"}}</h2>\n      <div class=\"keywords\">\n          {{#each inits}}\n          <div class=\"kw-row\">\n            <div class=\"kw-overview\">\n            {{#if this.args.length}}\n                <div class=\"args\">\n                  <h4>{{t \"arguments\"}}</h4>\n                  <div class=\"arguments-list-container\">\n                    <div class=\"arguments-list\">\n                    {{#each this.args}}\n                      {{> arg }}\n                    {{/each}}\n                    </div>\n                  </div>\n                </div>\n            {{/if}}\n            {{#if this.doc}}\n              <div class=\"kw-docs\">\n                <h4>{{t \"doc\"}}</h4>\n                <div class=\"kwdoc doc\">{{{this.doc}}}</div>\n              </div>\n            {{/if}}\n          </div>\n          {{/each}}\n      </div>\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"shortcuts-template\">\n      <div class=\"keywords-overview\">\n        <div class=\"keyword-search-box\">\n          <input\n            placeholder=\"{{t 'search'}}\"\n            type=\"text\"\n            class=\"search-input\"\n          />\n          <button class=\"clear-search\">&#10005;</button>\n        </div>\n        {{#if tags.length}}\n          <select id=\"tags-shortcuts-container\">\n          </select>\n        {{/if}}\n        <div class=\"keywords-overview-header-row\">\n          <h4>{{t \"keywords\"}}\n            (<span id=\"keyword-statistics-header\"></span>)\n          </h4>\n          <button id=\"toggle-keyword-shortcuts\">+</button>\n        </div>\n        <ul class=\"shortcuts\" id=\"keyword-shortcuts-container\">\n        </ul>\n      </div>\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"keyword-shortcuts-template\">\n      {{#each keywords}}\n        {{#unless this.hidden}}\n          <li>\n            <a\n              href=\"#{{encodeURIComponent this.name}}\"\n              class=\"match\"\n              title=\"{{value.shortdoc}}\"\n            >{{this.name}}</a>\n          </li>\n        {{/unless}}\n      {{/each}}\n      {{#each keywords}}\n        {{#if this.hidden}}\n          <li>\n            <a\n              href=\"#{{encodeURIComponent this.name}}\"\n              class=\"no-match\"\n              title=\"{{value.shortdoc}}\"\n            >{{this.name}}</a>\n          </li>\n        {{/if}}\n      {{/each}}\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"keywords-template\">\n      <h2 id=\"Keywords\">{{t \"keywords\"}}</h2>\n      <div class=\"keywords\">\n          {{#each keywords}}\n          {{#unless this.hidden}}\n          {{>keyword this}}\n          {{/unless}}\n          {{/each}}\n          {{#each keywords}}\n          {{#if this.hidden}}\n          {{>keyword this}}\n          {{/if}}\n          {{/each}}\n      </div>\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"keyword-template\">\n      <div class=\"keyword-container {{#if hidden}}no-{{/if}}match\" id=\"{{name}}\">\n         <div class=\"keyword-name\">\n              <h2>\n              <a class=\"kw-name\" href=\"#{{encodeURIComponent name}}\"\n                 title=\"{{t 'kwLink'}}\">{{name}}</a>\n              </h2>\n         </div>\n         <div class=\"keyword-content\">\n            <div class=\"kw-overview\">\n              {{#if args.length}}\n                <div class=\"args\">\n                  <h4>{{t \"arguments\"}}</h4>\n                  <div class=\"arguments-list-container\">\n                    <div class=\"arguments-list\">\n                    {{#each args}}\n                      {{> arg this}}\n                    {{/each}}\n                    </div>\n                  </div>\n                </div>\n              {{/if}}\n              {{#if returnType}}\n              <div class=\"return-type\">\n                <h4>{{t \"returnType\"}}</h4>\n                <span class=\"arg-type\">\n                {{>typeInfo returnType}}\n                </span>\n              </div>\n              {{/if}}\n            </div>\n            {{#if tags.length}}\n            <div class=\"tags\">\n              <h4>{{t \"tags\"}}</h4>\n              <span class=\"kw-tags\">\n              {{#each tags}}\n                <span class=\"tag-link\"\n                  title=\"Show keywords with this tag\">{{this}}</span>{{#unless @last}},<br>{{/unless}}\n              {{/each}}\n              </span>\n            </div>\n          {{/if}}\n        </div>\n            {{#if doc}}\n              <div class=\"kw-docs\">\n                <h4>{{t \"doc\"}}</h4>\n                <div class=\"kwdoc doc\">{{{doc}}}</div>\n              </div>\n            {{/if}}\n         </div>\n      </div>\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"argument-template\">\n          <span class=\"arg-name {{#if required}}arg-required{{else}}arg-optional{{/if}}\" title=\"{{t 'argName'}}\">\n          {{#ifEquals kind \"VAR_POSITIONAL\"}}<span class=\"arg-kind\" title=\"{{t 'varArgs'}}\">*</span>{{/ifEquals}}\n          {{#ifEquals kind \"VAR_NAMED\"}}<span class=\"arg-kind\" title=\"{{t 'varNamedArgs'}}\">**</span>{{/ifEquals}}\n          {{#ifEquals kind \"NAMED_ONLY\"}}<span class=\"arg-kind\" title=\"{{t 'namedOnlyArg'}}\">&#x1F3F7;</span>{{/ifEquals}}\n          {{#ifEquals kind \"POSITIONAL_ONLY\"}}<span class=\"arg-kind\" title=\"{{t 'posOnlyArg'}}\">&#x27F6;</span>{{/ifEquals}}\n          {{name}}\n          </span>\n        {{#ifNotNull defaultValue}}\n        <div class=\"arg-default-container\">\n          <span class=\"arg-default-eq\">=</span>\n          <span class=\"arg-default-value\" title=\"{{t 'defaultTitle'}}\">{{defaultValue}}</span>\n        </div>\n      {{/ifNotNull}}\n\n      {{#if type}}\n        <span class=\"arg-type\">\n            {{> typeInfo type}}\n        </span>\n      {{/if}}\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"tags-shortcuts-template\">\n      <option value=\"\" {{#ifEquals selectedTag \"\"}}selected{{/ifEquals}}>- Show all tags -</option>\n      {{#each tags}}\n        <option {{#ifEquals ../selectedTag this}}selected{{/ifEquals}}>{{this}}\n        </option>\n      {{/each}}\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"type-info-template\">\n      {{~#if union}}\n        {{#each nested}}\n          {{> typeInfo this}}\n          {{#unless @last}}|{{/unless}}\n        {{/each}}\n      {{else~}}\n        {{#if typedoc~}}\n          <a style=\"cursor: pointer;\" class=\"type\" data-typedoc={{typedoc}} title=\"{{t 'typeInfoDialog'}}\">{{name}}</a>\n        {{~else}}\n          <span class=\"type\">{{name}}</span>\n        {{/if}}\n        {{#if nested.length}}\n        [\n        {{~#each nested}}\n            {{~> typeInfo this}}\n            {{~#unless @last}},&nbsp;{{/unless}}\n          {{~/each~}}\n          ]\n        {{/if~}}\n      {{~/if~}}\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"data-types-template\">\n      {{#if typedocs.length}}\n        <h2 id=\"Data types\">{{t \"dataTypes\"}}</h2>\n        <div class=\"data-types\">\n          {{#each typedocs}}\n            {{> dataType this}}\n          {{/each}}\n        </div>\n      {{/if}}\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"data-type-template\">\n      <div class=\"data-type-container {{#if hidden}}no-{{/if}}match\" id=\"type-modal-{{name}}\">\n         <div class=\"data-type-name\">\n              <h2>{{name}} ({{type}})</h2>\n         </div>\n         <div class=\"data-type-content\">\n            {{#if doc}}\n              <div class=\"dt-docs\">\n                <h4>{{t \"doc\"}}</h4>\n                <div class=\"dtdoc doc\">{{{doc}}}</div>\n              </div>\n            {{/if}}\n            {{#if members}}\n              <div class=\"dt-members\">\n                <h4>{{t \"allowedValues\"}}</h4>\n                <ul class=\"enum-type-members\">\n                  {{#each members}}\n                  <li>\n                    <span class=\"enum-member\">{{this.name}}</span>\n                    {{#ifContains ../accepts \"integer\"}}\n                      &nbsp; (<span class=\"enum-member\">{{value.value}}</span>)\n                    {{/ifContains}}\n                  </li>\n                  {{/each}}\n                </ul>\n              </div>\n            {{else}}\n              {{# if items}}\n              <div class=\"dt-items\">\n                <h4>{{t \"dictStructure\"}}</h4>\n                  <div class=\"typed-dict-annotation\">\n                  <span class=\"typed-dict-item\">\n                    {\n                      {{#each items}}<br><span\n                    {{#if required}}\n                      class=\"td-item {{#if required}}required-key{{else}}optional-key{{/if}}\"\n                      title=\"{{#if required}}required-key{{else}}optional-key{{/if}}\"\n                    {{else}}\n                      class=\"td-item\"\n                    {{/if}}\n                   >'${key}': </span>\n                     <span class=\"td-type\">&lt;${type}&gt;</span>\n                     {{/each}}<br>\n                    }</span>\n                  </div>\n              </div>\n              {{/if}}\n            {{/if}}\n            {{#if accepts.length}}\n              <div class=\"dt-docs\">\n                <h4>{{t \"convertedTypes\"}}</h4>\n                <ul class=\"dt-usages-list\">\n                {{#each accepts}}\n                  <li>{{this}}</li>\n                {{/each}}\n                </ul>\n              </div>\n            {{/if}}\n            {{#if usages.length}}\n              <div class=\"dt-usages\">\n                <h4>{{t \"usages\"}}</h4>\n                <ul class=\"dt-usages-list\">\n                  {{#each usages}}\n                    <li><a href=\"#{{encodeURIComponent this}}\">{{this}}</a></li>\n                  {{/each}}\n                </ul>\n              </div>\n            {{/if}}\n         </div>\n      </div>\n    </script>\n    <script type=\"text/x-handlebars-template\" id=\"footer-template\">\n      <p class=\"footer\">\n        {{t \"generatedBy\"}}\n        <a\n          href=\"http://robotframework.org/robotframework/#built-in-tools\"\n        >Libdoc</a>\n        {{t \"on\"}}\n        {{generated}}.\n      </p>\n    </script>\n    <script type=\"module\">let e;function t(e,t,r,n){Object.defineProperty(e,t,{get:r,set:n,enumerable:!0,configurable:!0})}function r(e){return e&&e.__esModule?e.default:e}var n,o,i,a,s,l,c,u,h,p,d,f,g,m,v,y,_,k,S,b,w,E,x,C,P,L,A,O,I,N,M,T,R,B,D,j,$,H,F,V,q,U,K,G,W,J,z,X,Y,Z,Q,ee,et,er,en,eo,ei,ea,es,el,ec,eu,eh,ep,ed,ef=globalThis,eg={},em={},ev=ef.parcelRequirefba8;null==ev&&((ev=function(e){if(e in eg)return eg[e].exports;if(e in em){var t=em[e];delete em[e];var r={id:e,exports:{}};return eg[e]=r,t.call(r.exports,r,r.exports),r.exports}var n=Error(\"Cannot find module '\"+e+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}).register=function(e,t){em[e]=t},ef.parcelRequirefba8=ev);var ey=ev.register;ey(\"ieWO2\",function(e,r){var n,o,i;t(e.exports,\"SourceMapGenerator\",()=>n,e=>n=e),t(e.exports,\"SourceMapConsumer\",()=>o,e=>o=e),t(e.exports,\"SourceNode\",()=>i,e=>i=e),n=ev(\"i8dtv\").SourceMapGenerator,o=ev(\"3DjxD\").SourceMapConsumer,i=ev(\"76tK5\").SourceNode}),ey(\"i8dtv\",function(e,r){t(e.exports,\"SourceMapGenerator\",()=>n,e=>n=e);var n,o=ev(\"jTqXJ\"),i=ev(\"hvjlv\"),a=ev(\"7Tyww\").ArraySet,s=ev(\"je4qX\").MappingList;function l(e){e||(e={}),this._file=i.getArg(e,\"file\",null),this._sourceRoot=i.getArg(e,\"sourceRoot\",null),this._skipValidation=i.getArg(e,\"skipValidation\",!1),this._sources=new a,this._names=new a,this._mappings=new s,this._sourcesContents=null}l.prototype._version=3,l.fromSourceMap=function(e){var t=e.sourceRoot,r=new l({file:e.file,sourceRoot:t});return e.eachMapping(function(e){var n={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(n.source=e.source,null!=t&&(n.source=i.relative(t,n.source)),n.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(n.name=e.name)),r.addMapping(n)}),e.sources.forEach(function(n){var o=n;null!==t&&(o=i.relative(t,n)),r._sources.has(o)||r._sources.add(o);var a=e.sourceContentFor(n);null!=a&&r.setSourceContent(n,a)}),r},l.prototype.addMapping=function(e){var t=i.getArg(e,\"generated\"),r=i.getArg(e,\"original\",null),n=i.getArg(e,\"source\",null),o=i.getArg(e,\"name\",null);this._skipValidation||this._validateMapping(t,r,n,o),null==n||(n=String(n),this._sources.has(n)||this._sources.add(n)),null==o||(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:t.line,generatedColumn:t.column,originalLine:null!=r&&r.line,originalColumn:null!=r&&r.column,source:n,name:o})},l.prototype.setSourceContent=function(e,t){var r=e;null!=this._sourceRoot&&(r=i.relative(this._sourceRoot,r)),null!=t?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[i.toSetString(r)]=t):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(r)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},l.prototype.applySourceMap=function(e,t,r){var n=t;if(null==t){if(null==e.file)throw Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\\'s \"file\" property. Both were omitted.');n=e.file}var o=this._sourceRoot;null!=o&&(n=i.relative(o,n));var s=new a,l=new a;this._mappings.unsortedForEach(function(t){if(t.source===n&&null!=t.originalLine){var a=e.originalPositionFor({line:t.originalLine,column:t.originalColumn});null!=a.source&&(t.source=a.source,null!=r&&(t.source=i.join(r,t.source)),null!=o&&(t.source=i.relative(o,t.source)),t.originalLine=a.line,t.originalColumn=a.column,null!=a.name&&(t.name=a.name))}var c=t.source;null==c||s.has(c)||s.add(c);var u=t.name;null==u||l.has(u)||l.add(u)},this),this._sources=s,this._names=l,e.sources.forEach(function(t){var n=e.sourceContentFor(t);null!=n&&(null!=r&&(t=i.join(r,t)),null!=o&&(t=i.relative(o,t)),this.setSourceContent(t,n))},this)},l.prototype._validateMapping=function(e,t,r,n){if(t&&\"number\"!=typeof t.line&&\"number\"!=typeof t.column)throw Error(\"original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.\");if((!e||!(\"line\"in e)||!(\"column\"in e)||!(e.line>0)||!(e.column>=0)||t||r||n)&&(!e||!(\"line\"in e)||!(\"column\"in e)||!t||!(\"line\"in t)||!(\"column\"in t)||!(e.line>0)||!(e.column>=0)||!(t.line>0)||!(t.column>=0)||!r))throw Error(\"Invalid mapping: \"+JSON.stringify({generated:e,source:r,original:t,name:n}))},l.prototype._serializeMappings=function(){for(var e,t,r,n,a=0,s=1,l=0,c=0,u=0,h=0,p=\"\",d=this._mappings.toArray(),f=0,g=d.length;f<g;f++){if(t=d[f],e=\"\",t.generatedLine!==s)for(a=0;t.generatedLine!==s;)e+=\";\",s++;else if(f>0){if(!i.compareByGeneratedPositionsInflated(t,d[f-1]))continue;e+=\",\"}e+=o.encode(t.generatedColumn-a),a=t.generatedColumn,null!=t.source&&(n=this._sources.indexOf(t.source),e+=o.encode(n-h),h=n,e+=o.encode(t.originalLine-1-c),c=t.originalLine-1,e+=o.encode(t.originalColumn-l),l=t.originalColumn,null!=t.name&&(r=this._names.indexOf(t.name),e+=o.encode(r-u),u=r)),p+=e}return p},l.prototype._generateSourcesContent=function(e,t){return e.map(function(e){if(!this._sourcesContents)return null;null!=t&&(e=i.relative(t,e));var r=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,r)?this._sourcesContents[r]:null},this)},l.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},l.prototype.toString=function(){return JSON.stringify(this.toJSON())},n=l}),ey(\"jTqXJ\",function(e,r){t(e.exports,\"encode\",()=>n,e=>n=e),t(e.exports,\"decode\",()=>o,e=>o=e);var n,o,i=ev(\"Q1Wfs\");n=function(e){var t,r=\"\",n=e<0?(-e<<1)+1:(e<<1)+0;do t=31&n,(n>>>=5)>0&&(t|=32),r+=i.encode(t);while(n>0)return r},o=function(e,t,r){var n,o,a,s,l=e.length,c=0,u=0;do{if(t>=l)throw Error(\"Expected more digits in base 64 VLQ value.\");if(-1===(s=i.decode(e.charCodeAt(t++))))throw Error(\"Invalid base64 digit: \"+e.charAt(t-1));a=!!(32&s),s&=31,c+=s<<u,u+=5}while(a)r.value=(o=(n=c)>>1,(1&n)==1?-o:o),r.rest=t}}),ey(\"Q1Wfs\",function(e,r){t(e.exports,\"encode\",()=>n,e=>n=e),t(e.exports,\"decode\",()=>o,e=>o=e);var n,o,i=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");n=function(e){if(0<=e&&e<i.length)return i[e];throw TypeError(\"Must be between 0 and 63: \"+e)},o=function(e){return 65<=e&&e<=90?e-65:97<=e&&e<=122?e-97+26:48<=e&&e<=57?e-48+52:43==e?62:47==e?63:-1}}),ey(\"hvjlv\",function(e,r){t(e.exports,\"getArg\",()=>n,e=>n=e),t(e.exports,\"urlParse\",()=>o,e=>o=e),t(e.exports,\"isAbsolute\",()=>s,e=>s=e),t(e.exports,\"normalize\",()=>i,e=>i=e),t(e.exports,\"join\",()=>a,e=>a=e),t(e.exports,\"relative\",()=>l,e=>l=e),t(e.exports,\"toSetString\",()=>c,e=>c=e),t(e.exports,\"fromSetString\",()=>u,e=>u=e),t(e.exports,\"compareByOriginalPositions\",()=>h,e=>h=e),t(e.exports,\"compareByGeneratedPositionsDeflated\",()=>p,e=>p=e),t(e.exports,\"compareByGeneratedPositionsInflated\",()=>d,e=>d=e),t(e.exports,\"parseSourceMapInput\",()=>f,e=>f=e),t(e.exports,\"computeSourceURL\",()=>g,e=>g=e),n=function(e,t,r){if(t in e)return e[t];if(3==arguments.length)return r;throw Error('\"'+t+'\" is a required argument.')};var n,o,i,a,s,l,c,u,h,p,d,f,g,m=/^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/,v=/^data:.+\\,.+$/;function y(e){var t=e.match(m);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function _(e){var t=\"\";return e.scheme&&(t+=e.scheme+\":\"),t+=\"//\",e.auth&&(t+=e.auth+\"@\"),e.host&&(t+=e.host),e.port&&(t+=\":\"+e.port),e.path&&(t+=e.path),t}function k(e){var t=e,r=y(e);if(r){if(!r.path)return e;t=r.path}for(var n,o=s(t),i=t.split(/\\/+/),a=0,l=i.length-1;l>=0;l--)\".\"===(n=i[l])?i.splice(l,1):\"..\"===n?a++:a>0&&(\"\"===n?(i.splice(l+1,a),a=0):(i.splice(l,2),a--));return(\"\"===(t=i.join(\"/\"))&&(t=o?\"/\":\".\"),r)?(r.path=t,_(r)):t}function S(e,t){\"\"===e&&(e=\".\"),\"\"===t&&(t=\".\");var r=y(t),n=y(e);if(n&&(e=n.path||\"/\"),r&&!r.scheme)return n&&(r.scheme=n.scheme),_(r);if(r||t.match(v))return t;if(n&&!n.host&&!n.path)return n.host=t,_(n);var o=\"/\"===t.charAt(0)?t:k(e.replace(/\\/+$/,\"\")+\"/\"+t);return n?(n.path=o,_(n)):o}o=y,i=k,a=S,s=function(e){return\"/\"===e.charAt(0)||m.test(e)},l=function(e,t){\"\"===e&&(e=\".\"),e=e.replace(/\\/$/,\"\");for(var r=0;0!==t.indexOf(e+\"/\");){var n=e.lastIndexOf(\"/\");if(n<0||(e=e.slice(0,n)).match(/^([^\\/]+:\\/)?\\/*$/))return t;++r}return Array(r+1).join(\"../\")+t.substr(e.length+1)};var b=!(\"__proto__\"in Object.create(null));function w(e){return e}function E(e){if(!e)return!1;var t=e.length;if(t<9||95!==e.charCodeAt(t-1)||95!==e.charCodeAt(t-2)||111!==e.charCodeAt(t-3)||116!==e.charCodeAt(t-4)||111!==e.charCodeAt(t-5)||114!==e.charCodeAt(t-6)||112!==e.charCodeAt(t-7)||95!==e.charCodeAt(t-8)||95!==e.charCodeAt(t-9))return!1;for(var r=t-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function x(e,t){return e===t?0:null===e?1:null===t?-1:e>t?1:-1}c=b?w:function(e){return E(e)?\"$\"+e:e},u=b?w:function(e){return E(e)?e.slice(1):e},h=function(e,t,r){var n=x(e.source,t.source);return 0!==n||0!=(n=e.originalLine-t.originalLine)||0!=(n=e.originalColumn-t.originalColumn)||r||0!=(n=e.generatedColumn-t.generatedColumn)||0!=(n=e.generatedLine-t.generatedLine)?n:x(e.name,t.name)},p=function(e,t,r){var n=e.generatedLine-t.generatedLine;return 0!==n||0!=(n=e.generatedColumn-t.generatedColumn)||r||0!==(n=x(e.source,t.source))||0!=(n=e.originalLine-t.originalLine)||0!=(n=e.originalColumn-t.originalColumn)?n:x(e.name,t.name)},d=function(e,t){var r=e.generatedLine-t.generatedLine;return 0!==r||0!=(r=e.generatedColumn-t.generatedColumn)||0!==(r=x(e.source,t.source))||0!=(r=e.originalLine-t.originalLine)||0!=(r=e.originalColumn-t.originalColumn)?r:x(e.name,t.name)},f=function(e){return JSON.parse(e.replace(/^\\)]}'[^\\n]*\\n/,\"\"))},g=function(e,t,r){if(t=t||\"\",e&&(\"/\"!==e[e.length-1]&&\"/\"!==t[0]&&(e+=\"/\"),t=e+t),r){var n=y(r);if(!n)throw Error(\"sourceMapURL could not be parsed\");if(n.path){var o=n.path.lastIndexOf(\"/\");o>=0&&(n.path=n.path.substring(0,o+1))}t=S(_(n),t)}return k(t)}}),ey(\"7Tyww\",function(e,r){t(e.exports,\"ArraySet\",()=>n,e=>n=e);var n,o=ev(\"hvjlv\"),i=Object.prototype.hasOwnProperty,a=\"undefined\"!=typeof Map;function s(){this._array=[],this._set=a?new Map:Object.create(null)}s.fromArray=function(e,t){for(var r=new s,n=0,o=e.length;n<o;n++)r.add(e[n],t);return r},s.prototype.size=function(){return a?this._set.size:Object.getOwnPropertyNames(this._set).length},s.prototype.add=function(e,t){var r=a?e:o.toSetString(e),n=a?this.has(e):i.call(this._set,r),s=this._array.length;(!n||t)&&this._array.push(e),n||(a?this._set.set(e,s):this._set[r]=s)},s.prototype.has=function(e){if(a)return this._set.has(e);var t=o.toSetString(e);return i.call(this._set,t)},s.prototype.indexOf=function(e){if(a){var t=this._set.get(e);if(t>=0)return t}else{var r=o.toSetString(e);if(i.call(this._set,r))return this._set[r]}throw Error('\"'+e+'\" is not in the set.')},s.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw Error(\"No element indexed by \"+e)},s.prototype.toArray=function(){return this._array.slice()},n=s}),ey(\"je4qX\",function(e,r){t(e.exports,\"MappingList\",()=>n,e=>n=e);var n,o=ev(\"hvjlv\");function i(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}i.prototype.unsortedForEach=function(e,t){this._array.forEach(e,t)},i.prototype.add=function(e){var t,r,n,i,a;(r=(t=this._last).generatedLine,n=e.generatedLine,i=t.generatedColumn,a=e.generatedColumn,n>r||n==r&&a>=i||0>=o.compareByGeneratedPositionsInflated(t,e))?this._last=e:this._sorted=!1,this._array.push(e)},i.prototype.toArray=function(){return this._sorted||(this._array.sort(o.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n=i}),ey(\"3DjxD\",function(e,r){t(e.exports,\"SourceMapConsumer\",()=>n,e=>n=e);var n,o=ev(\"hvjlv\"),i=ev(\"4khg5\"),a=ev(\"7Tyww\").ArraySet,s=ev(\"jTqXJ\"),l=ev(\"db1rV\").quickSort;function c(e,t){var r=e;return\"string\"==typeof e&&(r=o.parseSourceMapInput(e)),null!=r.sections?new p(r,t):new u(r,t)}function u(e,t){var r=e;\"string\"==typeof e&&(r=o.parseSourceMapInput(e));var n=o.getArg(r,\"version\"),i=o.getArg(r,\"sources\"),s=o.getArg(r,\"names\",[]),l=o.getArg(r,\"sourceRoot\",null),c=o.getArg(r,\"sourcesContent\",null),u=o.getArg(r,\"mappings\"),h=o.getArg(r,\"file\",null);if(n!=this._version)throw Error(\"Unsupported version: \"+n);l&&(l=o.normalize(l)),i=i.map(String).map(o.normalize).map(function(e){return l&&o.isAbsolute(l)&&o.isAbsolute(e)?o.relative(l,e):e}),this._names=a.fromArray(s.map(String),!0),this._sources=a.fromArray(i,!0),this._absoluteSources=this._sources.toArray().map(function(e){return o.computeSourceURL(l,e,t)}),this.sourceRoot=l,this.sourcesContent=c,this._mappings=u,this._sourceMapURL=t,this.file=h}function h(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function p(e,t){var r=e;\"string\"==typeof e&&(r=o.parseSourceMapInput(e));var n=o.getArg(r,\"version\"),i=o.getArg(r,\"sections\");if(n!=this._version)throw Error(\"Unsupported version: \"+n);this._sources=new a,this._names=new a;var s={line:-1,column:0};this._sections=i.map(function(e){if(e.url)throw Error(\"Support for url field in sections not implemented.\");var r=o.getArg(e,\"offset\"),n=o.getArg(r,\"line\"),i=o.getArg(r,\"column\");if(n<s.line||n===s.line&&i<s.column)throw Error(\"Section offsets must be ordered and non-overlapping.\");return s=r,{generatedOffset:{generatedLine:n+1,generatedColumn:i+1},consumer:new c(o.getArg(e,\"map\"),t)}})}c.fromSourceMap=function(e,t){return u.fromSourceMap(e,t)},c.prototype._version=3,c.prototype.__generatedMappings=null,Object.defineProperty(c.prototype,\"_generatedMappings\",{configurable:!0,enumerable:!0,get:function(){return this.__generatedMappings||this._parseMappings(this._mappings,this.sourceRoot),this.__generatedMappings}}),c.prototype.__originalMappings=null,Object.defineProperty(c.prototype,\"_originalMappings\",{configurable:!0,enumerable:!0,get:function(){return this.__originalMappings||this._parseMappings(this._mappings,this.sourceRoot),this.__originalMappings}}),c.prototype._charIsMappingSeparator=function(e,t){var r=e.charAt(t);return\";\"===r||\",\"===r},c.prototype._parseMappings=function(e,t){throw Error(\"Subclasses must implement _parseMappings\")},c.GENERATED_ORDER=1,c.ORIGINAL_ORDER=2,c.GREATEST_LOWER_BOUND=1,c.LEAST_UPPER_BOUND=2,c.prototype.eachMapping=function(e,t,r){switch(r||c.GENERATED_ORDER){case c.GENERATED_ORDER:n=this._generatedMappings;break;case c.ORIGINAL_ORDER:n=this._originalMappings;break;default:throw Error(\"Unknown order of iteration.\")}var n,i=this.sourceRoot;n.map(function(e){var t=null===e.source?null:this._sources.at(e.source);return{source:t=o.computeSourceURL(i,t,this._sourceMapURL),generatedLine:e.generatedLine,generatedColumn:e.generatedColumn,originalLine:e.originalLine,originalColumn:e.originalColumn,name:null===e.name?null:this._names.at(e.name)}},this).forEach(e,t||null)},c.prototype.allGeneratedPositionsFor=function(e){var t=o.getArg(e,\"line\"),r={source:o.getArg(e,\"source\"),originalLine:t,originalColumn:o.getArg(e,\"column\",0)};if(r.source=this._findSourceIndex(r.source),r.source<0)return[];var n=[],a=this._findMapping(r,this._originalMappings,\"originalLine\",\"originalColumn\",o.compareByOriginalPositions,i.LEAST_UPPER_BOUND);if(a>=0){var s=this._originalMappings[a];if(void 0===e.column)for(var l=s.originalLine;s&&s.originalLine===l;)n.push({line:o.getArg(s,\"generatedLine\",null),column:o.getArg(s,\"generatedColumn\",null),lastColumn:o.getArg(s,\"lastGeneratedColumn\",null)}),s=this._originalMappings[++a];else for(var c=s.originalColumn;s&&s.originalLine===t&&s.originalColumn==c;)n.push({line:o.getArg(s,\"generatedLine\",null),column:o.getArg(s,\"generatedColumn\",null),lastColumn:o.getArg(s,\"lastGeneratedColumn\",null)}),s=this._originalMappings[++a]}return n},n=c,u.prototype=Object.create(c.prototype),u.prototype.consumer=c,u.prototype._findSourceIndex=function(e){var t,r=e;if(null!=this.sourceRoot&&(r=o.relative(this.sourceRoot,r)),this._sources.has(r))return this._sources.indexOf(r);for(t=0;t<this._absoluteSources.length;++t)if(this._absoluteSources[t]==e)return t;return -1},u.fromSourceMap=function(e,t){var r=Object.create(u.prototype),n=r._names=a.fromArray(e._names.toArray(),!0),i=r._sources=a.fromArray(e._sources.toArray(),!0);r.sourceRoot=e._sourceRoot,r.sourcesContent=e._generateSourcesContent(r._sources.toArray(),r.sourceRoot),r.file=e._file,r._sourceMapURL=t,r._absoluteSources=r._sources.toArray().map(function(e){return o.computeSourceURL(r.sourceRoot,e,t)});for(var s=e._mappings.toArray().slice(),c=r.__generatedMappings=[],p=r.__originalMappings=[],d=0,f=s.length;d<f;d++){var g=s[d],m=new h;m.generatedLine=g.generatedLine,m.generatedColumn=g.generatedColumn,g.source&&(m.source=i.indexOf(g.source),m.originalLine=g.originalLine,m.originalColumn=g.originalColumn,g.name&&(m.name=n.indexOf(g.name)),p.push(m)),c.push(m)}return l(r.__originalMappings,o.compareByOriginalPositions),r},u.prototype._version=3,Object.defineProperty(u.prototype,\"sources\",{get:function(){return this._absoluteSources.slice()}}),u.prototype._parseMappings=function(e,t){for(var r,n,i,a,c,u=1,p=0,d=0,f=0,g=0,m=0,v=e.length,y=0,_={},k={},S=[],b=[];y<v;)if(\";\"===e.charAt(y))u++,y++,p=0;else if(\",\"===e.charAt(y))y++;else{for((r=new h).generatedLine=u,a=y;a<v&&!this._charIsMappingSeparator(e,a);a++);if(i=_[n=e.slice(y,a)])y+=n.length;else{for(i=[];y<a;)s.decode(e,y,k),c=k.value,y=k.rest,i.push(c);if(2===i.length)throw Error(\"Found a source, but no line and column\");if(3===i.length)throw Error(\"Found a source and line, but no column\");_[n]=i}r.generatedColumn=p+i[0],p=r.generatedColumn,i.length>1&&(r.source=g+i[1],g+=i[1],r.originalLine=d+i[2],d=r.originalLine,r.originalLine+=1,r.originalColumn=f+i[3],f=r.originalColumn,i.length>4&&(r.name=m+i[4],m+=i[4])),b.push(r),\"number\"==typeof r.originalLine&&S.push(r)}l(b,o.compareByGeneratedPositionsDeflated),this.__generatedMappings=b,l(S,o.compareByOriginalPositions),this.__originalMappings=S},u.prototype._findMapping=function(e,t,r,n,o,a){if(e[r]<=0)throw TypeError(\"Line must be greater than or equal to 1, got \"+e[r]);if(e[n]<0)throw TypeError(\"Column must be greater than or equal to 0, got \"+e[n]);return i.search(e,t,o,a)},u.prototype.computeColumnSpans=function(){for(var e=0;e<this._generatedMappings.length;++e){var t=this._generatedMappings[e];if(e+1<this._generatedMappings.length){var r=this._generatedMappings[e+1];if(t.generatedLine===r.generatedLine){t.lastGeneratedColumn=r.generatedColumn-1;continue}}t.lastGeneratedColumn=1/0}},u.prototype.originalPositionFor=function(e){var t={generatedLine:o.getArg(e,\"line\"),generatedColumn:o.getArg(e,\"column\")},r=this._findMapping(t,this._generatedMappings,\"generatedLine\",\"generatedColumn\",o.compareByGeneratedPositionsDeflated,o.getArg(e,\"bias\",c.GREATEST_LOWER_BOUND));if(r>=0){var n=this._generatedMappings[r];if(n.generatedLine===t.generatedLine){var i=o.getArg(n,\"source\",null);null!==i&&(i=this._sources.at(i),i=o.computeSourceURL(this.sourceRoot,i,this._sourceMapURL));var a=o.getArg(n,\"name\",null);return null!==a&&(a=this._names.at(a)),{source:i,line:o.getArg(n,\"originalLine\",null),column:o.getArg(n,\"originalColumn\",null),name:a}}}return{source:null,line:null,column:null,name:null}},u.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e})},u.prototype.sourceContentFor=function(e,t){if(!this.sourcesContent)return null;var r,n=this._findSourceIndex(e);if(n>=0)return this.sourcesContent[n];var i=e;if(null!=this.sourceRoot&&(i=o.relative(this.sourceRoot,i)),null!=this.sourceRoot&&(r=o.urlParse(this.sourceRoot))){var a=i.replace(/^file:\\/\\//,\"\");if(\"file\"==r.scheme&&this._sources.has(a))return this.sourcesContent[this._sources.indexOf(a)];if((!r.path||\"/\"==r.path)&&this._sources.has(\"/\"+i))return this.sourcesContent[this._sources.indexOf(\"/\"+i)]}if(t)return null;throw Error('\"'+i+'\" is not in the SourceMap.')},u.prototype.generatedPositionFor=function(e){var t=o.getArg(e,\"source\");if((t=this._findSourceIndex(t))<0)return{line:null,column:null,lastColumn:null};var r={source:t,originalLine:o.getArg(e,\"line\"),originalColumn:o.getArg(e,\"column\")},n=this._findMapping(r,this._originalMappings,\"originalLine\",\"originalColumn\",o.compareByOriginalPositions,o.getArg(e,\"bias\",c.GREATEST_LOWER_BOUND));if(n>=0){var i=this._originalMappings[n];if(i.source===r.source)return{line:o.getArg(i,\"generatedLine\",null),column:o.getArg(i,\"generatedColumn\",null),lastColumn:o.getArg(i,\"lastGeneratedColumn\",null)}}return{line:null,column:null,lastColumn:null}},p.prototype=Object.create(c.prototype),p.prototype.constructor=c,p.prototype._version=3,Object.defineProperty(p.prototype,\"sources\",{get:function(){for(var e=[],t=0;t<this._sections.length;t++)for(var r=0;r<this._sections[t].consumer.sources.length;r++)e.push(this._sections[t].consumer.sources[r]);return e}}),p.prototype.originalPositionFor=function(e){var t={generatedLine:o.getArg(e,\"line\"),generatedColumn:o.getArg(e,\"column\")},r=i.search(t,this._sections,function(e,t){return e.generatedLine-t.generatedOffset.generatedLine||e.generatedColumn-t.generatedOffset.generatedColumn}),n=this._sections[r];return n?n.consumer.originalPositionFor({line:t.generatedLine-(n.generatedOffset.generatedLine-1),column:t.generatedColumn-(n.generatedOffset.generatedLine===t.generatedLine?n.generatedOffset.generatedColumn-1:0),bias:e.bias}):{source:null,line:null,column:null,name:null}},p.prototype.hasContentsOfAllSources=function(){return this._sections.every(function(e){return e.consumer.hasContentsOfAllSources()})},p.prototype.sourceContentFor=function(e,t){for(var r=0;r<this._sections.length;r++){var n=this._sections[r].consumer.sourceContentFor(e,!0);if(n)return n}if(t)return null;throw Error('\"'+e+'\" is not in the SourceMap.')},p.prototype.generatedPositionFor=function(e){for(var t=0;t<this._sections.length;t++){var r=this._sections[t];if(-1!==r.consumer._findSourceIndex(o.getArg(e,\"source\"))){var n=r.consumer.generatedPositionFor(e);if(n)return{line:n.line+(r.generatedOffset.generatedLine-1),column:n.column+(r.generatedOffset.generatedLine===n.line?r.generatedOffset.generatedColumn-1:0)}}}return{line:null,column:null}},p.prototype._parseMappings=function(e,t){this.__generatedMappings=[],this.__originalMappings=[];for(var r=0;r<this._sections.length;r++)for(var n=this._sections[r],i=n.consumer._generatedMappings,a=0;a<i.length;a++){var s=i[a],c=n.consumer._sources.at(s.source);c=o.computeSourceURL(n.consumer.sourceRoot,c,this._sourceMapURL),this._sources.add(c),c=this._sources.indexOf(c);var u=null;s.name&&(u=n.consumer._names.at(s.name),this._names.add(u),u=this._names.indexOf(u));var h={source:c,generatedLine:s.generatedLine+(n.generatedOffset.generatedLine-1),generatedColumn:s.generatedColumn+(n.generatedOffset.generatedLine===s.generatedLine?n.generatedOffset.generatedColumn-1:0),originalLine:s.originalLine,originalColumn:s.originalColumn,name:u};this.__generatedMappings.push(h),\"number\"==typeof h.originalLine&&this.__originalMappings.push(h)}l(this.__generatedMappings,o.compareByGeneratedPositionsDeflated),l(this.__originalMappings,o.compareByOriginalPositions)}}),ey(\"4khg5\",function(e,r){var n,o,i;t(e.exports,\"GREATEST_LOWER_BOUND\",()=>n,e=>n=e),t(e.exports,\"LEAST_UPPER_BOUND\",()=>o,e=>o=e),t(e.exports,\"search\",()=>i,e=>i=e),n=1,o=2,i=function(e,t,r,i){if(0===t.length)return -1;var a=function e(t,r,n,i,a,s){var l=Math.floor((r-t)/2)+t,c=a(n,i[l],!0);return 0===c?l:c>0?r-l>1?e(l,r,n,i,a,s):s==o?r<i.length?r:-1:l:l-t>1?e(t,l,n,i,a,s):s==o?l:t<0?-1:t}(-1,t.length,e,t,r,i||n);if(a<0)return -1;for(;a-1>=0&&0===r(t[a],t[a-1],!0);)--a;return a}}),ey(\"db1rV\",function(e,r){var n;function o(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}t(e.exports,\"quickSort\",()=>n,e=>n=e),n=function(e,t){!function e(t,r,n,i){if(n<i){var a=Math.round(n+Math.random()*(i-n)),s=n-1;o(t,a,i);for(var l=t[i],c=n;c<i;c++)0>=r(t[c],l)&&o(t,s+=1,c);o(t,s+1,c);var u=s+1;e(t,r,n,u-1),e(t,r,u+1,i)}}(e,t,0,e.length-1)}}),ey(\"76tK5\",function(e,r){t(e.exports,\"SourceNode\",()=>n,e=>n=e);var n,o=ev(\"i8dtv\").SourceMapGenerator,i=ev(\"hvjlv\"),a=/(\\r?\\n)/,s=\"$$$isSourceNode$$$\";function l(e,t,r,n,o){this.children=[],this.sourceContents={},this.line=null==e?null:e,this.column=null==t?null:t,this.source=null==r?null:r,this.name=null==o?null:o,this[s]=!0,null!=n&&this.add(n)}l.fromStringWithSourceMap=function(e,t,r){var n=new l,o=e.split(a),s=0,c=function(){return e()+(e()||\"\");function e(){return s<o.length?o[s++]:void 0}},u=1,h=0,p=null;return t.eachMapping(function(e){if(null!==p){if(u<e.generatedLine)d(p,c()),u++,h=0;else{var t=o[s]||\"\",r=t.substr(0,e.generatedColumn-h);o[s]=t.substr(e.generatedColumn-h),h=e.generatedColumn,d(p,r),p=e;return}}for(;u<e.generatedLine;)n.add(c()),u++;if(h<e.generatedColumn){var t=o[s]||\"\";n.add(t.substr(0,e.generatedColumn)),o[s]=t.substr(e.generatedColumn),h=e.generatedColumn}p=e},this),s<o.length&&(p&&d(p,c()),n.add(o.splice(s).join(\"\"))),t.sources.forEach(function(e){var o=t.sourceContentFor(e);null!=o&&(null!=r&&(e=i.join(r,e)),n.setSourceContent(e,o))}),n;function d(e,t){if(null===e||void 0===e.source)n.add(t);else{var o=r?i.join(r,e.source):e.source;n.add(new l(e.originalLine,e.originalColumn,o,t,e.name))}}},l.prototype.add=function(e){if(Array.isArray(e))e.forEach(function(e){this.add(e)},this);else if(e[s]||\"string\"==typeof e)e&&this.children.push(e);else throw TypeError(\"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \"+e);return this},l.prototype.prepend=function(e){if(Array.isArray(e))for(var t=e.length-1;t>=0;t--)this.prepend(e[t]);else if(e[s]||\"string\"==typeof e)this.children.unshift(e);else throw TypeError(\"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \"+e);return this},l.prototype.walk=function(e){for(var t,r=0,n=this.children.length;r<n;r++)(t=this.children[r])[s]?t.walk(e):\"\"!==t&&e(t,{source:this.source,line:this.line,column:this.column,name:this.name})},l.prototype.join=function(e){var t,r,n=this.children.length;if(n>0){for(r=0,t=[];r<n-1;r++)t.push(this.children[r]),t.push(e);t.push(this.children[r]),this.children=t}return this},l.prototype.replaceRight=function(e,t){var r=this.children[this.children.length-1];return r[s]?r.replaceRight(e,t):\"string\"==typeof r?this.children[this.children.length-1]=r.replace(e,t):this.children.push(\"\".replace(e,t)),this},l.prototype.setSourceContent=function(e,t){this.sourceContents[i.toSetString(e)]=t},l.prototype.walkSourceContents=function(e){for(var t=0,r=this.children.length;t<r;t++)this.children[t][s]&&this.children[t].walkSourceContents(e);for(var n=Object.keys(this.sourceContents),t=0,r=n.length;t<r;t++)e(i.fromSetString(n[t]),this.sourceContents[n[t]])},l.prototype.toString=function(){var e=\"\";return this.walk(function(t){e+=t}),e},l.prototype.toStringWithSourceMap=function(e){var t={code:\"\",line:1,column:0},r=new o(e),n=!1,i=null,a=null,s=null,l=null;return this.walk(function(e,o){t.code+=e,null!==o.source&&null!==o.line&&null!==o.column?((i!==o.source||a!==o.line||s!==o.column||l!==o.name)&&r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:t.line,column:t.column},name:o.name}),i=o.source,a=o.line,s=o.column,l=o.name,n=!0):n&&(r.addMapping({generated:{line:t.line,column:t.column}}),i=null,n=!1);for(var c=0,u=e.length;c<u;c++)10===e.charCodeAt(c)?(t.line++,t.column=0,c+1===u?(i=null,n=!1):n&&r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:t.line,column:t.column},name:o.name})):t.column++}),this.walkSourceContents(function(e,t){r.setSourceContent(e,t)}),{code:t.code,map:r}},n=l});var e_=class{constructor(e=\"\"){this.prefix=\"robot-framework-\",e&&(this.prefix+=e+\"-\"),this.storage=this.getStorage()}getStorage(){try{return localStorage.setItem(this.prefix,this.prefix),localStorage.removeItem(this.prefix),localStorage}catch(e){return{}}}get(e,t){var r=this.storage[this.fullKey(e)];return void 0===r?t:r}set(e,t){this.storage[this.fullKey(e)]=t}fullKey(e){return this.prefix+e}},ek={};ek=JSON.parse('{\"en\":{\"code\":\"en\",\"intro\":\"Introduction\",\"libVersion\":\"Library version\",\"libScope\":\"Library scope\",\"importing\":\"Importing\",\"arguments\":\"Arguments\",\"doc\":\"Documentation\",\"keywords\":\"Keywords\",\"tags\":\"Tags\",\"returnType\":\"Return Type\",\"kwLink\":\"Link to this keyword\",\"argName\":\"Argument name\",\"varArgs\":\"Variable number of arguments\",\"varNamedArgs\":\"Variable number of named arguments\",\"namedOnlyArg\":\"Named only argument\",\"posOnlyArg\":\"Positional only argument\",\"defaultTitle\":\"Default value that is used if no value is given\",\"typeInfoDialog\":\"Click to show type information\",\"search\":\"Search\",\"dataTypes\":\"Data types\",\"allowedValues\":\"Allowed Values\",\"dictStructure\":\"Dictionary Structure\",\"convertedTypes\":\"Converted Types\",\"usages\":\"Usages\",\"generatedBy\":\"Generated by\",\"on\":\"on\",\"chooseLanguage\":\"Choose language\"},\"fi\":{\"code\":\"fi\",\"intro\":\"Johdanto\",\"libVersion\":\"Kirjaston versio\",\"libScope\":\"Kirjaston laajuus\",\"importing\":\"Käyttöönotto\",\"arguments\":\"Argumentit\",\"doc\":\"Dokumentaatio\",\"keywords\":\"Avainsanat\",\"tags\":\"Tagit\",\"returnType\":\"Paluuarvo\",\"kwLink\":\"Linkki tähän avainsanaan\",\"argName\":\"Argumentin nimi\",\"varArgs\":\"Vaihteleva määrä argumentteja\",\"varNamedArgs\":\"Vaihteleva määrä nimettyjä argumentteja\",\"namedOnlyArg\":\"Vain nimettyjä argumentteja\",\"posOnlyArg\":\"Vain positionaalisia argumentteja\",\"defaultTitle\":\"Oletusarvo, jota käytetään jos arvoa ei anneta\",\"typeInfoDialog\":\"Näytä tyyppitieto\",\"search\":\"Etsi\",\"dataTypes\":\"Datatyypit\",\"allowedValues\":\"Sallitut arvot\",\"dictStructure\":\"Sanakirjarakenne\",\"convertedTypes\":\"Muunnetut tyypit\",\"usages\":\"Käyttöpaikat\",\"generatedBy\":\"Luotu\",\"on\":\"\",\"chooseLanguage\":\"Valitse kieli\"},\"fr\":{\"code\":\"fr\",\"intro\":\"Introduction\",\"libVersion\":\"Version de la bibliothèque\",\"libScope\":\"Portée de la bibliothèque\",\"importing\":\"Importation\",\"arguments\":\"Arguments\",\"doc\":\"Documentation\",\"keywords\":\"Mots-clés\",\"tags\":\"Tags\",\"returnType\":\"Type de retour\",\"kwLink\":\"Lien vers ce mot-clé\",\"argName\":\"Nom de l\\'argument\",\"varArgs\":\"Nombre variable d\\'arguments\",\"varNamedArgs\":\"Nombre variable d\\'arguments nommés\",\"namedOnlyArg\":\"Argument nommé uniquement\",\"posOnlyArg\":\"Argument positionnel uniquement\",\"defaultTitle\":\"Valeur par défaut utilisée si aucune valeur n\\'est donnée\",\"typeInfoDialog\":\"Cliquez pour afficher les informations de type\",\"search\":\"Rechercher\",\"dataTypes\":\"Types de données\",\"allowedValues\":\"Valeurs autorisées\",\"dictStructure\":\"Structure du dictionnaire\",\"convertedTypes\":\"Types convertis\",\"usages\":\"Utilisations\",\"generatedBy\":\"Généré par\",\"on\":\"le\",\"chooseLanguage\":\"Choisir la langue\"},\"nl\":{\"code\":\"nl\",\"intro\":\"Introductie\",\"libVersion\":\"Bibliotheekversie\",\"libScope\":\"Bibliotheekbereik\",\"importing\":\"Importeren\",\"arguments\":\"Parameters\",\"doc\":\"Documentatie\",\"keywords\":\"Actiewoorden\",\"tags\":\"Labels\",\"returnType\":\"Andwoord type\",\"kwLink\":\"Link naar actiewoord\",\"argName\":\"Benoemde parameters\",\"varArgs\":\"Variabel aantal parameters\",\"varNamedArgs\":\"Variable aantal benoemde parameters\",\"namedOnlyArg\":\"Alleen benoemde parameters\",\"posOnlyArg\":\"Aleen positionele parameters\",\"defaultTitle\":\"Standaard waarde welke wordt gebruikt als geen waarde is gegeven\",\"typeInfoDialog\":\"Klik om informatie over dit type te zien\",\"search\":\"Zoeken\",\"dataTypes\":\"Datatypen\",\"allowedValues\":\"Geldige waarden\",\"dictStructure\":\"Woordenboek Structuur\",\"convertedTypes\":\"Geconverteerde typen\",\"usages\":\"Gebruikt in\",\"generatedBy\":\"Gegenereerd door\",\"on\":\"op\",\"chooseLanguage\":\"Kies taal\"},\"pt-BR\":{\"code\":\"pt-BR\",\"intro\":\"Introdução\",\"libVersion\":\"Versão da Biblioteca\",\"libScope\":\"Escopo da Biblioteca\",\"importing\":\"Importação\",\"arguments\":\"Argumentos\",\"doc\":\"Documentação\",\"keywords\":\"Palavras-Chave\",\"tags\":\"Etiquetas\",\"returnType\":\"Tipo de Retorno\",\"kwLink\":\"Ligação para a palavra-chave\",\"argName\":\"Nome do Argumento\",\"varArgs\":\"Argumentos em quantidade variável\",\"varNamedArgs\":\"Argumentos nomeados em quantidade variável\",\"namedOnlyArg\":\"Apenas argumentos nomeados\",\"posOnlyArg\":\"Apenas argumentos posicionais\",\"defaultTitle\":\"Valor padrão que é usado se nenhum tiver sido informado\",\"typeInfoDialog\":\"Clicar para mostrar informação de tipo\",\"search\":\"Pesquisar\",\"dataTypes\":\"Tipos de dados\",\"allowedValues\":\"Valores permitidos\",\"dictStructure\":\"Estrutura de Dicionário\",\"convertedTypes\":\"Tipos Convertidos\",\"usages\":\"Usos\",\"generatedBy\":\"Gerado por\",\"on\":\"ligado\",\"chooseLanguage\":\"Escolher idioma\"},\"pt-PT\":{\"code\":\"pt-PT\",\"intro\":\"Introdução\",\"libVersion\":\"Versão da Biblioteca\",\"libScope\":\"Âmbito da Biblioteca\",\"importing\":\"Importação\",\"arguments\":\"Argumentos\",\"doc\":\"Documentação\",\"keywords\":\"Palavras-Chave\",\"tags\":\"Etiquetas\",\"returnType\":\"Tipo de Retorno\",\"kwLink\":\"Ligação para a palavra-chave\",\"argName\":\"Nome do Argumento\",\"varArgs\":\"Argumentos em quantidade variável\",\"varNamedArgs\":\"Argumentos nomeados em quantidade variável\",\"namedOnlyArg\":\"Apenas argumentos nomeados\",\"posOnlyArg\":\"Apenas argumentos posicionais\",\"defaultTitle\":\"Valor por omissão que é usado se nenhum tiver sido dado\",\"typeInfoDialog\":\"Clicar para mostrar informação de tipo\",\"search\":\"Procurar\",\"dataTypes\":\"Tipos de dados\",\"allowedValues\":\"Valores permitidos\",\"dictStructure\":\"Estrutura de Dicionário\",\"convertedTypes\":\"Tipos Convertidos\",\"usages\":\"Utilização\",\"generatedBy\":\"Gerado por\",\"on\":\"ligado\",\"chooseLanguage\":\"Escolher língua\"}}');class eS{constructor(e){this.setLanguage(e)}static getInstance(e){return eS.instance||(eS.instance=new eS(e||\"en\")),eS.instance}translate(e){return e in this.language?this.language[e]:(console.log(\"Warning, missing translation for\",e),\"\")}setLanguage(e){if(this.language&&e==this.language.code)return!1;let t=!1;return Object.keys(r(ek)).forEach(n=>{n===e&&(this.language=r(ek)[n],t=!0)}),t}getLanguageCodes(){return Object.keys(r(ek))}currentLanguage(){return this.language.code}}var eb={};n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},o=function(e,t){if(!(e instanceof t))throw TypeError(\"Cannot call a class as a function\")},i=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},s=function(){function e(t){var r=!(arguments.length>1)||void 0===arguments[1]||arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;o(this,e),this.ctx=t,this.iframes=r,this.exclude=n,this.iframesTimeout=i}return i(e,[{key:\"getContexts\",value:function(){var e=void 0,t=[];return void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):e=Array.isArray(this.ctx)?this.ctx:\"string\"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:e=[],e.forEach(function(e){var r=t.filter(function(t){return t.contains(e)}).length>0;-1!==t.indexOf(e)||r||t.push(e)}),t}},{key:\"getIframeContents\",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},n=void 0;try{var o=e.contentWindow;if(n=o.document,!o||!n)throw Error(\"iframe inaccessible\")}catch(e){r()}n&&t(n)}},{key:\"isIframeBlank\",value:function(e){var t=\"about:blank\",r=e.getAttribute(\"src\").trim();return e.contentWindow.location.href===t&&r!==t&&r}},{key:\"observeIframeLoad\",value:function(e,t,r){var n=this,o=!1,i=null,a=function a(){if(!o){o=!0,clearTimeout(i);try{n.isIframeBlank(e)||(e.removeEventListener(\"load\",a),n.getIframeContents(e,t,r))}catch(e){r()}}};e.addEventListener(\"load\",a),i=setTimeout(a,this.iframesTimeout)}},{key:\"onIframeReady\",value:function(e,t,r){try{\"complete\"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch(e){r()}}},{key:\"waitForIframes\",value:function(e,t){var r=this,n=0;this.forEachIframe(e,function(){return!0},function(e){n++,r.waitForIframes(e.querySelector(\"html\"),function(){--n||t()})},function(e){e||t()})}},{key:\"forEachIframe\",value:function(t,r,n){var o=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll(\"iframe\"),s=a.length,l=0;a=Array.prototype.slice.call(a);var c=function(){--s<=0&&i(l)};s||c(),a.forEach(function(t){e.matches(t,o.exclude)?c():o.onIframeReady(t,function(e){r(t)&&(l++,n(e)),c()},c)})}},{key:\"createIterator\",value:function(e,t,r){return document.createNodeIterator(e,t,r,!1)}},{key:\"createInstanceOnIframe\",value:function(t){return new e(t.querySelector(\"html\"),this.iframes)}},{key:\"compareNodeIframe\",value:function(e,t,r){return!!(e.compareDocumentPosition(r)&Node.DOCUMENT_POSITION_PRECEDING&&(null===t||t.compareDocumentPosition(r)&Node.DOCUMENT_POSITION_FOLLOWING))}},{key:\"getIteratorNode\",value:function(e){var t=e.previousNode(),r=void 0;return r=null===t?e.nextNode():e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}},{key:\"checkIframeFilter\",value:function(e,t,r,n){var o=!1,i=!1;return(n.forEach(function(e,t){e.val===r&&(o=t,i=e.handled)}),this.compareNodeIframe(e,t,r))?(!1!==o||i?!1===o||i||(n[o].handled=!0):n.push({val:r,handled:!0}),!0):(!1===o&&n.push({val:r,handled:!1}),!1)}},{key:\"handleOpenIframes\",value:function(e,t,r,n){var o=this;e.forEach(function(e){e.handled||o.getIframeContents(e.val,function(e){o.createInstanceOnIframe(e).forEachNode(t,r,n)})})}},{key:\"iterateThroughNodes\",value:function(e,t,r,n,o){for(var i,a=this,s=this.createIterator(t,e,n),l=[],c=[],u=void 0,h=void 0;h=(i=a.getIteratorNode(s)).prevNode,u=i.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(u,h,e,l)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return c.push(e)},n)}),c.push(u);c.forEach(function(e){r(e)}),this.iframes&&this.handleOpenIframes(l,e,r,n),o()}},{key:\"forEachNode\",value:function(e,t,r){var n=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},i=this.getContexts(),a=i.length;a||o(),i.forEach(function(i){var s=function(){n.iterateThroughNodes(e,i,t,r,function(){--a<=0&&o()})};n.iframes?n.waitForIframes(i,s):s()})}}],[{key:\"matches\",value:function(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(!r)return!1;var n=!1;return(\"string\"==typeof t?[t]:t).every(function(t){return!r.call(e,t)||(n=!0,!1)}),n}}]),e}(),l=function(){function e(t){o(this,e),this.ctx=t,this.ie=!1;var r=window.navigator.userAgent;(r.indexOf(\"MSIE\")>-1||r.indexOf(\"Trident\")>-1)&&(this.ie=!0)}return i(e,[{key:\"log\",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"debug\",r=this.opt.log;this.opt.debug&&(void 0===r?\"undefined\":n(r))===\"object\"&&\"function\"==typeof r[t]&&r[t](\"mark.js: \"+e)}},{key:\"escapeStr\",value:function(e){return e.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\"\\\\$&\")}},{key:\"createRegExp\",value:function(e){return\"disabled\"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),\"disabled\"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:\"createSynonymsRegExp\",value:function(e){var t=this.opt.synonyms,r=this.opt.caseSensitive?\"\":\"i\",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?\"\\0\":\"\";for(var o in t)if(t.hasOwnProperty(o)){var i=t[o],a=\"disabled\"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o),s=\"disabled\"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i);\"\"!==a&&\"\"!==s&&(e=e.replace(RegExp(\"(\"+this.escapeStr(a)+\"|\"+this.escapeStr(s)+\")\",\"gm\"+r),n+\"(\"+this.processSynomyms(a)+\"|\"+this.processSynomyms(s)+\")\"+n))}return e}},{key:\"processSynomyms\",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:\"setupWildcardsRegExp\",value:function(e){return(e=e.replace(/(?:\\\\)*\\?/g,function(e){return\"\\\\\"===e.charAt(0)?\"?\":\"\\x01\"})).replace(/(?:\\\\)*\\*/g,function(e){return\"\\\\\"===e.charAt(0)?\"*\":\"\\x02\"})}},{key:\"createWildcardsRegExp\",value:function(e){var t=\"withSpaces\"===this.opt.wildcards;return e.replace(/\\u0001/g,t?\"[\\\\S\\\\s]?\":\"\\\\S?\").replace(/\\u0002/g,t?\"[\\\\S\\\\s]*?\":\"\\\\S*\")}},{key:\"setupIgnoreJoinersRegExp\",value:function(e){return e.replace(/[^(|)\\\\]/g,function(e,t,r){var n=r.charAt(t+1);return/[(|)\\\\]/.test(n)||\"\"===n?e:e+\"\\0\"})}},{key:\"createJoinersRegExp\",value:function(e){var t=[],r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(\"\"))),this.opt.ignoreJoiners&&t.push(\"\\\\u00ad\\\\u200b\\\\u200c\\\\u200d\"),t.length?e.split(/\\u0000+/).join(\"[\"+t.join(\"\")+\"]*\"):e}},{key:\"createDiacriticsRegExp\",value:function(e){var t=this.opt.caseSensitive?\"\":\"i\",r=this.opt.caseSensitive?[\"aàáảãạăằắẳẵặâầấẩẫậäåāą\",\"AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ\",\"cçćč\",\"CÇĆČ\",\"dđď\",\"DĐĎ\",\"eèéẻẽẹêềếểễệëěēę\",\"EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ\",\"iìíỉĩịîïī\",\"IÌÍỈĨỊÎÏĪ\",\"lł\",\"LŁ\",\"nñňń\",\"NÑŇŃ\",\"oòóỏõọôồốổỗộơởỡớờợöøō\",\"OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ\",\"rř\",\"RŘ\",\"sšśșş\",\"SŠŚȘŞ\",\"tťțţ\",\"TŤȚŢ\",\"uùúủũụưừứửữựûüůū\",\"UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ\",\"yýỳỷỹỵÿ\",\"YÝỲỶỸỴŸ\",\"zžżź\",\"ZŽŻŹ\"]:[\"aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ\",\"cçćčCÇĆČ\",\"dđďDĐĎ\",\"eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ\",\"iìíỉĩịîïīIÌÍỈĨỊÎÏĪ\",\"lłLŁ\",\"nñňńNÑŇŃ\",\"oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ\",\"rřRŘ\",\"sšśșşSŠŚȘŞ\",\"tťțţTŤȚŢ\",\"uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ\",\"yýỳỷỹỵÿYÝỲỶỸỴŸ\",\"zžżźZŽŻŹ\"],n=[];return e.split(\"\").forEach(function(o){r.every(function(r){if(-1!==r.indexOf(o)){if(n.indexOf(r)>-1)return!1;e=e.replace(RegExp(\"[\"+r+\"]\",\"gm\"+t),\"[\"+r+\"]\"),n.push(r)}return!0})}),e}},{key:\"createMergedBlanksRegExp\",value:function(e){return e.replace(/[\\s]+/gmi,\"[\\\\s]+\")}},{key:\"createAccuracyRegExp\",value:function(e){var t=this,r=this.opt.accuracy,n=\"string\"==typeof r?r:r.value,o=\"string\"==typeof r?[]:r.limiters,i=\"\";switch(o.forEach(function(e){i+=\"|\"+t.escapeStr(e)}),n){case\"partially\":default:return\"()(\"+e+\")\";case\"complementary\":return\"()([^\"+(i=\"\\\\s\"+(i||this.escapeStr(\"!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~¡¿\")))+\"]*\"+e+\"[^\"+i+\"]*)\";case\"exactly\":return\"(^|\\\\s\"+i+\")(\"+e+\")(?=$|\\\\s\"+i+\")\"}}},{key:\"getSeparatedKeywords\",value:function(e){var t=this,r=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(\" \").forEach(function(e){e.trim()&&-1===r.indexOf(e)&&r.push(e)}):e.trim()&&-1===r.indexOf(e)&&r.push(e)}),{keywords:r.sort(function(e,t){return t.length-e.length}),length:r.length}}},{key:\"isNumeric\",value:function(e){return Number(parseFloat(e))==e}},{key:\"checkRanges\",value:function(e){var t=this;if(!Array.isArray(e)||\"[object Object]\"!==Object.prototype.toString.call(e[0]))return this.log(\"markRanges() will only accept an array of objects\"),this.opt.noMatch(e),[];var r=[],n=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var o=t.callNoMatchOnInvalidRanges(e,n),i=o.start,a=o.end;o.valid&&(e.start=i,e.length=a-i,r.push(e),n=a)}),r}},{key:\"callNoMatchOnInvalidRanges\",value:function(e,t){var r=void 0,n=void 0,o=!1;return e&&void 0!==e.start?(n=(r=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-r>0?o=!0:(this.log(\"Ignoring invalid or overlapping range: \"+JSON.stringify(e)),this.opt.noMatch(e))):(this.log(\"Ignoring invalid range: \"+JSON.stringify(e)),this.opt.noMatch(e)),{start:r,end:n,valid:o}}},{key:\"checkWhitespaceRanges\",value:function(e,t,r){var n=void 0,o=!0,i=r.length,a=t-i,s=parseInt(e.start,10)-a;return(n=(s=s>i?i:s)+parseInt(e.length,10))>i&&(n=i,this.log(\"End range automatically set to the max value of \"+i)),s<0||n-s<0||s>i||n>i?(o=!1,this.log(\"Invalid range: \"+JSON.stringify(e)),this.opt.noMatch(e)):\"\"===r.substring(s,n).replace(/\\s+/g,\"\")&&(o=!1,this.log(\"Skipping whitespace only range: \"+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:n,valid:o}}},{key:\"getTextNodes\",value:function(e){var t=this,r=\"\",n=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){n.push({start:r.length,end:(r+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:r,nodes:n})})}},{key:\"matchesExclude\",value:function(e){return s.matches(e,this.opt.exclude.concat([\"script\",\"style\",\"title\",\"head\",\"html\"]))}},{key:\"wrapRangeInTextNode\",value:function(e,t,r){var n=this.opt.element?this.opt.element:\"mark\",o=e.splitText(t),i=o.splitText(r-t),a=document.createElement(n);return a.setAttribute(\"data-markjs\",\"true\"),this.opt.className&&a.setAttribute(\"class\",this.opt.className),a.textContent=o.textContent,o.parentNode.replaceChild(a,o),i}},{key:\"wrapRangeInMappedTextNode\",value:function(e,t,r,n,o){var i=this;e.nodes.every(function(a,s){var l=e.nodes[s+1];if(void 0===l||l.start>t){if(!n(a.node))return!1;var c=t-a.start,u=(r>a.end?a.end:r)-a.start,h=e.value.substr(0,a.start),p=e.value.substr(u+a.start);if(a.node=i.wrapRangeInTextNode(a.node,c,u),e.value=h+p,e.nodes.forEach(function(t,r){r>=s&&(e.nodes[r].start>0&&r!==s&&(e.nodes[r].start-=u),e.nodes[r].end-=u)}),r-=u,o(a.node.previousSibling,a.start),!(r>a.end))return!1;t=a.end}return!0})}},{key:\"wrapMatches\",value:function(e,t,r,n,o){var i=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var o=void 0;null!==(o=e.exec(t.textContent))&&\"\"!==o[a];)if(r(o[a],t)){var s=o.index;if(0!==a)for(var l=1;l<a;l++)s+=o[l].length;n((t=i.wrapRangeInTextNode(t,s,s+o[a].length)).previousSibling),e.lastIndex=0}}),o()})}},{key:\"wrapMatchesAcrossElements\",value:function(e,t,r,n,o){var i=this,a=0===t?0:t+1;this.getTextNodes(function(t){for(var s=void 0;null!==(s=e.exec(t.value))&&\"\"!==s[a];){var l=s.index;if(0!==a)for(var c=1;c<a;c++)l+=s[c].length;var u=l+s[a].length;i.wrapRangeInMappedTextNode(t,l,u,function(e){return r(s[a],e)},function(t,r){e.lastIndex=r,n(t)})}o()})}},{key:\"wrapRangeFromIndex\",value:function(e,t,r,n){var o=this;this.getTextNodes(function(i){var a=i.value.length;e.forEach(function(e,n){var s=o.checkWhitespaceRanges(e,a,i.value),l=s.start,c=s.end;s.valid&&o.wrapRangeInMappedTextNode(i,l,c,function(r){return t(r,e,i.value.substring(l,c),n)},function(t){r(t,e)})}),n()})}},{key:\"unwrapMatches\",value:function(e){for(var t=e.parentNode,r=document.createDocumentFragment();e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}},{key:\"normalizeTextNode\",value:function(e){if(e){if(3===e.nodeType)for(;e.nextSibling&&3===e.nextSibling.nodeType;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}},{key:\"markRegExp\",value:function(e,t){var r=this;this.opt=t,this.log('Searching with expression \"'+e+'\"');var n=0,o=\"wrapMatches\";this.opt.acrossElements&&(o=\"wrapMatchesAcrossElements\"),this[o](e,this.opt.ignoreGroups,function(e,t){return r.opt.filter(t,e,n)},function(e){n++,r.opt.each(e)},function(){0===n&&r.opt.noMatch(e),r.opt.done(n)})}},{key:\"mark\",value:function(e,t){var r=this;this.opt=t;var n=0,o=\"wrapMatches\",i=this.getSeparatedKeywords(\"string\"==typeof e?[e]:e),a=i.keywords,s=i.length,l=this.opt.caseSensitive?\"\":\"i\";this.opt.acrossElements&&(o=\"wrapMatchesAcrossElements\"),0===s?this.opt.done(n):function e(t){var i=RegExp(r.createRegExp(t),\"gm\"+l),c=0;r.log('Searching with expression \"'+i+'\"'),r[o](i,1,function(e,o){return r.opt.filter(o,t,n,c)},function(e){c++,n++,r.opt.each(e)},function(){0===c&&r.opt.noMatch(t),a[s-1]===t?r.opt.done(n):e(a[a.indexOf(t)+1])})}(a[0])}},{key:\"markRanges\",value:function(e,t){var r=this;this.opt=t;var n=0,o=this.checkRanges(e);o&&o.length?(this.log(\"Starting to mark with the following ranges: \"+JSON.stringify(o)),this.wrapRangeFromIndex(o,function(e,t,n,o){return r.opt.filter(e,t,n,o)},function(e,t){n++,r.opt.each(e,t)},function(){r.opt.done(n)})):this.opt.done(n)}},{key:\"unmark\",value:function(e){var t=this;this.opt=e;var r=this.opt.element?this.opt.element:\"*\";r+=\"[data-markjs]\",this.opt.className&&(r+=\".\"+this.opt.className),this.log('Removal selector \"'+r+'\"'),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,function(e){t.unwrapMatches(e)},function(e){var n=s.matches(e,r),o=t.matchesExclude(e);return!n||o?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}},{key:\"opt\",set:function(e){this._opt=a({},{element:\"\",className:\"\",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:\"partially\",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:\"disabled\",each:function(){},noMatch:function(){},filter:function(){return!0},done:function(){},debug:!1,log:window.console},e)},get:function(){return this._opt}},{key:\"iterator\",get:function(){return new s(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}}]),e}(),eb=function(e){var t=this,r=new l(e);return this.mark=function(e,n){return r.mark(e,n),t},this.markRegExp=function(e,n){return r.markRegExp(e,n),t},this.markRanges=function(e,n){return r.markRanges(e,n),t},this.unmark=function(e){return r.unmark(e),t},this};var ew={};function eE(e){return e&&e.__esModule?e:{default:e}}ew.__esModule=!0;var ex={};function eC(e){return e&&e.__esModule?e:{default:e}}function eP(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}ex.__esModule=!0;var eL={};function eA(e){return e&&e.__esModule?e:{default:e}}t(eL,\"__esModule\",()=>_,e=>_=e),t(eL,\"HandlebarsEnvironment\",()=>k,e=>k=e),t(eL,\"VERSION\",()=>S,e=>S=e),t(eL,\"COMPILER_REVISION\",()=>b,e=>b=e),t(eL,\"LAST_COMPATIBLE_COMPILER_REVISION\",()=>w,e=>w=e),t(eL,\"REVISION_CHANGES\",()=>E,e=>E=e),t(eL,\"log\",()=>x,e=>x=e),t(eL,\"createFrame\",()=>C,e=>C=e),t(eL,\"logger\",()=>P,e=>P=e),_=!0,k=ts;var eO={};t(eO,\"__esModule\",()=>L,e=>L=e),t(eO,\"extend\",()=>A,e=>A=e),t(eO,\"indexOf\",()=>O,e=>O=e),t(eO,\"escapeExpression\",()=>I,e=>I=e),t(eO,\"isEmpty\",()=>N,e=>N=e),t(eO,\"createFrame\",()=>M,e=>M=e),t(eO,\"blockParams\",()=>T,e=>T=e),t(eO,\"appendContextPath\",()=>R,e=>R=e),t(eO,\"toString\",()=>B,e=>B=e),t(eO,\"isFunction\",()=>D,e=>D=e),t(eO,\"isArray\",()=>j,e=>j=e),L=!0,A=eR,O=function(e,t){for(var r=0,n=e.length;r<n;r++)if(e[r]===t)return r;return -1},I=function(e){if(\"string\"!=typeof e){if(e&&e.toHTML)return e.toHTML();if(null==e)return\"\";if(!e)return e+\"\";e=\"\"+e}return eM.test(e)?e.replace(eN,eT):e},N=function(e){return!e&&0!==e||!!ej(e)&&0===e.length},M=function(e){var t=eR({},e);return t._parent=e,t},T=function(e,t){return e.path=t,e},R=function(e,t){return(e?e+\".\":\"\")+t};var eI={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#x27;\",\"`\":\"&#x60;\",\"=\":\"&#x3D;\"},eN=/[&<>\"'`=]/g,eM=/[&<>\"'`=]/;function eT(e){return eI[e]}function eR(e){for(var t=1;t<arguments.length;t++)for(var r in arguments[t])Object.prototype.hasOwnProperty.call(arguments[t],r)&&(e[r]=arguments[t][r]);return e}var eB=Object.prototype.toString;B=eB;var eD=function(e){return\"function\"==typeof e};eD(/x/)&&(D=eD=function(e){return\"function\"==typeof e&&\"[object Function]\"===eB.call(e)}),D=eD;var ej=Array.isArray||function(e){return!!e&&\"object\"==typeof e&&\"[object Array]\"===eB.call(e)};j=ej;var e$={};e$.__esModule=!0;var eH=[\"description\",\"fileName\",\"lineNumber\",\"endLineNumber\",\"message\",\"name\",\"number\",\"stack\"];function eF(e,t){var r=t&&t.loc,n=void 0,o=void 0,i=void 0,a=void 0;r&&(n=r.start.line,o=r.end.line,i=r.start.column,a=r.end.column,e+=\" - \"+n+\":\"+i);for(var s=Error.prototype.constructor.call(this,e),l=0;l<eH.length;l++)this[eH[l]]=s[eH[l]];Error.captureStackTrace&&Error.captureStackTrace(this,eF);try{r&&(this.lineNumber=n,this.endLineNumber=o,Object.defineProperty?(Object.defineProperty(this,\"column\",{value:i,enumerable:!0}),Object.defineProperty(this,\"endColumn\",{value:a,enumerable:!0})):(this.column=i,this.endColumn=a))}catch(e){}}eF.prototype=Error(),e$.default=eF;var eV=eA(e$=e$.default);function eq(e){return e&&e.__esModule?e:{default:e}}$=function(e){eK.default(e),eJ.default(e),eY.default(e),e2.default(e),e0.default(e),e4.default(e),e7.default(e)},H=function(e,t,r){e.helpers[t]&&(e.hooks[t]=e.helpers[t],r||delete e.helpers[t])};var eU={};eU.__esModule=!0,eU.default=function(e){e.registerHelper(\"blockHelperMissing\",function(t,r){var n=r.inverse,o=r.fn;if(!0===t)return o(this);if(!1===t||null==t)return n(this);if(j(t))return t.length>0?(r.ids&&(r.ids=[r.name]),e.helpers.each(t,r)):n(this);if(r.data&&r.ids){var i=M(r.data);i.contextPath=R(r.data.contextPath,r.name),r={data:i}}return o(t,r)})};var eK=eq(eU=eU.default),eG={};eG.__esModule=!0;var eW=(c=e$)&&c.__esModule?c:{default:c};eG.default=function(e){e.registerHelper(\"each\",function(e,t){if(!t)throw new eW.default(\"Must pass iterator to #each\");var r=t.fn,n=t.inverse,o=0,i=\"\",a=void 0,s=void 0;function l(t,n,o){a&&(a.key=t,a.index=n,a.first=0===n,a.last=!!o,s&&(a.contextPath=s+t)),i+=r(e[t],{data:a,blockParams:T([e[t],t],[s+t,null])})}if(t.data&&t.ids&&(s=R(t.data.contextPath,t.ids[0])+\".\"),D(e)&&(e=e.call(this)),t.data&&(a=M(t.data)),e&&\"object\"==typeof e){if(j(e))for(var c,u=e.length;o<u;o++)o in e&&l(o,o,o===e.length-1);else if(\"function\"==typeof Symbol&&e[Symbol.iterator]){for(var h=[],p=e[Symbol.iterator](),d=p.next();!d.done;d=p.next())h.push(d.value);e=h;for(var u=e.length;o<u;o++)l(o,o,o===e.length-1)}else c=void 0,Object.keys(e).forEach(function(e){void 0!==c&&l(c,o-1),c=e,o++}),void 0!==c&&l(c,o-1,!0)}return 0===o&&(i=n(this)),i})};var eJ=eq(eG=eG.default),ez={};ez.__esModule=!0;var eX=(u=e$)&&u.__esModule?u:{default:u};ez.default=function(e){e.registerHelper(\"helperMissing\",function(){if(1!=arguments.length)throw new eX.default('Missing helper: \"'+arguments[arguments.length-1].name+'\"')})};var eY=eq(ez=ez.default),eZ={};eZ.__esModule=!0;var eQ=(h=e$)&&h.__esModule?h:{default:h};eZ.default=function(e){e.registerHelper(\"if\",function(e,t){if(2!=arguments.length)throw new eQ.default(\"#if requires exactly one argument\");return(D(e)&&(e=e.call(this)),!t.hash.includeZero&&!e||N(e))?t.inverse(this):t.fn(this)}),e.registerHelper(\"unless\",function(t,r){if(2!=arguments.length)throw new eQ.default(\"#unless requires exactly one argument\");return e.helpers.if.call(this,t,{fn:r.inverse,inverse:r.fn,hash:r.hash})})};var e2=eq(eZ=eZ.default),e1={};e1.__esModule=!0,e1.default=function(e){e.registerHelper(\"log\",function(){for(var t=[void 0],r=arguments[arguments.length-1],n=0;n<arguments.length-1;n++)t.push(arguments[n]);var o=1;null!=r.hash.level?o=r.hash.level:r.data&&null!=r.data.level&&(o=r.data.level),t[0]=o,e.log.apply(e,t)})};var e0=eq(e1=e1.default),e3={};e3.__esModule=!0,e3.default=function(e){e.registerHelper(\"lookup\",function(e,t,r){return e?r.lookupProperty(e,t):e})};var e4=eq(e3=e3.default),e8={};e8.__esModule=!0;var e5=(p=e$)&&p.__esModule?p:{default:p};e8.default=function(e){e.registerHelper(\"with\",function(e,t){if(2!=arguments.length)throw new e5.default(\"#with requires exactly one argument\");D(e)&&(e=e.call(this));var r=t.fn;if(N(e))return t.inverse(this);var n=t.data;return t.data&&t.ids&&((n=M(t.data)).contextPath=R(t.data.contextPath,t.ids[0])),r(e,{data:n,blockParams:T([e],[n&&n.contextPath])})})};var e7=eq(e8=e8.default);F=function(e){e9.default(e)};var e6={};e6.__esModule=!0,e6.default=function(e){e.registerDecorator(\"inline\",function(e,t,r,n){var o=e;return t.partials||(t.partials={},o=function(n,o){var i=r.partials;r.partials=A({},i,t.partials);var a=e(n,o);return r.partials=i,a}),t.partials[n.args[0]]=n.fn,o})};var e9=(d=e6=e6.default)&&d.__esModule?d:{default:d},te={};te.__esModule=!0;var tt={methodMap:[\"debug\",\"info\",\"warn\",\"error\"],level:\"info\",lookupLevel:function(e){if(\"string\"==typeof e){var t=O(tt.methodMap,e.toLowerCase());e=t>=0?t:parseInt(e,10)}return e},log:function(e){if(e=tt.lookupLevel(e),\"undefined\"!=typeof console&&tt.lookupLevel(tt.level)<=e){var t=tt.methodMap[e];console[t]||(t=\"log\");for(var r=arguments.length,n=Array(r>1?r-1:0),o=1;o<r;o++)n[o-1]=arguments[o];console[t].apply(console,n)}}};te.default=tt;var tr=eA(te=te.default);V=function(e){var t=Object.create(null);t.constructor=!1,t.__defineGetter__=!1,t.__defineSetter__=!1,t.__lookupGetter__=!1;var r=Object.create(null);return r.__proto__=!1,{properties:{whitelist:K(r,e.allowedProtoProperties),defaultValue:e.allowProtoPropertiesByDefault},methods:{whitelist:K(t,e.allowedProtoMethods),defaultValue:e.allowProtoMethodsByDefault}}},q=function(e,t,r){return\"function\"==typeof e?ti(t.methods,r):ti(t.properties,r)},U=function(){Object.keys(to).forEach(function(e){delete to[e]})},K=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return A.apply(void 0,[Object.create(null)].concat(t))};var tn=(f=te)&&f.__esModule?f:{default:f},to=Object.create(null);function ti(e,t){return void 0!==e.whitelist[t]?!0===e.whitelist[t]:void 0!==e.defaultValue?e.defaultValue:(!0!==to[t]&&(to[t]=!0,tn.default.log(\"error\",'Handlebars: Access has been denied to resolve the property \"'+t+'\" because it is not an \"own property\" of its parent.\\nYou can add a runtime option to disable the check or this warning:\\nSee https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details')),!1)}S=\"4.7.8\",b=8,w=7,E={1:\"<= 1.0.rc.2\",2:\"== 1.0.0-rc.3\",3:\"== 1.0.0-rc.4\",4:\"== 1.x.x\",5:\"== 2.0.0-alpha.x\",6:\">= 2.0.0-beta.1\",7:\">= 4.0.0 <4.3.0\",8:\">= 4.3.0\"};var ta=\"[object Object]\";function ts(e,t,r){this.helpers=e||{},this.partials=t||{},this.decorators=r||{},$(this),F(this)}ts.prototype={constructor:ts,logger:tr.default,log:tr.default.log,registerHelper:function(e,t){if(B.call(e)===ta){if(t)throw new eV.default(\"Arg not supported with multiple helpers\");A(this.helpers,e)}else this.helpers[e]=t},unregisterHelper:function(e){delete this.helpers[e]},registerPartial:function(e,t){if(B.call(e)===ta)A(this.partials,e);else{if(void 0===t)throw new eV.default('Attempting to register a partial called \"'+e+'\" as undefined');this.partials[e]=t}},unregisterPartial:function(e){delete this.partials[e]},registerDecorator:function(e,t){if(B.call(e)===ta){if(t)throw new eV.default(\"Arg not supported with multiple decorators\");A(this.decorators,e)}else this.decorators[e]=t},unregisterDecorator:function(e){delete this.decorators[e]},resetLoggedPropertyAccesses:function(){U()}},x=tr.default.log,C=M,P=tr.default;var tl=eP(eL),tc={};function tu(e){this.string=e}tc.__esModule=!0,tu.prototype.toString=tu.prototype.toHTML=function(){return\"\"+this.string},tc.default=tu;var th=eC(tc=tc.default),tp=eC(e$),td=eP(eO),tf={};t(tf,\"__esModule\",()=>G,e=>G=e),t(tf,\"checkRevision\",()=>W,e=>W=e),t(tf,\"template\",()=>J,e=>J=e),t(tf,\"wrapProgram\",()=>z,e=>z=e),t(tf,\"resolvePartial\",()=>X,e=>X=e),t(tf,\"invokePartial\",()=>Y,e=>Y=e),t(tf,\"noop\",()=>Z,e=>Z=e),G=!0,W=function(e){var t=e&&e[0]||1,r=b;if(!(t>=w)||!(t<=b)){if(t<w){var n=E[r],o=E[t];throw new tm.default(\"Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version (\"+n+\") or downgrade your runtime to an older version (\"+o+\").\")}throw new tm.default(\"Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version (\"+e[1]+\").\")}},J=function(e,t){if(!t)throw new tm.default(\"No environment passed to template\");if(!e||!e.main)throw new tm.default(\"Unknown template object: \"+typeof e);e.main.decorator=e.main_d,t.VM.checkRevision(e.compiler);var r=e.compiler&&7===e.compiler[0],n={strict:function(e,t,r){if(!e||!(t in e))throw new tm.default('\"'+t+'\" not defined in '+e,{loc:r});return n.lookupProperty(e,t)},lookupProperty:function(e,t){var r=e[t];if(null==r||Object.prototype.hasOwnProperty.call(e,t)||q(r,n.protoAccessControl,t))return r},lookup:function(e,t){for(var r=e.length,o=0;o<r;o++)if(null!=(e[o]&&n.lookupProperty(e[o],t)))return e[o][t]},lambda:function(e,t){return\"function\"==typeof e?e.call(t):e},escapeExpression:tg.escapeExpression,invokePartial:function(r,n,o){o.hash&&(n=tg.extend({},n,o.hash),o.ids&&(o.ids[0]=!0)),r=t.VM.resolvePartial.call(this,r,n,o);var i=tg.extend({},o,{hooks:this.hooks,protoAccessControl:this.protoAccessControl}),a=t.VM.invokePartial.call(this,r,n,i);if(null==a&&t.compile&&(o.partials[o.name]=t.compile(r,e.compilerOptions,t),a=o.partials[o.name](n,i)),null!=a){if(o.indent){for(var s=a.split(\"\\n\"),l=0,c=s.length;l<c&&(s[l]||l+1!==c);l++)s[l]=o.indent+s[l];a=s.join(\"\\n\")}return a}throw new tm.default(\"The partial \"+o.name+\" could not be compiled when running in runtime-only mode\")},fn:function(t){var r=e[t];return r.decorator=e[t+\"_d\"],r},programs:[],program:function(e,t,r,n,o){var i=this.programs[e],a=this.fn(e);return t||o||n||r?i=tv(this,e,a,t,r,n,o):i||(i=this.programs[e]=tv(this,e,a)),i},data:function(e,t){for(;e&&t--;)e=e._parent;return e},mergeIfNeeded:function(e,t){var r=e||t;return e&&t&&e!==t&&(r=tg.extend({},t,e)),r},nullContext:Object.seal({}),noop:t.VM.noop,compilerInfo:e.compiler};function o(t){var r,i=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],a=i.data;o._setup(i),!i.partial&&e.useData&&((r=a)&&\"root\"in r||((r=r?C(r):{}).root=t),a=r);var s=void 0,l=e.useBlockParams?[]:void 0;function c(t){return\"\"+e.main(n,t,n.helpers,n.partials,a,l,s)}return e.useDepths&&(s=i.depths?t!=i.depths[0]?[t].concat(i.depths):i.depths:[t]),(c=t_(e.main,c,n,i.depths||[],a,l))(t,i)}return o.isTop=!0,o._setup=function(o){if(o.partial)n.protoAccessControl=o.protoAccessControl,n.helpers=o.helpers,n.partials=o.partials,n.decorators=o.decorators,n.hooks=o.hooks;else{var i=tg.extend({},t.helpers,o.helpers);(function(e,t){Object.keys(e).forEach(function(r){var n,o=e[r];e[r]=(n=t.lookupProperty,Q(o,function(e){return tg.extend({lookupProperty:n},e)}))})})(i,n),n.helpers=i,e.usePartial&&(n.partials=n.mergeIfNeeded(o.partials,t.partials)),(e.usePartial||e.useDecorators)&&(n.decorators=tg.extend({},t.decorators,o.decorators)),n.hooks={},n.protoAccessControl=V(o);var a=o.allowCallsToHelperMissing||r;H(n,\"helperMissing\",a),H(n,\"blockHelperMissing\",a)}},o._child=function(t,r,o,i){if(e.useBlockParams&&!o)throw new tm.default(\"must pass block params\");if(e.useDepths&&!i)throw new tm.default(\"must pass parent depths\");return tv(n,t,e[t],r,0,o,i)},o},z=tv,X=function(e,t,r){return e?e.call||r.name||(r.name=e,e=r.partials[e]):e=\"@partial-block\"===r.name?r.data[\"partial-block\"]:r.partials[r.name],e},Y=function(e,t,r){var n,o=r.data&&r.data[\"partial-block\"];r.partial=!0,r.ids&&(r.data.contextPath=r.ids[0]||r.data.contextPath);var i=void 0;if(r.fn&&r.fn!==ty&&(r.data=C(r.data),n=r.fn,i=r.data[\"partial-block\"]=function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return t.data=C(t.data),t.data[\"partial-block\"]=o,n(e,t)},n.partials&&(r.partials=tg.extend({},r.partials,n.partials))),void 0===e&&i&&(e=i),void 0===e)throw new tm.default(\"The partial \"+r.name+\" could not be found\");if(e instanceof Function)return e(t,r)},Z=ty;var tg=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(eO),tm=(g=e$)&&g.__esModule?g:{default:g};function tv(e,t,r,n,o,i,a){function s(t){var o=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],s=a;return a&&t!=a[0]&&!(t===e.nullContext&&null===a[0])&&(s=[t].concat(a)),r(e,t,e.helpers,e.partials,o.data||n,i&&[o.blockParams].concat(i),s)}return(s=t_(r,s,e,a,n,i)).program=t,s.depth=a?a.length:0,s.blockParams=o||0,s}function ty(){return\"\"}function t_(e,t,r,n,o,i){if(e.decorator){var a={};t=e.decorator(t,a,r,n&&n[0],o,i,n),tg.extend(t,a)}return t}Q=function(e,t){return\"function\"!=typeof e?e:function(){var r=arguments[arguments.length-1];return arguments[arguments.length-1]=t(r),e.apply(this,arguments)}};var tk=eP(tf),tS={};tS.__esModule=!0,tS.default=function(e){\"object\"!=typeof globalThis&&(Object.prototype.__defineGetter__(\"__magic__\",function(){return this}),__magic__.globalThis=__magic__,delete Object.prototype.__magic__);var t=globalThis.Handlebars;e.noConflict=function(){return globalThis.Handlebars===e&&(globalThis.Handlebars=t),e}};var tb=eC(tS=tS.default);function tw(){var e=new tl.HandlebarsEnvironment;return td.extend(e,tl),e.SafeString=th.default,e.Exception=tp.default,e.Utils=td,e.escapeExpression=td.escapeExpression,e.VM=tk,e.template=function(t){return tk.template(t,e)},e}var tE=tw();tE.create=tw,tb.default(tE),tE.default=tE,ex.default=tE;var tx=eE(ex=ex.default),tC={};tC.__esModule=!0;var tP={helpers:{helperExpression:function(e){return\"SubExpression\"===e.type||(\"MustacheStatement\"===e.type||\"BlockStatement\"===e.type)&&!!(e.params&&e.params.length||e.hash)},scopedId:function(e){return/^\\.|this\\b/.test(e.original)},simpleId:function(e){return 1===e.parts.length&&!tP.helpers.scopedId(e)&&!e.depth}}};tC.default=tP;var tL=eE(tC=tC.default);function tA(e){return e&&e.__esModule?e:{default:e}}var tO={};tO.__esModule=!0;var tI=function(){var e,t={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,partialBlock:12,content:13,COMMENT:14,CONTENT:15,openRawBlock:16,rawBlock_repetition0:17,END_RAW_BLOCK:18,OPEN_RAW_BLOCK:19,helperName:20,openRawBlock_repetition0:21,openRawBlock_option0:22,CLOSE_RAW_BLOCK:23,openBlock:24,block_option0:25,closeBlock:26,openInverse:27,block_option1:28,OPEN_BLOCK:29,openBlock_repetition0:30,openBlock_option0:31,openBlock_option1:32,CLOSE:33,OPEN_INVERSE:34,openInverse_repetition0:35,openInverse_option0:36,openInverse_option1:37,openInverseChain:38,OPEN_INVERSE_CHAIN:39,openInverseChain_repetition0:40,openInverseChain_option0:41,openInverseChain_option1:42,inverseAndProgram:43,INVERSE:44,inverseChain:45,inverseChain_option0:46,OPEN_ENDBLOCK:47,OPEN:48,mustache_repetition0:49,mustache_option0:50,OPEN_UNESCAPED:51,mustache_repetition1:52,mustache_option1:53,CLOSE_UNESCAPED:54,OPEN_PARTIAL:55,partialName:56,partial_repetition0:57,partial_option0:58,openPartialBlock:59,OPEN_PARTIAL_BLOCK:60,openPartialBlock_repetition0:61,openPartialBlock_option0:62,param:63,sexpr:64,OPEN_SEXPR:65,sexpr_repetition0:66,sexpr_option0:67,CLOSE_SEXPR:68,hash:69,hash_repetition_plus0:70,hashSegment:71,ID:72,EQUALS:73,blockParams:74,OPEN_BLOCK_PARAMS:75,blockParams_repetition_plus0:76,CLOSE_BLOCK_PARAMS:77,path:78,dataName:79,STRING:80,NUMBER:81,BOOLEAN:82,UNDEFINED:83,NULL:84,DATA:85,pathSegments:86,SEP:87,$accept:0,$end:1},terminals_:{2:\"error\",5:\"EOF\",14:\"COMMENT\",15:\"CONTENT\",18:\"END_RAW_BLOCK\",19:\"OPEN_RAW_BLOCK\",23:\"CLOSE_RAW_BLOCK\",29:\"OPEN_BLOCK\",33:\"CLOSE\",34:\"OPEN_INVERSE\",39:\"OPEN_INVERSE_CHAIN\",44:\"INVERSE\",47:\"OPEN_ENDBLOCK\",48:\"OPEN\",51:\"OPEN_UNESCAPED\",54:\"CLOSE_UNESCAPED\",55:\"OPEN_PARTIAL\",60:\"OPEN_PARTIAL_BLOCK\",65:\"OPEN_SEXPR\",68:\"CLOSE_SEXPR\",72:\"ID\",73:\"EQUALS\",75:\"OPEN_BLOCK_PARAMS\",77:\"CLOSE_BLOCK_PARAMS\",80:\"STRING\",81:\"NUMBER\",82:\"BOOLEAN\",83:\"UNDEFINED\",84:\"NULL\",85:\"DATA\",87:\"SEP\"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[13,1],[10,3],[16,5],[9,4],[9,4],[24,6],[27,6],[38,6],[43,2],[45,3],[45,1],[26,3],[8,5],[8,5],[11,5],[12,3],[59,5],[63,1],[63,1],[64,5],[69,1],[71,3],[74,3],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[56,1],[56,1],[79,2],[78,1],[86,3],[86,1],[6,0],[6,2],[17,0],[17,2],[21,0],[21,2],[22,0],[22,1],[25,0],[25,1],[28,0],[28,1],[30,0],[30,2],[31,0],[31,1],[32,0],[32,1],[35,0],[35,2],[36,0],[36,1],[37,0],[37,1],[40,0],[40,2],[41,0],[41,1],[42,0],[42,1],[46,0],[46,1],[49,0],[49,2],[50,0],[50,1],[52,0],[52,2],[53,0],[53,1],[57,0],[57,2],[58,0],[58,1],[61,0],[61,2],[62,0],[62,1],[66,0],[66,2],[67,0],[67,1],[70,1],[70,2],[76,1],[76,2]],performAction:function(e,t,r,n,o,i,a){var s=i.length-1;switch(o){case 1:return i[s-1];case 2:this.$=n.prepareProgram(i[s]);break;case 3:case 4:case 5:case 6:case 7:case 8:case 20:case 27:case 28:case 33:case 34:case 40:case 41:this.$=i[s];break;case 9:this.$={type:\"CommentStatement\",value:n.stripComment(i[s]),strip:n.stripFlags(i[s],i[s]),loc:n.locInfo(this._$)};break;case 10:this.$={type:\"ContentStatement\",original:i[s],value:i[s],loc:n.locInfo(this._$)};break;case 11:this.$=n.prepareRawBlock(i[s-2],i[s-1],i[s],this._$);break;case 12:this.$={path:i[s-3],params:i[s-2],hash:i[s-1]};break;case 13:this.$=n.prepareBlock(i[s-3],i[s-2],i[s-1],i[s],!1,this._$);break;case 14:this.$=n.prepareBlock(i[s-3],i[s-2],i[s-1],i[s],!0,this._$);break;case 15:this.$={open:i[s-5],path:i[s-4],params:i[s-3],hash:i[s-2],blockParams:i[s-1],strip:n.stripFlags(i[s-5],i[s])};break;case 16:case 17:this.$={path:i[s-4],params:i[s-3],hash:i[s-2],blockParams:i[s-1],strip:n.stripFlags(i[s-5],i[s])};break;case 18:this.$={strip:n.stripFlags(i[s-1],i[s-1]),program:i[s]};break;case 19:var l=n.prepareBlock(i[s-2],i[s-1],i[s],i[s],!1,this._$),c=n.prepareProgram([l],i[s-1].loc);c.chained=!0,this.$={strip:i[s-2].strip,program:c,chain:!0};break;case 21:this.$={path:i[s-1],strip:n.stripFlags(i[s-2],i[s])};break;case 22:case 23:this.$=n.prepareMustache(i[s-3],i[s-2],i[s-1],i[s-4],n.stripFlags(i[s-4],i[s]),this._$);break;case 24:this.$={type:\"PartialStatement\",name:i[s-3],params:i[s-2],hash:i[s-1],indent:\"\",strip:n.stripFlags(i[s-4],i[s]),loc:n.locInfo(this._$)};break;case 25:this.$=n.preparePartialBlock(i[s-2],i[s-1],i[s],this._$);break;case 26:this.$={path:i[s-3],params:i[s-2],hash:i[s-1],strip:n.stripFlags(i[s-4],i[s])};break;case 29:this.$={type:\"SubExpression\",path:i[s-3],params:i[s-2],hash:i[s-1],loc:n.locInfo(this._$)};break;case 30:this.$={type:\"Hash\",pairs:i[s],loc:n.locInfo(this._$)};break;case 31:this.$={type:\"HashPair\",key:n.id(i[s-2]),value:i[s],loc:n.locInfo(this._$)};break;case 32:this.$=n.id(i[s-1]);break;case 35:this.$={type:\"StringLiteral\",value:i[s],original:i[s],loc:n.locInfo(this._$)};break;case 36:this.$={type:\"NumberLiteral\",value:Number(i[s]),original:Number(i[s]),loc:n.locInfo(this._$)};break;case 37:this.$={type:\"BooleanLiteral\",value:\"true\"===i[s],original:\"true\"===i[s],loc:n.locInfo(this._$)};break;case 38:this.$={type:\"UndefinedLiteral\",original:void 0,value:void 0,loc:n.locInfo(this._$)};break;case 39:this.$={type:\"NullLiteral\",original:null,value:null,loc:n.locInfo(this._$)};break;case 42:this.$=n.preparePath(!0,i[s],this._$);break;case 43:this.$=n.preparePath(!1,i[s],this._$);break;case 44:i[s-2].push({part:n.id(i[s]),original:i[s],separator:i[s-1]}),this.$=i[s-2];break;case 45:this.$=[{part:n.id(i[s]),original:i[s]}];break;case 46:case 48:case 50:case 58:case 64:case 70:case 78:case 82:case 86:case 90:case 94:this.$=[];break;case 47:case 49:case 51:case 59:case 65:case 71:case 79:case 83:case 87:case 91:case 95:case 99:case 101:i[s-1].push(i[s]);break;case 98:case 100:this.$=[i[s]]}},table:[{3:1,4:2,5:[2,46],6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:11,14:[1,12],15:[1,20],16:17,19:[1,23],24:15,27:16,29:[1,21],34:[1,22],39:[2,2],44:[2,2],47:[2,2],48:[1,13],51:[1,14],55:[1,18],59:19,60:[1,24]},{1:[2,1]},{5:[2,47],14:[2,47],15:[2,47],19:[2,47],29:[2,47],34:[2,47],39:[2,47],44:[2,47],47:[2,47],48:[2,47],51:[2,47],55:[2,47],60:[2,47]},{5:[2,3],14:[2,3],15:[2,3],19:[2,3],29:[2,3],34:[2,3],39:[2,3],44:[2,3],47:[2,3],48:[2,3],51:[2,3],55:[2,3],60:[2,3]},{5:[2,4],14:[2,4],15:[2,4],19:[2,4],29:[2,4],34:[2,4],39:[2,4],44:[2,4],47:[2,4],48:[2,4],51:[2,4],55:[2,4],60:[2,4]},{5:[2,5],14:[2,5],15:[2,5],19:[2,5],29:[2,5],34:[2,5],39:[2,5],44:[2,5],47:[2,5],48:[2,5],51:[2,5],55:[2,5],60:[2,5]},{5:[2,6],14:[2,6],15:[2,6],19:[2,6],29:[2,6],34:[2,6],39:[2,6],44:[2,6],47:[2,6],48:[2,6],51:[2,6],55:[2,6],60:[2,6]},{5:[2,7],14:[2,7],15:[2,7],19:[2,7],29:[2,7],34:[2,7],39:[2,7],44:[2,7],47:[2,7],48:[2,7],51:[2,7],55:[2,7],60:[2,7]},{5:[2,8],14:[2,8],15:[2,8],19:[2,8],29:[2,8],34:[2,8],39:[2,8],44:[2,8],47:[2,8],48:[2,8],51:[2,8],55:[2,8],60:[2,8]},{5:[2,9],14:[2,9],15:[2,9],19:[2,9],29:[2,9],34:[2,9],39:[2,9],44:[2,9],47:[2,9],48:[2,9],51:[2,9],55:[2,9],60:[2,9]},{20:25,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:36,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:37,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{4:38,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{15:[2,48],17:39,18:[2,48]},{20:41,56:40,64:42,65:[1,43],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:44,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{5:[2,10],14:[2,10],15:[2,10],18:[2,10],19:[2,10],29:[2,10],34:[2,10],39:[2,10],44:[2,10],47:[2,10],48:[2,10],51:[2,10],55:[2,10],60:[2,10]},{20:45,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:46,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:47,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:41,56:48,64:42,65:[1,43],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[2,78],49:49,65:[2,78],72:[2,78],80:[2,78],81:[2,78],82:[2,78],83:[2,78],84:[2,78],85:[2,78]},{23:[2,33],33:[2,33],54:[2,33],65:[2,33],68:[2,33],72:[2,33],75:[2,33],80:[2,33],81:[2,33],82:[2,33],83:[2,33],84:[2,33],85:[2,33]},{23:[2,34],33:[2,34],54:[2,34],65:[2,34],68:[2,34],72:[2,34],75:[2,34],80:[2,34],81:[2,34],82:[2,34],83:[2,34],84:[2,34],85:[2,34]},{23:[2,35],33:[2,35],54:[2,35],65:[2,35],68:[2,35],72:[2,35],75:[2,35],80:[2,35],81:[2,35],82:[2,35],83:[2,35],84:[2,35],85:[2,35]},{23:[2,36],33:[2,36],54:[2,36],65:[2,36],68:[2,36],72:[2,36],75:[2,36],80:[2,36],81:[2,36],82:[2,36],83:[2,36],84:[2,36],85:[2,36]},{23:[2,37],33:[2,37],54:[2,37],65:[2,37],68:[2,37],72:[2,37],75:[2,37],80:[2,37],81:[2,37],82:[2,37],83:[2,37],84:[2,37],85:[2,37]},{23:[2,38],33:[2,38],54:[2,38],65:[2,38],68:[2,38],72:[2,38],75:[2,38],80:[2,38],81:[2,38],82:[2,38],83:[2,38],84:[2,38],85:[2,38]},{23:[2,39],33:[2,39],54:[2,39],65:[2,39],68:[2,39],72:[2,39],75:[2,39],80:[2,39],81:[2,39],82:[2,39],83:[2,39],84:[2,39],85:[2,39]},{23:[2,43],33:[2,43],54:[2,43],65:[2,43],68:[2,43],72:[2,43],75:[2,43],80:[2,43],81:[2,43],82:[2,43],83:[2,43],84:[2,43],85:[2,43],87:[1,50]},{72:[1,35],86:51},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{52:52,54:[2,82],65:[2,82],72:[2,82],80:[2,82],81:[2,82],82:[2,82],83:[2,82],84:[2,82],85:[2,82]},{25:53,38:55,39:[1,57],43:56,44:[1,58],45:54,47:[2,54]},{28:59,43:60,44:[1,58],47:[2,56]},{13:62,15:[1,20],18:[1,61]},{33:[2,86],57:63,65:[2,86],72:[2,86],80:[2,86],81:[2,86],82:[2,86],83:[2,86],84:[2,86],85:[2,86]},{33:[2,40],65:[2,40],72:[2,40],80:[2,40],81:[2,40],82:[2,40],83:[2,40],84:[2,40],85:[2,40]},{33:[2,41],65:[2,41],72:[2,41],80:[2,41],81:[2,41],82:[2,41],83:[2,41],84:[2,41],85:[2,41]},{20:64,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:65,47:[1,66]},{30:67,33:[2,58],65:[2,58],72:[2,58],75:[2,58],80:[2,58],81:[2,58],82:[2,58],83:[2,58],84:[2,58],85:[2,58]},{33:[2,64],35:68,65:[2,64],72:[2,64],75:[2,64],80:[2,64],81:[2,64],82:[2,64],83:[2,64],84:[2,64],85:[2,64]},{21:69,23:[2,50],65:[2,50],72:[2,50],80:[2,50],81:[2,50],82:[2,50],83:[2,50],84:[2,50],85:[2,50]},{33:[2,90],61:70,65:[2,90],72:[2,90],80:[2,90],81:[2,90],82:[2,90],83:[2,90],84:[2,90],85:[2,90]},{20:74,33:[2,80],50:71,63:72,64:75,65:[1,43],69:73,70:76,71:77,72:[1,78],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{72:[1,79]},{23:[2,42],33:[2,42],54:[2,42],65:[2,42],68:[2,42],72:[2,42],75:[2,42],80:[2,42],81:[2,42],82:[2,42],83:[2,42],84:[2,42],85:[2,42],87:[1,50]},{20:74,53:80,54:[2,84],63:81,64:75,65:[1,43],69:82,70:76,71:77,72:[1,78],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:83,47:[1,66]},{47:[2,55]},{4:84,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{47:[2,20]},{20:85,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:86,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{26:87,47:[1,66]},{47:[2,57]},{5:[2,11],14:[2,11],15:[2,11],19:[2,11],29:[2,11],34:[2,11],39:[2,11],44:[2,11],47:[2,11],48:[2,11],51:[2,11],55:[2,11],60:[2,11]},{15:[2,49],18:[2,49]},{20:74,33:[2,88],58:88,63:89,64:75,65:[1,43],69:90,70:76,71:77,72:[1,78],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{65:[2,94],66:91,68:[2,94],72:[2,94],80:[2,94],81:[2,94],82:[2,94],83:[2,94],84:[2,94],85:[2,94]},{5:[2,25],14:[2,25],15:[2,25],19:[2,25],29:[2,25],34:[2,25],39:[2,25],44:[2,25],47:[2,25],48:[2,25],51:[2,25],55:[2,25],60:[2,25]},{20:92,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:74,31:93,33:[2,60],63:94,64:75,65:[1,43],69:95,70:76,71:77,72:[1,78],75:[2,60],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:74,33:[2,66],36:96,63:97,64:75,65:[1,43],69:98,70:76,71:77,72:[1,78],75:[2,66],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:74,22:99,23:[2,52],63:100,64:75,65:[1,43],69:101,70:76,71:77,72:[1,78],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:74,33:[2,92],62:102,63:103,64:75,65:[1,43],69:104,70:76,71:77,72:[1,78],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,105]},{33:[2,79],65:[2,79],72:[2,79],80:[2,79],81:[2,79],82:[2,79],83:[2,79],84:[2,79],85:[2,79]},{33:[2,81]},{23:[2,27],33:[2,27],54:[2,27],65:[2,27],68:[2,27],72:[2,27],75:[2,27],80:[2,27],81:[2,27],82:[2,27],83:[2,27],84:[2,27],85:[2,27]},{23:[2,28],33:[2,28],54:[2,28],65:[2,28],68:[2,28],72:[2,28],75:[2,28],80:[2,28],81:[2,28],82:[2,28],83:[2,28],84:[2,28],85:[2,28]},{23:[2,30],33:[2,30],54:[2,30],68:[2,30],71:106,72:[1,107],75:[2,30]},{23:[2,98],33:[2,98],54:[2,98],68:[2,98],72:[2,98],75:[2,98]},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],73:[1,108],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{23:[2,44],33:[2,44],54:[2,44],65:[2,44],68:[2,44],72:[2,44],75:[2,44],80:[2,44],81:[2,44],82:[2,44],83:[2,44],84:[2,44],85:[2,44],87:[2,44]},{54:[1,109]},{54:[2,83],65:[2,83],72:[2,83],80:[2,83],81:[2,83],82:[2,83],83:[2,83],84:[2,83],85:[2,83]},{54:[2,85]},{5:[2,13],14:[2,13],15:[2,13],19:[2,13],29:[2,13],34:[2,13],39:[2,13],44:[2,13],47:[2,13],48:[2,13],51:[2,13],55:[2,13],60:[2,13]},{38:55,39:[1,57],43:56,44:[1,58],45:111,46:110,47:[2,76]},{33:[2,70],40:112,65:[2,70],72:[2,70],75:[2,70],80:[2,70],81:[2,70],82:[2,70],83:[2,70],84:[2,70],85:[2,70]},{47:[2,18]},{5:[2,14],14:[2,14],15:[2,14],19:[2,14],29:[2,14],34:[2,14],39:[2,14],44:[2,14],47:[2,14],48:[2,14],51:[2,14],55:[2,14],60:[2,14]},{33:[1,113]},{33:[2,87],65:[2,87],72:[2,87],80:[2,87],81:[2,87],82:[2,87],83:[2,87],84:[2,87],85:[2,87]},{33:[2,89]},{20:74,63:115,64:75,65:[1,43],67:114,68:[2,96],69:116,70:76,71:77,72:[1,78],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,117]},{32:118,33:[2,62],74:119,75:[1,120]},{33:[2,59],65:[2,59],72:[2,59],75:[2,59],80:[2,59],81:[2,59],82:[2,59],83:[2,59],84:[2,59],85:[2,59]},{33:[2,61],75:[2,61]},{33:[2,68],37:121,74:122,75:[1,120]},{33:[2,65],65:[2,65],72:[2,65],75:[2,65],80:[2,65],81:[2,65],82:[2,65],83:[2,65],84:[2,65],85:[2,65]},{33:[2,67],75:[2,67]},{23:[1,123]},{23:[2,51],65:[2,51],72:[2,51],80:[2,51],81:[2,51],82:[2,51],83:[2,51],84:[2,51],85:[2,51]},{23:[2,53]},{33:[1,124]},{33:[2,91],65:[2,91],72:[2,91],80:[2,91],81:[2,91],82:[2,91],83:[2,91],84:[2,91],85:[2,91]},{33:[2,93]},{5:[2,22],14:[2,22],15:[2,22],19:[2,22],29:[2,22],34:[2,22],39:[2,22],44:[2,22],47:[2,22],48:[2,22],51:[2,22],55:[2,22],60:[2,22]},{23:[2,99],33:[2,99],54:[2,99],68:[2,99],72:[2,99],75:[2,99]},{73:[1,108]},{20:74,63:125,64:75,65:[1,43],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,23],14:[2,23],15:[2,23],19:[2,23],29:[2,23],34:[2,23],39:[2,23],44:[2,23],47:[2,23],48:[2,23],51:[2,23],55:[2,23],60:[2,23]},{47:[2,19]},{47:[2,77]},{20:74,33:[2,72],41:126,63:127,64:75,65:[1,43],69:128,70:76,71:77,72:[1,78],75:[2,72],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,24],14:[2,24],15:[2,24],19:[2,24],29:[2,24],34:[2,24],39:[2,24],44:[2,24],47:[2,24],48:[2,24],51:[2,24],55:[2,24],60:[2,24]},{68:[1,129]},{65:[2,95],68:[2,95],72:[2,95],80:[2,95],81:[2,95],82:[2,95],83:[2,95],84:[2,95],85:[2,95]},{68:[2,97]},{5:[2,21],14:[2,21],15:[2,21],19:[2,21],29:[2,21],34:[2,21],39:[2,21],44:[2,21],47:[2,21],48:[2,21],51:[2,21],55:[2,21],60:[2,21]},{33:[1,130]},{33:[2,63]},{72:[1,132],76:131},{33:[1,133]},{33:[2,69]},{15:[2,12],18:[2,12]},{14:[2,26],15:[2,26],19:[2,26],29:[2,26],34:[2,26],47:[2,26],48:[2,26],51:[2,26],55:[2,26],60:[2,26]},{23:[2,31],33:[2,31],54:[2,31],68:[2,31],72:[2,31],75:[2,31]},{33:[2,74],42:134,74:135,75:[1,120]},{33:[2,71],65:[2,71],72:[2,71],75:[2,71],80:[2,71],81:[2,71],82:[2,71],83:[2,71],84:[2,71],85:[2,71]},{33:[2,73],75:[2,73]},{23:[2,29],33:[2,29],54:[2,29],65:[2,29],68:[2,29],72:[2,29],75:[2,29],80:[2,29],81:[2,29],82:[2,29],83:[2,29],84:[2,29],85:[2,29]},{14:[2,15],15:[2,15],19:[2,15],29:[2,15],34:[2,15],39:[2,15],44:[2,15],47:[2,15],48:[2,15],51:[2,15],55:[2,15],60:[2,15]},{72:[1,137],77:[1,136]},{72:[2,100],77:[2,100]},{14:[2,16],15:[2,16],19:[2,16],29:[2,16],34:[2,16],44:[2,16],47:[2,16],48:[2,16],51:[2,16],55:[2,16],60:[2,16]},{33:[1,138]},{33:[2,75]},{33:[2,32]},{72:[2,101],77:[2,101]},{14:[2,17],15:[2,17],19:[2,17],29:[2,17],34:[2,17],39:[2,17],44:[2,17],47:[2,17],48:[2,17],51:[2,17],55:[2,17],60:[2,17]}],defaultActions:{4:[2,1],54:[2,55],56:[2,20],60:[2,57],73:[2,81],82:[2,85],86:[2,18],90:[2,89],101:[2,53],104:[2,93],110:[2,19],111:[2,77],116:[2,97],119:[2,63],122:[2,69],135:[2,75],136:[2,32]},parseError:function(e,t){throw Error(e)},parse:function(e){var t=this,r=[0],n=[null],o=[],i=this.table,a=\"\",s=0,l=0,c=0;this.lexer.setInput(e),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,void 0===this.lexer.yylloc&&(this.lexer.yylloc={});var u=this.lexer.yylloc;o.push(u);var h=this.lexer.options&&this.lexer.options.ranges;\"function\"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var p,d,f,g,m,v,y,_,k,S={};;){if(f=r[r.length-1],this.defaultActions[f]?g=this.defaultActions[f]:(null==p&&(p=function(){var e;return\"number\"!=typeof(e=t.lexer.lex()||1)&&(e=t.symbols_[e]||e),e}()),g=i[f]&&i[f][p]),void 0===g||!g.length||!g[0]){var b=\"\";if(!c){for(v in k=[],i[f])this.terminals_[v]&&v>2&&k.push(\"'\"+this.terminals_[v]+\"'\");b=this.lexer.showPosition?\"Parse error on line \"+(s+1)+\":\\n\"+this.lexer.showPosition()+\"\\nExpecting \"+k.join(\", \")+\", got '\"+(this.terminals_[p]||p)+\"'\":\"Parse error on line \"+(s+1)+\": Unexpected \"+(1==p?\"end of input\":\"'\"+(this.terminals_[p]||p)+\"'\"),this.parseError(b,{text:this.lexer.match,token:this.terminals_[p]||p,line:this.lexer.yylineno,loc:u,expected:k})}}if(g[0]instanceof Array&&g.length>1)throw Error(\"Parse Error: multiple actions possible at state: \"+f+\", token: \"+p);switch(g[0]){case 1:r.push(p),n.push(this.lexer.yytext),o.push(this.lexer.yylloc),r.push(g[1]),p=null,d?(p=d,d=null):(l=this.lexer.yyleng,a=this.lexer.yytext,s=this.lexer.yylineno,u=this.lexer.yylloc,c>0&&c--);break;case 2:if(y=this.productions_[g[1]][1],S.$=n[n.length-y],S._$={first_line:o[o.length-(y||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(y||1)].first_column,last_column:o[o.length-1].last_column},h&&(S._$.range=[o[o.length-(y||1)].range[0],o[o.length-1].range[1]]),void 0!==(m=this.performAction.call(S,a,l,s,this.yy,g[1],n,o)))return m;y&&(r=r.slice(0,-1*y*2),n=n.slice(0,-1*y),o=o.slice(0,-1*y)),r.push(this.productions_[g[1]][0]),n.push(S.$),o.push(S._$),_=i[r[r.length-2]][r[r.length-1]],r.push(_);break;case 3:return!0}}return!0}},r=((e={EOF:1,parseError:function(e,t){if(this.yy.parser)this.yy.parser.parseError(e,t);else throw Error(e)},setInput:function(e){return this._input=e,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match=\"\",this.conditionStack=[\"INITIAL\"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e,e.match(/(?:\\r\\n?|\\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},unput:function(e){var t=e.length,r=e.split(/(?:\\r\\n?|\\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t-1),this.offset-=t;var n=this.match.split(/(?:\\r\\n?|\\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),r.length-1&&(this.yylineno-=r.length-1);var o=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:r?(r.length===n.length?this.yylloc.first_column:0)+n[n.length-r.length].length-r[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[o[0],o[0]+this.yyleng-t]),this},more:function(){return this._more=!0,this},less:function(e){this.unput(this.match.slice(e))},pastInput:function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?\"...\":\"\")+e.substr(-20).replace(/\\n/g,\"\")},upcomingInput:function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?\"...\":\"\")).replace(/\\n/g,\"\")},showPosition:function(){var e=this.pastInput(),t=Array(e.length+1).join(\"-\");return e+this.upcomingInput()+\"\\n\"+t+\"^\"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0),this._more||(this.yytext=\"\",this.match=\"\");for(var e,t,r,n,o,i=this._currentRules(),a=0;a<i.length&&(!(r=this._input.match(this.rules[i[a]]))||t&&!(r[0].length>t[0].length)||(t=r,n=a,this.options.flex));a++);return t?((o=t[0].match(/(?:\\r\\n?|\\n).*/g))&&(this.yylineno+=o.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:o?o[o.length-1].length-o[o.length-1].match(/\\r?\\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],e=this.performAction.call(this,this.yy,this,i[n],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),e)?e:void 0:\"\"===this._input?this.EOF:this.parseError(\"Lexical error on line \"+(this.yylineno+1)+\". Unrecognized text.\\n\"+this.showPosition(),{text:\"\",token:null,line:this.yylineno})},lex:function(){var e=this.next();return void 0!==e?e:this.lex()},begin:function(e){this.conditionStack.push(e)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(e){this.begin(e)}}).options={},e.performAction=function(e,t,r,n){function o(e,r){return t.yytext=t.yytext.substring(e,t.yyleng-r+e)}switch(r){case 0:if(\"\\\\\\\\\"===t.yytext.slice(-2)?(o(0,1),this.begin(\"mu\")):\"\\\\\"===t.yytext.slice(-1)?(o(0,1),this.begin(\"emu\")):this.begin(\"mu\"),t.yytext)return 15;break;case 1:case 5:return 15;case 2:return this.popState(),15;case 3:return this.begin(\"raw\"),15;case 4:if(this.popState(),\"raw\"===this.conditionStack[this.conditionStack.length-1])return 15;return o(5,9),\"END_RAW_BLOCK\";case 6:case 22:return this.popState(),14;case 7:return 65;case 8:return 68;case 9:return 19;case 10:return this.popState(),this.begin(\"raw\"),23;case 11:return 55;case 12:return 60;case 13:return 29;case 14:return 47;case 15:case 16:return this.popState(),44;case 17:return 34;case 18:return 39;case 19:return 51;case 20:case 23:return 48;case 21:this.unput(t.yytext),this.popState(),this.begin(\"com\");break;case 24:return 73;case 25:case 26:case 41:return 72;case 27:return 87;case 28:break;case 29:return this.popState(),54;case 30:return this.popState(),33;case 31:return t.yytext=o(1,2).replace(/\\\\\"/g,'\"'),80;case 32:return t.yytext=o(1,2).replace(/\\\\'/g,\"'\"),80;case 33:return 85;case 34:case 35:return 82;case 36:return 83;case 37:return 84;case 38:return 81;case 39:return 75;case 40:return 77;case 42:return t.yytext=t.yytext.replace(/\\\\([\\\\\\]])/g,\"$1\"),72;case 43:return\"INVALID\";case 44:return 5}},e.rules=[/^(?:[^\\x00]*?(?=(\\{\\{)))/,/^(?:[^\\x00]+)/,/^(?:[^\\x00]{2,}?(?=(\\{\\{|\\\\\\{\\{|\\\\\\\\\\{\\{|$)))/,/^(?:\\{\\{\\{\\{(?=[^/]))/,/^(?:\\{\\{\\{\\{\\/[^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=[=}\\s\\/.])\\}\\}\\}\\})/,/^(?:[^\\x00]+?(?=(\\{\\{\\{\\{)))/,/^(?:[\\s\\S]*?--(~)?\\}\\})/,/^(?:\\()/,/^(?:\\))/,/^(?:\\{\\{\\{\\{)/,/^(?:\\}\\}\\}\\})/,/^(?:\\{\\{(~)?>)/,/^(?:\\{\\{(~)?#>)/,/^(?:\\{\\{(~)?#\\*?)/,/^(?:\\{\\{(~)?\\/)/,/^(?:\\{\\{(~)?\\^\\s*(~)?\\}\\})/,/^(?:\\{\\{(~)?\\s*else\\s*(~)?\\}\\})/,/^(?:\\{\\{(~)?\\^)/,/^(?:\\{\\{(~)?\\s*else\\b)/,/^(?:\\{\\{(~)?\\{)/,/^(?:\\{\\{(~)?&)/,/^(?:\\{\\{(~)?!--)/,/^(?:\\{\\{(~)?![\\s\\S]*?\\}\\})/,/^(?:\\{\\{(~)?\\*?)/,/^(?:=)/,/^(?:\\.\\.)/,/^(?:\\.(?=([=~}\\s\\/.)|])))/,/^(?:[\\/.])/,/^(?:\\s+)/,/^(?:\\}(~)?\\}\\})/,/^(?:(~)?\\}\\})/,/^(?:\"(\\\\[\"]|[^\"])*\")/,/^(?:'(\\\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\\s)])))/,/^(?:false(?=([~}\\s)])))/,/^(?:undefined(?=([~}\\s)])))/,/^(?:null(?=([~}\\s)])))/,/^(?:-?[0-9]+(?:\\.[0-9]+)?(?=([~}\\s)])))/,/^(?:as\\s+\\|)/,/^(?:\\|)/,/^(?:([^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=([=~}\\s\\/.)|]))))/,/^(?:\\[(\\\\\\]|[^\\]])*\\])/,/^(?:.)/,/^(?:$)/],e.conditions={mu:{rules:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[6],inclusive:!1},raw:{rules:[3,4,5],inclusive:!1},INITIAL:{rules:[0,1,44],inclusive:!0}},e);function n(){this.yy={}}return t.lexer=r,n.prototype=t,t.Parser=n,new n}();tO.default=tI;var tN=tA(tO=tO.default),tM={};tM.__esModule=!0;var tT={};tT.__esModule=!0;var tR=(m=e$)&&m.__esModule?m:{default:m};function tB(){this.parents=[]}function tD(e){this.acceptRequired(e,\"path\"),this.acceptArray(e.params),this.acceptKey(e,\"hash\")}function tj(e){tD.call(this,e),this.acceptKey(e,\"program\"),this.acceptKey(e,\"inverse\")}function t$(e){this.acceptRequired(e,\"name\"),this.acceptArray(e.params),this.acceptKey(e,\"hash\")}tB.prototype={constructor:tB,mutating:!1,acceptKey:function(e,t){var r=this.accept(e[t]);if(this.mutating){if(r&&!tB.prototype[r.type])throw new tR.default('Unexpected node type \"'+r.type+'\" found when accepting '+t+\" on \"+e.type);e[t]=r}},acceptRequired:function(e,t){if(this.acceptKey(e,t),!e[t])throw new tR.default(e.type+\" requires \"+t)},acceptArray:function(e){for(var t=0,r=e.length;t<r;t++)this.acceptKey(e,t),!e[t]&&(e.splice(t,1),t--,r--)},accept:function(e){if(e){if(!this[e.type])throw new tR.default(\"Unknown type: \"+e.type,e);this.current&&this.parents.unshift(this.current),this.current=e;var t=this[e.type](e);if(this.current=this.parents.shift(),!this.mutating||t)return t;if(!1!==t)return e}},Program:function(e){this.acceptArray(e.body)},MustacheStatement:tD,Decorator:tD,BlockStatement:tj,DecoratorBlock:tj,PartialStatement:t$,PartialBlockStatement:function(e){t$.call(this,e),this.acceptKey(e,\"program\")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:tD,PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(e){this.acceptArray(e.pairs)},HashPair:function(e){this.acceptRequired(e,\"value\")}},tT.default=tB;var tH=(v=tT=tT.default)&&v.__esModule?v:{default:v};function tF(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.options=e}function tV(e,t,r){void 0===t&&(t=e.length);var n=e[t-1],o=e[t-2];return n?\"ContentStatement\"===n.type?(o||!r?/\\r?\\n\\s*?$/:/(^|\\r?\\n)\\s*?$/).test(n.original):void 0:r}function tq(e,t,r){void 0===t&&(t=-1);var n=e[t+1],o=e[t+2];return n?\"ContentStatement\"===n.type?(o||!r?/^\\s*?\\r?\\n/:/^\\s*?(\\r?\\n|$)/).test(n.original):void 0:r}function tU(e,t,r){var n=e[null==t?0:t+1];if(n&&\"ContentStatement\"===n.type&&(r||!n.rightStripped)){var o=n.value;n.value=n.value.replace(r?/^\\s+/:/^[ \\t]*\\r?\\n?/,\"\"),n.rightStripped=n.value!==o}}function tK(e,t,r){var n=e[null==t?e.length-1:t-1];if(n&&\"ContentStatement\"===n.type&&(r||!n.leftStripped)){var o=n.value;return n.value=n.value.replace(r?/\\s+$/:/[ \\t]+$/,\"\"),n.leftStripped=n.value!==o,n.leftStripped}}tF.prototype=new tH.default,tF.prototype.Program=function(e){var t=!this.options.ignoreStandalone,r=!this.isRootSeen;this.isRootSeen=!0;for(var n=e.body,o=0,i=n.length;o<i;o++){var a=n[o],s=this.accept(a);if(s){var l=tV(n,o,r),c=tq(n,o,r),u=s.openStandalone&&l,h=s.closeStandalone&&c,p=s.inlineStandalone&&l&&c;s.close&&tU(n,o,!0),s.open&&tK(n,o,!0),t&&p&&(tU(n,o),tK(n,o)&&\"PartialStatement\"===a.type&&(a.indent=/([ \\t]+$)/.exec(n[o-1].original)[1])),t&&u&&(tU((a.program||a.inverse).body),tK(n,o)),t&&h&&(tU(n,o),tK((a.inverse||a.program).body))}}return e},tF.prototype.BlockStatement=tF.prototype.DecoratorBlock=tF.prototype.PartialBlockStatement=function(e){this.accept(e.program),this.accept(e.inverse);var t=e.program||e.inverse,r=e.program&&e.inverse,n=r,o=r;if(r&&r.chained)for(n=r.body[0].program;o.chained;)o=o.body[o.body.length-1].program;var i={open:e.openStrip.open,close:e.closeStrip.close,openStandalone:tq(t.body),closeStandalone:tV((n||t).body)};if(e.openStrip.close&&tU(t.body,null,!0),r){var a=e.inverseStrip;a.open&&tK(t.body,null,!0),a.close&&tU(n.body,null,!0),e.closeStrip.open&&tK(o.body,null,!0),!this.options.ignoreStandalone&&tV(t.body)&&tq(n.body)&&(tK(t.body),tU(n.body))}else e.closeStrip.open&&tK(t.body,null,!0);return i},tF.prototype.Decorator=tF.prototype.MustacheStatement=function(e){return e.strip},tF.prototype.PartialStatement=tF.prototype.CommentStatement=function(e){var t=e.strip||{};return{inlineStandalone:!0,open:t.open,close:t.close}},tM.default=tF;var tG=tA(tM=tM.default),tW={};t(tW,\"__esModule\",()=>et,e=>et=e),t(tW,\"SourceLocation\",()=>er,e=>er=e),t(tW,\"id\",()=>en,e=>en=e),t(tW,\"stripFlags\",()=>eo,e=>eo=e),t(tW,\"stripComment\",()=>ei,e=>ei=e),t(tW,\"preparePath\",()=>ea,e=>ea=e),t(tW,\"prepareMustache\",()=>es,e=>es=e),t(tW,\"prepareRawBlock\",()=>el,e=>el=e),t(tW,\"prepareBlock\",()=>ec,e=>ec=e),t(tW,\"prepareProgram\",()=>eu,e=>eu=e),t(tW,\"preparePartialBlock\",()=>eh,e=>eh=e),et=!0,er=function(e,t){this.source=e,this.start={line:t.first_line,column:t.first_column},this.end={line:t.last_line,column:t.last_column}},en=function(e){return/^\\[.*\\]$/.test(e)?e.substring(1,e.length-1):e},eo=function(e,t){return{open:\"~\"===e.charAt(2),close:\"~\"===t.charAt(t.length-3)}},ei=function(e){return e.replace(/^\\{\\{~?!-?-?/,\"\").replace(/-?-?~?\\}\\}$/,\"\")},ea=function(e,t,r){r=this.locInfo(r);for(var n=e?\"@\":\"\",o=[],i=0,a=0,s=t.length;a<s;a++){var l=t[a].part,c=t[a].original!==l;if(n+=(t[a].separator||\"\")+l,c||\"..\"!==l&&\".\"!==l&&\"this\"!==l)o.push(l);else{if(o.length>0)throw new tJ.default(\"Invalid path: \"+n,{loc:r});\"..\"===l&&i++}}return{type:\"PathExpression\",data:e,depth:i,parts:o,original:n,loc:r}},es=function(e,t,r,n,o,i){var a=n.charAt(3)||n.charAt(2);return{type:/\\*/.test(n)?\"Decorator\":\"MustacheStatement\",path:e,params:t,hash:r,escaped:\"{\"!==a&&\"&\"!==a,strip:o,loc:this.locInfo(i)}},el=function(e,t,r,n){tz(e,r);var o={type:\"Program\",body:t,strip:{},loc:n=this.locInfo(n)};return{type:\"BlockStatement\",path:e.path,params:e.params,hash:e.hash,program:o,openStrip:{},inverseStrip:{},closeStrip:{},loc:n}},ec=function(e,t,r,n,o,i){n&&n.path&&tz(e,n);var a=/\\*/.test(e.open);t.blockParams=e.blockParams;var s=void 0,l=void 0;if(r){if(a)throw new tJ.default(\"Unexpected inverse block on decorator\",r);r.chain&&(r.program.body[0].closeStrip=n.strip),l=r.strip,s=r.program}return o&&(o=s,s=t,t=o),{type:a?\"DecoratorBlock\":\"BlockStatement\",path:e.path,params:e.params,hash:e.hash,program:t,inverse:s,openStrip:e.strip,inverseStrip:l,closeStrip:n&&n.strip,loc:this.locInfo(i)}},eu=function(e,t){if(!t&&e.length){var r=e[0].loc,n=e[e.length-1].loc;r&&n&&(t={source:r.source,start:{line:r.start.line,column:r.start.column},end:{line:n.end.line,column:n.end.column}})}return{type:\"Program\",body:e,strip:{},loc:t}},eh=function(e,t,r,n){return tz(e,r),{type:\"PartialBlockStatement\",name:e.path,params:e.params,hash:e.hash,program:t,openStrip:e.strip,closeStrip:r&&r.strip,loc:this.locInfo(n)}};var tJ=(y=e$)&&y.__esModule?y:{default:y};function tz(e,t){if(t=t.path?t.path.original:t,e.path.original!==t){var r={loc:e.path.loc};throw new tJ.default(e.path.original+\" doesn't match \"+t,r)}}var tX=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(tW);ee=tN.default;var tY={};function tZ(e,t){return\"Program\"===e.type?e:(tN.default.yy=tY,tY.locInfo=function(e){return new tY.SourceLocation(t&&t.srcName,e)},tN.default.parse(e))}function tQ(e,t){var r=tZ(e,t);return new tG.default(t).accept(r)}function t2(e){return e&&e.__esModule?e:{default:e}}A(tY,tX),ep=function(e,t,r){if(null==e||\"string\"!=typeof e&&\"Program\"!==e.type)throw new t1.default(\"You must pass a string or Handlebars AST to Handlebars.precompile. You passed \"+e);\"data\"in(t=t||{})||(t.data=!0),t.compat&&(t.useDepths=!0);var n=r.parse(e,t),o=new r.Compiler().compile(n,t);return new r.JavaScriptCompiler().compile(o,t)},ed=function(e,t,r){if(void 0===t&&(t={}),null==e||\"string\"!=typeof e&&\"Program\"!==e.type)throw new t1.default(\"You must pass a string or Handlebars AST to Handlebars.compile. You passed \"+e);\"data\"in(t=A({},t))||(t.data=!0),t.compat&&(t.useDepths=!0);var n=void 0;function o(){var n=r.parse(e,t),o=new r.Compiler().compile(n,t),i=new r.JavaScriptCompiler().compile(o,t,void 0,!0);return r.template(i)}function i(e,t){return n||(n=o()),n.call(this,e,t)}return i._setup=function(e){return n||(n=o()),n._setup(e)},i._child=function(e,t,r,i){return n||(n=o()),n._child(e,t,r,i)},i};var t1=t2(e$),t0=t2(tC),t3=[].slice;function t4(){}function t8(e){if(!e.path.parts){var t=e.path;e.path={type:\"PathExpression\",data:!1,depth:0,parts:[t.original+\"\"],original:t.original+\"\",loc:t.loc}}}t4.prototype={compiler:t4,equals:function(e){var t=this.opcodes.length;if(e.opcodes.length!==t)return!1;for(var r=0;r<t;r++){var n=this.opcodes[r],o=e.opcodes[r];if(n.opcode!==o.opcode||!function e(t,r){if(t===r)return!0;if(j(t)&&j(r)&&t.length===r.length){for(var n=0;n<t.length;n++)if(!e(t[n],r[n]))return!1;return!0}}(n.args,o.args))return!1}t=this.children.length;for(var r=0;r<t;r++)if(!this.children[r].equals(e.children[r]))return!1;return!0},guid:0,compile:function(e,t){return this.sourceNode=[],this.opcodes=[],this.children=[],this.options=t,this.stringParams=t.stringParams,this.trackIds=t.trackIds,t.blockParams=t.blockParams||[],t.knownHelpers=A(Object.create(null),{helperMissing:!0,blockHelperMissing:!0,each:!0,if:!0,unless:!0,with:!0,log:!0,lookup:!0},t.knownHelpers),this.accept(e)},compileProgram:function(e){var t=new this.compiler().compile(e,this.options),r=this.guid++;return this.usePartial=this.usePartial||t.usePartial,this.children[r]=t,this.useDepths=this.useDepths||t.useDepths,r},accept:function(e){if(!this[e.type])throw new t1.default(\"Unknown type: \"+e.type,e);this.sourceNode.unshift(e);var t=this[e.type](e);return this.sourceNode.shift(),t},Program:function(e){this.options.blockParams.unshift(e.blockParams);for(var t=e.body,r=t.length,n=0;n<r;n++)this.accept(t[n]);return this.options.blockParams.shift(),this.isSimple=1===r,this.blockParams=e.blockParams?e.blockParams.length:0,this},BlockStatement:function(e){t8(e);var t=e.program,r=e.inverse;t=t&&this.compileProgram(t),r=r&&this.compileProgram(r);var n=this.classifySexpr(e);\"helper\"===n?this.helperSexpr(e,t,r):\"simple\"===n?(this.simpleSexpr(e),this.opcode(\"pushProgram\",t),this.opcode(\"pushProgram\",r),this.opcode(\"emptyHash\"),this.opcode(\"blockValue\",e.path.original)):(this.ambiguousSexpr(e,t,r),this.opcode(\"pushProgram\",t),this.opcode(\"pushProgram\",r),this.opcode(\"emptyHash\"),this.opcode(\"ambiguousBlockValue\")),this.opcode(\"append\")},DecoratorBlock:function(e){var t=e.program&&this.compileProgram(e.program),r=this.setupFullMustacheParams(e,t,void 0),n=e.path;this.useDecorators=!0,this.opcode(\"registerDecorator\",r.length,n.original)},PartialStatement:function(e){this.usePartial=!0;var t=e.program;t&&(t=this.compileProgram(e.program));var r=e.params;if(r.length>1)throw new t1.default(\"Unsupported number of partial arguments: \"+r.length,e);r.length||(this.options.explicitPartialContext?this.opcode(\"pushLiteral\",\"undefined\"):r.push({type:\"PathExpression\",parts:[],depth:0}));var n=e.name.original,o=\"SubExpression\"===e.name.type;o&&this.accept(e.name),this.setupFullMustacheParams(e,t,void 0,!0);var i=e.indent||\"\";this.options.preventIndent&&i&&(this.opcode(\"appendContent\",i),i=\"\"),this.opcode(\"invokePartial\",o,n,i),this.opcode(\"append\")},PartialBlockStatement:function(e){this.PartialStatement(e)},MustacheStatement:function(e){this.SubExpression(e),e.escaped&&!this.options.noEscape?this.opcode(\"appendEscaped\"):this.opcode(\"append\")},Decorator:function(e){this.DecoratorBlock(e)},ContentStatement:function(e){e.value&&this.opcode(\"appendContent\",e.value)},CommentStatement:function(){},SubExpression:function(e){t8(e);var t=this.classifySexpr(e);\"simple\"===t?this.simpleSexpr(e):\"helper\"===t?this.helperSexpr(e):this.ambiguousSexpr(e)},ambiguousSexpr:function(e,t,r){var n=e.path,o=n.parts[0];this.opcode(\"getContext\",n.depth),this.opcode(\"pushProgram\",t),this.opcode(\"pushProgram\",r),n.strict=!0,this.accept(n),this.opcode(\"invokeAmbiguous\",o,null!=t||null!=r)},simpleSexpr:function(e){var t=e.path;t.strict=!0,this.accept(t),this.opcode(\"resolvePossibleLambda\")},helperSexpr:function(e,t,r){var n=this.setupFullMustacheParams(e,t,r),o=e.path,i=o.parts[0];if(this.options.knownHelpers[i])this.opcode(\"invokeKnownHelper\",n.length,i);else if(this.options.knownHelpersOnly)throw new t1.default(\"You specified knownHelpersOnly, but used the unknown helper \"+i,e);else o.strict=!0,o.falsy=!0,this.accept(o),this.opcode(\"invokeHelper\",n.length,o.original,t0.default.helpers.simpleId(o))},PathExpression:function(e){this.addDepth(e.depth),this.opcode(\"getContext\",e.depth);var t=e.parts[0],r=t0.default.helpers.scopedId(e),n=!e.depth&&!r&&this.blockParamIndex(t);n?this.opcode(\"lookupBlockParam\",n,e.parts):t?e.data?(this.options.data=!0,this.opcode(\"lookupData\",e.depth,e.parts,e.strict)):this.opcode(\"lookupOnContext\",e.parts,e.falsy,e.strict,r):this.opcode(\"pushContext\")},StringLiteral:function(e){this.opcode(\"pushString\",e.value)},NumberLiteral:function(e){this.opcode(\"pushLiteral\",e.value)},BooleanLiteral:function(e){this.opcode(\"pushLiteral\",e.value)},UndefinedLiteral:function(){this.opcode(\"pushLiteral\",\"undefined\")},NullLiteral:function(){this.opcode(\"pushLiteral\",\"null\")},Hash:function(e){var t=e.pairs,r=0,n=t.length;for(this.opcode(\"pushHash\");r<n;r++)this.pushParam(t[r].value);for(;r--;)this.opcode(\"assignToHash\",t[r].key);this.opcode(\"popHash\")},opcode:function(e){this.opcodes.push({opcode:e,args:t3.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(e){e&&(this.useDepths=!0)},classifySexpr:function(e){var t=t0.default.helpers.simpleId(e.path),r=t&&!!this.blockParamIndex(e.path.parts[0]),n=!r&&t0.default.helpers.helperExpression(e),o=!r&&(n||t);if(o&&!n){var i=e.path.parts[0],a=this.options;a.knownHelpers[i]?n=!0:a.knownHelpersOnly&&(o=!1)}return n?\"helper\":o?\"ambiguous\":\"simple\"},pushParams:function(e){for(var t=0,r=e.length;t<r;t++)this.pushParam(e[t])},pushParam:function(e){var t=null!=e.value?e.value:e.original||\"\";if(this.stringParams)t.replace&&(t=t.replace(/^(\\.?\\.\\/)*/g,\"\").replace(/\\//g,\".\")),e.depth&&this.addDepth(e.depth),this.opcode(\"getContext\",e.depth||0),this.opcode(\"pushStringParam\",t,e.type),\"SubExpression\"===e.type&&this.accept(e);else{if(this.trackIds){var r=void 0;if(!e.parts||t0.default.helpers.scopedId(e)||e.depth||(r=this.blockParamIndex(e.parts[0])),r){var n=e.parts.slice(1).join(\".\");this.opcode(\"pushId\",\"BlockParam\",r,n)}else(t=e.original||t).replace&&(t=t.replace(/^this(?:\\.|$)/,\"\").replace(/^\\.\\//,\"\").replace(/^\\.$/,\"\")),this.opcode(\"pushId\",e.type,t)}this.accept(e)}},setupFullMustacheParams:function(e,t,r,n){var o=e.params;return this.pushParams(o),this.opcode(\"pushProgram\",t),this.opcode(\"pushProgram\",r),e.hash?this.accept(e.hash):this.opcode(\"emptyHash\",n),o},blockParamIndex:function(e){for(var t=0,r=this.options.blockParams.length;t<r;t++){var n=this.options.blockParams[t],o=n&&O(n,e);if(n&&o>=0)return[t,o]}}};var t5={};function t7(e){return e&&e.__esModule?e:{default:e}}t5.__esModule=!0;var t6=t7(e$),t9={};t9.__esModule=!0;var re=void 0;try{\"function\"==typeof define&&define.amd||(re=ev(\"ieWO2\").SourceNode)}catch(e){}function rt(e,t,r){if(j(e)){for(var n=[],o=0,i=e.length;o<i;o++)n.push(t.wrap(e[o],r));return n}return\"boolean\"==typeof e||\"number\"==typeof e?e+\"\":e}function rr(e){this.srcFile=e,this.source=[]}re||((re=function(e,t,r,n){this.src=\"\",n&&this.add(n)}).prototype={add:function(e){j(e)&&(e=e.join(\"\")),this.src+=e},prepend:function(e){j(e)&&(e=e.join(\"\")),this.src=e+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),rr.prototype={isEmpty:function(){return!this.source.length},prepend:function(e,t){this.source.unshift(this.wrap(e,t))},push:function(e,t){this.source.push(this.wrap(e,t))},merge:function(){var e=this.empty();return this.each(function(t){e.add([\"  \",t,\"\\n\"])}),e},each:function(e){for(var t=0,r=this.source.length;t<r;t++)e(this.source[t])},empty:function(){var e=this.currentLocation||{start:{}};return new re(e.start.line,e.start.column,this.srcFile)},wrap:function(e){var t=arguments.length<=1||void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return e instanceof re?e:(e=rt(e,this,t),new re(t.start.line,t.start.column,this.srcFile,e))},functionCall:function(e,t,r){return r=this.generateList(r),this.wrap([e,t?\".\"+t+\"(\":\"(\",r,\")\"])},quotedString:function(e){return'\"'+(e+\"\").replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/\\u2028/g,\"\\\\u2028\").replace(/\\u2029/g,\"\\\\u2029\")+'\"'},objectLiteral:function(e){var t=this,r=[];Object.keys(e).forEach(function(n){var o=rt(e[n],t);\"undefined\"!==o&&r.push([t.quotedString(n),\":\",o])});var n=this.generateList(r);return n.prepend(\"{\"),n.add(\"}\"),n},generateList:function(e){for(var t=this.empty(),r=0,n=e.length;r<n;r++)r&&t.add(\",\"),t.add(rt(e[r],this));return t},generateArray:function(e){var t=this.generateList(e);return t.prepend(\"[\"),t.add(\"]\"),t}},t9.default=rr;var rn=t7(t9=t9.default);function ro(e){this.value=e}function ri(){}ri.prototype={nameLookup:function(e,t){return this.internalNameLookup(e,t)},depthedLookup:function(e){return[this.aliasable(\"container.lookup\"),\"(depths, \",JSON.stringify(e),\")\"]},compilerInfo:function(){var e=b,t=E[e];return[e,t]},appendToBuffer:function(e,t,r){return(j(e)||(e=[e]),e=this.source.wrap(e,t),this.environment.isSimple)?[\"return \",e,\";\"]:r?[\"buffer += \",e,\";\"]:(e.appendToBuffer=!0,e)},initializeBuffer:function(){return this.quotedString(\"\")},internalNameLookup:function(e,t){return this.lookupPropertyFunctionIsUsed=!0,[\"lookupProperty(\",e,\",\",JSON.stringify(t),\")\"]},lookupPropertyFunctionIsUsed:!1,compile:function(e,t,r,n){this.environment=e,this.options=t,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!n,this.name=this.environment.name,this.isChild=!!r,this.context=r||{decorators:[],programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(e,t),this.useDepths=this.useDepths||e.useDepths||e.useDecorators||this.options.compat,this.useBlockParams=this.useBlockParams||e.useBlockParams;var o=e.opcodes,i=void 0,a=void 0,s=void 0,l=void 0;for(s=0,l=o.length;s<l;s++)i=o[s],this.source.currentLocation=i.loc,a=a||i.loc,this[i.opcode].apply(this,i.args);if(this.source.currentLocation=a,this.pushSource(\"\"),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new t6.default(\"Compile completed with content left on stack\");this.decorators.isEmpty()?this.decorators=void 0:(this.useDecorators=!0,this.decorators.prepend([\"var decorators = container.decorators, \",this.lookupPropertyFunctionVarDeclaration(),\";\\n\"]),this.decorators.push(\"return fn;\"),n?this.decorators=Function.apply(this,[\"fn\",\"props\",\"container\",\"depth0\",\"data\",\"blockParams\",\"depths\",this.decorators.merge()]):(this.decorators.prepend(\"function(fn, props, container, depth0, data, blockParams, depths) {\\n\"),this.decorators.push(\"}\\n\"),this.decorators=this.decorators.merge()));var c=this.createFunctionContext(n);if(this.isChild)return c;var u={compiler:this.compilerInfo(),main:c};this.decorators&&(u.main_d=this.decorators,u.useDecorators=!0);var h=this.context,p=h.programs,d=h.decorators;for(s=0,l=p.length;s<l;s++)p[s]&&(u[s]=p[s],d[s]&&(u[s+\"_d\"]=d[s],u.useDecorators=!0));return this.environment.usePartial&&(u.usePartial=!0),this.options.data&&(u.useData=!0),this.useDepths&&(u.useDepths=!0),this.useBlockParams&&(u.useBlockParams=!0),this.options.compat&&(u.compat=!0),n?u.compilerOptions=this.options:(u.compiler=JSON.stringify(u.compiler),this.source.currentLocation={start:{line:1,column:0}},u=this.objectLiteral(u),t.srcName?(u=u.toStringWithSourceMap({file:t.destName})).map=u.map&&u.map.toString():u=u.toString()),u},preamble:function(){this.lastContext=0,this.source=new rn.default(this.options.srcName),this.decorators=new rn.default(this.options.srcName)},createFunctionContext:function(e){var t=this,r=\"\",n=this.stackVars.concat(this.registers.list);n.length>0&&(r+=\", \"+n.join(\", \"));var o=0;Object.keys(this.aliases).forEach(function(e){var n=t.aliases[e];n.children&&n.referenceCount>1&&(r+=\", alias\"+ ++o+\"=\"+e,n.children[0]=\"alias\"+o)}),this.lookupPropertyFunctionIsUsed&&(r+=\", \"+this.lookupPropertyFunctionVarDeclaration());var i=[\"container\",\"depth0\",\"helpers\",\"partials\",\"data\"];(this.useBlockParams||this.useDepths)&&i.push(\"blockParams\"),this.useDepths&&i.push(\"depths\");var a=this.mergeSource(r);return e?(i.push(a),Function.apply(this,i)):this.source.wrap([\"function(\",i.join(\",\"),\") {\\n  \",a,\"}\"])},mergeSource:function(e){var t=this.environment.isSimple,r=!this.forceBuffer,n=void 0,o=void 0,i=void 0,a=void 0;return this.source.each(function(e){e.appendToBuffer?(i?e.prepend(\"  + \"):i=e,a=e):(i&&(o?i.prepend(\"buffer += \"):n=!0,a.add(\";\"),i=a=void 0),o=!0,t||(r=!1))}),r?i?(i.prepend(\"return \"),a.add(\";\")):o||this.source.push('return \"\";'):(e+=\", buffer = \"+(n?\"\":this.initializeBuffer()),i?(i.prepend(\"return buffer + \"),a.add(\";\")):this.source.push(\"return buffer;\")),e&&this.source.prepend(\"var \"+e.substring(2)+(n?\"\":\";\\n\")),this.source.merge()},lookupPropertyFunctionVarDeclaration:function(){return\"\\n      lookupProperty = container.lookupProperty || function(parent, propertyName) {\\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\\n          return parent[propertyName];\\n        }\\n        return undefined\\n    }\\n    \".trim()},blockValue:function(e){var t=this.aliasable(\"container.hooks.blockHelperMissing\"),r=[this.contextName(0)];this.setupHelperArgs(e,0,r);var n=this.popStack();r.splice(1,0,n),this.push(this.source.functionCall(t,\"call\",r))},ambiguousBlockValue:function(){var e=this.aliasable(\"container.hooks.blockHelperMissing\"),t=[this.contextName(0)];this.setupHelperArgs(\"\",0,t,!0),this.flushInline();var r=this.topStack();t.splice(1,0,r),this.pushSource([\"if (!\",this.lastHelper,\") { \",r,\" = \",this.source.functionCall(e,\"call\",t),\"}\"])},appendContent:function(e){this.pendingContent?e=this.pendingContent+e:this.pendingLocation=this.source.currentLocation,this.pendingContent=e},append:function(){if(this.isInline())this.replaceStack(function(e){return[\" != null ? \",e,' : \"\"']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var e=this.popStack();this.pushSource([\"if (\",e,\" != null) { \",this.appendToBuffer(e,void 0,!0),\" }\"]),this.environment.isSimple&&this.pushSource([\"else { \",this.appendToBuffer(\"''\",void 0,!0),\" }\"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable(\"container.escapeExpression\"),\"(\",this.popStack(),\")\"]))},getContext:function(e){this.lastContext=e},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(e,t,r,n){var o=0;n||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(e[o++])),this.resolvePath(\"context\",e,o,t,r)},lookupBlockParam:function(e,t){this.useBlockParams=!0,this.push([\"blockParams[\",e[0],\"][\",e[1],\"]\"]),this.resolvePath(\"context\",t,1)},lookupData:function(e,t,r){e?this.pushStackLiteral(\"container.data(data, \"+e+\")\"):this.pushStackLiteral(\"data\"),this.resolvePath(\"data\",t,0,!0,r)},resolvePath:function(e,t,r,n,o){var i=this;if(this.options.strict||this.options.assumeObjects){this.push(function(e,t,r,n,o){var i=t.popStack(),a=r.length;for(e&&a--;n<a;n++)i=t.nameLookup(i,r[n],o);return e?[t.aliasable(\"container.strict\"),\"(\",i,\", \",t.quotedString(r[n]),\", \",JSON.stringify(t.source.currentLocation),\" )\"]:i}(this.options.strict&&o,this,t,r,e));return}for(var a=t.length;r<a;r++)this.replaceStack(function(o){var a=i.nameLookup(o,t[r],e);return n?[\" && \",a]:[\" != null ? \",a,\" : \",o]})},resolvePossibleLambda:function(){this.push([this.aliasable(\"container.lambda\"),\"(\",this.popStack(),\", \",this.contextName(0),\")\"])},pushStringParam:function(e,t){this.pushContext(),this.pushString(t),\"SubExpression\"!==t&&(\"string\"==typeof e?this.pushString(e):this.pushStackLiteral(e))},emptyHash:function(e){this.trackIds&&this.push(\"{}\"),this.stringParams&&(this.push(\"{}\"),this.push(\"{}\")),this.pushStackLiteral(e?\"undefined\":\"{}\")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:{},types:[],contexts:[],ids:[]}},popHash:function(){var e=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(e.ids)),this.stringParams&&(this.push(this.objectLiteral(e.contexts)),this.push(this.objectLiteral(e.types))),this.push(this.objectLiteral(e.values))},pushString:function(e){this.pushStackLiteral(this.quotedString(e))},pushLiteral:function(e){this.pushStackLiteral(e)},pushProgram:function(e){null!=e?this.pushStackLiteral(this.programExpression(e)):this.pushStackLiteral(null)},registerDecorator:function(e,t){var r=this.nameLookup(\"decorators\",t,\"decorator\"),n=this.setupHelperArgs(t,e);this.decorators.push([\"fn = \",this.decorators.functionCall(r,\"\",[\"fn\",\"props\",\"container\",n]),\" || fn;\"])},invokeHelper:function(e,t,r){var n=this.popStack(),o=this.setupHelper(e,t),i=[];r&&i.push(o.name),i.push(n),this.options.strict||i.push(this.aliasable(\"container.hooks.helperMissing\"));var a=[\"(\",this.itemsSeparatedBy(i,\"||\"),\")\"],s=this.source.functionCall(a,\"call\",o.callParams);this.push(s)},itemsSeparatedBy:function(e,t){var r=[];r.push(e[0]);for(var n=1;n<e.length;n++)r.push(t,e[n]);return r},invokeKnownHelper:function(e,t){var r=this.setupHelper(e,t);this.push(this.source.functionCall(r.name,\"call\",r.callParams))},invokeAmbiguous:function(e,t){this.useRegister(\"helper\");var r=this.popStack();this.emptyHash();var n=this.setupHelper(0,e,t),o=[\"(\",\"(helper = \",this.lastHelper=this.nameLookup(\"helpers\",e,\"helper\"),\" || \",r,\")\"];this.options.strict||(o[0]=\"(helper = \",o.push(\" != null ? helper : \",this.aliasable(\"container.hooks.helperMissing\"))),this.push([\"(\",o,n.paramsInit?[\"),(\",n.paramsInit]:[],\"),\",\"(typeof helper === \",this.aliasable('\"function\"'),\" ? \",this.source.functionCall(\"helper\",\"call\",n.callParams),\" : helper))\"])},invokePartial:function(e,t,r){var n=[],o=this.setupParams(t,1,n);e&&(t=this.popStack(),delete o.name),r&&(o.indent=JSON.stringify(r)),o.helpers=\"helpers\",o.partials=\"partials\",o.decorators=\"container.decorators\",e?n.unshift(t):n.unshift(this.nameLookup(\"partials\",t,\"partial\")),this.options.compat&&(o.depths=\"depths\"),o=this.objectLiteral(o),n.push(o),this.push(this.source.functionCall(\"container.invokePartial\",\"\",n))},assignToHash:function(e){var t=this.popStack(),r=void 0,n=void 0,o=void 0;this.trackIds&&(o=this.popStack()),this.stringParams&&(n=this.popStack(),r=this.popStack());var i=this.hash;r&&(i.contexts[e]=r),n&&(i.types[e]=n),o&&(i.ids[e]=o),i.values[e]=t},pushId:function(e,t,r){\"BlockParam\"===e?this.pushStackLiteral(\"blockParams[\"+t[0]+\"].path[\"+t[1]+\"]\"+(r?\" + \"+JSON.stringify(\".\"+r):\"\")):\"PathExpression\"===e?this.pushString(t):\"SubExpression\"===e?this.pushStackLiteral(\"true\"):this.pushStackLiteral(\"null\")},compiler:ri,compileChildren:function(e,t){for(var r=e.children,n=void 0,o=void 0,i=0,a=r.length;i<a;i++){n=r[i],o=new this.compiler;var s=this.matchExistingProgram(n);if(null==s){this.context.programs.push(\"\");var l=this.context.programs.length;n.index=l,n.name=\"program\"+l,this.context.programs[l]=o.compile(n,t,this.context,!this.precompile),this.context.decorators[l]=o.decorators,this.context.environments[l]=n,this.useDepths=this.useDepths||o.useDepths,this.useBlockParams=this.useBlockParams||o.useBlockParams,n.useDepths=this.useDepths,n.useBlockParams=this.useBlockParams}else n.index=s.index,n.name=\"program\"+s.index,this.useDepths=this.useDepths||s.useDepths,this.useBlockParams=this.useBlockParams||s.useBlockParams}},matchExistingProgram:function(e){for(var t=0,r=this.context.environments.length;t<r;t++){var n=this.context.environments[t];if(n&&n.equals(e))return n}},programExpression:function(e){var t=this.environment.children[e],r=[t.index,\"data\",t.blockParams];return(this.useBlockParams||this.useDepths)&&r.push(\"blockParams\"),this.useDepths&&r.push(\"depths\"),\"container.program(\"+r.join(\", \")+\")\"},useRegister:function(e){this.registers[e]||(this.registers[e]=!0,this.registers.list.push(e))},push:function(e){return e instanceof ro||(e=this.source.wrap(e)),this.inlineStack.push(e),e},pushStackLiteral:function(e){this.push(new ro(e))},pushSource:function(e){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),e&&this.source.push(e)},replaceStack:function(e){var t=[\"(\"],r=void 0,n=void 0,o=void 0;if(!this.isInline())throw new t6.default(\"replaceStack on non-inline\");var i=this.popStack(!0);if(i instanceof ro)t=[\"(\",r=[i.value]],o=!0;else{n=!0;var a=this.incrStack();t=[\"((\",this.push(a),\" = \",i,\")\"],r=this.topStack()}var s=e.call(this,r);o||this.popStack(),n&&this.stackSlot--,this.push(t.concat(s,\")\"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push(\"stack\"+this.stackSlot),this.topStackName()},topStackName:function(){return\"stack\"+this.stackSlot},flushInline:function(){var e=this.inlineStack;this.inlineStack=[];for(var t=0,r=e.length;t<r;t++){var n=e[t];if(n instanceof ro)this.compileStack.push(n);else{var o=this.incrStack();this.pushSource([o,\" = \",n,\";\"]),this.compileStack.push(o)}}},isInline:function(){return this.inlineStack.length},popStack:function(e){var t=this.isInline(),r=(t?this.inlineStack:this.compileStack).pop();if(!e&&r instanceof ro)return r.value;if(!t){if(!this.stackSlot)throw new t6.default(\"Invalid stack pop\");this.stackSlot--}return r},topStack:function(){var e=this.isInline()?this.inlineStack:this.compileStack,t=e[e.length-1];return t instanceof ro?t.value:t},contextName:function(e){return this.useDepths&&e?\"depths[\"+e+\"]\":\"depth\"+e},quotedString:function(e){return this.source.quotedString(e)},objectLiteral:function(e){return this.source.objectLiteral(e)},aliasable:function(e){var t=this.aliases[e];return t?t.referenceCount++:((t=this.aliases[e]=this.source.wrap(e)).aliasable=!0,t.referenceCount=1),t},setupHelper:function(e,t,r){var n=[],o=this.setupHelperArgs(t,e,n,r);return{params:n,paramsInit:o,name:this.nameLookup(\"helpers\",t,\"helper\"),callParams:[this.aliasable(this.contextName(0)+\" != null ? \"+this.contextName(0)+\" : (container.nullContext || {})\")].concat(n)}},setupParams:function(e,t,r){var n={},o=[],i=[],a=[],s=!r,l=void 0;s&&(r=[]),n.name=this.quotedString(e),n.hash=this.popStack(),this.trackIds&&(n.hashIds=this.popStack()),this.stringParams&&(n.hashTypes=this.popStack(),n.hashContexts=this.popStack());var c=this.popStack(),u=this.popStack();(u||c)&&(n.fn=u||\"container.noop\",n.inverse=c||\"container.noop\");for(var h=t;h--;)l=this.popStack(),r[h]=l,this.trackIds&&(a[h]=this.popStack()),this.stringParams&&(i[h]=this.popStack(),o[h]=this.popStack());return s&&(n.args=this.source.generateArray(r)),this.trackIds&&(n.ids=this.source.generateArray(a)),this.stringParams&&(n.types=this.source.generateArray(i),n.contexts=this.source.generateArray(o)),this.options.data&&(n.data=\"data\"),this.useBlockParams&&(n.blockParams=\"blockParams\"),n},setupHelperArgs:function(e,t,r,n){var o=this.setupParams(e,t,r);return(o.loc=JSON.stringify(this.source.currentLocation),o=this.objectLiteral(o),n)?(this.useRegister(\"options\"),r.push(\"options\"),[\"options=\",o]):r?(r.push(o),\"\"):o}},function(){for(var e=\"break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false\".split(\" \"),t=ri.RESERVED_WORDS={},r=0,n=e.length;r<n;r++)t[e[r]]=!0}(),ri.isValidJavaScriptVariableName=function(e){return!ri.RESERVED_WORDS[e]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(e)},t5.default=ri;var ra=eE(t5=t5.default),rs=eE(tT),rl=eE(tS),rc=tx.default.create;function ru(){var e=rc();return e.compile=function(t,r){return ed(t,r,e)},e.precompile=function(t,r){return ep(t,r,e)},e.AST=tL.default,e.Compiler=t4,e.JavaScriptCompiler=ra.default,e.Parser=ee,e.parse=tQ,e.parseWithoutProcessing=tZ,e}var rh=ru();function rp(e){let t=document.getElementById(\"modal-background\"),r=document.getElementById(\"modal\"),n=document.getElementById(\"modal-content\");t.classList.add(\"visible\"),r.classList.add(\"visible\"),n.appendChild(e.cloneNode(!0)),document.body.style.overflow=\"hidden\"}function rd(){let e=document.getElementById(\"modal-background\"),t=document.getElementById(\"modal\"),r=document.getElementById(\"modal-content\");e.classList.remove(\"visible\"),t.classList.remove(\"visible\"),document.body.style.overflow=\"auto\",0==window.location.hash.indexOf(\"#type-\")&&history.pushState(\"\",document.title,window.location.pathname),setTimeout(()=>{r.innerHTML=\"\"},200)}rh.create=ru,rl.default(rh),rh.Visitor=rs.default,rh.default=rh,ew.default=rh,ew=ew.default;const rf=function(t,r){clearTimeout(e),e=setTimeout(t,r)};var rg=class{constructor(e,t,r){this.libdoc=e,this.storage=t,this.translations=r,this.initTemplating(r)}initTemplating(e){r(ew).registerHelper(\"t\",function(t){return e.translate(t)}),r(ew).registerHelper(\"encodeURIComponent\",function(e){return encodeURIComponent(e)}),r(ew).registerHelper(\"ifEquals\",function(e,t,r){return e==t?r.fn(this):r.inverse(this)}),r(ew).registerHelper(\"ifNotNull\",function(e,t){return null!==e?t.fn(this):t.inverse(this)}),r(ew).registerHelper(\"ifContains\",function(e,t,r){return -1!=e.indexOf(t)?r.fn(this):r.inverse(this)}),this.registerPartial(\"arg\",\"argument-template\"),this.registerPartial(\"typeInfo\",\"type-info-template\"),this.registerPartial(\"keyword\",\"keyword-template\"),this.registerPartial(\"dataType\",\"data-type-template\")}registerPartial(e,t){let n=document.getElementById(t)?.innerHTML;r(ew).registerPartial(e,r(ew).compile(n))}render(){document.title=this.libdoc.name,this.setTheme(),this.renderTemplates(),this.initTagSearch(),this.initHashEvents(),this.initLanguageMenu(),setTimeout(()=>{\"open\"===this.storage.get(\"keyword-wall\")&&this.openKeywordWall()},0),function(){let e=document.createElement(\"div\");e.id=\"modal-background\",e.classList.add(\"modal-background\"),e.addEventListener(\"click\",({target:e})=>{e?.id===\"modal-background\"&&rd()});let t=document.createElement(\"button\");t.innerHTML=`<svg xmlns=\"\n    http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"2em\" height=\"2em\" className=\"block\" data-v-2754030d=\"\" data-v-512b0344=\"\">\n            <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\"\n                  data-v-2754030d=\"\" fill=\"var(--text-color)\"></path></svg>`,t.classList.add(\"modal-close-button\");let r=document.createElement(\"div\");r.classList.add(\"modal-close-button-container\"),r.appendChild(t),t.addEventListener(\"click\",()=>{rd()}),e.appendChild(r),r.addEventListener(\"click\",()=>{rd()});let n=document.createElement(\"div\");n.id=\"modal\",n.classList.add(\"modal\"),n.addEventListener(\"click\",({target:e})=>{\"A\"===e.tagName.toUpperCase()&&rd()});let o=document.createElement(\"div\");o.id=\"modal-content\",o.classList.add(\"modal-content\"),n.appendChild(o),e.appendChild(n),document.body.appendChild(e),document.addEventListener(\"keydown\",({key:e})=>{\"Escape\"===e&&rd()})}()}renderTemplates(){this.renderLibdocTemplate(\"base\",this.libdoc,\"#root\"),this.renderImporting(),this.renderShortcuts(),this.renderKeywords(),this.renderLibdocTemplate(\"data-types\"),this.renderLibdocTemplate(\"footer\")}initHashEvents(){window.addEventListener(\"hashchange\",function(){document.getElementsByClassName(\"hamburger-menu\")[0].checked=!1},!1),window.addEventListener(\"hashchange\",function(){if(0==window.location.hash.indexOf(\"#type-\")){let e=\"#type-modal-\"+decodeURI(window.location.hash.slice(6)),t=document.querySelector(\".data-types\").querySelector(e);t&&rp(t)}},!1),this.scrollToHash()}initTagSearch(){let e=new URLSearchParams(window.location.search),t=\"\";e.has(\"tag\")&&(t=e.get(\"tag\"),this.tagSearch(t,window.location.hash)),this.libdoc.tags.length&&(this.libdoc.selectedTag=t,this.renderLibdocTemplate(\"tags-shortcuts\"),document.getElementById(\"tags-shortcuts-container\").onchange=e=>{let t=e.target.selectedOptions[0].value;\"\"!=t?this.tagSearch(t):this.clearTagSearch()})}initLanguageMenu(){this.renderTemplate(\"language\",{languages:this.translations.getLanguageCodes()}),document.querySelectorAll(\"#language-container ul a\").forEach(e=>{e.innerHTML===this.translations.currentLanguage()&&e.classList.toggle(\"selected\"),e.addEventListener(\"click\",()=>{this.translations.setLanguage(e.innerHTML)&&this.render()})}),document.querySelector(\"#language-container button\").addEventListener(\"click\",()=>{document.querySelector(\"#language-container ul\").classList.toggle(\"hidden\")})}renderImporting(){this.renderLibdocTemplate(\"importing\"),this.registerTypeDocHandlers(\"#importing-container\")}renderShortcuts(){this.renderLibdocTemplate(\"shortcuts\"),document.getElementById(\"toggle-keyword-shortcuts\").addEventListener(\"click\",()=>this.toggleShortcuts()),document.querySelector(\".clear-search\").addEventListener(\"click\",()=>this.clearSearch()),document.querySelector(\".search-input\").addEventListener(\"keydown\",()=>rf(()=>this.searching(),150)),this.renderLibdocTemplate(\"keyword-shortcuts\"),document.querySelectorAll(\"a.match\").forEach(e=>e.addEventListener(\"click\",this.closeMenu))}registerTypeDocHandlers(e){document.querySelectorAll(`${e} a.type`).forEach(e=>e.addEventListener(\"click\",e=>{let t=e.target.dataset.typedoc;rp(document.querySelector(`#type-modal-${t}`))}))}renderKeywords(e=null){null==e&&(e=this.libdoc),this.renderLibdocTemplate(\"keywords\",e),document.querySelectorAll(\".kw-tags span\").forEach(e=>{e.addEventListener(\"click\",e=>{this.tagSearch(e.target.innerText)})}),this.registerTypeDocHandlers(\"#keywords-container\"),document.getElementById(\"keyword-statistics-header\").innerText=\"\"+this.libdoc.keywords.length}setTheme(){document.documentElement.setAttribute(\"data-theme\",this.getTheme())}getTheme(){return null!=this.libdoc.theme?this.libdoc.theme:window.matchMedia(\"(prefers-color-scheme: dark)\").matches?\"dark\":\"light\"}scrollToHash(){if(window.location.hash){let e=window.location.hash.substring(1),t=document.getElementById(decodeURIComponent(e));null!=t&&t.scrollIntoView()}}tagSearch(e,t){document.getElementsByClassName(\"search-input\")[0].value=\"\";let r={tags:!0,tagsExact:!0},n=window.location.pathname+\"?tag=\"+e+(t||\"\");this.markMatches(e,r),this.highlightMatches(e,r),history.replaceState&&history.replaceState(null,\"\",n),document.getElementById(\"keyword-shortcuts-container\").scrollTop=0}clearTagSearch(){document.getElementsByClassName(\"search-input\")[0].value=\"\",history.replaceState&&history.replaceState(null,\"\",window.location.pathname),this.resetKeywords()}searching(){this.searchTime=Date.now();let e=document.getElementsByClassName(\"search-input\")[0].value,t={name:!0,args:!0,doc:!0,tags:!0};e?requestAnimationFrame(()=>{this.markMatches(e,t,this.searchTime,()=>{this.highlightMatches(e,t,this.searchTime),document.getElementById(\"keyword-shortcuts-container\").scrollTop=0})}):this.resetKeywords()}highlightMatches(e,t,n){if(n&&n!==this.searchTime)return;let o=document.querySelectorAll(\"#shortcuts-container .match\"),i=document.querySelectorAll(\"#keywords-container .match\");if(t.name&&(new(r(eb))(o).mark(e),new(r(eb))(i).mark(e)),t.args&&new(r(eb))(document.querySelectorAll(\"#keywords-container .match .args\")).mark(e),t.doc&&new(r(eb))(document.querySelectorAll(\"#keywords-container .match .doc\")).mark(e),t.tags){let n=document.querySelectorAll(\"#keywords-container .match .tags a, #tags-shortcuts-container .match .tags a\");if(t.tagsExact){let t=[];n.forEach(r=>{r.textContent?.toUpperCase()==e.toUpperCase()&&t.push(r)}),new(r(eb))(t).mark(e)}else new(r(eb))(n).mark(e)}}markMatches(e,t,r,n){if(r&&r!==this.searchTime)return;let o=e.replace(/[-[\\]{}()+?*.,\\\\^$|#]/g,\"\\\\$&\");t.tagsExact&&(o=\"^\"+o+\"$\");let i=RegExp(o,\"i\"),a=i.test.bind(i),s={},l=0;s.keywords=this.libdoc.keywords.map(e=>{let r={...e};return r.hidden=!(t.name&&a(r.name))&&!(t.args&&a(r.args))&&!(t.doc&&a(r.doc))&&!(t.tags&&r.tags.some(a)),!r.hidden&&l++,r}),this.renderLibdocTemplate(\"keyword-shortcuts\",s),this.renderKeywords(s),this.libdoc.tags.length&&(this.libdoc.selectedTag=t.tagsExact?e:\"\",this.renderLibdocTemplate(\"tags-shortcuts\")),document.getElementById(\"keyword-statistics-header\").innerText=l+\" / \"+s.keywords.length,0===l&&(document.querySelector(\"#keywords-container table\").innerHTML=\"\"),n&&requestAnimationFrame(n)}closeMenu(){document.getElementById(\"hamburger-menu-input\").checked=!1}openKeywordWall(){document.getElementsByClassName(\"shortcuts\")[0].classList.add(\"keyword-wall\"),this.storage.set(\"keyword-wall\",\"open\"),document.getElementById(\"toggle-keyword-shortcuts\").innerText=\"-\"}closeKeywordWall(){document.getElementsByClassName(\"shortcuts\")[0].classList.remove(\"keyword-wall\"),this.storage.set(\"keyword-wall\",\"close\"),document.getElementById(\"toggle-keyword-shortcuts\").innerText=\"+\"}toggleShortcuts(){document.getElementsByClassName(\"shortcuts\")[0].classList.contains(\"keyword-wall\")?this.closeKeywordWall():this.openKeywordWall()}resetKeywords(){this.renderLibdocTemplate(\"keyword-shortcuts\"),this.renderKeywords(),this.libdoc.tags.length&&(this.libdoc.selectedTag=\"\",this.renderLibdocTemplate(\"tags-shortcuts\")),history.replaceState&&history.replaceState(null,\"\",location.pathname)}clearSearch(){document.getElementsByClassName(\"search-input\")[0].value=\"\";let e=document.getElementById(\"tags-shortcuts-container\");e&&(e.selectedIndex=0),this.resetKeywords()}renderLibdocTemplate(e,t=null,r=\"\"){null==t&&(t=this.libdoc),this.renderTemplate(e,t,r)}renderTemplate(e,t,n=\"\"){let o=document.getElementById(`${e}-template`)?.innerHTML,i=r(ew).compile(o);\"\"===n&&(n=`#${e}-container`),document.body.querySelector(n).innerHTML=i(t)}};!function(e){let t=new e_(\"libdoc\"),r=eS.getInstance(e.lang);new rg(e,t,r).render()}(libdoc);</script>\n  </body>\n</html>\n"
  },
  {
    "path": "requirements-dev.txt",
    "content": "-r requirements.txt\nmock\nflake8\ncoverage\nrobotframework-requests\n"
  },
  {
    "path": "requirements.txt",
    "content": "google-auth>=2.5.0\nkubernetes>=21.7.0\nrobotframework>=3.2.2\nurllib3-mock>=0.3.3"
  },
  {
    "path": "setup.py",
    "content": "from pkg_resources import parse_requirements\nfrom pathlib import Path\nfrom setuptools import setup\n\nexec(open(\"src/KubeLibrary/version.py\").read())\n\nwith open(\"README.md\", \"r\") as fh:\n    long_description = fh.read()\n\nwith Path(\"requirements.txt\").open() as requirements:\n    install_requires = [\n        str(requirement)\n        for requirement in parse_requirements(requirements)\n    ]\n\nsetup(\n    name=\"robotframework-kubelibrary\",\n    version=version,\n    author=\"Michał Wcisło\",\n    author_email=\"mwcislo999@gmail.com\",\n    description=\"Kubernetes library for Robot Framework\",\n    long_description=long_description,\n    long_description_content_type=\"text/markdown\",\n    url=\"https://github.com/devopsspiral/KubeLibrary\",\n    license=\"MIT\",\n    packages=[\"KubeLibrary\"],\n    classifiers=[\n        \"Development Status :: 2 - Pre-Alpha\",\n        \"Programming Language :: Python :: 3\",\n        \"License :: OSI Approved :: MIT License\",\n        \"Operating System :: OS Independent\",\n        \"Topic :: Software Development :: Testing\",\n    ],\n    keywords=\"robotframework testing test automation kubernetes\",\n    python_requires='>=3.6',\n    package_dir={'': 'src'},\n    install_requires=install_requires,\n)\n"
  },
  {
    "path": "src/KubeLibrary/KubeLibrary.py",
    "content": "import ast\nimport json\nimport re\nimport ssl\nimport urllib3\n\nfrom os import environ\nfrom kubernetes import client, config, dynamic, stream\nfrom robot.api import logger\nfrom robot.api.deco import library\nfrom string import digits, ascii_lowercase\nfrom random import choices\n\nfrom KubeLibrary.exceptions import BearerTokenWithPrefixException\nfrom KubeLibrary.version import version\n\n# supressing SSL warnings when using self-signed certs\nurllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)\n\n\nclass DynamicClient(dynamic.DynamicClient):\n    @property\n    def api_client(self):\n        return self.client\n\n\n@library(scope=\"GLOBAL\", version=version, auto_keywords=True)\nclass KubeLibrary:\n    \"\"\"KubeLibrary is a Robot Framework test library for Kubernetes.\n\n    The approach taken by this library is to provide easy to access kubernetes objects representation that can\n    be then accessed to define highlevel keywords for tests.\n\n    = Kubeconfigs =\n\n    By default ~/.kube/config is used. Kubeconfig location\n    can also be passed by setting KUBECONFIG environment variable or as Library argument.\n\n    | ***** Settings *****\n    | Library           KubeLibrary          /path/to/kubeconfig\n\n    = Context =\n\n    By default current context from kubeconfig is used. Setting multiple contexts in\n    different test suites allows working on multiple clusters.\n\n    | ***** Settings *****\n    | Library           KubeLibrary          context=k3d-k3d-cluster2\n\n    = Bearer token authentication =\n\n    It is possible to authenticate using bearer token by passing API url, bearer token and optionally CA certificate.\n\n    | ***** Settings *****\n    | Library           KubeLibrary          api_url=%{K8S_API_URL}    bearer_token=%{K8S_TOKEN}    ca_cert=%{K8S_CA_CRT}\n\n    = In cluster execution =\n\n    If tests are supposed to be executed from within cluster, KubeLibrary can be configured to use standard\n    token authentication. Just set incluster parameter to True.\n\n    = Auth methods precedence =\n\n    If enabled, auth methods takes precedence in following order:\n    1. Incluster\n    2. Bearer Token\n    3. Kubeconfig\n\n    | ***** Settings *****\n    | Library           KubeLibrary          None    True\n\n    \"\"\"\n\n    def __init__(self, kube_config=None, context=None, api_url=None, bearer_token=None,\n                 ca_cert=None, incluster=False, cert_validation=True):\n        \"\"\"KubeLibrary can be configured with several optional arguments.\n        - ``kube_config``:\n          Path pointing to kubeconfig of target Kubernetes cluster.\n        - ``context``:\n          Active context. If None current_context from kubeconfig is used.\n        - ``api_url``:\n          K8s API url, used for bearer token authenticaiton.\n        - ``bearer_token``:\n          Bearer token, used for bearer token authenticaiton. Do not include 'Bearer ' prefix.\n        - ``ca_cert``:\n          Optional CA certificate file path, used for bearer token authenticaiton.\n        - ``incuster``:\n          Default False. Indicates if used from within k8s cluster. Overrides kubeconfig.\n        - ``cert_validation``:\n          Default True. Can be set to False for self-signed certificates.\n\n        Environment variables:\n        - INIT_FOR_LIBDOC_ONLY:\n          Set to '1' to generate keyword documentation and skip to load a kube config..\n        \"\"\"\n        if \"1\" == environ.get('INIT_FOR_LIBDOC_ONLY', \"0\"):\n            return\n        self.reload_config(kube_config=kube_config, context=context, api_url=api_url, bearer_token=bearer_token,\n                           ca_cert=ca_cert, incluster=incluster, cert_validation=cert_validation)\n\n    @staticmethod\n    def get_proxy():\n        return environ.get('https_proxy') or environ.get('HTTPS_PROXY') or environ.get('http_proxy') or environ.get(\n            'HTTP_PROXY')\n\n    @staticmethod\n    def get_no_proxy():\n        return environ.get('no_proxy') or environ.get('NO_PROXY')\n\n    @staticmethod\n    def generate_alphanumeric_str(size):\n        \"\"\"Generates a random alphanumeric string with given size.\n\n        Returns a string.\n\n        - ``size``:\n          Desired size of the output string\n        \"\"\"\n        return \"\".join(choices(ascii_lowercase + digits, k=size))\n\n    @staticmethod\n    def evaluate_callable_from_k8s_client(attr_name, *args, **kwargs):\n        \"\"\"Evaluates a callable from kubernetes client.\n\n        Returns the output of the client callable.\n\n        - ``attr_name``:\n          Callable name\n        - ``*args``:\n          Positional arguments for argument forwarding\n        - ``**kwargs``:\n          Keyword arguments for argument forwarding\n        \"\"\"\n        attr = getattr(client, attr_name, None)\n        assert callable(attr), f\"kubernetes.client does not contain {attr_name}!\"\n        return attr(*args, **kwargs)\n\n    def get_dynamic_resource(self, api_version, kind):\n        \"\"\"Returns a dynamic resource based on the provided api version and kind.\n\n        - ``api_version``:\n          Api version of the desired kubernetes resource\n        - ``kind``:\n          Kind of the desired kubernetes resource\n        \"\"\"\n        return self.dynamic.resources.get(api_version=api_version, kind=kind)\n\n    def get(self, api_version, kind, **kwargs):\n        \"\"\"Retrieves resource instances based on the provided parameters.\n\n        Can be optionally given a ``namespace``, ``name``, ``label_selector``, ``body`` and ``field_selector``.\n\n        Returns a resource list.\n\n        - ``api_version``:\n          Api version of the desired kubernetes resource\n        - ``kind``:\n          Kind of the desired kubernetes resource\n        - ``**kwargs``:\n          Keyword arguments for argument forwarding\n        \"\"\"\n        resource = self.get_dynamic_resource(api_version, kind)\n        return resource.get(**kwargs)\n\n    def create(self, api_version, kind, **kwargs):\n        \"\"\"Creates resource instances based on the provided configuration.\n\n        If the resource is namespaced (ie, not cluster-level), then one of ``namespace``, ``label_selector``, or ``field_selector`` is required.\n        If the resource is cluster-level, then one of ``name``, ``label_selector``, or ``field_selector`` is required.\n        Can be optionally given a kubernetes manifest (``body``) which respects the above considerations.\n\n        Returns created object\n\n        - ``api_version``:\n          Api version of the desired kubernetes resource\n        - ``kind``:\n          Kind of the desired kubernetes resource\n        - ``**kwargs``:\n          Keyword arguments for argument forwarding\n        \"\"\"\n        resource = self.get_dynamic_resource(api_version, kind)\n        ret = resource.create(**kwargs)\n        return ret\n\n    def delete(self, api_version, kind, **kwargs):\n        \"\"\"Deletes resource instances based on the provided configuration.\n\n        Can be optionally given a ``namespace``, ``name``, ``label_selector``, ``body`` and ``field_selector``.\n\n        - ``api_version``:\n          Api version of the desired kubernetes resource\n        - ``kind``:\n          Kind of the desired kubernetes resource\n        - ``**kwargs``:\n          Keyword arguments for argument forwarding\n        \"\"\"\n        resource = self.get_dynamic_resource(api_version, kind)\n        resource.delete(**kwargs)\n\n    def patch(self, api_version, kind, **kwargs):\n        \"\"\"Patches resource instances based on the provided parameters.\n\n        Can be optionally given a ``namespace``, ``name``, ``label_selector``, ``body`` and ``field_selector``.\n\n        - ``api_version``:\n          Api version of the desired kubernetes resource\n        - ``kind``:\n          Kind of the desired kubernetes resource\n        - ``**kwargs``:\n          Keyword arguments for argument forwarding\n        \"\"\"\n        resource = self.get_dynamic_resource(api_version, kind)\n        resource.patch(**kwargs)\n\n    def replace(self, api_version, kind, **kwargs):\n        \"\"\"Replaces resource instances based on the provided parameters.\n\n        Can be optionally given a ``namespace``, ``name``, ``label_selector``, ``body`` and ``field_selector``.\n\n        - ``api_version``:\n          Api version of the desired kubernetes resource\n        - ``kind``:\n          Kind of the desired kubernetes resource\n        - ``**kwargs``:\n          Keyword arguments for argument forwarding\n        \"\"\"\n        resource = self.get_dynamic_resource(api_version, kind)\n        resource.replace(**kwargs)\n\n    def reload_config(self, kube_config=None, context=None, api_url=None, bearer_token=None, ca_cert=None,\n                      incluster=False, cert_validation=True):\n        \"\"\"Reload the KubeLibrary to be configured with different optional arguments.\n           This can be used to connect to a different cluster during the same test.\n        - ``kube_config``:\n          Path pointing to kubeconfig of target Kubernetes cluster.\n        - ``context``:\n          Active context. If None current_context from kubeconfig is used.\n        - ``api_url``:\n          K8s API url, used for bearer token authenticaiton.\n        - ``bearer_token``:\n          Bearer token, used for bearer token authenticaiton. Do not include 'Bearer ' prefix.\n        - ``ca_cert``:\n          Optional CA certificate file path, used for bearer token authenticaiton.\n        - ``incuster``:\n          Default False. Indicates if used from within k8s cluster. Overrides kubeconfig.\n        - ``cert_validation``:\n          Default True. Can be set to False for self-signed certificates.\n\n        Environment variables:\n        - HTTP_PROXY:\n          Proxy URL\n        \"\"\"\n        self.api_client = None\n        self.cert_validation = cert_validation\n        if incluster:\n            try:\n                config.load_incluster_config()\n            except config.config_exception.ConfigException as e:\n                logger.error('Are you sure tests are executed from within k8s cluster?')\n                raise e\n        elif api_url and bearer_token:\n            if bearer_token.startswith('Bearer '):\n                raise BearerTokenWithPrefixException\n            configuration = client.Configuration.get_default_copy()\n            configuration.api_key[\"authorization\"] = bearer_token\n            configuration.api_key_prefix['authorization'] = 'Bearer'\n            configuration.host = api_url\n            configuration.ssl_ca_cert = ca_cert\n            self.api_client = client.ApiClient(configuration)\n        else:\n            try:\n                config.load_kube_config(kube_config, context)\n            except TypeError:\n                logger.error('Neither KUBECONFIG nor ~/.kube/config available.')\n\n        if not self.api_client:\n            self.api_client = client.ApiClient(configuration=client.Configuration.get_default_copy())\n\n        self._add_api('v1', client.CoreV1Api)\n        self._add_api('networkingv1api', client.NetworkingV1Api)\n        self._add_api('batchv1', client.BatchV1Api)\n        self._add_api('appsv1', client.AppsV1Api)\n        # self._add_api('batchv1_beta1', client.BatchV1Api)\n        self._add_api('custom_object', client.CustomObjectsApi)\n        self._add_api('rbac_authv1_api', client.RbacAuthorizationV1Api)\n        self._add_api('autoscalingv1', client.AutoscalingV1Api)\n        self._add_api('dynamic', DynamicClient)\n\n    def _add_api(self, reference, class_name):\n        self.__dict__[reference] = class_name(self.api_client)\n        if not self.cert_validation:\n            self.__dict__[reference].api_client.rest_client.pool_manager.connection_pool_kw['cert_reqs'] = ssl.CERT_NONE\n\n    def k8s_api_ping(self):\n        \"\"\"Performs GET on /api/v1/ for simple check of API availability.\n\n        Returns tuple of (response data, response status, response headers). Can be used as prerequisite in tests.\n        \"\"\"\n        path_params = {}\n        query_params = []\n        header_params = {}\n        auth_settings = ['BearerToken']\n        resp = self.v1.api_client.call_api('/api/v1/', 'GET',\n                                           path_params,\n                                           query_params,\n                                           header_params,\n                                           response_type='str',\n                                           auth_settings=auth_settings,\n                                           async_req=False,\n                                           _return_http_data_only=False)\n        return resp\n\n    def k8s_version(self):\n        \"\"\"Performs GET on /version to show the k8s cluster version.\n\n        Returns a dict of kubernetes version information, similar to `kubectl version`.\n        \"\"\"\n        path_params = {}\n        query_params = []\n        header_params = {}\n        auth_settings = ['BearerToken']\n        resp = self.v1.api_client.call_api('/version/', 'GET',\n                                           path_params,\n                                           query_params,\n                                           header_params,\n                                           response_type='str',\n                                           auth_settings=auth_settings,\n                                           async_req=False,\n                                           _return_http_data_only=False)\n        version = ast.literal_eval(resp[0])\n        return version\n\n    def list_namespace(self, label_selector=\"\"):\n        \"\"\"Lists available namespaces.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of namespaces.\n        \"\"\"\n        ret = self.v1.list_namespace(watch=False, label_selector=label_selector)\n        return ret.items\n\n    def get_namespaces(self, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespace.\n        Gets a list of available namespaces.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of namespaces names.\n        \"\"\"\n        return self.filter_names(self.list_namespace(label_selector=label_selector))\n\n    def get_healthy_nodes_count(self, label_selector=\"\"):\n        \"\"\"Counts node with KubeletReady and status True.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Can be used to check number of healthy nodes. Can be used as prerequisite in tests.\n        \"\"\"\n        ret = self.v1.list_node(watch=False, label_selector=label_selector)\n        healthy_nods = []\n        for item in ret.items:\n            for condition in item.status.conditions:\n                if condition.reason == 'KubeletReady' and condition.status == 'True':\n                    healthy_nods.append(item.metadata.name)\n        return len(healthy_nods)\n\n    def get_pod_names_in_namespace(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_pod_by_pattern.\n        Gets pod name matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of strings.\n\n        - ``name_pattern``:\n          Pod name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_pod(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern + '.*')\n        return [item.metadata.name for item in ret.items if r.match(item.metadata.name)]\n\n    def list_namespaced_pod_by_pattern(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"List pods matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of pods.\n\n        - ``name_pattern``:\n          Pod name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_pod(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        pods = [item for item in ret.items if r.match(item.metadata.name)]\n        return pods\n\n    def get_pods_in_namespace(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_pod_by_pattern.\n        Gets pods matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of pods.\n\n        - ``name_pattern``:\n          Pod name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_pod(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        pods = [item for item in ret.items if r.match(item.metadata.name)]\n        return pods\n\n    def read_namespaced_pod_log(self, name, namespace, container, since_seconds=None):\n        \"\"\"Gets container logs of given pod in given namespace.\n\n        Can be optionally filtered by time in seconds. e.g. since_seconds=1000.\n\n        Returns logs.\n\n        - ``name``:\n          Pod name to check\n        - ``namespace``:\n          Namespace to check\n        - ``container``:\n          Container to check\n        \"\"\"\n        pod_logs = self.v1.read_namespaced_pod_log(name=name, namespace=namespace, container=container, follow=False,\n                                                   since_seconds=since_seconds)\n        return pod_logs\n\n    def get_pod_logs(self, name, namespace, container):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_pod_log.\n        Gets container logs of given pod in given namespace.\n\n        Returns logs.\n\n        - ``name``:\n          Pod name to check\n        - ``namespace``:\n          Namespace to check\n        - ``container``:\n          Container to check\n        \"\"\"\n        pod_logs = self.v1.read_namespaced_pod_log(name=name, namespace=namespace, container=container, follow=False)\n        return pod_logs\n\n    def list_namespaced_config_map_by_pattern(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"Lists configmaps matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of configmaps.\n\n        - ``name_pattern``:\n          configmap name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_config_map(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        configmaps = [item for item in ret.items if r.match(item.metadata.name)]\n        return configmaps\n\n    def get_configmaps_in_namespace(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_config_map_by_pattern.\n        Gets configmaps matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of configmaps.\n\n        - ``name_pattern``:\n          configmap name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_config_map(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        configmaps = [item for item in ret.items if r.match(item.metadata.name)]\n        return configmaps\n\n    def list_namespaced_service_account_by_pattern(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"Lists service accounts matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of service accounts.\n\n        - ``name_pattern``:\n          Service Account name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_service_account(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        service_accounts = [item for item in ret.items if r.match(item.metadata.name)]\n        return service_accounts\n\n    def get_service_accounts_in_namespace(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_service_account_by_pattern.\n        Gets service accounts matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of service accounts.\n\n        - ``name_pattern``:\n          Service Account name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_service_account(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        service_accounts = [item for item in ret.items if r.match(item.metadata.name)]\n        return service_accounts\n\n    def list_namespaced_deployment_by_pattern(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"Gets deployments matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of deployments.\n\n        - ``name_pattern``:\n          deployment name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.appsv1.list_namespaced_deployment(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        deployments = [item for item in ret.items if r.match(item.metadata.name)]\n        return deployments\n\n    def get_deployments_in_namespace(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_deployment_by_pattern.\n        Gets deployments matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of deployments.\n\n        - ``name_pattern``:\n          deployment name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.appsv1.list_namespaced_deployment(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        deployments = [item for item in ret.items if r.match(item.metadata.name)]\n        return deployments\n\n    def list_namespaced_replica_set_by_pattern(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"Lists replicasets matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of  replicasets.\n\n        - ``name_pattern``:\n          replicaset name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.appsv1.list_namespaced_replica_set(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        replicasets = [item for item in ret.items if r.match(item.metadata.name)]\n        return replicasets\n\n    def get_replicasets_in_namespace(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_replica_set_by_pattern.\n        Gets replicasets matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of  replicasets.\n\n        - ``name_pattern``:\n          replicaset name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.appsv1.list_namespaced_replica_set(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        replicasets = [item for item in ret.items if r.match(item.metadata.name)]\n        return replicasets\n\n    def list_namespaced_job_by_pattern(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"Gets jobs matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of jobs.\n\n        - ``name_pattern``:\n          job name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.batchv1.list_namespaced_job(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        jobs = [item for item in ret.items if r.match(item.metadata.name)]\n        return jobs\n\n    def get_jobs_in_namespace(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_job_by_pattern.\n        Gets jobs matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of jobs.\n\n        - ``name_pattern``:\n          job name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.batchv1.list_namespaced_job(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        jobs = [item for item in ret.items if r.match(item.metadata.name)]\n        return jobs\n\n    def list_namespaced_secret_by_pattern(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"Lists secrets matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of secrets.\n\n        - ``name_pattern``:\n          secret name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_secret(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        secrets = [item for item in ret.items if r.match(item.metadata.name)]\n        return secrets\n\n    def get_secrets_in_namespace(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_secret_by_pattern.\n        Gets secrets matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of secrets.\n\n        - ``name_pattern``:\n          secret name pattern to check\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_secret(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        secrets = [item for item in ret.items if r.match(item.metadata.name)]\n        return secrets\n\n    def get_namespaced_pod_exec(self, name, namespace, argv_cmd, container=None):\n        \"\"\"Exec command on selected container for POD.\n\n        Returns command stdout/stderr\n\n        - ``name``:\n          pod name\n        - ``namespace``:\n          namespace to check\n        - ``argv_cmd``:\n          command to be executed using argv syntax: [\"/bin/sh\", \"-c\", \"ls\"]\n          it do not use shell as default!\n        - ``container``:\n          container on which we run exec, default: None\n        \"\"\"\n        if not isinstance(argv_cmd, list) or not len(argv_cmd):\n            raise TypeError(\n                f\"argv_cmd parameter should be a list and contains values like [\\\"/bin/bash\\\", \\\"-c\\\", \\\"ls\\\"] \"\n                f\"not {argv_cmd}\")\n        if not container:\n            return stream.stream(self.v1.connect_get_namespaced_pod_exec,\n                                 name,\n                                 namespace,\n                                 command=argv_cmd,\n                                 stderr=True,\n                                 stdin=True,\n                                 stdout=True,\n                                 tty=False).strip()\n        else:\n            return stream.stream(self.v1.connect_get_namespaced_pod_exec,\n                                 name,\n                                 namespace,\n                                 container=container,\n                                 command=argv_cmd,\n                                 stderr=True,\n                                 stdin=True,\n                                 stdout=True,\n                                 tty=False).strip()\n\n    def filter_names(self, objects):\n        \"\"\"Filter .metadata.name for list of k8s objects.\n\n        Returns list of strings.\n\n        - ``objects``:\n          List of k8s objects\n        \"\"\"\n        return [obj.metadata.name for obj in objects]\n\n    def filter_by_key(self, objects, key, match):\n        \"\"\"Filter object with key matching value for list of k8s objects.\n\n        Returns list of objects.\n\n        - ``objects``:\n          List of k8s objects\n        - ``key``:\n          Key to match\n        - ``match``:\n          Value of the key based on which objects will be included\n        \"\"\"\n        return [obj for obj in objects if getattr(obj, key) == match]\n\n    def filter_deployments_names(self, deployments):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. See examples in TBD.\n        Returns list of strings.\n        - ``deployments``:\n          List of deployments objects\n        \"\"\"\n        return self.filter_names(deployments)\n\n    def filter_replicasets_names(self, replicasets):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. See examples in TBD.\n        Returns list of strings.\n        - ``replicasets``:\n          List of replicasets objects\n        \"\"\"\n        return self.filter_names(replicasets)\n\n    def filter_pods_names(self, pods):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. See examples in TBD.\n        Filter pod names for list of pods.\n\n        Returns list of strings.\n\n        - ``pods``:\n          List of pods objects\n        \"\"\"\n        return self.filter_names(pods)\n\n    def filter_service_accounts_names(self, service_accounts):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. See examples in TBD.\n        Filter service accounts names for list of service accounts.\n\n        Returns list of strings.\n\n        - ``service_accounts``:\n          List of service accounts objects\n        \"\"\"\n        return self.filter_names(service_accounts)\n\n    def filter_configmap_names(self, configmaps):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. See examples in TBD.\n        Filter configmap  names for list of configmaps.\n        Returns list of strings.\n        - ``configmaps``:\n          List of configmap objects\n        \"\"\"\n        return self.filter_names(configmaps)\n\n    def filter_endpoints_names(self, endpoints):\n        \"\"\"Filter endpoints names for list of endpoints.\n        Returns list of strings.\n        - ``endpoints``:\n        List of endpoint objects\n        \"\"\"\n        return self.filter_names(endpoints.items)\n\n    @staticmethod\n    def filter_pods_containers_by_name(pods, name_pattern):\n        \"\"\"Filters pods containers by name for given list of pods.\n\n        Returns lists of containers (flattens).\n\n        - ``pods``:\n          List of pods objects\n        \"\"\"\n        containers = []\n        r = re.compile(name_pattern)\n        for pod in pods:\n            for container in pod.spec.containers:\n                if r.match(container.name):\n                    containers.append(container)\n        return containers\n\n    @staticmethod\n    def filter_containers_images(containers):\n        \"\"\"Filters container images for given lists of containers.\n\n        Returns list of images.\n\n        - ``containers``:\n          List of containers\n        \"\"\"\n        return [container.image for container in containers]\n\n    @staticmethod\n    def filter_containers_resources(containers):\n        \"\"\"Filters container resources for given lists of containers.\n\n        Returns list of resources.\n\n        - ``containers``:\n          List of containers\n        \"\"\"\n        return [container.resources for container in containers]\n\n    @staticmethod\n    def filter_pods_containers_statuses_by_name(pods, name_pattern):\n        \"\"\"Filters pods containers statuses by container name for given list of pods.\n\n        Returns lists of containers statuses.\n\n        - ``pods``:\n          List of pods objects\n        \"\"\"\n        container_statuses = []\n        r = re.compile(name_pattern)\n        for pod in pods:\n            for container_status in pod.status.container_statuses:\n                if r.match(container_status.name):\n                    container_statuses.append(container_status)\n        return container_statuses\n\n    def read_namespaced_pod_status(self, name, namespace):\n        \"\"\"Reads pod status in given namespace.\n\n        - ``name``:\n          Name of pod.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.read_namespaced_pod_status(name, namespace)\n        return ret.status\n\n    def get_pod_status_in_namespace(self, name, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_pod_status.\n\n        - ``name``:\n          Name of pod.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.read_namespaced_pod_status(name, namespace)\n        return ret.status.phase\n\n    @staticmethod\n    def assert_pod_has_labels(pod, labels_json):\n        \"\"\"Assert pod has labels.\n\n        Returns True/False\n\n        - ``pod``:\n          Pod object.\n        - ``labels_json``:\n          JSON representing labels\n        \"\"\"\n        try:\n            labels = json.loads(labels_json)\n            for k, v in labels.items():\n                if pod.metadata.labels and k in pod.metadata.labels:\n                    if pod.metadata.labels[k] != v:\n                        logger.error(f'Label \"{k}\" value \"{v}\" not matching actual \"{pod.metadata.labels[k]}\"')\n                        return False\n                else:\n                    logger.error(f'Label \"{k}\" not found in actual')\n                    return False\n            return True\n        except json.JSONDecodeError:\n            logger.error(f'Failed parsing Pod Labels JSON:{labels_json}')\n            return False\n\n    @staticmethod\n    def assert_pod_has_annotations(pod, annotations_json):\n        \"\"\"Assert pod has annotations.\n\n        Returns True/False\n\n        - ``pod``:\n          Pod object.\n        - ``annotations_json``:\n          JSON representing annotations\n        \"\"\"\n        try:\n            annotations = json.loads(annotations_json)\n            for k, v in annotations.items():\n                if pod.metadata.annotations and k in pod.metadata.annotations:\n                    if pod.metadata.annotations[k] != v:\n                        logger.error(\n                            f'Annotation \"{k}\" value \"{v}\" not matching actual \"{pod.metadata.annotations[k]}\"')\n                        return False\n                else:\n                    logger.error(f'Annotation \"{k}\" not found in actual')\n                    return False\n            return True\n        except json.JSONDecodeError:\n            logger.error(f'Failed parsing Pod Annotations JSON:{annotations_json}')\n            return False\n\n    @staticmethod\n    def assert_container_has_env_vars(container, env_vars_json):\n        \"\"\"Assert container has env vars.\n\n        Returns True/False\n\n        - ``container``:\n          Container object.\n        - ``env_var_json``:\n          JSON representing env vars i.e.: {\"EXAMPLE_VAR\": \"examplevalue\"}\n        \"\"\"\n        try:\n            env_vars = json.loads(env_vars_json)\n            for k, v in env_vars.items():\n                found = False\n                for ev in container.env:\n                    if k == ev.name and v == ev.value:\n                        found = True\n                        break\n                    elif k == ev.name and v != ev.value:\n                        logger.error(f'Env var \"{k}\" value \"{v}\" not matching actual \"{ev.value}\"')\n                        return False\n                if not found:\n                    logger.error(f'Env var \"{k}\" not found in actual')\n                    return False\n            return True\n        except json.JSONDecodeError:\n            logger.error(f'Failed parsing Container Env Var JSON:{env_vars_json}')\n            return False\n\n    def list_namespaced_service(self, namespace, label_selector=\"\"):\n        \"\"\"Gets services in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of strings.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_service(namespace, watch=False, label_selector=label_selector)\n        return [item for item in ret.items]\n\n    def get_services_in_namespace(self, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_service.\n\n        Gets services in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of strings.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_service(namespace, watch=False, label_selector=label_selector)\n        return [item.metadata.name for item in ret.items]\n\n    def read_namespaced_service(self, name, namespace):\n        \"\"\"Gets service details in given namespace.\n\n        Returns Service object representation. Can be accessed using\n\n        | Should Be Equal As integers    | ${service_details.spec.ports[0].port}    | 8080 |\n\n        - ``name``:\n          Name of service.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.read_namespaced_service(name, namespace)\n        return ret\n\n    def get_service_details_in_namespace(self, name, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_service.\n\n        Gets service details in given namespace.\n\n        Returns Service object representation. Can be accessed using\n\n        | Should Be Equal As integers    | ${service_details.spec.ports[0].port}    | 8080 |\n\n        - ``name``:\n          Name of service.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.read_namespaced_service(name, namespace)\n        return ret\n\n    def list_namespaced_horizontal_pod_autoscaler(self, namespace, label_selector=\"\"):\n        \"\"\"Gets Horizontal Pod Autoscalers in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of strings.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.autoscalingv1.list_namespaced_horizontal_pod_autoscaler(namespace, watch=False,\n                                                                           label_selector=label_selector)\n        return [item for item in ret.items]\n\n    def get_hpas_in_namespace(self, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_horizontal_pod_autoscaler.\n\n        Gets Horizontal Pod Autoscalers in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of strings.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.autoscalingv1.list_namespaced_horizontal_pod_autoscaler(namespace, watch=False,\n                                                                           label_selector=label_selector)\n        return [item.metadata.name for item in ret.items]\n\n    def read_namespaced_horizontal_pod_autoscaler(self, name, namespace):\n        \"\"\"Gets Horizontal Pod Autoscaler details in given namespace.\n\n        Returns Horizontal Pod Autoscaler object representation. Can be accessed using\n\n        | Should Be Equal As integers    | ${hpa_details.spec.target_cpu_utilization_percentage}    | 50 |\n\n        - ``name``:\n          Name of Horizontal Pod Autoscaler\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.autoscalingv1.read_namespaced_horizontal_pod_autoscaler(name, namespace)\n        return ret\n\n    def get_hpa_details_in_namespace(self, name, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_horizontal_pod_autoscaler.\n\n        Gets Horizontal Pod Autoscaler details in given namespace.\n\n        Returns Horizontal Pod Autoscaler object representation. Can be accessed using\n\n        | Should Be Equal As integers    | ${hpa_details.spec.target_cpu_utilization_percentage}    | 50 |\n\n        - ``name``:\n          Name of Horizontal Pod Autoscaler\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.autoscalingv1.read_namespaced_horizontal_pod_autoscaler(name, namespace)\n        return ret\n\n    def read_namespaced_endpoints(self, name, namespace):\n        \"\"\"Gets endpoint details in given namespace.\n\n        Returns Endpoint object representation. Can be accessed using\n\n        | Should Match    | ${endpoint_details.subsets[0].addresses[0].target_ref.name}    | pod-name-123456 |\n\n        - ``name``:\n          Name of endpoint.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.read_namespaced_endpoints(name, namespace)\n        return ret\n\n    def get_endpoints_in_namespace(self, name, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_endpoints.\n\n        Gets endpoint details in given namespace.\n\n        Returns Endpoint object representation. Can be accessed using\n\n        | Should Match    | ${endpoint_details.subsets[0].addresses[0].target_ref.name}    | pod-name-123456 |\n\n        - ``name``:\n          Name of endpoint.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.read_namespaced_endpoints(name, namespace)\n        return ret\n\n    def list_namespaced_persistent_volume_claim(self, namespace, label_selector=\"\"):\n        \"\"\"Gets pvcs in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of strings.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_persistent_volume_claim(namespace, watch=False, label_selector=label_selector)\n        return [item for item in ret.items]\n\n    def list_namespaced_persistent_volume_claim_by_pattern(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"Gets pvcs in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n       Returns list of strings.\n\n        - ``namespace``:\n          Namespace to check\n        - ``name_pattern``:\n          pvc name pattern to check\n        \"\"\"\n        ret = self.v1.list_namespaced_persistent_volume_claim(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        return [item for item in ret.items if r.match(item.metadata.name)]\n\n    def list_namespaced_stateful_set(self, namespace, label_selector=\"\"):\n        \"\"\"Lists statefulsets in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of  statefulsets.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.appsv1.list_namespaced_stateful_set(namespace, watch=False, label_selector=label_selector)\n        return [item for item in ret.items]\n\n    def list_namespaced_stateful_set_by_pattern(self, name_pattern, namespace, label_selector=\"\"):\n        \"\"\"Lists statefulsets matching pattern in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of  statefulsets.\n\n        - ``namespace``:\n          Namespace to check\n        - ``name_pattern``:\n          statefulset name pattern to check\n        \"\"\"\n        ret = self.appsv1.list_namespaced_stateful_set(namespace, watch=False, label_selector=label_selector)\n        r = re.compile(name_pattern)\n        statefulsets = [item for item in ret.items if r.match(item.metadata.name)]\n        return statefulsets\n\n    def get_pvc_in_namespace(self, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_persistent_volume_claim.\n\n        Gets pvcs in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of strings.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.list_namespaced_persistent_volume_claim(namespace, watch=False, label_selector=label_selector)\n        return [item.metadata.name for item in ret.items]\n\n    def read_namespaced_persistent_volume_claim(self, name, namespace):\n        \"\"\"Gets PVC details in given namespace.\n\n        Returns PVC object representation. Can be accessed using\n\n        | Should Be Equal As strings    | ${pvc.status.capacity.storage}    | 1Gi |\n\n        - ``name``:\n          Name of PVC.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.read_namespaced_persistent_volume_claim(name, namespace)\n        return ret\n\n    def get_pvc_capacity(self, name, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_persistent_volume_claim.\n\n        Gets PVC details in given namespace.\n\n        Returns PVC object representation. Can be accessed using\n\n        | Should Be Equal As strings    | ${pvc.status.capacity.storage}    | 1Gi |\n\n        - ``name``:\n          Name of PVC.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.read_namespaced_persistent_volume_claim(name, namespace)\n        return ret\n\n    def get_kubelet_version(self, label_selector=\"\"):\n        \"\"\"Gets list of kubelet versions on each node.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of strings.\n        \"\"\"\n        ret = self.v1.list_node(watch=False, label_selector=label_selector)\n        return [item.status.node_info.kubelet_version for item in ret.items]\n\n    def create_namespaced_service_account(self, namespace, body):\n        \"\"\"Creates service account in a namespace\n\n        Returns created service account\n\n        - ``body``:\n          Service Account object.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.create_namespaced_service_account(namespace=namespace, body=body)\n        return ret\n\n    def create_service_account_in_namespace(self, namespace, body):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use create_namespaced_service_account.\n\n        Creates service account in a namespace\n\n        Returns created service account\n\n        - ``body``:\n          Service Account object.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.create_namespaced_service_account(namespace=namespace, body=body)\n        return ret\n\n    def delete_namespaced_service_account(self, name, namespace):\n        \"\"\"Deletes service account in a namespace\n\n        Returns V1status\n\n\n        - ``name``:\n          Service Account name\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.delete_namespaced_service_account(name=name, namespace=namespace)\n        return ret\n\n    def delete_service_account_in_namespace(self, name, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use delete_namespaced_service_account.\n\n        Deletes service account in a namespace\n\n        Returns V1status\n\n\n        - ``name``:\n          Service Account name\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.v1.delete_namespaced_service_account(name=name, namespace=namespace)\n        return ret\n\n    def get_healthcheck(self, endpoint='/readyz', verbose=False):\n        \"\"\"Performs GET on /readyz or /livez for simple health check.\n\n        Can be used to verify the readiness/current status of the API server\n        Returns tuple of (response data, response status and response headers)\n\n        - ``endpoint``:\n            /readyz, /livez or induvidual endpoints like '/livez/etcd'. defaults to /readyz\n        - ``verbose``:\n            More detailed output.\n\n        https://kubernetes.io/docs/reference/using-api/health-checks\n\n        \"\"\"\n        path_params = {}\n        query_params = []\n        header_params = {}\n        auth_settings = ['BearerToken']\n        if not (endpoint.startswith('/readyz') or endpoint.startswith('/livez')):\n            raise RuntimeError(f'{endpoint} does not start with \"/readyz\" or \"/livez\"')\n        endpoint = endpoint if not verbose else endpoint + '?verbose'\n        resp = self.v1.api_client.call_api(endpoint, 'GET',\n                                           path_params,\n                                           query_params,\n                                           header_params,\n                                           response_type='str',\n                                           auth_settings=auth_settings,\n                                           async_req=False,\n                                           _return_http_data_only=False)\n        return resp\n\n    def list_namespaced_ingress(self, namespace, label_selector=\"\"):\n        \"\"\"Gets ingresses in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n        Returns list of strings.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.networkingv1api.list_namespaced_ingress(namespace, watch=False, label_selector=label_selector)\n        return [item for item in ret.items]\n\n    def get_ingresses_in_namespace(self, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_ingress.\n\n        Gets ingresses in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n        Returns list of strings.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.networkingv1api.list_namespaced_ingress(namespace, watch=False, label_selector=label_selector)\n        return [item.metadata.name for item in ret.items]\n\n    def read_namespaced_ingress(self, name, namespace):\n        \"\"\"Gets ingress details in given namespace.\n\n        Returns Ingress object representation.\n          Name of ingress.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.networkingv1api.read_namespaced_ingress(name, namespace)\n        return ret\n\n    def get_ingress_details_in_namespace(self, name, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_ingress.\n\n        Gets ingress details in given namespace.\n\n        Returns Ingress object representation.\n          Name of ingress.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.networkingv1api.read_namespaced_ingress(name, namespace)\n        return ret\n\n    def list_namespaced_cron_job(self, namespace, label_selector=\"\"):\n        \"\"\"Gets cron jobs in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of strings.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.batchv1.list_namespaced_cron_job(namespace, watch=False, label_selector=label_selector)\n        return [item for item in ret.items]\n\n    def get_cron_jobs_in_namespace(self, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_cron_job.\n\n        Gets cron jobs in given namespace.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of strings.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.batchv1.list_namespaced_cron_job(namespace, watch=False, label_selector=label_selector)\n        return [item.metadata.name for item in ret.items]\n\n    def read_namespaced_cron_job(self, name, namespace):\n        \"\"\"Gets cron job details in given namespace.\n\n        Returns Cron job object representation.\n\n        - ``name``:\n          Name of cron job.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.batchv1.read_namespaced_cron_job(name, namespace)\n        return ret\n\n    def get_cron_job_details_in_namespace(self, name, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_cron_job.\n\n        Gets cron job details in given namespace.\n\n        Returns Cron job object representation.\n\n        - ``name``:\n          Name of cron job.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.batchv1.read_namespaced_cron_job(name, namespace)\n        return ret\n\n    def list_namespaced_daemon_set(self, namespace, label_selector=\"\"):\n        \"\"\"Gets a list of available daemonsets.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of deaemonsets.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.appsv1.list_namespaced_daemon_set(namespace, watch=False, label_selector=label_selector)\n        return [item for item in ret.items]\n\n    def get_daemonsets_in_namespace(self, namespace, label_selector=\"\"):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_daemon_set.\n\n        Gets a list of available daemonsets.\n\n        Can be optionally filtered by label. e.g. label_selector=label_key=label_value\n\n        Returns list of deaemonsets.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.appsv1.list_namespaced_daemon_set(namespace, watch=False, label_selector=label_selector)\n        return [item.metadata.name for item in ret.items]\n\n    def read_namespaced_daemon_set(self, name, namespace):\n        \"\"\"Gets deamonset details in given namespace.\n\n        Returns daemonset object representation.\n\n        - ``name``:\n          Name of the daemonset\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.appsv1.read_namespaced_daemon_set(name, namespace)\n        return ret\n\n    def get_daemonset_details_in_namespace(self, name, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use read_namespaced_daemon_set.\n\n        Gets deamonset details in given namespace.\n\n        Returns daemonset object representation.\n\n        - ``name``:\n          Name of the daemonset\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.appsv1.read_namespaced_daemon_set(name, namespace)\n        return ret\n\n    def list_cluster_role(self):\n        \"\"\"Gets a list of cluster_roles.\n\n        Returns list of cluster_roles.\n        \"\"\"\n        ret = self.rbac_authv1_api.list_cluster_role(watch=False)\n        return [item for item in ret.items]\n\n    def get_cluster_roles(self):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_cluster_role.\n\n        Gets a list of cluster_roles.\n\n        Returns list of cluster_roles.\n        \"\"\"\n        ret = self.rbac_authv1_api.list_cluster_role(watch=False)\n        return [item.metadata.name for item in ret.items]\n\n    def list_cluster_role_binding(self):\n        \"\"\"Gets a list of cluster_role_bindings.\n\n        Returns list of cluster_role_bindings.\n        \"\"\"\n        ret = self.rbac_authv1_api.list_cluster_role_binding(watch=False)\n        return [item for item in ret.items]\n\n    def get_cluster_role_bindings(self):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_cluster_role_binding.\n\n        Gets a list of cluster_role_bindings.\n\n        Returns list of cluster_role_bindings.\n        \"\"\"\n        ret = self.rbac_authv1_api.list_cluster_role_binding(watch=False)\n        return [item.metadata.name for item in ret.items]\n\n    def list_namespaced_role(self, namespace):\n        \"\"\"Gets roles in given namespace.\n\n        Returns list of roles.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.rbac_authv1_api.list_namespaced_role(namespace, watch=False)\n        return [item for item in ret.items]\n\n    def get_roles_in_namespace(self, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_role.\n\n        Gets roles in given namespace.\n\n        Returns list of roles.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.rbac_authv1_api.list_namespaced_role(namespace, watch=False)\n        return [item.metadata.name for item in ret.items]\n\n    def list_namespaced_role_binding(self, namespace):\n        \"\"\"Gets role_bindings in given namespace.\n\n        Returns list of role_bindings.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.rbac_authv1_api.list_namespaced_role_binding(namespace, watch=False)\n        return [item for item in ret.items]\n\n    def get_role_bindings_in_namespace(self, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_namespaced_role_binding.\n\n        Gets role_bindings in given namespace.\n\n        Returns list of role_bindings.\n\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.rbac_authv1_api.list_namespaced_role_binding(namespace, watch=False)\n        return [item.metadata.name for item in ret.items]\n\n    def list_cluster_custom_object(self, group, version, plural):\n        \"\"\"Lists cluster level custom objects.\n\n        Returns an object.\n\n        - ``group``:\n          API Group, e.g. 'k8s.cni.cncf.io'\n        - ``version``:\n          API version, e.g. 'v1'\n        - ``plural``:\n          e.g. 'network-attachment-definitions'\n\n        As in ``GET /apis/{group}/{version}/{plural}``\n\n        https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\n        \"\"\"\n        return self.custom_object.list_cluster_custom_object(group, version, plural)\n\n    def list_cluster_custom_objects(self, group, version, plural):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use list_cluster_custom_object.\n\n        Lists cluster level custom objects.\n\n        Returns an object.\n\n        - ``group``:\n          API Group, e.g. 'k8s.cni.cncf.io'\n        - ``version``:\n          API version, e.g. 'v1'\n        - ``plural``:\n          e.g. 'network-attachment-definitions'\n\n        As in ``GET /apis/{group}/{version}/{plural}``\n\n        https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\n        \"\"\"\n        return self.custom_object.list_cluster_custom_object(group, version, plural)\n\n    def get_cluster_custom_object(self, group, version, plural, name):\n        \"\"\"Get cluster level custom object.\n\n        Returns an object.\n\n        - ``group``:\n          API Group, e.g. 'scheduling.k8s.io'\n        - ``version``:\n          API version, e.g. 'v1'\n        - ``plural``:\n          e.g. 'priorityclasses'\n        - ``name``:\n          e.g. 'system-node-critical'\n\n        As in ``GET /apis/{group}/{version}/{plural}/{name}``\n\n        https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\n        \"\"\"\n        return self.custom_object.get_cluster_custom_object(group, version, plural, name)\n\n    def get_namespaced_custom_object(self, group, version, namespace, plural, name):\n        \"\"\"Get custom object in namespace.\n\n        Returns an object.\n\n        - ``group``:\n          API Group, e.g. 'k8s.cni.cncf.io'\n        - ``version``:\n          API version, e.g. 'v1'\n        - ``namespace``:\n          Namespace, e.g. 'default'\n        - ``plural``:\n          e.g. 'network-attachment-definitions'\n        - ``name``:\n          e.g. 'my-network'\n\n        As in ``GET /apis/{group}/{version}/namespaces/{namespace}/{plural}/{name}``\n\n        https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\n        \"\"\"\n        return self.custom_object.get_namespaced_custom_object(group, version, namespace, plural, name)\n\n    def list_namespaced_custom_object(self, group, version, namespace, plural):\n        \"\"\"List custom objects in namespace.\n\n        Returns an object.\n\n        - ``group``:\n          API Group, e.g. 'k8s.cni.cncf.io'\n        - ``version``:\n          API version, e.g. 'v1'\n        - ``namespace``:\n          Namespace, e.g. 'default'\n        - ``plural``:\n          e.g. 'network-attachment-definitions'\n\n        As in ``GET /apis/{group}/{version}/namespaces/{namespace}/{plural}``\n\n        https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\n        \"\"\"\n        return self.custom_object.list_namespaced_custom_object(group, version, namespace, plural)\n\n    def get_custom_object_in_namespace(self, group, version, namespace, plural, name):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use get_namespaced_custom_object.\n\n        Get custom object in namespace.\n\n        Returns an object.\n\n        - ``group``:\n          API Group, e.g. 'k8s.cni.cncf.io'\n        - ``version``:\n          API version, e.g. 'v1'\n        - ``namespace``:\n          Namespace, e.g. 'default'\n        - ``plural``:\n          e.g. 'network-attachment-definitions'\n        - ``name``:\n          e.g. 'my-network'\n\n        As in ``GET /apis/{group}/{version}/namespaces/{namespace}/{plural}/{name}``\n\n        https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md\n        \"\"\"\n        return self.custom_object.get_namespaced_custom_object(group, version, namespace, plural, name)\n\n    def create_namespaced_cron_job(self, namespace, body):\n        \"\"\"Creates cron_job in a namespace\n\n        Returns created cron_job\n        - ``body``:\n          Cron_job object.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.batchv1.create_namespaced_cron_job(namespace=namespace, body=body)\n        return ret\n\n    def create_cron_job_in_namespace(self, namespace, body):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use create_namespaced_cron_job.\n\n        Creates cron_job in a namespace\n\n        Returns created cron_job\n        - ``body``:\n          Cron_job object.\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.batchv1.create_namespaced_cron_job(namespace=namespace, body=body)\n        return ret\n\n    def delete_namespaced_cron_job(self, name, namespace):\n        \"\"\"Deletes cron_job in a namespace\n\n        Returns V1 status\n        - ``name``:\n          Cron Job name\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.batchv1.delete_namespaced_cron_job(name=name, namespace=namespace)\n        return ret\n\n    def delete_cron_job_in_namespace(self, name, namespace):\n        \"\"\"*DEPRECATED* Will be removed in v1.0.0. Use delete_namespaced_cron_job.\n\n        Deletes cron_job in a namespace\n\n        Returns V1 status\n        - ``name``:\n          Cron Job name\n        - ``namespace``:\n          Namespace to check\n        \"\"\"\n        ret = self.batchv1.delete_namespaced_cron_job(name=name, namespace=namespace)\n        return ret\n"
  },
  {
    "path": "src/KubeLibrary/__init__.py",
    "content": "from .KubeLibrary import KubeLibrary   # noqa: F401\n"
  },
  {
    "path": "src/KubeLibrary/exceptions.py",
    "content": "class BearerTokenWithPrefixException(Exception):\n\n    ROBOT_SUPPRESS_NAME = True\n\n    def __init__(self):\n        super().__init__(\"Unnecessary 'Bearer ' prefix in token\")\n    pass\n"
  },
  {
    "path": "src/KubeLibrary/version.py",
    "content": "version = \"0.8.10\"\n"
  },
  {
    "path": "test/__init__.py",
    "content": ""
  },
  {
    "path": "test/resources/cluster_role.json",
    "content": "[\n\t{\n\t\t\"apiVersion\": \"rbac.authorization.k8s.io/v1\",\n\t\t\"kind\": \"ClusterRole\",\n\t\t\"metadata\": {\n\t\t\t\"creationTimestamp\": \"2021-03-16T12:06:59Z\",\n\t\t\t\"managedFields\": [\n\t\t\t\t{\n\t\t\t\t\t\"apiVersion\": \"rbac.authorization.k8s.io/v1\",\n\t\t\t\t\t\"fieldsType\": \"FieldsV1\",\n\t\t\t\t\t\"fieldsV1\": {\n\t\t\t\t\t\t\"f:rules\": {}\n\t\t\t\t\t},\n\t\t\t\t\t\"manager\": \"kubectl\",\n\t\t\t\t\t\"operation\": \"Update\",\n\t\t\t\t\t\"time\": \"2021-03-16T12:06:59Z\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"name\": \"secret-reader\",\n\t\t\t\"resourceVersion\": \"678\",\n\t\t\t\"selfLink\": \"/apis/rbac.authorization.k8s.io/v1/clusterroles/secret-reader\",\n\t\t\t\"uid\": \"8fe2238a-9132-4b5d-a1d6-8c68b7c6abf0\"\n\t\t},\n\t\t\"rules\": [\n\t\t\t{\n\t\t\t\t\"apiGroups\": [\n\t\t\t\t\t\"\"\n\t\t\t\t],\n\t\t\t\t\"resources\": [\n\t\t\t\t\t\"secrets\"\n\t\t\t\t],\n\t\t\t\t\"verbs\": [\n\t\t\t\t\t\"get\",\n\t\t\t\t\t\"watch\",\n\t\t\t\t\t\"list\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n]\n"
  },
  {
    "path": "test/resources/cluster_role_bind.json",
    "content": "[\n\t{\n\t\t\"apiVersion\": \"rbac.authorization.k8s.io/v1\",\n\t\t\"kind\": \"ClusterRoleBinding\",\n\t\t\"metadata\": {\n\t\t\t\"creationTimestamp\": \"2021-03-16T12:25:09Z\",\n\t\t\t\"managedFields\": [\n\t\t\t\t{\n\t\t\t\t\t\"apiVersion\": \"rbac.authorization.k8s.io/v1\",\n\t\t\t\t\t\"fieldsType\": \"FieldsV1\",\n\t\t\t\t\t\"fieldsV1\": {\n\t\t\t\t\t\t\"f:roleRef\": {\n\t\t\t\t\t\t\t\"f:apiGroup\": {},\n\t\t\t\t\t\t\t\"f:kind\": {},\n\t\t\t\t\t\t\t\"f:name\": {}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"f:subjects\": {}\n\t\t\t\t\t},\n\t\t\t\t\t\"manager\": \"kubectl\",\n\t\t\t\t\t\"operation\": \"Update\",\n\t\t\t\t\t\"time\": \"2021-03-16T12:25:09Z\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"name\": \"read-secrets-global\",\n\t\t\t\"resourceVersion\": \"3556\",\n\t\t\t\"selfLink\": \"/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/read-secrets-global\",\n\t\t\t\"uid\": \"e31d1893-811b-4b63-8051-0c8ffba31140\"\n\t\t},\n\t\t\"roleRef\": {\n\t\t\t\"apiGroup\": \"rbac.authorization.k8s.io\",\n\t\t\t\"kind\": \"ClusterRole\",\n\t\t\t\"name\": \"secret-reader\"\n\t\t},\n\t\t\"subjects\": [\n\t\t\t{\n\t\t\t\t\"apiGroup\": \"rbac.authorization.k8s.io\",\n\t\t\t\t\"kind\": \"Group\",\n\t\t\t\t\"name\": \"manager\"\n\t\t\t}\n\t\t]\n\t}\n]\n"
  },
  {
    "path": "test/resources/configmap.json",
    "content": "[\n\t{\n\t\t\"apiVersion\": \"v1\",\n\t\t\"data\": {\n\t\t\t\"game.properties\": \"enemy.types=aliens,monsters\\nplayer.maximum-lives=5    \\n\",\n\t\t\t\"player_initial_lives\": \"3\",\n\t\t\t\"ui_properties_file_name\": \"user-interface.properties\",\n\t\t\t\"user-interface.properties\": \"color.good=purple\\ncolor.bad=yellow\\nallow.textmode=true   \\n\"\n\t\t},\n\t\t\"kind\": \"ConfigMap\",\n\t\t\"metadata\": {\n\t\t\t\"creationTimestamp\": \"2021-03-17T13:06:44Z\",\n\t\t\t\"managedFields\": [\n\t\t\t\t{\n\t\t\t\t\t\"apiVersion\": \"v1\",\n\t\t\t\t\t\"fieldsType\": \"FieldsV1\",\n\t\t\t\t\t\"fieldsV1\": {\n\t\t\t\t\t\t\"f:data\": {\n\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\"f:game.properties\": {},\n\t\t\t\t\t\t\t\"f:player_initial_lives\": {},\n\t\t\t\t\t\t\t\"f:ui_properties_file_name\": {},\n\t\t\t\t\t\t\t\"f:user-interface.properties\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"manager\": \"kubectl\",\n\t\t\t\t\t\"operation\": \"Update\",\n\t\t\t\t\t\"time\": \"2021-03-17T13:06:44Z\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"name\": \"game-demo\",\n\t\t\t\"namespace\": \"default\",\n\t\t\t\"resourceVersion\": \"10295\",\n\t\t\t\"selfLink\": \"/api/v1/namespaces/default/configmaps/game-demo\",\n\t\t\t\"uid\": \"78083cf6-4d1a-475a-abf8-0da3d21bb8a5\"\n\t\t}\n\t}\n]\n"
  },
  {
    "path": "test/resources/cronjob.json",
    "content": "[\n\t{\n\t\t\"apiVersion\": \"batch/v1beta1\",\n\t\t\"kind\": \"CronJob\",\n\t\t\"metadata\": {\n\t\t\t\"creationTimestamp\": \"2021-03-25T04:02:24Z\",\n\t\t\t\"managedFields\": [\n\t\t\t\t{\n\t\t\t\t\t\"apiVersion\": \"batch/v1beta1\",\n\t\t\t\t\t\"fieldsType\": \"FieldsV1\",\n\t\t\t\t\t\"fieldsV1\": {\n\t\t\t\t\t\t\"f:spec\": {\n\t\t\t\t\t\t\t\"f:concurrencyPolicy\": {},\n\t\t\t\t\t\t\t\"f:failedJobsHistoryLimit\": {},\n\t\t\t\t\t\t\t\"f:jobTemplate\": {\n\t\t\t\t\t\t\t\t\"f:spec\": {\n\t\t\t\t\t\t\t\t\t\"f:template\": {\n\t\t\t\t\t\t\t\t\t\t\"f:spec\": {\n\t\t\t\t\t\t\t\t\t\t\t\"f:containers\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"k:{\\\"name\\\":\\\"hello\\\"}\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:command\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:image\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:imagePullPolicy\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:name\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:resources\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:terminationMessagePath\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:terminationMessagePolicy\": {}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"f:dnsPolicy\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:restartPolicy\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:schedulerName\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:securityContext\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:terminationGracePeriodSeconds\": {}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"f:schedule\": {},\n\t\t\t\t\t\t\t\"f:successfulJobsHistoryLimit\": {},\n\t\t\t\t\t\t\t\"f:suspend\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"manager\": \"kubectl\",\n\t\t\t\t\t\"operation\": \"Update\",\n\t\t\t\t\t\"time\": \"2021-03-25T04:02:24Z\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"name\": \"hello\",\n\t\t\t\"resourceVersion\": \"17206\",\n\t\t\t\"selfLink\": \"/apis/batch/v1beta1/namespaces/kubelib-tests/cronjobs/hello\",\n\t\t\t\"uid\": \"95049672-9fb9-4a23-ab69-046454a4104d\"\n\t\t},\n\t\t\"spec\": {\n\t\t\t\"concurrencyPolicy\": \"Allow\",\n\t\t\t\"failedJobsHistoryLimit\": 1,\n\t\t\t\"jobTemplate\": {\n\t\t\t\t\"metadata\": {\n\t\t\t\t\t\"creationTimestamp\": null\n\t\t\t\t},\n\t\t\t\t\"spec\": {\n\t\t\t\t\t\"template\": {\n\t\t\t\t\t\t\"metadata\": {\n\t\t\t\t\t\t\t\"creationTimestamp\": null\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"spec\": {\n\t\t\t\t\t\t\t\"containers\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"command\": [\n\t\t\t\t\t\t\t\t\t\t\"/bin/sh\",\n\t\t\t\t\t\t\t\t\t\t\"-c\",\n\t\t\t\t\t\t\t\t\t\t\"date; echo Hello from the Kubernetes cluster\"\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"image\": \"busybox\",\n\t\t\t\t\t\t\t\t\t\"imagePullPolicy\": \"IfNotPresent\",\n\t\t\t\t\t\t\t\t\t\"name\": \"hello\",\n\t\t\t\t\t\t\t\t\t\"resources\": {},\n\t\t\t\t\t\t\t\t\t\"terminationMessagePath\": \"/dev/termination-log\",\n\t\t\t\t\t\t\t\t\t\"terminationMessagePolicy\": \"File\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"dnsPolicy\": \"ClusterFirst\",\n\t\t\t\t\t\t\t\"restartPolicy\": \"OnFailure\",\n\t\t\t\t\t\t\t\"schedulerName\": \"default-scheduler\",\n\t\t\t\t\t\t\t\"securityContext\": {},\n\t\t\t\t\t\t\t\"terminationGracePeriodSeconds\": 30\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"schedule\": \"*/1 * * * *\",\n\t\t\t\"successfulJobsHistoryLimit\": 3,\n\t\t\t\"suspend\": false\n\t\t},\n\t\t\"status\": {}\n\t}\n]\n"
  },
  {
    "path": "test/resources/cronjob_details.json",
    "content": "{\n    \"apiVersion\": \"batch/v1beta1\",\n    \"kind\": \"CronJob\",\n    \"metadata\": {\n        \"creationTimestamp\": \"2021-04-19T10:54:19Z\",\n        \"labels\": {\n            \"TestLabel\": \"mytestlabel\"\n        },\n        \"managedFields\": [\n            {\n                \"apiVersion\": \"batch/v1beta1\",\n                \"fieldsType\": \"FieldsV1\",\n                \"fieldsV1\": {\n                    \"f:metadata\": {\n                        \"f:labels\": {\n                            \".\": {},\n                            \"f:TestLabel\": {}\n                        }\n                    },\n                    \"f:spec\": {\n                        \"f:concurrencyPolicy\": {},\n                        \"f:failedJobsHistoryLimit\": {},\n                        \"f:jobTemplate\": {\n                            \"f:spec\": {\n                                \"f:template\": {\n                                    \"f:metadata\": {\n                                        \"f:labels\": {\n                                            \".\": {},\n                                            \"f:TestLabel\": {}\n                                        }\n                                    },\n                                    \"f:spec\": {\n                                        \"f:containers\": {\n                                            \"k:{\\\"name\\\":\\\"hello\\\"}\": {\n                                                \".\": {},\n                                                \"f:args\": {},\n                                                \"f:image\": {},\n                                                \"f:imagePullPolicy\": {},\n                                                \"f:name\": {},\n                                                \"f:resources\": {},\n                                                \"f:terminationMessagePath\": {},\n                                                \"f:terminationMessagePolicy\": {}\n                                            }\n                                        },\n                                        \"f:dnsPolicy\": {},\n                                        \"f:restartPolicy\": {},\n                                        \"f:schedulerName\": {},\n                                        \"f:securityContext\": {},\n                                        \"f:terminationGracePeriodSeconds\": {}\n                                    }\n                                }\n                            }\n                        },\n                        \"f:schedule\": {},\n                        \"f:successfulJobsHistoryLimit\": {},\n                        \"f:suspend\": {}\n                    }\n                },\n                \"manager\": \"kubectl\",\n                \"operation\": \"Update\",\n                \"time\": \"2021-04-19T10:54:19Z\"\n            }\n        ],\n        \"name\": \"hello\",\n        \"namespace\": \"default\",\n        \"resourceVersion\": \"744\",\n        \"selfLink\": \"/apis/batch/v1beta1/namespaces/default/cronjobs/hello\",\n        \"uid\": \"a4030af5-39e0-4b8e-a6a1-65811afbbab7\"\n    },\n    \"spec\": {\n        \"concurrencyPolicy\": \"Allow\",\n        \"failedJobsHistoryLimit\": 1,\n        \"jobTemplate\": {\n            \"metadata\": {\n                \"creationTimestamp\": null\n            },\n            \"spec\": {\n                \"template\": {\n                    \"metadata\": {\n                        \"creationTimestamp\": null,\n                        \"labels\": {\n                            \"TestLabel\": \"mytestlabel\"\n                        }\n                    },\n                    \"spec\": {\n                        \"containers\": [\n                            {\n                                \"args\": [\n                                    \"/bin/sh\",\n                                    \"-c\",\n                                    \"date; echo Hello from the Kubernetes cluster\"\n                                ],\n                                \"image\": \"busybox\",\n                                \"imagePullPolicy\": \"IfNotPresent\",\n                                \"name\": \"hello\",\n                                \"resources\": {},\n                                \"terminationMessagePath\": \"/dev/termination-log\",\n                                \"terminationMessagePolicy\": \"File\"\n                            }\n                        ],\n                        \"dnsPolicy\": \"ClusterFirst\",\n                        \"restartPolicy\": \"OnFailure\",\n                        \"schedulerName\": \"default-scheduler\",\n                        \"securityContext\": {},\n                        \"terminationGracePeriodSeconds\": 30\n                    }\n                }\n            }\n        },\n        \"schedule\": \"*/1 * * * *\",\n        \"successfulJobsHistoryLimit\": 3,\n        \"suspend\": false\n    },\n    \"status\": {}\n}\n"
  },
  {
    "path": "test/resources/daemonset.json",
    "content": "[\n\t{\n\t\t\"apiVersion\": \"apps/v1\",\n\t\t\"kind\": \"DaemonSet\",\n\t\t\"metadata\": {\n\t\t\t\"annotations\": {\n\t\t\t\t\"deprecated.daemonset.template.generation\": \"1\"\n\t\t\t},\n\t\t\t\"creationTimestamp\": \"2021-03-25T04:00:10Z\",\n\t\t\t\"generation\": 1,\n\t\t\t\"labels\": {\n\t\t\t\t\"k8s-app\": \"fluentd-logging\"\n\t\t\t},\n\t\t\t\"managedFields\": [\n\t\t\t\t{\n\t\t\t\t\t\"apiVersion\": \"apps/v1\",\n\t\t\t\t\t\"fieldsType\": \"FieldsV1\",\n\t\t\t\t\t\"fieldsV1\": {\n\t\t\t\t\t\t\"f:metadata\": {\n\t\t\t\t\t\t\t\"f:annotations\": {\n\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\"f:deprecated.daemonset.template.generation\": {}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"f:labels\": {\n\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\"f:k8s-app\": {}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"f:spec\": {\n\t\t\t\t\t\t\t\"f:revisionHistoryLimit\": {},\n\t\t\t\t\t\t\t\"f:selector\": {\n\t\t\t\t\t\t\t\t\"f:matchLabels\": {\n\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\"f:name\": {}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"f:template\": {\n\t\t\t\t\t\t\t\t\"f:metadata\": {\n\t\t\t\t\t\t\t\t\t\"f:labels\": {\n\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\"f:name\": {}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"f:spec\": {\n\t\t\t\t\t\t\t\t\t\"f:containers\": {\n\t\t\t\t\t\t\t\t\t\t\"k:{\\\"name\\\":\\\"fluentd-elasticsearch\\\"}\": {\n\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:image\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:imagePullPolicy\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:name\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:resources\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"f:limits\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:memory\": {}\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\"f:requests\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:cpu\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:memory\": {}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"f:terminationMessagePath\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:terminationMessagePolicy\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:volumeMounts\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"k:{\\\"mountPath\\\":\\\"/var/lib/docker/containers\\\"}\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:mountPath\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:name\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:readOnly\": {}\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\"k:{\\\"mountPath\\\":\\\"/var/log\\\"}\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:mountPath\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:name\": {}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"f:dnsPolicy\": {},\n\t\t\t\t\t\t\t\t\t\"f:restartPolicy\": {},\n\t\t\t\t\t\t\t\t\t\"f:schedulerName\": {},\n\t\t\t\t\t\t\t\t\t\"f:securityContext\": {},\n\t\t\t\t\t\t\t\t\t\"f:terminationGracePeriodSeconds\": {},\n\t\t\t\t\t\t\t\t\t\"f:tolerations\": {},\n\t\t\t\t\t\t\t\t\t\"f:volumes\": {\n\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\"k:{\\\"name\\\":\\\"varlibdockercontainers\\\"}\": {\n\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:hostPath\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"f:path\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"f:type\": {}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"f:name\": {}\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\"k:{\\\"name\\\":\\\"varlog\\\"}\": {\n\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:hostPath\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"f:path\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"f:type\": {}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"f:name\": {}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"f:updateStrategy\": {\n\t\t\t\t\t\t\t\t\"f:rollingUpdate\": {\n\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\"f:maxUnavailable\": {}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"f:type\": {}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"manager\": \"kubectl\",\n\t\t\t\t\t\"operation\": \"Update\",\n\t\t\t\t\t\"time\": \"2021-03-25T04:00:10Z\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"apiVersion\": \"apps/v1\",\n\t\t\t\t\t\"fieldsType\": \"FieldsV1\",\n\t\t\t\t\t\"fieldsV1\": {\n\t\t\t\t\t\t\"f:status\": {\n\t\t\t\t\t\t\t\"f:currentNumberScheduled\": {},\n\t\t\t\t\t\t\t\"f:desiredNumberScheduled\": {},\n\t\t\t\t\t\t\t\"f:numberAvailable\": {},\n\t\t\t\t\t\t\t\"f:numberReady\": {},\n\t\t\t\t\t\t\t\"f:observedGeneration\": {},\n\t\t\t\t\t\t\t\"f:updatedNumberScheduled\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"manager\": \"kube-controller-manager\",\n\t\t\t\t\t\"operation\": \"Update\",\n\t\t\t\t\t\"time\": \"2021-03-25T04:00:22Z\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"name\": \"fluentd-elasticsearch\",\n\t\t\t\"resourceVersion\": \"16870\",\n\t\t\t\"selfLink\": \"/apis/apps/v1/namespaces/kubelib-tests/daemonsets/fluentd-elasticsearch\",\n\t\t\t\"uid\": \"09db9622-6111-402a-a9b9-d2ed8f0ee65c\"\n\t\t},\n\t\t\"spec\": {\n\t\t\t\"revisionHistoryLimit\": 10,\n\t\t\t\"selector\": {\n\t\t\t\t\"matchLabels\": {\n\t\t\t\t\t\"name\": \"fluentd-elasticsearch\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"template\": {\n\t\t\t\t\"metadata\": {\n\t\t\t\t\t\"creationTimestamp\": null,\n\t\t\t\t\t\"labels\": {\n\t\t\t\t\t\t\"name\": \"fluentd-elasticsearch\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"spec\": {\n\t\t\t\t\t\"containers\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"image\": \"quay.io/fluentd_elasticsearch/fluentd:v2.5.2\",\n\t\t\t\t\t\t\t\"imagePullPolicy\": \"IfNotPresent\",\n\t\t\t\t\t\t\t\"name\": \"fluentd-elasticsearch\",\n\t\t\t\t\t\t\t\"resources\": {\n\t\t\t\t\t\t\t\t\"limits\": {\n\t\t\t\t\t\t\t\t\t\"memory\": \"200Mi\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"requests\": {\n\t\t\t\t\t\t\t\t\t\"cpu\": \"100m\",\n\t\t\t\t\t\t\t\t\t\"memory\": \"200Mi\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"terminationMessagePath\": \"/dev/termination-log\",\n\t\t\t\t\t\t\t\"terminationMessagePolicy\": \"File\",\n\t\t\t\t\t\t\t\"volumeMounts\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mountPath\": \"/var/log\",\n\t\t\t\t\t\t\t\t\t\"name\": \"varlog\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mountPath\": \"/var/lib/docker/containers\",\n\t\t\t\t\t\t\t\t\t\"name\": \"varlibdockercontainers\",\n\t\t\t\t\t\t\t\t\t\"readOnly\": true\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"dnsPolicy\": \"ClusterFirst\",\n\t\t\t\t\t\"restartPolicy\": \"Always\",\n\t\t\t\t\t\"schedulerName\": \"default-scheduler\",\n\t\t\t\t\t\"securityContext\": {},\n\t\t\t\t\t\"terminationGracePeriodSeconds\": 30,\n\t\t\t\t\t\"tolerations\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"effect\": \"NoSchedule\",\n\t\t\t\t\t\t\t\"key\": \"node-role.kubernetes.io/master\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"volumes\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"hostPath\": {\n\t\t\t\t\t\t\t\t\"path\": \"/var/log\",\n\t\t\t\t\t\t\t\t\"type\": \"\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"name\": \"varlog\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"hostPath\": {\n\t\t\t\t\t\t\t\t\"path\": \"/var/lib/docker/containers\",\n\t\t\t\t\t\t\t\t\"type\": \"\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"name\": \"varlibdockercontainers\"\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"updateStrategy\": {\n\t\t\t\t\"rollingUpdate\": {\n\t\t\t\t\t\"maxUnavailable\": 1\n\t\t\t\t},\n\t\t\t\t\"type\": \"RollingUpdate\"\n\t\t\t}\n\t\t},\n\t\t\"status\": {\n\t\t\t\"currentNumberScheduled\": 2,\n\t\t\t\"desiredNumberScheduled\": 2,\n\t\t\t\"numberAvailable\": 2,\n\t\t\t\"numberMisscheduled\": 0,\n\t\t\t\"numberReady\": 2,\n\t\t\t\"observedGeneration\": 1,\n\t\t\t\"updatedNumberScheduled\": 2\n\t\t}\n\t}\n]\n"
  },
  {
    "path": "test/resources/daemonset_details.json",
    "content": "{\n    \"apiVersion\": \"apps/v1\",\n    \"kind\": \"DaemonSet\",\n    \"metadata\": {\n        \"annotations\": {\n            \"deprecated.daemonset.template.generation\": \"1\"\n        },\n        \"creationTimestamp\": \"2021-04-22T14:18:47Z\",\n        \"generation\": 1,\n        \"labels\": {\n            \"TestLabel\": \"mytestlabel\"\n        },\n        \"managedFields\": [\n            {\n                \"apiVersion\": \"apps/v1\",\n                \"fieldsType\": \"FieldsV1\",\n                \"fieldsV1\": {\n                    \"f:metadata\": {\n                        \"f:annotations\": {\n                            \".\": {},\n                            \"f:deprecated.daemonset.template.generation\": {}\n                        },\n                        \"f:labels\": {\n                            \".\": {},\n                            \"f:TestLabel\": {}\n                        }\n                    },\n                    \"f:spec\": {\n                        \"f:revisionHistoryLimit\": {},\n                        \"f:selector\": {\n                            \"f:matchLabels\": {\n                                \".\": {},\n                                \"f:name\": {}\n                            }\n                        },\n                        \"f:template\": {\n                            \"f:metadata\": {\n                                \"f:labels\": {\n                                    \".\": {},\n                                    \"f:name\": {}\n                                }\n                            },\n                            \"f:spec\": {\n                                \"f:containers\": {\n                                    \"k:{\\\"name\\\":\\\"fluentd-elasticsearch\\\"}\": {\n                                        \".\": {},\n                                        \"f:image\": {},\n                                        \"f:imagePullPolicy\": {},\n                                        \"f:name\": {},\n                                        \"f:resources\": {\n                                            \".\": {},\n                                            \"f:limits\": {\n                                                \".\": {},\n                                                \"f:memory\": {}\n                                            },\n                                            \"f:requests\": {\n                                                \".\": {},\n                                                \"f:cpu\": {},\n                                                \"f:memory\": {}\n                                            }\n                                        },\n                                        \"f:terminationMessagePath\": {},\n                                        \"f:terminationMessagePolicy\": {},\n                                        \"f:volumeMounts\": {\n                                            \".\": {},\n                                            \"k:{\\\"mountPath\\\":\\\"/var/lib/docker/containers\\\"}\": {\n                                                \".\": {},\n                                                \"f:mountPath\": {},\n                                                \"f:name\": {},\n                                                \"f:readOnly\": {}\n                                            },\n                                            \"k:{\\\"mountPath\\\":\\\"/var/log\\\"}\": {\n                                                \".\": {},\n                                                \"f:mountPath\": {},\n                                                \"f:name\": {}\n                                            }\n                                        }\n                                    }\n                                },\n                                \"f:dnsPolicy\": {},\n                                \"f:restartPolicy\": {},\n                                \"f:schedulerName\": {},\n                                \"f:securityContext\": {},\n                                \"f:terminationGracePeriodSeconds\": {},\n                                \"f:tolerations\": {},\n                                \"f:volumes\": {\n                                    \".\": {},\n                                    \"k:{\\\"name\\\":\\\"varlibdockercontainers\\\"}\": {\n                                        \".\": {},\n                                        \"f:hostPath\": {\n                                            \".\": {},\n                                            \"f:path\": {},\n                                            \"f:type\": {}\n                                        },\n                                        \"f:name\": {}\n                                    },\n                                    \"k:{\\\"name\\\":\\\"varlog\\\"}\": {\n                                        \".\": {},\n                                        \"f:hostPath\": {\n                                            \".\": {},\n                                            \"f:path\": {},\n                                            \"f:type\": {}\n                                        },\n                                        \"f:name\": {}\n                                    }\n                                }\n                            }\n                        },\n                        \"f:updateStrategy\": {\n                            \"f:rollingUpdate\": {\n                                \".\": {},\n                                \"f:maxUnavailable\": {}\n                            },\n                            \"f:type\": {}\n                        }\n                    }\n                },\n                \"manager\": \"kubectl\",\n                \"operation\": \"Update\",\n                \"time\": \"2021-04-22T14:18:47Z\"\n            },\n            {\n                \"apiVersion\": \"apps/v1\",\n                \"fieldsType\": \"FieldsV1\",\n                \"fieldsV1\": {\n                    \"f:status\": {\n                        \"f:currentNumberScheduled\": {},\n                        \"f:desiredNumberScheduled\": {},\n                        \"f:numberAvailable\": {},\n                        \"f:numberReady\": {},\n                        \"f:observedGeneration\": {},\n                        \"f:updatedNumberScheduled\": {}\n                    }\n                },\n                \"manager\": \"kube-controller-manager\",\n                \"operation\": \"Update\",\n                \"time\": \"2021-04-22T14:19:00Z\"\n            }\n        ],\n        \"name\": \"fluentd-elasticsearch\",\n        \"namespace\": \"default\",\n        \"resourceVersion\": \"1498\",\n        \"selfLink\": \"/apis/apps/v1/namespaces/default/daemonsets/fluentd-elasticsearch\",\n        \"uid\": \"684cdcd7-28c3-4d52-ba26-3aea85895961\"\n    },\n    \"spec\": {\n        \"revisionHistoryLimit\": 10,\n        \"selector\": {\n            \"matchLabels\": {\n                \"name\": \"fluentd-elasticsearch\"\n            }\n        },\n        \"template\": {\n            \"metadata\": {\n                \"creationTimestamp\": null,\n                \"labels\": {\n                    \"name\": \"fluentd-elasticsearch\"\n                }\n            },\n            \"spec\": {\n                \"containers\": [\n                    {\n                        \"image\": \"quay.io/fluentd_elasticsearch/fluentd:v2.5.2\",\n                        \"imagePullPolicy\": \"IfNotPresent\",\n                        \"name\": \"fluentd-elasticsearch\",\n                        \"resources\": {\n                            \"limits\": {\n                                \"memory\": \"200Mi\"\n                            },\n                            \"requests\": {\n                                \"cpu\": \"100m\",\n                                \"memory\": \"200Mi\"\n                            }\n                        },\n                        \"terminationMessagePath\": \"/dev/termination-log\",\n                        \"terminationMessagePolicy\": \"File\",\n                        \"volumeMounts\": [\n                            {\n                                \"mountPath\": \"/var/log\",\n                                \"name\": \"varlog\"\n                            },\n                            {\n                                \"mountPath\": \"/var/lib/docker/containers\",\n                                \"name\": \"varlibdockercontainers\",\n                                \"readOnly\": true\n                            }\n                        ]\n                    }\n                ],\n                \"dnsPolicy\": \"ClusterFirst\",\n                \"restartPolicy\": \"Always\",\n                \"schedulerName\": \"default-scheduler\",\n                \"securityContext\": {},\n                \"terminationGracePeriodSeconds\": 30,\n                \"tolerations\": [\n                    {\n                        \"effect\": \"NoSchedule\",\n                        \"key\": \"node-role.kubernetes.io/master\"\n                    }\n                ],\n                \"volumes\": [\n                    {\n                        \"hostPath\": {\n                            \"path\": \"/var/log\",\n                            \"type\": \"\"\n                        },\n                        \"name\": \"varlog\"\n                    },\n                    {\n                        \"hostPath\": {\n                            \"path\": \"/var/lib/docker/containers\",\n                            \"type\": \"\"\n                        },\n                        \"name\": \"varlibdockercontainers\"\n                    }\n                ]\n            }\n        },\n        \"updateStrategy\": {\n            \"rollingUpdate\": {\n                \"maxUnavailable\": 1\n            },\n            \"type\": \"RollingUpdate\"\n        }\n    },\n    \"status\": {\n        \"currentNumberScheduled\": 2,\n        \"desiredNumberScheduled\": 2,\n        \"numberAvailable\": 2,\n        \"numberMisscheduled\": 0,\n        \"numberReady\": 2,\n        \"observedGeneration\": 1,\n        \"updatedNumberScheduled\": 2\n    }\n}\n"
  },
  {
    "path": "test/resources/deployment.json",
    "content": "[\n\t{\n\t\t\"apiVersion\": \"apps/v1\",\n\t\t\"kind\": \"Deployment\",\n\t\t\"metadata\": {\n\t\t\t\"annotations\": {\n\t\t\t\t\"deployment.kubernetes.io/revision\": \"1\"\n\t\t\t},\n\t\t\t\"creationTimestamp\": \"2021-03-21T14:10:07Z\",\n\t\t\t\"generation\": 1,\n\t\t\t\"labels\": {\n\t\t\t\t\"app\": \"nginx\"\n\t\t\t},\n\t\t\t\"managedFields\": [\n\t\t\t\t{\n\t\t\t\t\t\"apiVersion\": \"apps/v1\",\n\t\t\t\t\t\"fieldsType\": \"FieldsV1\",\n\t\t\t\t\t\"fieldsV1\": {\n\t\t\t\t\t\t\"f:metadata\": {\n\t\t\t\t\t\t\t\"f:labels\": {\n\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\"f:app\": {}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"f:spec\": {\n\t\t\t\t\t\t\t\"f:progressDeadlineSeconds\": {},\n\t\t\t\t\t\t\t\"f:replicas\": {},\n\t\t\t\t\t\t\t\"f:revisionHistoryLimit\": {},\n\t\t\t\t\t\t\t\"f:selector\": {\n\t\t\t\t\t\t\t\t\"f:matchLabels\": {\n\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\"f:app\": {}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"f:strategy\": {\n\t\t\t\t\t\t\t\t\"f:rollingUpdate\": {\n\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\"f:maxSurge\": {},\n\t\t\t\t\t\t\t\t\t\"f:maxUnavailable\": {}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"f:type\": {}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"f:template\": {\n\t\t\t\t\t\t\t\t\"f:metadata\": {\n\t\t\t\t\t\t\t\t\t\"f:labels\": {\n\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\"f:app\": {}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"f:spec\": {\n\t\t\t\t\t\t\t\t\t\"f:containers\": {\n\t\t\t\t\t\t\t\t\t\t\"k:{\\\"name\\\":\\\"nginx\\\"}\": {\n\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:image\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:imagePullPolicy\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:name\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:ports\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"k:{\\\"containerPort\\\":80,\\\"protocol\\\":\\\"TCP\\\"}\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:containerPort\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"f:protocol\": {}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"f:resources\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:terminationMessagePath\": {},\n\t\t\t\t\t\t\t\t\t\t\t\"f:terminationMessagePolicy\": {}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"f:dnsPolicy\": {},\n\t\t\t\t\t\t\t\t\t\"f:restartPolicy\": {},\n\t\t\t\t\t\t\t\t\t\"f:schedulerName\": {},\n\t\t\t\t\t\t\t\t\t\"f:securityContext\": {},\n\t\t\t\t\t\t\t\t\t\"f:terminationGracePeriodSeconds\": {}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"manager\": \"kubectl\",\n\t\t\t\t\t\"operation\": \"Update\",\n\t\t\t\t\t\"time\": \"2021-03-21T14:10:07Z\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"apiVersion\": \"apps/v1\",\n\t\t\t\t\t\"fieldsType\": \"FieldsV1\",\n\t\t\t\t\t\"fieldsV1\": {\n\t\t\t\t\t\t\"f:metadata\": {\n\t\t\t\t\t\t\t\"f:annotations\": {\n\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\"f:deployment.kubernetes.io/revision\": {}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"f:status\": {\n\t\t\t\t\t\t\t\"f:availableReplicas\": {},\n\t\t\t\t\t\t\t\"f:conditions\": {\n\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\"k:{\\\"type\\\":\\\"Available\\\"}\": {\n\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\"f:lastTransitionTime\": {},\n\t\t\t\t\t\t\t\t\t\"f:lastUpdateTime\": {},\n\t\t\t\t\t\t\t\t\t\"f:message\": {},\n\t\t\t\t\t\t\t\t\t\"f:reason\": {},\n\t\t\t\t\t\t\t\t\t\"f:status\": {},\n\t\t\t\t\t\t\t\t\t\"f:type\": {}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"k:{\\\"type\\\":\\\"Progressing\\\"}\": {\n\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\"f:lastTransitionTime\": {},\n\t\t\t\t\t\t\t\t\t\"f:lastUpdateTime\": {},\n\t\t\t\t\t\t\t\t\t\"f:message\": {},\n\t\t\t\t\t\t\t\t\t\"f:reason\": {},\n\t\t\t\t\t\t\t\t\t\"f:status\": {},\n\t\t\t\t\t\t\t\t\t\"f:type\": {}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"f:observedGeneration\": {},\n\t\t\t\t\t\t\t\"f:readyReplicas\": {},\n\t\t\t\t\t\t\t\"f:replicas\": {},\n\t\t\t\t\t\t\t\"f:updatedReplicas\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"manager\": \"kube-controller-manager\",\n\t\t\t\t\t\"operation\": \"Update\",\n\t\t\t\t\t\"time\": \"2021-03-21T14:10:15Z\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"name\": \"nginx-deployment\",\n\t\t\t\"namespace\": \"default\",\n\t\t\t\"resourceVersion\": \"5101\",\n\t\t\t\"selfLink\": \"/apis/apps/v1/namespaces/default/deployments/nginx-deployment\",\n\t\t\t\"uid\": \"7c69ea94-eb4e-4246-90f2-9e9d20964e66\"\n\t\t},\n\t\t\"spec\": {\n\t\t\t\"progressDeadlineSeconds\": 600,\n\t\t\t\"replicas\": 3,\n\t\t\t\"revisionHistoryLimit\": 10,\n\t\t\t\"selector\": {\n\t\t\t\t\"matchLabels\": {\n\t\t\t\t\t\"app\": \"nginx\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"strategy\": {\n\t\t\t\t\"rollingUpdate\": {\n\t\t\t\t\t\"maxSurge\": \"25%\",\n\t\t\t\t\t\"maxUnavailable\": \"25%\"\n\t\t\t\t},\n\t\t\t\t\"type\": \"RollingUpdate\"\n\t\t\t},\n\t\t\t\"template\": {\n\t\t\t\t\"metadata\": {\n\t\t\t\t\t\"creationTimestamp\": null,\n\t\t\t\t\t\"labels\": {\n\t\t\t\t\t\t\"app\": \"nginx\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"spec\": {\n\t\t\t\t\t\"containers\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"image\": \"nginx:1.14.2\",\n\t\t\t\t\t\t\t\"imagePullPolicy\": \"IfNotPresent\",\n\t\t\t\t\t\t\t\"name\": \"nginx\",\n\t\t\t\t\t\t\t\"ports\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"containerPort\": 80,\n\t\t\t\t\t\t\t\t\t\"protocol\": \"TCP\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"resources\": {},\n\t\t\t\t\t\t\t\"terminationMessagePath\": \"/dev/termination-log\",\n\t\t\t\t\t\t\t\"terminationMessagePolicy\": \"File\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"dnsPolicy\": \"ClusterFirst\",\n\t\t\t\t\t\"restartPolicy\": \"Always\",\n\t\t\t\t\t\"schedulerName\": \"default-scheduler\",\n\t\t\t\t\t\"securityContext\": {},\n\t\t\t\t\t\"terminationGracePeriodSeconds\": 30\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"status\": {\n\t\t\t\"availableReplicas\": 3,\n\t\t\t\"conditions\": [\n\t\t\t\t{\n\t\t\t\t\t\"lastTransitionTime\": \"2021-03-21T14:10:15Z\",\n\t\t\t\t\t\"lastUpdateTime\": \"2021-03-21T14:10:15Z\",\n\t\t\t\t\t\"message\": \"Deployment has minimum availability.\",\n\t\t\t\t\t\"reason\": \"MinimumReplicasAvailable\",\n\t\t\t\t\t\"status\": \"True\",\n\t\t\t\t\t\"type\": \"Available\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"lastTransitionTime\": \"2021-03-21T14:10:07Z\",\n\t\t\t\t\t\"lastUpdateTime\": \"2021-03-21T14:10:15Z\",\n\t\t\t\t\t\"message\": \"ReplicaSet \\\"nginx-deployment-6b474476c4\\\" has successfully progressed.\",\n\t\t\t\t\t\"reason\": \"NewReplicaSetAvailable\",\n\t\t\t\t\t\"status\": \"True\",\n\t\t\t\t\t\"type\": \"Progressing\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"observedGeneration\": 1,\n\t\t\t\"readyReplicas\": 3,\n\t\t\t\"replicas\": 3,\n\t\t\t\"updatedReplicas\": 3\n\t\t}\n\t}\n]\n"
  },
  {
    "path": "test/resources/endpoints.json",
    "content": "[\n{\n    \"apiVersion\": \"v1\",\n    \"kind\": \"Endpoints\",\n    \"metadata\": {\n        \"creationTimestamp\": \"2021-04-08T14:59:12Z\",\n        \"managedFields\": [\n            {\n                \"apiVersion\": \"v1\",\n                \"fieldsType\": \"FieldsV1\",\n                \"fieldsV1\": {\n                    \"f:subsets\": {}\n                },\n                \"manager\": \"kubectl\",\n                \"operation\": \"Update\",\n                \"time\": \"2021-04-08T14:59:12Z\"\n            }\n        ],\n        \"name\": \"my-service\",\n        \"namespace\": \"default\",\n        \"resourceVersion\": \"1278\",\n        \"selfLink\": \"/api/v1/namespaces/default/endpoints/my-service\",\n        \"uid\": \"05b4c49e-0d93-4c66-b46b-0454d23721b8\"\n    },\n    \"subsets\": [\n        {\n            \"addresses\": [\n                {\n                    \"ip\": \"192.0.2.42\"\n                }\n            ],\n            \"ports\": [\n                {\n                    \"port\": 9376,\n                    \"protocol\": \"TCP\"\n                }\n            ]\n        }\n    ]\n}\n]\n"
  },
  {
    "path": "test/resources/hpa.json",
    "content": "[\t\n\t{\n\t\t\"apiVersion\": \"autoscaling/v1\",\n\t\t\"kind\": \"HorizontalPodAutoscaler\",\n\t\t\"metadata\": {\n\t\t\t\"annotations\": {\n\t\t\t\t\"autoscaling.alpha.kubernetes.io/conditions\": \"[{\\\"type\\\":\\\"AbleToScale\\\",\\\"status\\\":\\\"True\\\",\\\"lastTransitionTime\\\":\\\"2021-05-31T20:25:56Z\\\",\\\"reason\\\":\\\"SucceededGetScale\\\",\\\"message\\\":\\\"the HPA controller was able to get the target's current scale\\\"},{\\\"type\\\":\\\"ScalingActive\\\",\\\"status\\\":\\\"False\\\",\\\"lastTransitionTime\\\":\\\"2021-05-31T20:25:56Z\\\",\\\"reason\\\":\\\"FailedGetResourceMetric\\\",\\\"message\\\":\\\"the HPA was unable to compute the replica count: missing request for cpu\\\"}]\",\n\t\t\t\t\"meta.helm.sh/release-name\": \"kubelib-test\",\n\t\t\t\t\"meta.helm.sh/release-namespace\": \"kubelib-tests\"\n\t\t\t},\n\t\t\t\"creationTimestamp\": \"2021-05-31T20:25:39Z\",\n\t\t\t\"labels\": {\n\t\t\t\t\"app.kubernetes.io/managed-by\": \"Helm\"\n\t\t\t},\n\t\t\t\"name\": \"kubelib-test-test-objects-chart\",\n\t\t\t\"namespace\": \"kubelib-tests\",\n\t\t\t\"resourceVersion\": \"280454922\",\n\t\t\t\"selfLink\": \"/apis/autoscaling/v1/namespaces/kubelib-tests/horizontalpodautoscalers/kubelib-test-test-objects-chart\",\n\t\t\t\"uid\": \"283300de-6de9-434d-bc8a-f7caeae65dcc\"\n\t\t},\n\t\t\"spec\": {\n\t\t\t\"maxReplicas\": 5,\n\t\t\t\"minReplicas\": 1,\n\t\t\t\"scaleTargetRef\": {\n\t\t\t\t\"apiVersion\": \"apps/v1\",\n\t\t\t\t\"kind\": \"Deployment\",\n\t\t\t\t\"name\": \"kubelib-test-test-objects-chart\"\n\t\t\t},\n\t\t\t\"targetCPUUtilizationPercentage\": 50\n\t\t},\n\t\t\"status\": {\n\t\t\t\"currentReplicas\": 1,\n\t\t\t\"desiredReplicas\": 0\n\t\t}\n\t}\n]\n"
  },
  {
    "path": "test/resources/hpa_details.json",
    "content": "{\n\t\"apiVersion\": \"autoscaling/v1\",\n\t\"kind\": \"HorizontalPodAutoscaler\",\n\t\"metadata\": {\n\t\t\"annotations\": {\n\t\t\t\"autoscaling.alpha.kubernetes.io/conditions\": \"[{\\\"type\\\":\\\"AbleToScale\\\",\\\"status\\\":\\\"True\\\",\\\"lastTransitionTime\\\":\\\"2021-05-31T20:25:56Z\\\",\\\"reason\\\":\\\"SucceededGetScale\\\",\\\"message\\\":\\\"the HPA controller was able to get the target's current scale\\\"},{\\\"type\\\":\\\"ScalingActive\\\",\\\"status\\\":\\\"False\\\",\\\"lastTransitionTime\\\":\\\"2021-05-31T20:25:56Z\\\",\\\"reason\\\":\\\"FailedGetResourceMetric\\\",\\\"message\\\":\\\"the HPA was unable to compute the replica count: missing request for cpu\\\"}]\",\n\t\t\t\"meta.helm.sh/release-name\": \"kubelib-test\",\n\t\t\t\"meta.helm.sh/release-namespace\": \"kubelib-tests\"\n\t\t},\n\t\t\"creationTimestamp\": \"2021-05-31T20:25:39Z\",\n\t\t\"labels\": {\n\t\t\t\"app.kubernetes.io/managed-by\": \"Helm\"\n\t\t},\n\t\t\"name\": \"kubelib-test-test-objects-chart\",\n\t\t\"namespace\": \"kubelib-tests\",\n\t\t\"resourceVersion\": \"280454922\",\n\t\t\"selfLink\": \"/apis/autoscaling/v1/namespaces/kubelib-tests/horizontalpodautoscalers/kubelib-test-test-objects-chart\",\n\t\t\"uid\": \"283300de-6de9-434d-bc8a-f7caeae65dcc\"\n\t},\n\t\"spec\": {\n\t\t\"maxReplicas\": 5,\n\t\t\"minReplicas\": 1,\n\t\t\"scaleTargetRef\": {\n\t\t\t\"apiVersion\": \"apps/v1\",\n\t\t\t\"kind\": \"Deployment\",\n\t\t\t\"name\": \"kubelib-test-test-objects-chart\"\n\t\t},\n\t\t\"targetCPUUtilizationPercentage\": 50\n\t},\n\t\"status\": {\n\t\t\"currentReplicas\": 1,\n\t\t\"desiredReplicas\": 0\n\t}\n}\n"
  },
  {
    "path": "test/resources/ingress.json",
    "content": "[\n\t{\n\t\t\"apiVersion\": \"extensions/v1beta1\",\n\t\t\"kind\": \"Ingress\",\n\t\t\"metadata\": {\n\t\t\t\"creationTimestamp\": \"2021-03-25T04:04:21Z\",\n\t\t\t\"generation\": 1,\n\t\t\t\"managedFields\": [\n\t\t\t\t{\n\t\t\t\t\t\"apiVersion\": \"networking.k8s.io/v1beta1\",\n\t\t\t\t\t\"fieldsType\": \"FieldsV1\",\n\t\t\t\t\t\"fieldsV1\": {\n\t\t\t\t\t\t\"f:spec\": {\n\t\t\t\t\t\t\t\"f:rules\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"manager\": \"kubectl\",\n\t\t\t\t\t\"operation\": \"Update\",\n\t\t\t\t\t\"time\": \"2021-03-25T04:04:21Z\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"name\": \"minimal-ingress\",\n\t\t\t\"namespace\": \"default\",\n\t\t\t\"resourceVersion\": \"17529\",\n\t\t\t\"selfLink\": \"/apis/extensions/v1beta1/namespaces/default/ingresses/minimal-ingress\",\n\t\t\t\"uid\": \"e2dc27e7-4a75-4837-bf6a-9a13d7cbaaf3\"\n\t\t},\n\t\t\"spec\": {\n\t\t\t\"rules\": [\n\t\t\t\t{\n\t\t\t\t\t\"http\": {\n\t\t\t\t\t\t\"paths\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"backend\": {\n\t\t\t\t\t\t\t\t\t\"serviceName\": \"test\",\n\t\t\t\t\t\t\t\t\t\"servicePort\": 80\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"path\": \"/testpath\",\n\t\t\t\t\t\t\t\t\"pathType\": \"ImplementationSpecific\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"status\": {\n\t\t\t\"loadBalancer\": {}\n\t\t}\n\t}\n]\n"
  },
  {
    "path": "test/resources/ingress_details.json",
    "content": "{\n    \"apiVersion\": \"extensions/v1beta1\",\n    \"kind\": \"Ingress\",\n    \"metadata\": {\n        \"creationTimestamp\": \"2021-03-25T04:04:21Z\",\n        \"labels\": {\n            \"TestLabel\": \"mytestlabel\"\n        },\n        \"generation\": 1,\n        \"managedFields\": [\n            {\n                \"apiVersion\": \"networking.k8s.io/v1beta1\",\n                \"fieldsType\": \"FieldsV1\",\n                \"fieldsV1\": {\n                    \"f:spec\": {\n                        \"f:rules\": {}\n                    }\n                },\n                \"manager\": \"kubectl\",\n                \"operation\": \"Update\",\n                \"time\": \"2021-03-25T04:04:21Z\"\n            }\n        ],\n        \"name\": \"minimal-ingress\",\n        \"namespace\": \"default\",\n        \"resourceVersion\": \"17529\",\n        \"selfLink\": \"/apis/extensions/v1beta1/namespaces/default/ingresses/minimal-ingress\",\n        \"uid\": \"e2dc27e7-4a75-4837-bf6a-9a13d7cbaaf3\"\n    },\n    \"spec\": {\n        \"rules\": [\n            {\n                \"http\": {\n                    \"paths\": [\n                        {\n                            \"backend\": {\n                                \"serviceName\": \"test\",\n                                \"servicePort\": 80\n                            },\n                            \"path\": \"/testpath\",\n                            \"pathType\": \"ImplementationSpecific\"\n                        }\n                    ]\n                }\n            }\n        ]\n    },\n    \"status\": {\n        \"loadBalancer\": {}\n    }\n}\n"
  },
  {
    "path": "test/resources/jobs.json",
    "content": "[\n        {\n            \"apiVersion\": \"batch/v1\",\n            \"kind\": \"Job\",\n            \"metadata\": {\n                \"creationTimestamp\": \"2020-12-04T14:53:42Z\",\n                \"labels\": {\n                    \"controller-uid\": \"cce59116-9392-4eb0-b9bb-b3a72dd4d835\",\n                    \"job-name\": \"octopus-0\"\n                },\n                \"name\": \"octopus-0\",\n                \"namespace\": \"default\",\n                \"ownerReferences\": [\n                    {\n                        \"apiVersion\": \"batch/v1beta\",\n                        \"blockOwnerDeletion\": true,\n                        \"kind\": \"CronJob\",\n                        \"name\": \"monitoring-job-prod\",\n                        \"uid\": \"e296649c-3c4e-11ea-8cdc-42010a9a0056\"\n                    }\n                ],\n                \"resourceVersion\": \"259049170\",\n                \"selfLink\": \"/apis/batch/v1/namespaces/default/jobs/octopus-0\",\n                \"uid\": \"cce59116-9392-4eb0-b9bb-b3a72dd4d835\"\n            },\n            \"spec\": {\n                \"backoffLimit\": 6,\n                \"completions\": 1,\n                \"parallelism\": 1,\n                \"selector\": {\n                    \"matchLabels\": {\n                        \"controller-uid\": \"cce59116-9392-4eb0-b9bb-b3a72dd4d835\"\n                    }\n                },\n                \"template\": {\n                    \"metadata\": {\n                        \"creationTimestamp\": null,\n                        \"labels\": {\n                            \"controller-uid\": \"cce59116-9392-4eb0-b9bb-b3a72dd4d835\",\n                            \"job-name\": \"octopus-0\"\n                        }\n                    },\n                    \"spec\": {\n                        \"containers\": [\n                        ],\n                        \"dnsPolicy\": \"ClusterFirst\",\n                        \"restartPolicy\": \"OnFailure\",\n                        \"schedulerName\": \"default-scheduler\",\n                        \"securityContext\": {},\n                        \"terminationGracePeriodSeconds\": 30\n                    }\n                }\n            },\n            \"status\": {\n                \"completionTime\": \"2020-12-04T14:53:46Z\",\n                \"conditions\": [\n                    {\n                        \"lastProbeTime\": \"2020-12-04T14:53:46Z\",\n                        \"lastTransitionTime\": \"2020-12-04T14:53:46Z\",\n                        \"status\": \"True\",\n                        \"type\": \"Complete\"\n                    }\n                ],\n                \"startTime\": \"2020-12-04T14:53:42Z\",\n                \"succeeded\": 1\n            }\n        },\n        {\n            \"apiVersion\": \"batch/v1\",\n            \"kind\": \"Job\",\n            \"metadata\": {\n                \"creationTimestamp\": \"2020-11-30T11:14:09Z\",\n                \"labels\": {\n                    \"controller-uid\": \"1c63b471-812b-4aae-8168-842d8e37b916\",\n                    \"job-name\": \"octopus-1\"\n                },\n                \"name\": \"octopus-1\",\n                \"namespace\": \"default\",\n                \"ownerReferences\": [\n                    {\n                        \"apiVersion\": \"batch/v1beta\",\n                        \"blockOwnerDeletion\": true,\n                        \"kind\": \"CronJob\",\n                        \"name\": \"monitoring-job-staging\",\n                        \"uid\": \"826080f1-3c50-11ea-8cdc-42010a9a0056\"\n                    }\n                ],\n                \"resourceVersion\": \"256386178\",\n                \"selfLink\": \"/apis/batch/v1/namespaces/default/jobs/octopus-1\",\n                \"uid\": \"1c63b471-812b-4aae-8168-842d8e37b916\"\n            },\n            \"spec\": {\n                \"backoffLimit\": 6,\n                \"completions\": 1,\n                \"parallelism\": 1,\n                \"selector\": {\n                    \"matchLabels\": {\n                        \"controller-uid\": \"1c63b471-812b-4aae-8168-842d8e37b916\"\n                    }\n                },\n                \"template\": {\n                    \"metadata\": {\n                        \"creationTimestamp\": null,\n                        \"labels\": {\n                            \"controller-uid\": \"1c63b471-812b-4aae-8168-842d8e37b916\",\n                            \"job-name\": \"octopus-1\"\n                        }\n                    },\n                    \"spec\": {\n                        \"containers\": [\n                            \n                        ],\n                        \"dnsPolicy\": \"ClusterFirst\",\n                        \"restartPolicy\": \"OnFailure\",\n                        \"schedulerName\": \"default-scheduler\",\n                        \"securityContext\": {},\n                        \"terminationGracePeriodSeconds\": 30\n                    }\n                }\n            },\n            \"status\": {\n                \"completionTime\": \"2020-11-30T11:14:12Z\",\n                \"conditions\": [\n                    {\n                        \"lastProbeTime\": \"2020-11-30T11:14:12Z\",\n                        \"lastTransitionTime\": \"2020-11-30T11:14:12Z\",\n                        \"status\": \"True\",\n                        \"type\": \"Complete\"\n                    }\n                ],\n                \"startTime\": \"2020-11-30T11:14:09Z\",\n                \"succeeded\": 1\n            }\n        },\n        {\n            \"apiVersion\": \"batch/v1\",\n            \"kind\": \"Job\",\n            \"metadata\": {\n                \"creationTimestamp\": \"2020-12-08T08:30:29Z\",\n                \"labels\": {\n                    \"controller-uid\": \"58238c85-7d02-442c-8f87-45a7c26f233d\",\n                    \"job-name\": \"octopus-2\"\n                },\n                \"name\": \"octopus-2\",\n                \"namespace\": \"default\",\n                \"ownerReferences\": [\n                    {\n                        \"apiVersion\": \"batch/v1beta\",\n                        \"blockOwnerDeletion\": true,\n                        \"kind\": \"CronJob\",\n                        \"name\": \"monitoring-job-staging\",\n                        \"uid\": \"826080f1-3c50-11ea-8cdc-42010a9a0056\"\n                    }\n                ],\n                \"resourceVersion\": \"261430323\",\n                \"selfLink\": \"/apis/batch/v1/namespaces/default/jobs/octopus-2\",\n                \"uid\": \"58238c85-7d02-442c-8f87-45a7c26f233d\"\n            },\n            \"spec\": {\n                \"backoffLimit\": 6,\n                \"completions\": 1,\n                \"parallelism\": 1,\n                \"selector\": {\n                    \"matchLabels\": {\n                        \"controller-uid\": \"58238c85-7d02-442c-8f87-45a7c26f233d\"\n                    }\n                },\n                \"template\": {\n                    \"metadata\": {\n                        \"creationTimestamp\": null,\n                        \"labels\": {\n                            \"controller-uid\": \"58238c85-7d02-442c-8f87-45a7c26f233d\",\n                            \"job-name\": \"octopus-2\"\n                        }\n                    },\n                    \"spec\": {\n                        \"containers\": [\n                            \n                        ],\n                        \"dnsPolicy\": \"ClusterFirst\",\n                        \"restartPolicy\": \"OnFailure\",\n                        \"schedulerName\": \"default-scheduler\",\n                        \"securityContext\": {},\n                        \"terminationGracePeriodSeconds\": 30\n                    }\n                }\n            },\n            \"status\": {\n                \"completionTime\": \"2020-12-08T08:31:07Z\",\n                \"conditions\": [\n                    {\n                        \"lastProbeTime\": \"2020-12-08T08:31:07Z\",\n                        \"lastTransitionTime\": \"2020-12-08T08:31:07Z\",\n                        \"status\": \"True\",\n                        \"type\": \"Complete\"\n                    }\n                ],\n                \"startTime\": \"2020-12-08T08:30:29Z\",\n                \"succeeded\": 1\n            }\n        },\n        {\n            \"apiVersion\": \"batch/v1\",\n            \"kind\": \"Job\",\n            \"metadata\": {\n                \"creationTimestamp\": \"2020-12-10T08:43:36Z\",\n                \"labels\": {\n                    \"controller-uid\": \"9d0ca880-a0f2-48e6-9b7d-af348c3d0ba1\",\n                    \"job-name\": \"octopus-3\"\n                },\n                \"name\": \"octopus-3\",\n                \"namespace\": \"default\",\n                \"ownerReferences\": [\n                    {\n                        \"apiVersion\": \"batch/v1beta\",\n                        \"blockOwnerDeletion\": true,\n                        \"kind\": \"CronJob\",\n                        \"name\": \"monitoring-job-staging\",\n                        \"uid\": \"826080f1-3c50-11ea-8cdc-42010a9a0056\"\n                    }\n                ],\n                \"resourceVersion\": \"262715903\",\n                \"selfLink\": \"/apis/batch/v1/namespaces/default/jobs/octopus-3\",\n                \"uid\": \"9d0ca880-a0f2-48e6-9b7d-af348c3d0ba1\"\n            },\n            \"spec\": {\n                \"backoffLimit\": 6,\n                \"completions\": 1,\n                \"parallelism\": 1,\n                \"selector\": {\n                    \"matchLabels\": {\n                        \"controller-uid\": \"9d0ca880-a0f2-48e6-9b7d-af348c3d0ba1\"\n                    }\n                },\n                \"template\": {\n                    \"metadata\": {\n                        \"creationTimestamp\": null,\n                        \"labels\": {\n                            \"controller-uid\": \"9d0ca880-a0f2-48e6-9b7d-af348c3d0ba1\",\n                            \"job-name\": \"octopus-3\"\n                        }\n                    },\n                    \"spec\": {\n                        \"containers\": [\n                            \n                        ],\n                        \"dnsPolicy\": \"ClusterFirst\",\n                        \"restartPolicy\": \"OnFailure\",\n                        \"schedulerName\": \"default-scheduler\",\n                        \"securityContext\": {},\n                        \"terminationGracePeriodSeconds\": 30\n                    }\n                }\n            },\n            \"status\": {\n                \"completionTime\": \"2020-12-10T08:43:58Z\",\n                \"conditions\": [\n                    {\n                        \"lastProbeTime\": \"2020-12-10T08:43:58Z\",\n                        \"lastTransitionTime\": \"2020-12-10T08:43:58Z\",\n                        \"status\": \"True\",\n                        \"type\": \"Complete\"\n                    }\n                ],\n                \"startTime\": \"2020-12-10T08:43:36Z\",\n                \"succeeded\": 1\n            }\n        }\n]"
  },
  {
    "path": "test/resources/k3d",
    "content": "apiVersion: v1\nclusters:\n- cluster:\n    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJWakNCL3FBREFnRUNBZ0VBTUFvR0NDcUdTTTQ5QkFNQ01DTXhJVEFmQmdOVkJBTU1HR3N6Y3kxelpYSjIKWlhJdFkyRkFNVFU1T1RFeE5Ua3dNREFlRncweU1EQTVNRE13TmpVeE5EQmFGdzB6TURBNU1ERXdOalV4TkRCYQpNQ014SVRBZkJnTlZCQU1NR0dzemN5MXpaWEoyWlhJdFkyRkFNVFU1T1RFeE5Ua3dNREJaTUJNR0J5cUdTTTQ5CkFnRUdDQ3FHU000OUF3RUhBMElBQkJ0NzF6OER1UGZpZWIvNXI4ZVdaZ2pmL1Z0UnBUMFNNOWdEaG5zTTFseFAKSGdaUFgvU3k1NzFKWFJqbFhpTEdzYmZlaEV4RU5mWmNiUXlpQTZHVkxPYWpJekFoTUE0R0ExVWREd0VCL3dRRQpBd0lDcERBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUFvR0NDcUdTTTQ5QkFNQ0EwY0FNRVFDSUdnUVUwc2k1a2FLCm83cDRlaFdTZFJLZ1JhajJTa3B2YlUwVVdZNElEQ0krQWlBTDhQbjhoUm1oWjB0QUFwY0dKZzROR0d3eE0wTG0KWCtHUEt5bk9qRmlDK1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==\n    server: https://localhost:6443\n  name: k3s-default\ncontexts:\n- context:\n    cluster: k3s-default\n    user: k3s-default\n  name: k3s-default\ncurrent-context: k3s-default\nkind: Config\npreferences: {}\nusers:\n- name: k3s-default\n  user:\n    password: 68dd2cb21de7b909c7b12f3a57c0054f\n    username: admin"
  },
  {
    "path": "test/resources/multiple_context",
    "content": "apiVersion: v1\nclusters:\n- cluster:\n    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJWekNCL3FBREFnRUNBZ0VBTUFvR0NDcUdTTTQ5QkFNQ01DTXhJVEFmQmdOVkJBTU1HR3N6Y3kxelpYSjIKWlhJdFkyRkFNVFl4TXpVNU1UUXhNVEFlRncweU1UQXlNVGN4T1RVd01URmFGdzB6TVRBeU1UVXhPVFV3TVRGYQpNQ014SVRBZkJnTlZCQU1NR0dzemN5MXpaWEoyWlhJdFkyRkFNVFl4TXpVNU1UUXhNVEJaTUJNR0J5cUdTTTQ5CkFnRUdDQ3FHU000OUF3RUhBMElBQkl4T0ZvVnFtdlZ3ZzlHcE1ER0ZOOUprelAzQlVMQWdwSGErYWhta0E5TVUKK1hhMFFxdnZJRUFDNmluZDh1dzdxVTlPcXVXUGZ1M3FyUFU2QitTV3F4ZWpJekFoTUE0R0ExVWREd0VCL3dRRQpBd0lDcERBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDSUd3Um81Y2crMFhOCjZ5cGQvVlhtc2tSQ1MrWjBHV2xSVU54L010S0dGc1dWQWlFQWs0UkNPOFRXVGx5eTVNcHQwcHRaNzBMVlEyWWMKZUdacjJUcFEvTU5uTFJBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==\n    server: https://0.0.0.0:38531\n  name: k3d-k3d-cluster\n- cluster:\n    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJWakNCL3FBREFnRUNBZ0VBTUFvR0NDcUdTTTQ5QkFNQ01DTXhJVEFmQmdOVkJBTU1HR3N6Y3kxelpYSjIKWlhJdFkyRkFNVFl4TXpVNU1UVXlOREFlRncweU1UQXlNVGN4T1RVeU1EUmFGdzB6TVRBeU1UVXhPVFV5TURSYQpNQ014SVRBZkJnTlZCQU1NR0dzemN5MXpaWEoyWlhJdFkyRkFNVFl4TXpVNU1UVXlOREJaTUJNR0J5cUdTTTQ5CkFnRUdDQ3FHU000OUF3RUhBMElBQko1bG0xelBrNXRyTUV0RHJaL2FNcEk5Rm1hYkJGTmlWbFhYeGc1N1BXWm8KWVNHNHFSbXJRV05YNzFtVG5qV20rSk1ITUhaa21NalJidzd0RmRvUVJOU2pJekFoTUE0R0ExVWREd0VCL3dRRQpBd0lDcERBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUFvR0NDcUdTTTQ5QkFNQ0EwY0FNRVFDSURVWHUvRCtIdGJXClEzRTNlbEtGNHp6N3dMSjNmYXRYbGZpNmtUL0NCanlhQWlCcGo3NktMR1htZ1ZKQ0VrRVBSU3AvSjJ5NkkzMlUKN0JyOG02UG1aaHlJSWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==\n    server: https://0.0.0.0:37971\n  name: k3d-k3d-cluster2\ncontexts:\n- context:\n    cluster: k3d-k3d-cluster\n    user: admin@k3d-k3d-cluster\n  name: k3d-k3d-cluster\n- context:\n    cluster: k3d-k3d-cluster2\n    user: admin@k3d-k3d-cluster2\n  name: k3d-k3d-cluster2\ncurrent-context: k3d-k3d-cluster\nkind: Config\npreferences: {}\nusers:\n- name: admin@k3d-k3d-cluster\n  user:\n    password: 7723eb490bd1900a0686c9dcc55de40e\n    username: admin\n- name: admin@k3d-k3d-cluster2\n  user:\n    password: 34e01dc12a8d5054aceead504dec1112\n    username: admin"
  },
  {
    "path": "test/resources/namespaces.json",
    "content": "[\n    {\n        \"apiVersion\": \"v1\",\n        \"kind\": \"Namespace\",\n        \"metadata\": {\n            \"creationTimestamp\": \"2021-01-11T13:11:58Z\",\n            \"managedFields\": [\n                {\n                    \"apiVersion\": \"v1\",\n                    \"fieldsType\": \"FieldsV1\",\n                    \"fieldsV1\": {\n                        \"f:status\": {\n                            \"f:phase\": {}\n                        }\n                    },\n                    \"manager\": \"k3s\",\n                    \"operation\": \"Update\",\n                    \"time\": \"2021-01-11T13:11:58Z\"\n                }\n            ],\n            \"name\": \"default\",\n            \"resourceVersion\": \"5\",\n            \"uid\": \"e068db23-0f18-4535-9821-42b7acf9ca72\"\n        },\n        \"spec\": {\n            \"finalizers\": [\n                \"kubernetes\"\n            ]\n        },\n        \"status\": {\n            \"phase\": \"Active\"\n        }\n    },\n    {\n        \"apiVersion\": \"v1\",\n        \"kind\": \"Namespace\",\n        \"metadata\": {\n            \"creationTimestamp\": \"2021-01-11T13:11:58Z\",\n            \"managedFields\": [\n                {\n                    \"apiVersion\": \"v1\",\n                    \"fieldsType\": \"FieldsV1\",\n                    \"fieldsV1\": {\n                        \"f:status\": {\n                            \"f:phase\": {}\n                        }\n                    },\n                    \"manager\": \"k3s\",\n                    \"operation\": \"Update\",\n                    \"time\": \"2021-01-11T13:11:58Z\"\n                }\n            ],\n            \"name\": \"kubelib-test-test-objects-chart\",\n            \"resourceVersion\": \"5\",\n            \"uid\": \"e068db23-0f18-4535-9821-42b7acf9ca72\"\n        },\n        \"spec\": {\n            \"finalizers\": [\n                \"kubernetes\"\n            ]\n        },\n        \"status\": {\n            \"phase\": \"Active\"\n        }\n    }\n]"
  },
  {
    "path": "test/resources/node_info.json",
    "content": "\n    {\n        \"apiVersion\": \"v1\",\n        \"items\": [\n            {\n                \"apiVersion\": \"v1\",\n                \"kind\": \"Node\",\n                \"metadata\": {\n                    \"annotations\": {\n                        \"flannel.alpha.coreos.com/backend-data\": \"{\\\"VtepMAC\\\":\\\"62:e5:a6:42:d6:58\\\"}\",\n                        \"flannel.alpha.coreos.com/backend-type\": \"vxlan\",\n                        \"flannel.alpha.coreos.com/kube-subnet-manager\": \"true\",\n                        \"flannel.alpha.coreos.com/public-ip\": \"172.21.0.2\",\n                        \"k3s.io/node-args\": \"[\\\"server\\\",\\\"--tls-san\\\",\\\"0.0.0.0\\\"]\",\n                        \"k3s.io/node-config-hash\": \"D7CBSUVNY5FSJVW3U5ZIAK74FHUOS5TZOOMQE6FTIWUTHA7QHGKQ====\",\n                        \"k3s.io/node-env\": \"{\\\"K3S_KUBECONFIG_OUTPUT\\\":\\\"/output/kubeconfig.yaml\\\",\\\"K3S_TOKEN\\\":\\\"********\\\"}\",\n                        \"node.alpha.kubernetes.io/ttl\": \"0\",\n                        \"volumes.kubernetes.io/controller-managed-attach-detach\": \"true\"\n                    },\n                    \"creationTimestamp\": \"2021-01-11T13:12:07Z\",\n                    \"finalizers\": [\n                        \"wrangler.cattle.io/node\"\n                    ],\n                    \"labels\": {\n                        \"beta.kubernetes.io/arch\": \"amd64\",\n                        \"beta.kubernetes.io/instance-type\": \"k3s\",\n                        \"beta.kubernetes.io/os\": \"linux\",\n                        \"k3s.io/hostname\": \"k3d-k3s-default-server-0\",\n                        \"k3s.io/internal-ip\": \"172.21.0.2\",\n                        \"kubernetes.io/arch\": \"amd64\",\n                        \"kubernetes.io/hostname\": \"k3d-k3s-default-server-0\",\n                        \"kubernetes.io/os\": \"linux\",\n                        \"node-role.kubernetes.io/control-plane\": \"true\",\n                        \"node-role.kubernetes.io/master\": \"true\",\n                        \"node.kubernetes.io/instance-type\": \"k3s\"\n                    },\n                    \"managedFields\": [\n                        {\n                            \"apiVersion\": \"v1\",\n                            \"fieldsType\": \"FieldsV1\",\n                            \"fieldsV1\": {\n                                \"f:metadata\": {\n                                    \"f:annotations\": {\n                                        \".\": {},\n                                        \"f:flannel.alpha.coreos.com/backend-data\": {},\n                                        \"f:flannel.alpha.coreos.com/backend-type\": {},\n                                        \"f:flannel.alpha.coreos.com/kube-subnet-manager\": {},\n                                        \"f:flannel.alpha.coreos.com/public-ip\": {},\n                                        \"f:k3s.io/node-args\": {},\n                                        \"f:k3s.io/node-config-hash\": {},\n                                        \"f:k3s.io/node-env\": {},\n                                        \"f:node.alpha.kubernetes.io/ttl\": {},\n                                        \"f:volumes.kubernetes.io/controller-managed-attach-detach\": {}\n                                    },\n                                    \"f:finalizers\": {\n                                        \".\": {},\n                                        \"v:\\\"wrangler.cattle.io/node\\\"\": {}\n                                    },\n                                    \"f:labels\": {\n                                        \".\": {},\n                                        \"f:beta.kubernetes.io/arch\": {},\n                                        \"f:beta.kubernetes.io/instance-type\": {},\n                                        \"f:beta.kubernetes.io/os\": {},\n                                        \"f:k3s.io/hostname\": {},\n                                        \"f:k3s.io/internal-ip\": {},\n                                        \"f:kubernetes.io/arch\": {},\n                                        \"f:kubernetes.io/hostname\": {},\n                                        \"f:kubernetes.io/os\": {},\n                                        \"f:node-role.kubernetes.io/control-plane\": {},\n                                        \"f:node-role.kubernetes.io/master\": {},\n                                        \"f:node.kubernetes.io/instance-type\": {}\n                                    }\n                                },\n                                \"f:spec\": {\n                                    \"f:podCIDR\": {},\n                                    \"f:podCIDRs\": {\n                                        \".\": {},\n                                        \"v:\\\"10.42.0.0/24\\\"\": {}\n                                    },\n                                    \"f:providerID\": {}\n                                },\n                                \"f:status\": {\n                                    \"f:addresses\": {\n                                        \".\": {},\n                                        \"k:{\\\"type\\\":\\\"Hostname\\\"}\": {\n                                            \".\": {},\n                                            \"f:address\": {},\n                                            \"f:type\": {}\n                                        },\n                                        \"k:{\\\"type\\\":\\\"InternalIP\\\"}\": {\n                                            \".\": {},\n                                            \"f:address\": {},\n                                            \"f:type\": {}\n                                        }\n                                    },\n                                    \"f:allocatable\": {\n                                        \".\": {},\n                                        \"f:cpu\": {},\n                                        \"f:ephemeral-storage\": {},\n                                        \"f:hugepages-1Gi\": {},\n                                        \"f:hugepages-2Mi\": {},\n                                        \"f:memory\": {},\n                                        \"f:pods\": {}\n                                    },\n                                    \"f:capacity\": {\n                                        \".\": {},\n                                        \"f:cpu\": {},\n                                        \"f:ephemeral-storage\": {},\n                                        \"f:hugepages-1Gi\": {},\n                                        \"f:hugepages-2Mi\": {},\n                                        \"f:memory\": {},\n                                        \"f:pods\": {}\n                                    },\n                                    \"f:conditions\": {\n                                        \".\": {},\n                                        \"k:{\\\"type\\\":\\\"DiskPressure\\\"}\": {\n                                            \".\": {},\n                                            \"f:lastHeartbeatTime\": {},\n                                            \"f:lastTransitionTime\": {},\n                                            \"f:message\": {},\n                                            \"f:reason\": {},\n                                            \"f:status\": {},\n                                            \"f:type\": {}\n                                        },\n                                        \"k:{\\\"type\\\":\\\"MemoryPressure\\\"}\": {\n                                            \".\": {},\n                                            \"f:lastHeartbeatTime\": {},\n                                            \"f:lastTransitionTime\": {},\n                                            \"f:message\": {},\n                                            \"f:reason\": {},\n                                            \"f:status\": {},\n                                            \"f:type\": {}\n                                        },\n                                        \"k:{\\\"type\\\":\\\"NetworkUnavailable\\\"}\": {\n                                            \".\": {},\n                                            \"f:lastHeartbeatTime\": {},\n                                            \"f:lastTransitionTime\": {},\n                                            \"f:message\": {},\n                                            \"f:reason\": {},\n                                            \"f:status\": {},\n                                            \"f:type\": {}\n                                        },\n                                        \"k:{\\\"type\\\":\\\"PIDPressure\\\"}\": {\n                                            \".\": {},\n                                            \"f:lastHeartbeatTime\": {},\n                                            \"f:lastTransitionTime\": {},\n                                            \"f:message\": {},\n                                            \"f:reason\": {},\n                                            \"f:status\": {},\n                                            \"f:type\": {}\n                                        },\n                                        \"k:{\\\"type\\\":\\\"Ready\\\"}\": {\n                                            \".\": {},\n                                            \"f:lastHeartbeatTime\": {},\n                                            \"f:lastTransitionTime\": {},\n                                            \"f:message\": {},\n                                            \"f:reason\": {},\n                                            \"f:status\": {},\n                                            \"f:type\": {}\n                                        }\n                                    },\n                                    \"f:daemonEndpoints\": {\n                                        \"f:kubeletEndpoint\": {\n                                            \"f:Port\": {}\n                                        }\n                                    },\n                                    \"f:images\": {},\n                                    \"f:nodeInfo\": {\n                                        \"f:architecture\": {},\n                                        \"f:bootID\": {},\n                                        \"f:containerRuntimeVersion\": {},\n                                        \"f:kernelVersion\": {},\n                                        \"f:kubeProxyVersion\": {},\n                                        \"f:kubeletVersion\": {},\n                                        \"f:operatingSystem\": {},\n                                        \"f:osImage\": {},\n                                        \"f:systemUUID\": {}\n                                    }\n                                }\n                            },\n                            \"manager\": \"k3s\",\n                            \"operation\": \"Update\",\n                            \"time\": \"2021-01-11T13:12:37Z\"\n                        }\n                    ],\n                    \"name\": \"k3d-k3s-default-server-0\",\n                    \"resourceVersion\": \"4047\",\n                    \"uid\": \"3251c14a-52ad-448a-bd1f-575ccd4f4654\"\n                },\n                \"spec\": {\n                    \"podCIDR\": \"10.42.0.0/24\",\n                    \"podCIDRs\": [\n                        \"10.42.0.0/24\"\n                    ],\n                    \"providerID\": \"k3s://k3d-k3s-default-server-0\"\n                },\n                \"status\": {\n                    \"addresses\": [\n                        {\n                            \"address\": \"172.21.0.2\",\n                            \"type\": \"InternalIP\"\n                        },\n                        {\n                            \"address\": \"k3d-k3s-default-server-0\",\n                            \"type\": \"Hostname\"\n                        }\n                    ],\n                    \"allocatable\": {\n                        \"cpu\": \"2\",\n                        \"ephemeral-storage\": \"59589342571\",\n                        \"hugepages-1Gi\": \"0\",\n                        \"hugepages-2Mi\": \"0\",\n                        \"memory\": \"6089228Ki\",\n                        \"pods\": \"110\"\n                    },\n                    \"capacity\": {\n                        \"cpu\": \"2\",\n                        \"ephemeral-storage\": \"61255492Ki\",\n                        \"hugepages-1Gi\": \"0\",\n                        \"hugepages-2Mi\": \"0\",\n                        \"memory\": \"6089228Ki\",\n                        \"pods\": \"110\"\n                    },\n                    \"conditions\": [\n                        {\n                            \"lastHeartbeatTime\": \"2021-01-11T13:12:15Z\",\n                            \"lastTransitionTime\": \"2021-01-11T13:12:15Z\",\n                            \"message\": \"Flannel is running on this node\",\n                            \"reason\": \"FlannelIsUp\",\n                            \"status\": \"False\",\n                            \"type\": \"NetworkUnavailable\"\n                        },\n                        {\n                            \"lastHeartbeatTime\": \"2021-01-11T14:33:56Z\",\n                            \"lastTransitionTime\": \"2021-01-11T13:12:07Z\",\n                            \"message\": \"kubelet has sufficient memory available\",\n                            \"reason\": \"KubeletHasSufficientMemory\",\n                            \"status\": \"False\",\n                            \"type\": \"MemoryPressure\"\n                        },\n                        {\n                            \"lastHeartbeatTime\": \"2021-01-11T14:33:56Z\",\n                            \"lastTransitionTime\": \"2021-01-11T13:12:07Z\",\n                            \"message\": \"kubelet has no disk pressure\",\n                            \"reason\": \"KubeletHasNoDiskPressure\",\n                            \"status\": \"False\",\n                            \"type\": \"DiskPressure\"\n                        },\n                        {\n                            \"lastHeartbeatTime\": \"2021-01-11T14:33:56Z\",\n                            \"lastTransitionTime\": \"2021-01-11T13:12:07Z\",\n                            \"message\": \"kubelet has sufficient PID available\",\n                            \"reason\": \"KubeletHasSufficientPID\",\n                            \"status\": \"False\",\n                            \"type\": \"PIDPressure\"\n                        },\n                        {\n                            \"lastHeartbeatTime\": \"2021-01-11T14:33:56Z\",\n                            \"lastTransitionTime\": \"2021-01-11T13:12:14Z\",\n                            \"message\": \"kubelet is posting ready status\",\n                            \"reason\": \"KubeletReady\",\n                            \"status\": \"True\",\n                            \"type\": \"Ready\"\n                        }\n                    ],\n                    \"daemonEndpoints\": {\n                        \"kubeletEndpoint\": {\n                            \"Port\": 10250\n                        }\n                    },\n                    \"images\": [\n                        {\n                            \"names\": [\n                                \"docker.io/rancher/klipper-helm@sha256:33f8d2b6961b76a10826d75194d8678a0e3ad4d715abf8e7370ac552a91eb0f0\",\n                                \"docker.io/rancher/klipper-helm:v0.3.2\"\n                            ],\n                            \"sizeBytes\": 50733006\n                        },\n                        {\n                            \"names\": [\n                                \"docker.io/rancher/library-traefik@sha256:3ba3ed48c4632f2b02671923950b30b5b7f1b556e559ce15446d1f5d648a037d\",\n                                \"docker.io/rancher/library-traefik:1.7.19\"\n                            ],\n                            \"sizeBytes\": 24011762\n                        },\n                        {\n                            \"names\": [\n                                \"docker.io/rancher/local-path-provisioner@sha256:40cb8c984c1759f1860eee088035040f47051c959a6d07cdb126e132c6f43b45\",\n                                \"docker.io/rancher/local-path-provisioner:v0.0.14\"\n                            ],\n                            \"sizeBytes\": 13367922\n                        },\n                        {\n                            \"names\": [\n                                \"docker.io/rancher/coredns-coredns@sha256:8b675d12eb9faf3121475b12db478ac2cf5129046d92137aa9067dd04f3b4e10\",\n                                \"docker.io/rancher/coredns-coredns:1.8.0\"\n                            ],\n                            \"sizeBytes\": 12944537\n                        },\n                        {\n                            \"names\": [\n                                \"docker.io/rancher/metrics-server@sha256:b85628b103169d7db52a32a48b46d8942accb7bde3709c0a4888a23d035f9f1e\",\n                                \"docker.io/rancher/metrics-server:v0.3.6\"\n                            ],\n                            \"sizeBytes\": 10543877\n                        },\n                        {\n                            \"names\": [\n                                \"docker.io/rancher/klipper-lb@sha256:2fb97818f5d64096d635bc72501a6cb2c8b88d5d16bc031cf71b5b6460925e4a\",\n                                \"docker.io/rancher/klipper-lb:v0.1.2\"\n                            ],\n                            \"sizeBytes\": 2708293\n                        },\n                        {\n                            \"names\": [\n                                \"docker.io/rancher/pause@sha256:d22591b61e9c2b52aecbf07106d5db313c4f178e404d660b32517b18fcbf0144\",\n                                \"docker.io/rancher/pause:3.1\"\n                            ],\n                            \"sizeBytes\": 326597\n                        }\n                    ],\n                    \"node_info\": {\n                        \"architecture\": \"amd64\",\n                        \"bootID\": \"b1f9f0eb-1d1d-4fca-80e0-8bd41c453043\",\n                        \"containerRuntimeVersion\": \"containerd://1.4.3-k3s1\",\n                        \"kernelVersion\": \"5.4.39-linuxkit\",\n                        \"kubeProxyVersion\": \"v1.20.0+k3s2\",\n                        \"kubelet_version\": \"v1.20.0+k3s2\",\n                        \"machineID\": \"\",\n                        \"operatingSystem\": \"linux\",\n                        \"osImage\": \"Unknown\",\n                        \"systemUUID\": \"6a2946ae-0000-0000-a337-34a5b5720c9a\"\n                    }\n                }\n            }\n        ],\n        \"kind\": \"List\",\n        \"metadata\": {\n            \"resourceVersion\": \"\",\n            \"selfLink\": \"\"\n        }\n    }\n    \n"
  },
  {
    "path": "test/resources/pod.json",
    "content": "{\n  \"api_version\": \"v1\",\n  \"kind\": \"Pod\",\n  \"metadata\": {\n    \"name\": \"Mock\"\n  },\n  \"spec\": {\n    \"containers\": [\n      {\n        \"name\": \"Mock\",\n        \"image\": \"nginx:latest\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "test/resources/pod_status.json",
    "content": "{\n    \"api_version\": \"v1\",\n    \"kind\": \"Pod\",\n    \"metadata\": {\n        \"annotations\": {\n            \"checksum/config\": \"6554cd280cbfc996221d287c63c1bae2c5d3306173b19e6920ea3d6ad7ebe979\",\n            \"checksum/dashboards-json-config\": \"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b\",\n            \"checksum/sc-dashboard-provider-config\": \"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b\",\n            \"checksum/secret\": \"82880dc31f393c9c5167c9c3981b345b14971aaca804f8333e82938059d9a59c\",\n            \"kubelibrary\": \"testing\"\n        },\n        \"cluster_name\": null,\n        \"creation_timestamp\": 1592598289,\n        \"deletion_grace_period_seconds\": null,\n        \"deletion_timestamp\": null,\n        \"finalizers\": null,\n        \"generate_name\": \"grafana-6769d4b669-\",\n        \"generation\": null,\n        \"labels\": {\n            \"app.kubernetes.io/instance\": \"grafana\",\n            \"app.kubernetes.io/name\": \"grafana\",\n            \"pod-template-hash\": \"6769d4b669\"\n        },\n        \"managed_fields\": null,\n        \"name\": \"grafana-6769d4b669-fhspj\",\n        \"namespace\": \"default\",\n        \"owner_references\": [\n            {\n                \"api_version\": \"apps/v1\",\n                \"block_owner_deletion\": true,\n                \"controller\": true,\n                \"kind\": \"ReplicaSet\",\n                \"name\": \"grafana-6769d4b669\",\n                \"uid\": \"fc2e7570-5d8e-422a-a52e-8396e78ec8ae\"\n            }\n        ],\n        \"resource_version\": \"721\",\n        \"self_link\": \"/api/v1/namespaces/default/pods/grafana-6769d4b669-fhspj/status\",\n        \"uid\": \"304ed46c-a11d-49e0-adcb-c0bf1a333376\"\n    },\n    \"spec\": {\n        \"active_deadline_seconds\": null,\n        \"affinity\": null,\n        \"automount_service_account_token\": true,\n        \"containers\": [\n            {\n                \"args\": null,\n                \"command\": null,\n                \"env\": [\n                    {\n                        \"name\": \"GF_SECURITY_ADMIN_USER\",\n                        \"value\": null,\n                        \"value_from\": {\n                            \"config_map_key_ref\": null,\n                            \"field_ref\": null,\n                            \"resource_field_ref\": null,\n                            \"secret_key_ref\": {\n                                \"key\": \"admin-user\",\n                                \"name\": \"grafana\",\n                                \"optional\": null\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"GF_SECURITY_ADMIN_PASSWORD\",\n                        \"value\": null,\n                        \"value_from\": {\n                            \"config_map_key_ref\": null,\n                            \"field_ref\": null,\n                            \"resource_field_ref\": null,\n                            \"secret_key_ref\": {\n                                \"key\": \"admin-password\",\n                                \"name\": \"grafana\",\n                                \"optional\": null\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"GF_PATHS_DATA\",\n                        \"value\": \"/var/lib/grafana/\",\n                        \"value_from\": null\n                    },\n                    {\n                        \"name\": \"GF_PATHS_LOGS\",\n                        \"value\": \"/var/log/grafana\",\n                        \"value_from\": null\n                    },\n                    {\n                        \"name\": \"GF_PATHS_PLUGINS\",\n                        \"value\": \"/var/lib/grafana/plugins\",\n                        \"value_from\": null\n                    },\n                    {\n                        \"name\": \"GF_PATHS_PROVISIONING\",\n                        \"value\": \"/etc/grafana/provisioning\",\n                        \"value_from\": null\n                    }\n                ],\n                \"env_from\": null,\n                \"image\": \"grafana/grafana:8.1.2\",\n                \"image_pull_policy\": \"IfNotPresent\",\n                \"lifecycle\": null,\n                \"liveness_probe\": {\n                    \"_exec\": null,\n                    \"failure_threshold\": 10,\n                    \"http_get\": {\n                        \"host\": null,\n                        \"http_headers\": null,\n                        \"path\": \"/api/health\",\n                        \"port\": 3000,\n                        \"scheme\": \"HTTP\"\n                    },\n                    \"initial_delay_seconds\": 60,\n                    \"period_seconds\": 10,\n                    \"success_threshold\": 1,\n                    \"tcp_socket\": null,\n                    \"timeout_seconds\": 30\n                },\n                \"name\": \"grafana\",\n                \"ports\": [\n                    {\n                        \"container_port\": 3000,\n                        \"host_ip\": null,\n                        \"host_port\": null,\n                        \"name\": \"service\",\n                        \"protocol\": \"TCP\"\n                    },\n                    {\n                        \"container_port\": 3000,\n                        \"host_ip\": null,\n                        \"host_port\": null,\n                        \"name\": \"grafana\",\n                        \"protocol\": \"TCP\"\n                    }\n                ],\n                \"readiness_probe\": {\n                    \"_exec\": null,\n                    \"failure_threshold\": 3,\n                    \"http_get\": {\n                        \"host\": null,\n                        \"http_headers\": null,\n                        \"path\": \"/api/health\",\n                        \"port\": 3000,\n                        \"scheme\": \"HTTP\"\n                    },\n                    \"initial_delay_seconds\": null,\n                    \"period_seconds\": 10,\n                    \"success_threshold\": 1,\n                    \"tcp_socket\": null,\n                    \"timeout_seconds\": 1\n                },\n                \"resources\": {\n                    \"limits\": null,\n                    \"requests\": null\n                },\n                \"security_context\": null,\n                \"startup_probe\": null,\n                \"stdin\": null,\n                \"stdin_once\": null,\n                \"termination_message_path\": \"/dev/termination-log\",\n                \"termination_message_policy\": \"File\",\n                \"tty\": null,\n                \"volume_devices\": null,\n                \"volume_mounts\": [\n                    {\n                        \"mount_path\": \"/etc/grafana/grafana.ini\",\n                        \"mount_propagation\": null,\n                        \"name\": \"config\",\n                        \"read_only\": null,\n                        \"sub_path\": \"grafana.ini\",\n                        \"sub_path_expr\": null\n                    },\n                    {\n                        \"mount_path\": \"/var/lib/grafana\",\n                        \"mount_propagation\": null,\n                        \"name\": \"storage\",\n                        \"read_only\": null,\n                        \"sub_path\": null,\n                        \"sub_path_expr\": null\n                    },\n                    {\n                        \"mount_path\": \"/var/run/secrets/kubernetes.io/serviceaccount\",\n                        \"mount_propagation\": null,\n                        \"name\": \"grafana-token-k79kp\",\n                        \"read_only\": true,\n                        \"sub_path\": null,\n                        \"sub_path_expr\": null\n                    }\n                ],\n                \"working_dir\": null\n            }\n        ],\n        \"dns_config\": null,\n        \"dns_policy\": \"ClusterFirst\",\n        \"enable_service_links\": true,\n        \"ephemeral_containers\": null,\n        \"host_aliases\": null,\n        \"host_ipc\": null,\n        \"host_network\": null,\n        \"host_pid\": null,\n        \"hostname\": null,\n        \"image_pull_secrets\": null,\n        \"init_containers\": [\n            {\n                \"args\": null,\n                \"command\": [\n                    \"chown\",\n                    \"-R\",\n                    \"472:472\",\n                    \"/var/lib/grafana\"\n                ],\n                \"env\": null,\n                \"env_from\": null,\n                \"image\": \"busybox:1.31.1\",\n                \"image_pull_policy\": \"IfNotPresent\",\n                \"lifecycle\": null,\n                \"liveness_probe\": null,\n                \"name\": \"init-chown-data\",\n                \"ports\": null,\n                \"readiness_probe\": null,\n                \"resources\": {\n                    \"limits\": null,\n                    \"requests\": null\n                },\n                \"security_context\": {\n                    \"allow_privilege_escalation\": null,\n                    \"capabilities\": null,\n                    \"privileged\": null,\n                    \"proc_mount\": null,\n                    \"read_only_root_filesystem\": null,\n                    \"run_as_group\": null,\n                    \"run_as_non_root\": false,\n                    \"run_as_user\": 0,\n                    \"se_linux_options\": null,\n                    \"windows_options\": null\n                },\n                \"startup_probe\": null,\n                \"stdin\": null,\n                \"stdin_once\": null,\n                \"termination_message_path\": \"/dev/termination-log\",\n                \"termination_message_policy\": \"File\",\n                \"tty\": null,\n                \"volume_devices\": null,\n                \"volume_mounts\": [\n                    {\n                        \"mount_path\": \"/var/lib/grafana\",\n                        \"mount_propagation\": null,\n                        \"name\": \"storage\",\n                        \"read_only\": null,\n                        \"sub_path\": null,\n                        \"sub_path_expr\": null\n                    },\n                    {\n                        \"mount_path\": \"/var/run/secrets/kubernetes.io/serviceaccount\",\n                        \"mount_propagation\": null,\n                        \"name\": \"grafana-token-k79kp\",\n                        \"read_only\": true,\n                        \"sub_path\": null,\n                        \"sub_path_expr\": null\n                    }\n                ],\n                \"working_dir\": null\n            }\n        ],\n        \"node_name\": \"k3d-k3d-cluster-server-0\",\n        \"node_selector\": null,\n        \"overhead\": null,\n        \"preemption_policy\": null,\n        \"priority\": 0,\n        \"priority_class_name\": null,\n        \"readiness_gates\": null,\n        \"restart_policy\": \"Always\",\n        \"runtime_class_name\": null,\n        \"scheduler_name\": \"default-scheduler\",\n        \"security_context\": {\n            \"fs_group\": 472,\n            \"run_as_group\": 472,\n            \"run_as_non_root\": null,\n            \"run_as_user\": 472,\n            \"se_linux_options\": null,\n            \"supplemental_groups\": null,\n            \"sysctls\": null,\n            \"windows_options\": null\n        },\n        \"service_account\": \"grafana\",\n        \"service_account_name\": \"grafana\",\n        \"share_process_namespace\": null,\n        \"subdomain\": null,\n        \"termination_grace_period_seconds\": 30,\n        \"tolerations\": [\n            {\n                \"effect\": \"NoExecute\",\n                \"key\": \"node.kubernetes.io/not-ready\",\n                \"operator\": \"Exists\",\n                \"toleration_seconds\": 300,\n                \"value\": null\n            },\n            {\n                \"effect\": \"NoExecute\",\n                \"key\": \"node.kubernetes.io/unreachable\",\n                \"operator\": \"Exists\",\n                \"toleration_seconds\": 300,\n                \"value\": null\n            }\n        ],\n        \"topology_spread_constraints\": null,\n        \"volumes\": [\n            {\n                \"aws_elastic_block_store\": null,\n                \"azure_disk\": null,\n                \"azure_file\": null,\n                \"cephfs\": null,\n                \"cinder\": null,\n                \"config_map\": {\n                    \"default_mode\": 420,\n                    \"items\": null,\n                    \"name\": \"grafana\",\n                    \"optional\": null\n                },\n                \"csi\": null,\n                \"downward_api\": null,\n                \"empty_dir\": null,\n                \"fc\": null,\n                \"flex_volume\": null,\n                \"flocker\": null,\n                \"gce_persistent_disk\": null,\n                \"git_repo\": null,\n                \"glusterfs\": null,\n                \"host_path\": null,\n                \"iscsi\": null,\n                \"name\": \"config\",\n                \"nfs\": null,\n                \"persistent_volume_claim\": null,\n                \"photon_persistent_disk\": null,\n                \"portworx_volume\": null,\n                \"projected\": null,\n                \"quobyte\": null,\n                \"rbd\": null,\n                \"scale_io\": null,\n                \"secret\": null,\n                \"storageos\": null,\n                \"vsphere_volume\": null\n            },\n            {\n                \"aws_elastic_block_store\": null,\n                \"azure_disk\": null,\n                \"azure_file\": null,\n                \"cephfs\": null,\n                \"cinder\": null,\n                \"config_map\": null,\n                \"csi\": null,\n                \"downward_api\": null,\n                \"empty_dir\": null,\n                \"fc\": null,\n                \"flex_volume\": null,\n                \"flocker\": null,\n                \"gce_persistent_disk\": null,\n                \"git_repo\": null,\n                \"glusterfs\": null,\n                \"host_path\": null,\n                \"iscsi\": null,\n                \"name\": \"storage\",\n                \"nfs\": null,\n                \"persistent_volume_claim\": {\n                    \"claim_name\": \"grafana\",\n                    \"read_only\": null\n                },\n                \"photon_persistent_disk\": null,\n                \"portworx_volume\": null,\n                \"projected\": null,\n                \"quobyte\": null,\n                \"rbd\": null,\n                \"scale_io\": null,\n                \"secret\": null,\n                \"storageos\": null,\n                \"vsphere_volume\": null\n            },\n            {\n                \"aws_elastic_block_store\": null,\n                \"azure_disk\": null,\n                \"azure_file\": null,\n                \"cephfs\": null,\n                \"cinder\": null,\n                \"config_map\": null,\n                \"csi\": null,\n                \"downward_api\": null,\n                \"empty_dir\": null,\n                \"fc\": null,\n                \"flex_volume\": null,\n                \"flocker\": null,\n                \"gce_persistent_disk\": null,\n                \"git_repo\": null,\n                \"glusterfs\": null,\n                \"host_path\": null,\n                \"iscsi\": null,\n                \"name\": \"grafana-token-k79kp\",\n                \"nfs\": null,\n                \"persistent_volume_claim\": null,\n                \"photon_persistent_disk\": null,\n                \"portworx_volume\": null,\n                \"projected\": null,\n                \"quobyte\": null,\n                \"rbd\": null,\n                \"scale_io\": null,\n                \"secret\": {\n                    \"default_mode\": 420,\n                    \"items\": null,\n                    \"optional\": null,\n                    \"secret_name\": \"grafana-token-k79kp\"\n                },\n                \"storageos\": null,\n                \"vsphere_volume\": null\n            }\n        ]\n    },\n    \"status\": {\n        \"conditions\": [\n            {\n                \"last_probe_time\": null,\n                \"last_transition_time\": 1592598289,\n                \"message\": null,\n                \"reason\": null,\n                \"status\": \"true\",\n                \"type\": \"Initialized\"\n            },\n            {\n                \"last_probe_time\": null,\n                \"last_transition_time\": 1592598289,\n                \"message\": null,\n                \"reason\": null,\n                \"status\": \"true\",\n                \"type\": \"Ready\"\n            },\n            {\n                \"last_probe_time\": null,\n                \"last_transition_time\": 1592598289,\n                \"message\": null,\n                \"reason\": null,\n                \"status\": \"true\",\n                \"type\": \"ContainersReady\"\n            },\n            {\n                \"last_probe_time\": null,\n                \"last_transition_time\": 1592598289,\n                \"message\": null,\n                \"reason\": null,\n                \"status\": \"true\",\n                \"type\": \"PodScheduled\"\n            }\n        ],\n        \"container_statuses\": [\n            {\n                \"container_id\": \"containerd://b317cd72f71779c0020d319d05cecfa67dafd19eeda4fc35c004f34507ea8a2d\",\n                \"image\": \"docker.io/grafana/grafana:8.1.2\",\n                \"image_id\": \"docker.io/grafana/grafana@sha256:811ee7d685fe45e5625928716d189c518f2b96edaa86122a04cc6faf1e988180\",\n                \"last_state\": {\n                    \"running\": null,\n                    \"terminated\": null,\n                    \"waiting\": null\n                },\n                \"name\": \"grafana\",\n                \"ready\": true,\n                \"restart_count\": 0,\n                \"started\": true,\n                \"state\": {\n                    \"running\": {\n                        \"started_at\": 1592598289\n                    },\n                    \"terminated\": null,\n                    \"waiting\": null\n                }\n            }\n        ],\n        \"ephemeral_container_statuses\": null,\n        \"host_ip\": \"172.18.0.2\",\n        \"init_container_statuses\": [\n            {\n                \"container_id\": \"containerd://927ed23ec8d2d46c69f0decbbedeedc235b423f1ece2f8d7ad56512d04708eaa\",\n                \"image\": \"docker.io/library/busybox:1.31.1\",\n                \"image_id\": \"docker.io/library/busybox@sha256:95cf004f559831017cdf4628aaf1bb30133677be8702a8c5f2994629f637a209\",\n                \"last_state\": {\n                    \"running\": null,\n                    \"terminated\": null,\n                    \"waiting\": null\n                },\n                \"name\": \"init-chown-data\",\n                \"ready\": true,\n                \"restart_count\": 0,\n                \"started\": null,\n                \"state\": {\n                    \"running\": null,\n                    \"terminated\": {\n                        \"container_id\": \"containerd://927ed23ec8d2d46c69f0decbbedeedc235b423f1ece2f8d7ad56512d04708eaa\",\n                        \"exit_code\": 0,\n                        \"finished_at\": 1592598289,\n                        \"message\": null,\n                        \"reason\": \"Completed\",\n                        \"signal\": null,\n                        \"started_at\": 1592598289\n                    },\n                    \"waiting\": null\n                }\n            }\n        ],\n        \"message\": null,\n        \"nominated_node_name\": null,\n        \"phase\": \"Running\",\n        \"pod_i_ps\": [\n            {\n                \"ip\": \"10.42.0.11\"\n            }\n        ],\n        \"pod_ip\": \"10.42.0.11\",\n        \"qos_class\": \"BestEffort\",\n        \"reason\": null,\n        \"start_time\": 1592598289\n    }\n}"
  },
  {
    "path": "test/resources/pods.json",
    "content": "[\n    {\n        \"api_version\": null,\n        \"kind\": null,\n        \"metadata\": {\n            \"annotations\": null,\n            \"cluster_name\": null,\n            \"creation_timestamp\": 1592598289,\n            \"deletion_grace_period_seconds\": null,\n            \"deletion_timestamp\": null,\n            \"finalizers\": null,\n            \"generate_name\": \"octopus-\",\n            \"generation\": null,\n            \"initializers\": null,\n            \"labels\": {\n                \"app\": \"octopus\",\n                \"control-plane\": \"controller-manager\",\n                \"controller-revision-hash\": \"octopus-7678656bfb\",\n                \"controller-tools.k8s.io\": \"1.0\",\n                \"statefulset.kubernetes.io/pod-name\": \"octopus-0\"\n            },\n            \"managed_fields\": [\n                {\n                    \"api_version\": \"v1\",\n                    \"fields\": null,\n                    \"manager\": \"k3s\",\n                    \"operation\": \"Update\",\n                    \"time\": 1592598289\n                }\n            ],\n            \"name\": \"octopus-0\",\n            \"namespace\": \"default\",\n            \"owner_references\": [\n                {\n                    \"api_version\": \"apps/v1\",\n                    \"block_owner_deletion\": true,\n                    \"controller\": true,\n                    \"kind\": \"StatefulSet\",\n                    \"name\": \"octopus\",\n                    \"uid\": \"294fabba-95ba-451d-b3f5-d495e834c839\"\n                }\n            ],\n            \"resource_version\": \"739\",\n            \"self_link\": \"/api/v1/namespaces/default/pods/octopus-0\",\n            \"uid\": \"61b189e8-5c7e-46f1-b4af-8476a68da7a6\"\n        },\n        \"spec\": {\n            \"active_deadline_seconds\": null,\n            \"affinity\": null,\n            \"automount_service_account_token\": null,\n            \"containers\": [\n                {\n                    \"args\": null,\n                    \"command\": [\n                        \"/manager\"\n                    ],\n                    \"env\": [\n                        {\n                            \"name\": \"POD_NAMESPACE\",\n                            \"value\": null,\n                            \"value_from\": {\n                                \"config_map_key_ref\": null,\n                                \"field_ref\": {\n                                    \"api_version\": \"v1\",\n                                    \"field_path\": \"metadata.namespace\"\n                                },\n                                \"resource_field_ref\": null,\n                                \"secret_key_ref\": null\n                            }\n                        },\n                        {\n                            \"name\": \"SECRET_NAME\",\n                            \"value\": \"webhook-server-secret\",\n                            \"value_from\": null\n                        }\n                    ],\n                    \"env_from\": null,\n                    \"image\": \"eu.gcr.io/kyma-project/incubator/develop/octopus:dc5dc284\",\n                    \"image_pull_policy\": \"Always\",\n                    \"lifecycle\": null,\n                    \"liveness_probe\": null,\n                    \"name\": \"manager\",\n                    \"ports\": [\n                        {\n                            \"container_port\": 9876,\n                            \"host_ip\": null,\n                            \"host_port\": null,\n                            \"name\": \"webhook-server\",\n                            \"protocol\": \"TCP\"\n                        }\n                    ],\n                    \"readiness_probe\": null,\n                    \"resources\": {\n                        \"limits\": {\n                            \"cpu\": \"100m\",\n                            \"memory\": \"30Mi\"\n                        },\n                        \"requests\": {\n                            \"cpu\": \"100m\",\n                            \"memory\": \"20Mi\"\n                        }\n                    },\n                    \"security_context\": null,\n                    \"stdin\": null,\n                    \"stdin_once\": null,\n                    \"termination_message_path\": \"/dev/termination-log\",\n                    \"termination_message_policy\": \"File\",\n                    \"tty\": null,\n                    \"volume_devices\": null,\n                    \"volume_mounts\": [\n                        {\n                            \"mount_path\": \"/tmp/cert\",\n                            \"mount_propagation\": null,\n                            \"name\": \"cert\",\n                            \"read_only\": true,\n                            \"sub_path\": null,\n                            \"sub_path_expr\": null\n                        },\n                        {\n                            \"mount_path\": \"/var/run/secrets/kubernetes.io/serviceaccount\",\n                            \"mount_propagation\": null,\n                            \"name\": \"octopus-token-d6m9q\",\n                            \"read_only\": true,\n                            \"sub_path\": null,\n                            \"sub_path_expr\": null\n                        }\n                    ],\n                    \"working_dir\": null\n                }\n            ],\n            \"dns_config\": null,\n            \"dns_policy\": \"ClusterFirst\",\n            \"enable_service_links\": true,\n            \"host_aliases\": null,\n            \"host_ipc\": null,\n            \"host_network\": null,\n            \"host_pid\": null,\n            \"hostname\": \"octopus-0\",\n            \"image_pull_secrets\": null,\n            \"init_containers\": null,\n            \"node_name\": \"k3d-k3s-default-worker-0\",\n            \"node_selector\": null,\n            \"preemption_policy\": null,\n            \"priority\": 0,\n            \"priority_class_name\": null,\n            \"readiness_gates\": null,\n            \"restart_policy\": \"Always\",\n            \"runtime_class_name\": null,\n            \"scheduler_name\": \"default-scheduler\",\n            \"security_context\": {\n                \"fs_group\": null,\n                \"run_as_group\": null,\n                \"run_as_non_root\": null,\n                \"run_as_user\": null,\n                \"se_linux_options\": null,\n                \"supplemental_groups\": null,\n                \"sysctls\": null,\n                \"windows_options\": null\n            },\n            \"service_account\": \"octopus\",\n            \"service_account_name\": \"octopus\",\n            \"share_process_namespace\": null,\n            \"subdomain\": \"octopus\",\n            \"termination_grace_period_seconds\": 10,\n            \"tolerations\": [\n                {\n                    \"effect\": \"NoExecute\",\n                    \"key\": \"node.kubernetes.io/not-ready\",\n                    \"operator\": \"Exists\",\n                    \"toleration_seconds\": 300,\n                    \"value\": null\n                },\n                {\n                    \"effect\": \"NoExecute\",\n                    \"key\": \"node.kubernetes.io/unreachable\",\n                    \"operator\": \"Exists\",\n                    \"toleration_seconds\": 300,\n                    \"value\": null\n                }\n            ],\n            \"volumes\": [\n                {\n                    \"aws_elastic_block_store\": null,\n                    \"azure_disk\": null,\n                    \"azure_file\": null,\n                    \"cephfs\": null,\n                    \"cinder\": null,\n                    \"config_map\": null,\n                    \"csi\": null,\n                    \"downward_api\": null,\n                    \"empty_dir\": null,\n                    \"fc\": null,\n                    \"flex_volume\": null,\n                    \"flocker\": null,\n                    \"gce_persistent_disk\": null,\n                    \"git_repo\": null,\n                    \"glusterfs\": null,\n                    \"host_path\": null,\n                    \"iscsi\": null,\n                    \"name\": \"cert\",\n                    \"nfs\": null,\n                    \"persistent_volume_claim\": null,\n                    \"photon_persistent_disk\": null,\n                    \"portworx_volume\": null,\n                    \"projected\": null,\n                    \"quobyte\": null,\n                    \"rbd\": null,\n                    \"scale_io\": null,\n                    \"secret\": {\n                        \"default_mode\": 420,\n                        \"items\": null,\n                        \"optional\": null,\n                        \"secret_name\": \"webhook-server-secret\"\n                    },\n                    \"storageos\": null,\n                    \"vsphere_volume\": null\n                },\n                {\n                    \"aws_elastic_block_store\": null,\n                    \"azure_disk\": null,\n                    \"azure_file\": null,\n                    \"cephfs\": null,\n                    \"cinder\": null,\n                    \"config_map\": null,\n                    \"csi\": null,\n                    \"downward_api\": null,\n                    \"empty_dir\": null,\n                    \"fc\": null,\n                    \"flex_volume\": null,\n                    \"flocker\": null,\n                    \"gce_persistent_disk\": null,\n                    \"git_repo\": null,\n                    \"glusterfs\": null,\n                    \"host_path\": null,\n                    \"iscsi\": null,\n                    \"name\": \"octopus-token-d6m9q\",\n                    \"nfs\": null,\n                    \"persistent_volume_claim\": null,\n                    \"photon_persistent_disk\": null,\n                    \"portworx_volume\": null,\n                    \"projected\": null,\n                    \"quobyte\": null,\n                    \"rbd\": null,\n                    \"scale_io\": null,\n                    \"secret\": {\n                        \"default_mode\": 420,\n                        \"items\": null,\n                        \"optional\": null,\n                        \"secret_name\": \"octopus-token-d6m9q\"\n                    },\n                    \"storageos\": null,\n                    \"vsphere_volume\": null\n                }\n            ]\n        },\n        \"status\": {\n            \"conditions\": [\n                {\n                    \"last_probe_time\": null,\n                    \"last_transition_time\": 1592598289,\n                    \"message\": null,\n                    \"reason\": null,\n                    \"status\": \"true\",\n                    \"type\": \"Initialized\"\n                },\n                {\n                    \"last_probe_time\": null,\n                    \"last_transition_time\": 1592598289,\n                    \"message\": null,\n                    \"reason\": null,\n                    \"status\": \"true\",\n                    \"type\": \"Ready\"\n                },\n                {\n                    \"last_probe_time\": null,\n                    \"last_transition_time\": 1592598289,\n                    \"message\": null,\n                    \"reason\": null,\n                    \"status\": \"true\",\n                    \"type\": \"ContainersReady\"\n                },\n                {\n                    \"last_probe_time\": null,\n                    \"last_transition_time\": 1592598289,\n                    \"message\": null,\n                    \"reason\": null,\n                    \"status\": \"true\",\n                    \"type\": \"PodScheduled\"\n                }\n            ],\n            \"container_statuses\": [\n                {\n                    \"container_id\": \"containerd://0e85dc1bab1bf21c1de37b7a8026d1ce62231018a0ac28e72b0f2e95aa09d062\",\n                    \"image\": \"eu.gcr.io/kyma-project/incubator/develop/octopus:dc5dc284\",\n                    \"image_id\": \"eu.gcr.io/kyma-project/incubator/develop/octopus@sha256:bf9ebb15cb0aa127478efd0ec37bb223ab1f5cba3a112cfd3db61a6b0ccea733\",\n                    \"last_state\": {\n                        \"running\": null,\n                        \"terminated\": null,\n                        \"waiting\": null\n                    },\n                    \"name\": \"manager\",\n                    \"ready\": true,\n                    \"restart_count\": 0,\n                    \"state\": {\n                        \"running\": {\n                            \"started_at\": 1592598289\n                        },\n                        \"terminated\": null,\n                        \"waiting\": null\n                    }\n                }\n            ],\n            \"host_ip\": \"172.18.0.3\",\n            \"init_container_statuses\": null,\n            \"message\": null,\n            \"nominated_node_name\": null,\n            \"phase\": \"Running\",\n            \"pod_ip\": \"10.42.1.6\",\n            \"qos_class\": \"Burstable\",\n            \"reason\": null,\n            \"start_time\": 1592598289\n        }\n    },\n    {\n        \"api_version\": null,\n        \"kind\": null,\n        \"metadata\": {\n            \"annotations\": {\n                \"checksum/config\": \"1c42968a1b9eca0bafc3273ca39c4705fe71dc632e721db9e8ce44ab1b8e1428\",\n                \"checksum/dashboards-json-config\": \"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b\",\n                \"checksum/sc-dashboard-provider-config\": \"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b\",\n                \"checksum/secret\": \"11c4f1a28559266593f5ea89cbeabcdf26a3d14d003bd356a82a5250d3261803\"\n            },\n            \"cluster_name\": null,\n            \"creation_timestamp\": 1592598289,\n            \"deletion_grace_period_seconds\": null,\n            \"deletion_timestamp\": null,\n            \"finalizers\": null,\n            \"generate_name\": \"grafana-5d9895c6c4-\",\n            \"generation\": null,\n            \"initializers\": null,\n            \"labels\": {\n                \"app.kubernetes.io/instance\": \"grafana\",\n                \"app.kubernetes.io/name\": \"grafana\",\n                \"pod-template-hash\": \"5d9895c6c4\"\n            },\n            \"managed_fields\": [\n                {\n                    \"api_version\": \"v1\",\n                    \"fields\": null,\n                    \"manager\": \"k3s\",\n                    \"operation\": \"Update\",\n                    \"time\": 1592598289\n                }\n            ],\n            \"name\": \"grafana-5d9895c6c4-sfsn8\",\n            \"namespace\": \"default\",\n            \"owner_references\": [\n                {\n                    \"api_version\": \"apps/v1\",\n                    \"block_owner_deletion\": true,\n                    \"controller\": true,\n                    \"kind\": \"ReplicaSet\",\n                    \"name\": \"grafana-5d9895c6c4\",\n                    \"uid\": \"c2e555c9-be8d-4bcc-940e-39c8a5d7ed56\"\n                }\n            ],\n            \"resource_version\": \"924\",\n            \"self_link\": \"/api/v1/namespaces/default/pods/grafana-5d9895c6c4-sfsn8\",\n            \"uid\": \"c0d1dc6b-2de8-4edc-be28-b0cffd1eaa1b\"\n        },\n        \"spec\": {\n            \"active_deadline_seconds\": null,\n            \"affinity\": null,\n            \"automount_service_account_token\": null,\n            \"containers\": [\n                {\n                    \"args\": null,\n                    \"command\": null,\n                    \"env\": [\n                        {\n                            \"name\": \"GF_SECURITY_ADMIN_USER\",\n                            \"value\": null,\n                            \"value_from\": {\n                                \"config_map_key_ref\": null,\n                                \"field_ref\": null,\n                                \"resource_field_ref\": null,\n                                \"secret_key_ref\": {\n                                    \"key\": \"admin-user\",\n                                    \"name\": \"grafana\",\n                                    \"optional\": null\n                                }\n                            }\n                        },\n                        {\n                            \"name\": \"GF_SECURITY_ADMIN_PASSWORD\",\n                            \"value\": null,\n                            \"value_from\": {\n                                \"config_map_key_ref\": null,\n                                \"field_ref\": null,\n                                \"resource_field_ref\": null,\n                                \"secret_key_ref\": {\n                                    \"key\": \"admin-password\",\n                                    \"name\": \"grafana\",\n                                    \"optional\": null\n                                }\n                            }\n                        }\n                    ],\n                    \"env_from\": null,\n                    \"image\": \"grafana/grafana:7.0.3\",\n                    \"image_pull_policy\": \"IfNotPresent\",\n                    \"lifecycle\": null,\n                    \"liveness_probe\": {\n                        \"_exec\": null,\n                        \"failure_threshold\": 10,\n                        \"http_get\": {\n                            \"host\": null,\n                            \"http_headers\": null,\n                            \"path\": \"/api/health\",\n                            \"port\": 3000,\n                            \"scheme\": \"HTTP\"\n                        },\n                        \"initial_delay_seconds\": 60,\n                        \"period_seconds\": 10,\n                        \"success_threshold\": 1,\n                        \"tcp_socket\": null,\n                        \"timeout_seconds\": 30\n                    },\n                    \"name\": \"grafana\",\n                    \"ports\": [\n                        {\n                            \"container_port\": 80,\n                            \"host_ip\": null,\n                            \"host_port\": null,\n                            \"name\": \"service\",\n                            \"protocol\": \"TCP\"\n                        },\n                        {\n                            \"container_port\": 3000,\n                            \"host_ip\": null,\n                            \"host_port\": null,\n                            \"name\": \"grafana\",\n                            \"protocol\": \"TCP\"\n                        }\n                    ],\n                    \"readiness_probe\": {\n                        \"_exec\": null,\n                        \"failure_threshold\": 3,\n                        \"http_get\": {\n                            \"host\": null,\n                            \"http_headers\": null,\n                            \"path\": \"/api/health\",\n                            \"port\": 3000,\n                            \"scheme\": \"HTTP\"\n                        },\n                        \"initial_delay_seconds\": null,\n                        \"period_seconds\": 10,\n                        \"success_threshold\": 1,\n                        \"tcp_socket\": null,\n                        \"timeout_seconds\": 1\n                    },\n                    \"resources\": {\n                        \"limits\": null,\n                        \"requests\": null\n                    },\n                    \"security_context\": null,\n                    \"stdin\": null,\n                    \"stdin_once\": null,\n                    \"termination_message_path\": \"/dev/termination-log\",\n                    \"termination_message_policy\": \"File\",\n                    \"tty\": null,\n                    \"volume_devices\": null,\n                    \"volume_mounts\": [\n                        {\n                            \"mount_path\": \"/etc/grafana/grafana.ini\",\n                            \"mount_propagation\": null,\n                            \"name\": \"config\",\n                            \"read_only\": null,\n                            \"sub_path\": \"grafana.ini\",\n                            \"sub_path_expr\": null\n                        },\n                        {\n                            \"mount_path\": \"/var/lib/grafana\",\n                            \"mount_propagation\": null,\n                            \"name\": \"storage\",\n                            \"read_only\": null,\n                            \"sub_path\": null,\n                            \"sub_path_expr\": null\n                        },\n                        {\n                            \"mount_path\": \"/var/run/secrets/kubernetes.io/serviceaccount\",\n                            \"mount_propagation\": null,\n                            \"name\": \"grafana-token-ghbbk\",\n                            \"read_only\": true,\n                            \"sub_path\": null,\n                            \"sub_path_expr\": null\n                        }\n                    ],\n                    \"working_dir\": null\n                }\n            ],\n            \"dns_config\": null,\n            \"dns_policy\": \"ClusterFirst\",\n            \"enable_service_links\": true,\n            \"host_aliases\": null,\n            \"host_ipc\": null,\n            \"host_network\": null,\n            \"host_pid\": null,\n            \"hostname\": null,\n            \"image_pull_secrets\": null,\n            \"init_containers\": null,\n            \"node_name\": \"k3d-k3s-default-worker-0\",\n            \"node_selector\": null,\n            \"preemption_policy\": null,\n            \"priority\": 0,\n            \"priority_class_name\": null,\n            \"readiness_gates\": null,\n            \"restart_policy\": \"Always\",\n            \"runtime_class_name\": null,\n            \"scheduler_name\": \"default-scheduler\",\n            \"security_context\": {\n                \"fs_group\": 472,\n                \"run_as_group\": 472,\n                \"run_as_non_root\": null,\n                \"run_as_user\": 472,\n                \"se_linux_options\": null,\n                \"supplemental_groups\": null,\n                \"sysctls\": null,\n                \"windows_options\": null\n            },\n            \"service_account\": \"grafana\",\n            \"service_account_name\": \"grafana\",\n            \"share_process_namespace\": null,\n            \"subdomain\": null,\n            \"termination_grace_period_seconds\": 30,\n            \"tolerations\": [\n                {\n                    \"effect\": \"NoExecute\",\n                    \"key\": \"node.kubernetes.io/not-ready\",\n                    \"operator\": \"Exists\",\n                    \"toleration_seconds\": 300,\n                    \"value\": null\n                },\n                {\n                    \"effect\": \"NoExecute\",\n                    \"key\": \"node.kubernetes.io/unreachable\",\n                    \"operator\": \"Exists\",\n                    \"toleration_seconds\": 300,\n                    \"value\": null\n                }\n            ],\n            \"volumes\": [\n                {\n                    \"aws_elastic_block_store\": null,\n                    \"azure_disk\": null,\n                    \"azure_file\": null,\n                    \"cephfs\": null,\n                    \"cinder\": null,\n                    \"config_map\": {\n                        \"default_mode\": 420,\n                        \"items\": null,\n                        \"name\": \"grafana\",\n                        \"optional\": null\n                    },\n                    \"csi\": null,\n                    \"downward_api\": null,\n                    \"empty_dir\": null,\n                    \"fc\": null,\n                    \"flex_volume\": null,\n                    \"flocker\": null,\n                    \"gce_persistent_disk\": null,\n                    \"git_repo\": null,\n                    \"glusterfs\": null,\n                    \"host_path\": null,\n                    \"iscsi\": null,\n                    \"name\": \"config\",\n                    \"nfs\": null,\n                    \"persistent_volume_claim\": null,\n                    \"photon_persistent_disk\": null,\n                    \"portworx_volume\": null,\n                    \"projected\": null,\n                    \"quobyte\": null,\n                    \"rbd\": null,\n                    \"scale_io\": null,\n                    \"secret\": null,\n                    \"storageos\": null,\n                    \"vsphere_volume\": null\n                },\n                {\n                    \"aws_elastic_block_store\": null,\n                    \"azure_disk\": null,\n                    \"azure_file\": null,\n                    \"cephfs\": null,\n                    \"cinder\": null,\n                    \"config_map\": null,\n                    \"csi\": null,\n                    \"downward_api\": null,\n                    \"empty_dir\": {\n                        \"medium\": null,\n                        \"size_limit\": null\n                    },\n                    \"fc\": null,\n                    \"flex_volume\": null,\n                    \"flocker\": null,\n                    \"gce_persistent_disk\": null,\n                    \"git_repo\": null,\n                    \"glusterfs\": null,\n                    \"host_path\": null,\n                    \"iscsi\": null,\n                    \"name\": \"storage\",\n                    \"nfs\": null,\n                    \"persistent_volume_claim\": null,\n                    \"photon_persistent_disk\": null,\n                    \"portworx_volume\": null,\n                    \"projected\": null,\n                    \"quobyte\": null,\n                    \"rbd\": null,\n                    \"scale_io\": null,\n                    \"secret\": null,\n                    \"storageos\": null,\n                    \"vsphere_volume\": null\n                },\n                {\n                    \"aws_elastic_block_store\": null,\n                    \"azure_disk\": null,\n                    \"azure_file\": null,\n                    \"cephfs\": null,\n                    \"cinder\": null,\n                    \"config_map\": null,\n                    \"csi\": null,\n                    \"downward_api\": null,\n                    \"empty_dir\": null,\n                    \"fc\": null,\n                    \"flex_volume\": null,\n                    \"flocker\": null,\n                    \"gce_persistent_disk\": null,\n                    \"git_repo\": null,\n                    \"glusterfs\": null,\n                    \"host_path\": null,\n                    \"iscsi\": null,\n                    \"name\": \"grafana-token-ghbbk\",\n                    \"nfs\": null,\n                    \"persistent_volume_claim\": null,\n                    \"photon_persistent_disk\": null,\n                    \"portworx_volume\": null,\n                    \"projected\": null,\n                    \"quobyte\": null,\n                    \"rbd\": null,\n                    \"scale_io\": null,\n                    \"secret\": {\n                        \"default_mode\": 420,\n                        \"items\": null,\n                        \"optional\": null,\n                        \"secret_name\": \"grafana-token-ghbbk\"\n                    },\n                    \"storageos\": null,\n                    \"vsphere_volume\": null\n                }\n            ]\n        },\n        \"status\": {\n            \"conditions\": [\n                {\n                    \"last_probe_time\": null,\n                    \"last_transition_time\": 1592598289,\n                    \"message\": null,\n                    \"reason\": null,\n                    \"status\": \"true\",\n                    \"type\": \"Initialized\"\n                },\n                {\n                    \"last_probe_time\": null,\n                    \"last_transition_time\": 1592598289,\n                    \"message\": null,\n                    \"reason\": null,\n                    \"status\": \"true\",\n                    \"type\": \"Ready\"\n                },\n                {\n                    \"last_probe_time\": null,\n                    \"last_transition_time\": 1592598289,\n                    \"message\": null,\n                    \"reason\": null,\n                    \"status\": \"true\",\n                    \"type\": \"ContainersReady\"\n                },\n                {\n                    \"last_probe_time\": null,\n                    \"last_transition_time\": 1592598289,\n                    \"message\": null,\n                    \"reason\": null,\n                    \"status\": \"true\",\n                    \"type\": \"PodScheduled\"\n                }\n            ],\n            \"container_statuses\": [\n                {\n                    \"container_id\": \"containerd://17dbd103229c2e2b738ccfa2a373bd7ab3d79c7ad6e682ed785c3e9fc510ee41\",\n                    \"image\": \"docker.io/grafana/grafana:7.0.3\",\n                    \"image_id\": \"docker.io/grafana/grafana@sha256:d72946c8e5d57a9a121bcc3ae8e4a8ccab96960d81031d18a4c31ad1f7aea03e\",\n                    \"last_state\": {\n                        \"running\": null,\n                        \"terminated\": null,\n                        \"waiting\": null\n                    },\n                    \"name\": \"grafana\",\n                    \"ready\": true,\n                    \"restart_count\": 0,\n                    \"state\": {\n                        \"running\": {\n                            \"started_at\": 1592598289\n                        },\n                        \"terminated\": null,\n                        \"waiting\": null\n                    }\n                }\n            ],\n            \"host_ip\": \"172.18.0.3\",\n            \"init_container_statuses\": null,\n            \"message\": null,\n            \"nominated_node_name\": null,\n            \"phase\": \"Running\",\n            \"pod_ip\": \"10.42.1.7\",\n            \"qos_class\": \"BestEffort\",\n            \"reason\": null,\n            \"start_time\": 1592598289\n        }\n    }\n]"
  },
  {
    "path": "test/resources/pvc.json",
    "content": "[\n{\n    \"apiVersion\": \"v1\",\n    \"kind\": \"PersistentVolumeClaim\",\n    \"metadata\": {\n        \"creationTimestamp\": \"2021-03-19T03:42:46Z\",\n        \"finalizers\": [\n            \"kubernetes.io/pvc-protection\"\n        ],\n        \"managedFields\": [\n            {\n                \"apiVersion\": \"v1\",\n                \"fieldsType\": \"FieldsV1\",\n                \"fieldsV1\": {\n                    \"f:spec\": {\n                        \"f:accessModes\": {},\n                        \"f:resources\": {\n                            \"f:requests\": {\n                                \".\": {},\n                                \"f:storage\": {}\n                            }\n                        },\n                        \"f:selector\": {\n                            \".\": {},\n                            \"f:matchExpressions\": {},\n                            \"f:matchLabels\": {\n                                \".\": {},\n                                \"f:release\": {}\n                            }\n                        },\n                        \"f:storageClassName\": {},\n                        \"f:volumeMode\": {}\n                    },\n                    \"f:status\": {\n                        \"f:phase\": {}\n                    }\n                },\n                \"manager\": \"kubectl\",\n                \"operation\": \"Update\",\n                \"time\": \"2021-03-19T03:42:46Z\"\n            }\n        ],\n        \"name\": \"myclaim\",\n        \"namespace\": \"default\",\n        \"resourceVersion\": \"4686\",\n        \"selfLink\": \"/api/v1/namespaces/default/persistentvolumeclaims/myclaim\",\n        \"uid\": \"42708d93-02f5-4488-9bae-497d1a150de8\"\n    },\n    \"spec\": {\n        \"accessModes\": [\n            \"ReadWriteOnce\"\n        ],\n        \"resources\": {\n            \"requests\": {\n                \"storage\": \"8Gi\"\n            }\n        },\n        \"selector\": {\n            \"matchExpressions\": [\n                {\n                    \"key\": \"environment\",\n                    \"operator\": \"In\",\n                    \"values\": [\n                        \"dev\"\n                    ]\n                }\n            ],\n            \"matchLabels\": {\n                \"release\": \"stable\"\n            }\n        },\n        \"storageClassName\": \"slow\",\n        \"volumeMode\": \"Filesystem\"\n    },\n    \"status\": {\n        \"phase\": \"Pending\"\n    }\n}\n]\n"
  },
  {
    "path": "test/resources/replicaset.json",
    "content": "[\r\n  {\r\n    \"apiVersion\": \"apps/v1\",\r\n    \"kind\": \"ReplicaSet\",\r\n    \"metadata\": {\r\n      \"creationTimestamp\": \"2021-07-22T00:56:58Z\",\r\n      \"generation\": 1,\r\n      \"labels\": {\r\n        \"app\": \"nginx-proxy\",\r\n        \"tier\": \"frontend\"\r\n      },\r\n      \"name\": \"nginx-proxy\",\r\n      \"namespace\": \"test-auto\",\r\n      \"resourceVersion\": \"94849081\",\r\n      \"selfLink\": \"/apis/apps/v1/namespaces/test-auto/replicasets/nginx-proxy\",\r\n      \"uid\": \"3c64a9fb-b891-475b-905b-84ec84e079ee\"\r\n    },\r\n    \"spec\": {\r\n      \"replicas\": 5,\r\n      \"selector\": {\r\n        \"matchLabels\": {\r\n          \"tier\": \"frontend\"\r\n        }\r\n      },\r\n      \"template\": {\r\n        \"metadata\": {\r\n          \"creationTimestamp\": null,\r\n          \"labels\": {\r\n            \"tier\": \"frontend\"\r\n          }\r\n        },\r\n        \"spec\": {\r\n          \"containers\": [\r\n            {\r\n              \"image\": \"nginx\",\r\n              \"imagePullPolicy\": \"Always\",\r\n              \"name\": \"nginx\",\r\n              \"resources\": {},\r\n              \"terminationMessagePath\": \"/dev/termination-log\",\r\n              \"terminationMessagePolicy\": \"File\"\r\n            }\r\n          ],\r\n          \"dnsPolicy\": \"ClusterFirst\",\r\n          \"restartPolicy\": \"Always\",\r\n          \"schedulerName\": \"default-scheduler\",\r\n          \"securityContext\": {},\r\n          \"terminationGracePeriodSeconds\": 30\r\n        }\r\n      }\r\n    },\r\n    \"status\": {\r\n      \"fullyLabeledReplicas\": 5,\r\n      \"observedGeneration\": 1,\r\n      \"replicas\": 5\r\n    }\r\n  }\r\n]"
  },
  {
    "path": "test/resources/role.json",
    "content": " [\n        {\n            \"apiVersion\": \"rbac.authorization.k8s.io/v1\",\n            \"kind\": \"Role\",\n            \"metadata\": {\n                \"creationTimestamp\": \"2021-03-10T04:54:29Z\",\n                \"managedFields\": [\n                    {\n                        \"apiVersion\": \"rbac.authorization.k8s.io/v1\",\n                        \"fieldsType\": \"FieldsV1\",\n                        \"fieldsV1\": {\n                            \"f:rules\": {}\n                        },\n                        \"manager\": \"kubectl\",\n                        \"operation\": \"Update\",\n                        \"time\": \"2021-03-10T04:54:29Z\"\n                    }\n                ],\n                \"name\": \"pod-reader\",\n                \"namespace\": \"default\",\n                \"resourceVersion\": \"2157\",\n                \"selfLink\": \"/apis/rbac.authorization.k8s.io/v1/namespaces/default/roles/pod-reader\",\n                \"uid\": \"f2f5ebcf-d1fa-4607-9d9e-7872ef185614\"\n            },\n            \"rules\": [\n                {\n                    \"apiGroups\": [\n                        \"\"\n                    ],\n                    \"resources\": [\n                        \"pods\"\n                    ],\n                    \"verbs\": [\n                        \"get\",\n                        \"watch\",\n                        \"list\"\n                    ]\n                }\n            ]\n        }\n    ]\n"
  },
  {
    "path": "test/resources/rolebinding.json",
    "content": "[\n        {\n            \"apiVersion\": \"rbac.authorization.k8s.io/v1\",\n            \"kind\": \"RoleBinding\",\n            \"metadata\": {\n                \"creationTimestamp\": \"2021-03-10T04:59:42Z\",\n                \"managedFields\": [\n                    {\n                        \"apiVersion\": \"rbac.authorization.k8s.io/v1\",\n                        \"fieldsType\": \"FieldsV1\",\n                        \"fieldsV1\": {\n                            \"f:roleRef\": {\n                                \"f:apiGroup\": {},\n                                \"f:kind\": {},\n                                \"f:name\": {}\n                            },\n                            \"f:subjects\": {}\n                        },\n                        \"manager\": \"kubectl\",\n                        \"operation\": \"Update\",\n                        \"time\": \"2021-03-10T04:59:42Z\"\n                    }\n                ],\n                \"name\": \"read-pods\",\n                \"namespace\": \"default\",\n                \"resourceVersion\": \"2952\",\n                \"selfLink\": \"/apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/read-pods\",\n                \"uid\": \"0df37c75-ea20-4c8a-979a-1a2a67faf1db\"\n            },\n            \"roleRef\": {\n                \"apiGroup\": \"rbac.authorization.k8s.io\",\n                \"kind\": \"Role\",\n                \"name\": \"pod-reader\"\n            },\n            \"subjects\": [\n                {\n                    \"apiGroup\": \"rbac.authorization.k8s.io\",\n                    \"kind\": \"User\",\n                    \"name\": \"jane\"\n                }\n            ]\n        }\n]\n"
  },
  {
    "path": "test/resources/secrets.json",
    "content": "[\n    {\n        \"apiVersion\": \"v1\",\n        \"data\": {\n            \"admin-password\": \"NERwMHFKcjFtOWtPR0p3UW1GZFFYbXVVRU4xZ3dYemM0T09neXlGWg==\",\n            \"admin-user\": \"YWRtaW4=\",\n            \"ldap-toml\": \"\"\n        },\n        \"kind\": \"Secret\",\n        \"metadata\": {\n            \"creationTimestamp\": \"2021-02-06T10:57:31Z\",\n            \"labels\": {\n                \"app.kubernetes.io/instance\": \"grafana\",\n                \"app.kubernetes.io/managed-by\": \"Helm\",\n                \"app.kubernetes.io/name\": \"grafana\",\n                \"app.kubernetes.io/version\": \"7.1.1\",\n                \"helm.sh/chart\": \"grafana-5.5.7\"\n            },\n            \"name\": \"grafana\",\n            \"namespace\": \"default\",\n            \"resourceVersion\": \"207273733\",\n            \"selfLink\": \"/api/v1/namespaces/default/secrets/grafana\",\n            \"uid\": \"46ddd8a0-8ae9-47bb-8d4d-232ab1584594\"\n        },\n        \"type\": \"Opaque\"\n    }\n    \n]"
  },
  {
    "path": "test/resources/service.json",
    "content": "[\t\n\t{\n\t\t\"apiVersion\": \"v1\",\n\t\t\"kind\": \"Service\",\n\t\t\"metadata\": {\n\t\t\t\"creationTimestamp\": \"2021-03-17T12:27:33Z\",\n\t\t\t\"managedFields\": [\n\t\t\t\t{\n\t\t\t\t\t\"apiVersion\": \"v1\",\n\t\t\t\t\t\"fieldsType\": \"FieldsV1\",\n\t\t\t\t\t\"fieldsV1\": {\n\t\t\t\t\t\t\"f:spec\": {\n\t\t\t\t\t\t\t\"f:ports\": {\n\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\"k:{\\\"port\\\":80,\\\"protocol\\\":\\\"TCP\\\"}\": {\n\t\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\t\"f:port\": {},\n\t\t\t\t\t\t\t\t\t\"f:protocol\": {},\n\t\t\t\t\t\t\t\t\t\"f:targetPort\": {}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"f:selector\": {\n\t\t\t\t\t\t\t\t\".\": {},\n\t\t\t\t\t\t\t\t\"f:app\": {}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"f:sessionAffinity\": {},\n\t\t\t\t\t\t\t\"f:type\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"manager\": \"kubectl\",\n\t\t\t\t\t\"operation\": \"Update\",\n\t\t\t\t\t\"time\": \"2021-03-17T12:27:33Z\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"name\": \"test-service\",\n\t\t\t\"namespace\": \"default\",\n\t\t\t\"resourceVersion\": \"970\",\n\t\t\t\"selfLink\": \"/api/v1/namespaces/default/services/my-service\",\n\t\t\t\"uid\": \"bd0c1526-e540-4e80-aae6-088731013f1a\"\n\t\t},\n\t\t\"spec\": {\n\t\t\t\"clusterIP\": \"10.108.127.133\",\n\t\t\t\"ports\": [\n\t\t\t\t{\n\t\t\t\t\t\"port\": 80,\n\t\t\t\t\t\"protocol\": \"TCP\",\n\t\t\t\t\t\"targetPort\": 9376\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"selector\": {\n\t\t\t\t\"app\": \"MyApp\"\n\t\t\t},\n\t\t\t\"sessionAffinity\": \"None\",\n\t\t\t\"type\": \"ClusterIP\"\n\t\t},\n\t\t\"status\": {\n\t\t\t\"loadBalancer\": {}\n\t\t}\n\t}\n]\n"
  },
  {
    "path": "test/resources/service_accounts.json",
    "content": "[\n    {\n        \"apiVersion\": \"v1\",\n        \"kind\": \"ServiceAccount\",\n        \"metadata\": {\n            \"creationTimestamp\": \"2021-01-11T13:12:14Z\",\n            \"name\": \"default\",\n            \"namespace\": \"default\",\n            \"resourceVersion\": \"383\",\n            \"uid\": \"5a9e50d5-6e31-47a0-b747-cf3d60316d19\"\n        },\n        \"secrets\": [\n            {\n                \"name\": \"default-token-wtcl2\"\n            }\n        ]\n    },\n    {\n        \"apiVersion\": \"v1\",\n        \"kind\": \"ServiceAccount\",\n        \"metadata\": {\n            \"creationTimestamp\": \"2021-01-11T13:12:14Z\",\n            \"name\": \"kubelib-test-test-objects-chart\",\n            \"namespace\": \"default\",\n            \"resourceVersion\": \"383\",\n            \"uid\": \"5a9e50d5-6e31-47a0-b747-cf3d60316d19\"\n        },\n        \"secrets\": [\n            {\n                \"name\": \"default-token-wtcl2\"\n            }\n        ]\n    }\n]"
  },
  {
    "path": "test/resources/service_details.json",
    "content": "{\n    \"apiVersion\": \"v1\",\n    \"kind\": \"Service\",\n    \"metadata\": {\n        \"creationTimestamp\": \"2021-04-22T10:24:37Z\",\n        \"labels\": {\n            \"Test\": \"mytest\"\n        },\n        \"managedFields\": [\n            {\n                \"apiVersion\": \"v1\",\n                \"fieldsType\": \"FieldsV1\",\n                \"fieldsV1\": {\n                    \"f:metadata\": {\n                        \"f:labels\": {\n                            \".\": {},\n                            \"f:Test\": {}\n                        }\n                    },\n                    \"f:spec\": {\n                        \"f:ports\": {\n                            \".\": {},\n                            \"k:{\\\"port\\\":80,\\\"protocol\\\":\\\"TCP\\\"}\": {\n                                \".\": {},\n                                \"f:port\": {},\n                                \"f:protocol\": {},\n                                \"f:targetPort\": {}\n                            }\n                        },\n                        \"f:selector\": {\n                            \".\": {},\n                            \"f:app\": {}\n                        },\n                        \"f:sessionAffinity\": {},\n                        \"f:type\": {}\n                    }\n                },\n                \"manager\": \"kubectl\",\n                \"operation\": \"Update\",\n                \"time\": \"2021-04-22T10:24:37Z\"\n            }\n        ],\n        \"name\": \"my-service2\",\n        \"namespace\": \"default\",\n        \"resourceVersion\": \"909\",\n        \"selfLink\": \"/api/v1/namespaces/default/services/my-service2\",\n        \"uid\": \"6fd4d12c-8b5f-4a0b-b153-96489ab3c0be\"\n    },\n    \"spec\": {\n        \"clusterIP\": \"10.97.158.206\",\n        \"ports\": [\n            {\n                \"port\": 80,\n                \"protocol\": \"TCP\",\n                \"targetPort\": 9376\n            }\n        ],\n        \"selector\": {\n            \"app\": \"MyApp\"\n        },\n        \"sessionAffinity\": \"None\",\n        \"type\": \"ClusterIP\"\n    },\n    \"status\": {\n        \"loadBalancer\": {}\n    }\n}\n"
  },
  {
    "path": "test/resources/sts.json",
    "content": "[\n    {\n      \"apiVersion\": \"apps/v1\",\n      \"kind\": \"StatefulSet\",\n      \"metadata\": {\n        \"creationTimestamp\": \"2021-07-21T00:56:58Z\",\n        \"generation\": 1,\n        \"labels\": {\n          \"app\": \"nginx-proxy\",\n          \"tier\": \"frontend\"\n        },\n        \"name\": \"nginx-proxy\",\n        \"namespace\": \"default\",\n        \"resourceVersion\": \"94859081\",\n        \"selfLink\": \"/apis/apps/v1/namespaces/default/statefulsets/nginx-proxy\",\n        \"uid\": \"3c64a9fb-b891-475b-905b-84ec84e079e1\"\n      },\n      \"spec\": {\n        \"replicas\": 5,\n        \"selector\": {\n          \"matchLabels\": {\n            \"tier\": \"frontend\"\n          }\n        },\n        \"template\": {\n          \"metadata\": {\n            \"creationTimestamp\": null,\n            \"labels\": {\n              \"tier\": \"frontend\"\n            }\n          },\n          \"spec\": {\n            \"containers\": [\n              {\n                \"image\": \"nginx\",\n                \"imagePullPolicy\": \"Always\",\n                \"name\": \"nginx\",\n                \"resources\": {},\n                \"terminationMessagePath\": \"/dev/termination-log\",\n                \"terminationMessagePolicy\": \"File\"\n              }\n            ],\n            \"dnsPolicy\": \"ClusterFirst\",\n            \"restartPolicy\": \"Always\",\n            \"schedulerName\": \"default-scheduler\",\n            \"securityContext\": {},\n            \"terminationGracePeriodSeconds\": 30\n          }\n        }\n      },\n      \"status\": {\n        \"fullyLabeledReplicas\": 5,\n        \"observedGeneration\": 1,\n        \"replicas\": 5\n      }\n    }\n  ]"
  },
  {
    "path": "test/test_KubeLibrary.py",
    "content": "import json\nimport mock\nimport re\nimport ssl\nimport unittest\nfrom KubeLibrary import KubeLibrary\nfrom KubeLibrary.exceptions import BearerTokenWithPrefixException\nfrom kubernetes.config.config_exception import ConfigException\nfrom urllib3_mock import Responses\n\n\nclass AttributeDict(object):\n    \"\"\"\n    Based on http://databio.org/posts/python_AttributeDict.html\n\n    A class to convert a nested Dictionary into an object with key-values\n    accessibly using attribute notation (AttributeDict.attribute) instead of\n    key notation (Dict[\"key\"]). This class recursively sets Dicts to objects,\n    allowing you to recurse down nested dicts (like: AttributeDict.attr.attr)\n    \"\"\"\n    def __init__(self, entries):\n        self._root = None\n        self.add_entries(entries)\n\n    def add_entries(self, entries):\n        self._root = entries\n        for key, value in entries.items():\n            if type(value) is dict:\n                self.__dict__[key] = AttributeDict(value)\n            elif type(value) is list:\n                self.__dict__[key] = [AttributeDict(item) if type(item) is dict else item for item in value]\n            else:\n                self.__dict__[key] = value\n\n    def __iter__(self):\n        return iter(self._root)\n\n    def __getitem__(self, key):\n        \"\"\"\n        Provides dict-style access to attributes\n        \"\"\"\n        return getattr(self, key)\n\n\ndef mock_read_daemonset_details_in_namespace(name, namespace):\n    if namespace == 'default':\n        with open('test/resources/daemonset_details.json') as json_file:\n            daemonset_details_content = json.load(json_file)\n            read_daemonset_details = AttributeDict({'items': daemonset_details_content})\n            return read_daemonset_details\n\n\ndef mock_read_service_details_in_namespace(name, namespace):\n    if namespace == 'default':\n        with open('test/resources/service_details.json') as json_file:\n            service_details_content = json.load(json_file)\n            read_service_details = AttributeDict({'items': service_details_content})\n            return read_service_details\n\n\ndef mock_read_hpa_details_in_namespace(name, namespace):\n    if namespace == 'default':\n        with open('test/resources/hpa_details.json') as json_file:\n            hpa_details_content = json.load(json_file)\n            read_hpa_details = AttributeDict({'items': hpa_details_content})\n            return read_hpa_details\n\n\ndef mock_read_ingress_details_in_namespace(name, namespace):\n    if namespace == 'default':\n        with open('test/resources/ingress_details.json') as json_file:\n            ingress_details_content = json.load(json_file)\n            read_ingress_details = AttributeDict({'items': ingress_details_content})\n            return read_ingress_details\n\n\ndef mock_read_cron_job_details_in_namespace(name, namespace):\n    if namespace == 'default':\n        with open('test/resources/cronjob_details.json') as json_file:\n            cron_job_details_content = json.load(json_file)\n            read_cron_job_details = AttributeDict({'items': cron_job_details_content})\n            return read_cron_job_details\n\n\ndef mock_list_namespaced_daemonsets(namespace, watch=False, label_selector=\"\"):\n    if namespace == 'default':\n        with open('test/resources/daemonset.json') as json_file:\n            daemonsets_content = json.load(json_file)\n            list_of_daemonsets = AttributeDict({'items': daemonsets_content})\n            return list_of_daemonsets\n\n\ndef mock_list_namespaced_cronjobs(namespace, watch=False, label_selector=\"\"):\n    if namespace == 'default':\n        with open('test/resources/cronjob.json') as json_file:\n            cronjobs_content = json.load(json_file)\n            list_of_cronjobs = AttributeDict({'items': cronjobs_content})\n            return list_of_cronjobs\n\n\ndef mock_list_namespaced_ingresses(namespace, watch=False, label_selector=\"\"):\n    if namespace == 'default':\n        with open('test/resources/ingress.json') as json_file:\n            ingresses_content = json.load(json_file)\n            list_ingresses = AttributeDict({'items': ingresses_content})\n            return list_ingresses\n\n\ndef mock_read_namespaced_endpoints(name, namespace):\n    if namespace == 'default':\n        with open('test/resources/endpoints.json') as json_file:\n            endpoints_content = json.load(json_file)\n            read_endpoints = AttributeDict({'items': endpoints_content})\n            return read_endpoints\n\n\ndef mock_list_namespaced_config_map(namespace, watch=False, label_selector=\"\"):\n    with open('test/resources/configmap.json') as json_file:\n        configmap_content = json.load(json_file)\n        configmap = AttributeDict({'items': configmap_content})\n        return configmap\n\n\ndef mock_list_namespaced_deployments(namespace, watch=False, label_selector=\"\"):\n    with open('test/resources/deployment.json') as json_file:\n        deployments_content = json.load(json_file)\n        deployments = AttributeDict({'items': deployments_content})\n        return deployments\n\n\ndef mock_list_namespaced_replicasets(namespace, watch=False, label_selector=\"\"):\n    with open('test/resources/replicaset.json') as json_file:\n        replicasets_content = json.load(json_file)\n        replicasets = AttributeDict({'items': replicasets_content})\n        return replicasets\n\n\ndef mock_list_namespaced_statefulsets(namespace, watch=False, label_selector=\"\"):\n    with open('test/resources/sts.json') as json_file:\n        statefulsets_content = json.load(json_file)\n        statefulsets = AttributeDict({'items': statefulsets_content})\n        return statefulsets\n\n\ndef mock_list_pvc(namespace, watch=False, label_selector=\"\"):\n    if namespace == 'default':\n        with open('test/resources/pvc.json') as json_file:\n            pvc_content = json.load(json_file)\n            list_pvc = AttributeDict({'items': pvc_content})\n            return list_pvc\n\n\ndef mock_list_cluster_roles(watch=False):\n    with open('test/resources/cluster_role.json') as json_file:\n        cluster_roles_content = json.load(json_file)\n        list_of_cluster_roles = AttributeDict({'items': cluster_roles_content})\n        return list_of_cluster_roles\n\n\ndef mock_list_namespaced_services(namespace, watch=False, label_selector=\"\"):\n    if namespace == 'default':\n        with open('test/resources/service.json') as json_file:\n            services_content = json.load(json_file)\n            list_services = AttributeDict({'items': services_content})\n            return list_services\n\n\ndef mock_list_namespaced_hpas(namespace, watch=False, label_selector=\"\"):\n    if namespace == 'default':\n        with open('test/resources/hpa.json') as json_file:\n            hpas_content = json.load(json_file)\n            list_hpas = AttributeDict({'items': hpas_content})\n            return list_hpas\n\n\ndef mock_list_namespaced_pod(namespace, watch=False, label_selector=\"\"):\n    if namespace == 'default':\n        with open('test/resources/pods.json') as json_file:\n            pods_content = json.load(json_file)\n            list_of_pods = AttributeDict({'items': pods_content})\n            return list_of_pods\n\n\ndef mock_read_namespaced_pod_status(name, namespace):\n    if namespace == 'default':\n        with open('test/resources/pod_status.json') as json_file:\n            pod_content = json.load(json_file)\n            pod_status = AttributeDict({'status': pod_content['status']})\n            return pod_status\n\n\ndef mock_list_cluster_role_bindings(watch=False):\n    with open('test/resources/cluster_role_bind.json') as json_file:\n        cluster_role_bindings_content = json.load(json_file)\n        list_of_cluster_role_bindings = AttributeDict({'items': cluster_role_bindings_content})\n        return list_of_cluster_role_bindings\n\n\ndef mock_list_namespaced_service_accounts(namespace, watch=False, label_selector=\"\"):\n    if namespace == 'default':\n        with open('test/resources/service_accounts.json') as json_file:\n            service_accounts_content = json.load(json_file)\n            list_of_service_accounts = AttributeDict({'items': service_accounts_content})\n            return list_of_service_accounts\n\n\ndef mock_list_namespaced_jobs(namespace, watch=False, label_selector=\"\"):\n    if namespace == 'default':\n        with open('test/resources/jobs.json') as json_file:\n            jobs_content = json.load(json_file)\n            list_of_jobs = AttributeDict({'items': jobs_content})\n            return list_of_jobs\n\n\ndef mock_list_namespaced_secrets(namespace, watch=False, label_selector=\"\"):\n    if namespace == 'default':\n        with open('test/resources/secrets.json') as json_file:\n            secrets_content = json.load(json_file)\n            list_of_secrets = AttributeDict({'items': secrets_content})\n            return list_of_secrets\n\n\ndef mock_list_namespaces(watch=False, label_selector=\"\"):\n    with open('test/resources/namespaces.json') as json_file:\n        namespaces_content = json.load(json_file)\n        list_of_namespaces = AttributeDict({'items': namespaces_content})\n        return list_of_namespaces\n\n\ndef mock_list_node_info(watch=False, label_selector=\"\"):\n    with open('test/resources/node_info.json') as json_file:\n        node_info_content = json.load(json_file)\n        node_info = AttributeDict(node_info_content)\n        return node_info\n\n\ndef mock_list_namespaced_roles(namespace, watch=False):\n    if namespace == 'default':\n        with open('test/resources/role.json') as json_file:\n            role_content = json.load(json_file)\n            list_of_role = AttributeDict({'items': role_content})\n            return list_of_role\n\n\ndef mock_list_namespaced_role_bindings(namespace, watch=False):\n    if namespace == 'default':\n        with open('test/resources/rolebinding.json') as json_file:\n            role_bind_content = json.load(json_file)\n            list_of_role_bind = AttributeDict({'items': role_bind_content})\n            return list_of_role_bind\n\n\ndef mock_k8s_version():\n    k8s_version = {\n        'major': '1',\n        'minor': '33',\n        'emulationMajor': '1',\n        'emulationMinor': '33',\n        'minCompatibilityMajor': '1',\n        'minCompatibilityMinor': '32',\n        'gitVersion': 'v1.33.5-gke.1308000',\n        'gitCommit': 'a53c2ee3f2e9859ad8413e216edd44aed40e011d',\n        'gitTreeState': 'clean',\n        'buildDate': '2025-10-13T04:22:26Z',\n        'goVersion': 'go1.24.6 X:boringcrypto',\n        'compiler': 'gc',\n        'platform': 'linux/amd64'\n        }\n    return k8s_version\n\n\nbearer_token = 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjdXVWJMOUdTaDB1TjcyNmF0Sjk4RWlzQ05RaWdSUFoyN004TmlGT1pSX28ifQ.' \\\n               'eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1' \\\n               'lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Im15c2EtdG' \\\n               '9rZW4taDRzNzUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoibXlzY' \\\n               'SIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjY5MTk5ZmUyLTIzNWIt' \\\n               'NGY3MC04MjEwLTkzZTk2YmM5ZmEwOCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0Om15c2EifQ.' \\\n               'V8VIYZ0B2y2h9p-2LTZ19klSuZ37HUWi-8F1yjfFTq83R1Dmax6DoDr5gWbVL4A054q5k1L2U12d50gox0V_kVsRTb3' \\\n               'KQnRSGCz1YgCqOVNLqnnsyu3kcmDaUDrFlJ4PuZ7R4DfvGCdK-BU9pj2MhcQT-tyfbGR-dwwkjwXTCPRZVW-CUm4qwY' \\\n               'bCGTpGbNXPXbEKtseXIxMkRg70Kav3M-YB1LYHQRx_T2IqKAmyhXlbMc8boqoEiSi6TRbMjZ9Yz-nkc82e6kAdc1O2F' \\\n               '4kFw-14kg2mX7Hu-02vob_LZmfR08UGu6VTkcfVK5VqZVg2oVBI4swZghQl8_fOtlplOg'\n\nca_cert = '/path/to/certificate.crt'\n\nk8s_api_url = 'https://0.0.0.0:38041'\n\nresponses = Responses('requests.packages.urllib3')\n\n\nclass TestKubeLibrary(unittest.TestCase):\n\n    apis = ('v1', 'networkingv1api', 'batchv1', 'appsv1',\n            'custom_object', 'rbac_authv1_api', 'autoscalingv1', 'dynamic')\n\n    @responses.activate\n    def test_KubeLibrary_inits_from_kubeconfig(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        KubeLibrary(kube_config='test/resources/k3d')\n\n    @responses.activate\n    def test_KubeLibrary_inits_with_context(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        KubeLibrary(kube_config='test/resources/multiple_context', context='k3d-k3d-cluster2')\n\n    @responses.activate\n    def test_KubeLibrary_fails_for_wrong_context(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        kl = KubeLibrary(kube_config='test/resources/multiple_context')\n        self.assertRaises(ConfigException, kl.reload_config, kube_config='test/resources/multiple_context', context='k3d-k3d-cluster2-wrong')\n\n    @responses.activate\n    def test_inits_all_api_clients(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        for api in TestKubeLibrary.apis:\n            self.assertIsNotNone(getattr(kl, api))\n\n    @responses.activate\n    def test_KubeLibrary_inits_without_cert_validation(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        kl = KubeLibrary(kube_config='test/resources/k3d', cert_validation=False)\n        for api in TestKubeLibrary.apis:\n            target = getattr(kl, api)\n            self.assertEqual(target.api_client.rest_client.pool_manager.connection_pool_kw['cert_reqs'], ssl.CERT_NONE)\n\n    @responses.activate\n    def test_KubeLibrary_inits_with_bearer_token(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        kl = KubeLibrary(api_url=k8s_api_url, bearer_token=bearer_token)\n        for api in TestKubeLibrary.apis:\n            target = getattr(kl, api)\n            self.assertEqual(kl.api_client.configuration.api_key, target.api_client.configuration.api_key)\n        # self.assertEqual(kl.api_client.configuration.ssl_ca_cert, None) #seems this is now set by kubernetes client\n\n    @responses.activate\n    def test_inits_with_bearer_token_raises_BearerTokenWithPrefixException(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        kl = KubeLibrary(api_url=k8s_api_url, bearer_token=bearer_token)\n        self.assertRaises(BearerTokenWithPrefixException, kl.reload_config, api_url=k8s_api_url, bearer_token='Bearer prefix should fail')\n\n    @responses.activate\n    def test_KubeLibrary_inits_with_bearer_token_with_ca_crt(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        kl = KubeLibrary(api_url=k8s_api_url, bearer_token=bearer_token, ca_cert=ca_cert)\n        self.assertEqual(kl.api_client.configuration.ssl_ca_cert, ca_cert)\n        self.assertEqual(kl.dynamic.configuration.ssl_ca_cert, ca_cert)\n        self.assertEqual(kl.dynamic.client.configuration.ssl_ca_cert, ca_cert)\n\n    @responses.activate\n    def test_KubeLibrary_dynamic_init(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        responses.add(\"GET\", \"/api/v1\", status=200,\n                      body='{\"resources\": [{\"api_version\": \"v1\", \"kind\": \"Pod\", \"name\": \"Mock\"}], \"kind\": \"Pod\"}',\n                      content_type=\"application/json\")\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        resource = kl.get_dynamic_resource(\"v1\", \"Pod\")\n        self.assertTrue(hasattr(resource, \"get\"))\n        self.assertTrue(hasattr(resource, \"watch\"))\n        self.assertTrue(hasattr(resource, \"delete\"))\n        self.assertTrue(hasattr(resource, \"create\"))\n        self.assertTrue(hasattr(resource, \"patch\"))\n        self.assertTrue(hasattr(resource, \"replace\"))\n\n    @responses.activate\n    def test_KubeLibrary_dynamic_get(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        responses.add(\"GET\", \"/api/v1\", status=200,\n                      body='{\"resources\": [{\"api_version\": \"v1\", \"kind\": \"Pod\", \"name\": \"Mock\"}], \"kind\": \"Pod\"}',\n                      content_type=\"application/json\")\n        responses.add(\"GET\", \"/api/v1/mock/Mock\", status=200,\n                      body='{\"api_version\": \"v1\", \"kind\": \"Pod\", \"name\": \"Mock\", \"msg\": \"My Mock Pod\"}',\n                      content_type=\"application/json\")\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        pod = kl.get(\"v1\", \"Pod\", name=\"Mock\")\n        self.assertEqual(pod.msg, \"My Mock Pod\")\n\n    @responses.activate\n    def test_KubeLibrary_dynamic_patch(self):\n        def mock_callback(request):\n            self.assertEqual(request.body, '{\"msg\": \"Mock\"}')\n            return (200, None, None)\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        responses.add(\"GET\", \"/api/v1\", status=200,\n                      body='{\"resources\": [{\"api_version\": \"v1\", \"kind\": \"Pod\", \"name\": \"Mock\"}], \"kind\": \"Pod\"}',\n                      content_type=\"application/json\")\n        responses.add_callback(\"PATCH\", \"/api/v1/mock/Mock\", callback=mock_callback)\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        kl.patch(\"v1\", \"Pod\", name=\"Mock\", body={\"msg\": \"Mock\"})\n\n    @responses.activate\n    def test_KubeLibrary_dynamic_replace(self):\n        def mock_callback(request):\n            self.assertEqual(request.body, '{\"msg\": \"Mock\"}')\n            return (200, None, None)\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        responses.add(\"GET\", \"/api/v1\", status=200,\n                      body='{\"resources\": [{\"api_version\": \"v1\", \"kind\": \"Pod\", \"name\": \"Mock\"}], \"kind\": \"Pod\"}',\n                      content_type=\"application/json\")\n        responses.add_callback(\"PUT\", \"/api/v1/mock/Mock\", callback=mock_callback)\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        kl.replace(\"v1\", \"Pod\", name=\"Mock\", body={\"msg\": \"Mock\"})\n\n    @responses.activate\n    def test_KubeLibrary_dynamic_create(self):\n        with open('test/resources/pod.json') as json_file:\n            sample_pod = json.load(json_file)\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        responses.add(\"GET\", \"/api/v1\", status=200,\n                      body='{\"resources\": [{\"api_version\": \"v1\", \"kind\": \"Pod\", \"name\": \"Mock\"}], \"kind\": \"Pod\"}',\n                      content_type=\"application/json\")\n        responses.add(\"POST\", \"/api/v1/mock\", status=200, body=json.dumps(sample_pod), content_type=\"application/json\")\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        created = kl.create(\"v1\", \"Pod\", body=json.dumps(sample_pod))\n        self.assertEqual(created.to_dict(), sample_pod)\n\n    @responses.activate\n    def test_KubeLibrary_dynamic_delete(self):\n        responses.add(\"GET\", \"/version\", status=200)\n        responses.add(\"GET\", \"/apis\", status=200, body='{\"groups\": [], \"kind\": \"Pod\" }', content_type=\"application/json\")\n        responses.add(\"GET\", \"/api/v1\", status=200,\n                      body='{\"resources\": [{\"api_version\": \"v1\", \"kind\": \"Pod\", \"name\": \"Mock\"}], \"kind\": \"Pod\"}',\n                      content_type=\"application/json\")\n        responses.add(\"DELETE\", \"/api/v1/mock/Mock\", status=200)\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        kl.delete(\"v1\", \"Pod\", name=\"Mock\")\n\n    def test_generate_alphanumeric_str(self):\n        name = KubeLibrary.generate_alphanumeric_str(10)\n        self.assertEqual(10, len(name))\n\n    def test_evaluate_callable_from_k8s_client(self):\n        configmap = KubeLibrary.evaluate_callable_from_k8s_client(\n            attr_name=\"V1ConfigMap\",\n            data={\"msg\": \"Mock\"}, api_version=\"v1\", kind=\"ConfigMap\",\n            metadata=KubeLibrary.evaluate_callable_from_k8s_client(attr_name=\"V1ObjectMeta\", name=\"Mock\")\n        )\n        self.assertIsNotNone(configmap)\n        self.assertEqual(configmap.metadata.name, \"Mock\")\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_pod')\n    def test_list_namespaced_pod_by_pattern(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_pod\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        pods = kl.list_namespaced_pod_by_pattern('.*', 'default')\n        pods2 = kl.get_pods_in_namespace('.*', 'default')\n        pods3 = kl.get_pod_names_in_namespace('.*', 'default')\n        self.assertEqual(kl.filter_names(pods), pods3)\n        self.assertEqual(kl.filter_names(pods), kl.filter_pods_names(pods2))\n        self.assertEqual(['octopus-0', 'grafana-5d9895c6c4-sfsn8'], kl.filter_names(pods))\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_pod')\n    def test_get_matching_pods_in_namespace(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_pod\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        pods = kl.list_namespaced_pod_by_pattern('graf.*', 'default')\n        self.assertEqual(['grafana-5d9895c6c4-sfsn8'], kl.filter_names(pods))\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_pod')\n    def test_filter_pods_containers_by_name(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_pod\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        pods = kl.list_namespaced_pod_by_pattern('octopus.*', 'default')\n        self.assertEqual('manager', kl.filter_pods_containers_by_name(pods, '.*')[0].name)\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_pod')\n    def test_filter_containers_images(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_pod\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        pods = kl.list_namespaced_pod_by_pattern('octopus.*', 'default')\n        containers = kl.filter_pods_containers_by_name(pods, '.*')\n        self.assertEqual(['eu.gcr.io/kyma-project/incubator/develop/octopus:dc5dc284'], kl.filter_containers_images(containers))\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_pod')\n    def test_filter_pods_containers_statuses_by_name(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_pod\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        pods = kl.list_namespaced_pod_by_pattern('octopus.*', 'default')\n        self.assertEqual(0, kl.filter_pods_containers_statuses_by_name(pods, '.*')[0].restart_count)\n\n    @mock.patch('kubernetes.client.CoreV1Api.read_namespaced_pod_status')\n    def test_read_namespaced_pod_status(self, mock_lnp):\n        mock_lnp.side_effect = mock_read_namespaced_pod_status\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        pod_status = kl.read_namespaced_pod_status('grafana-6769d4b669-fhspj', 'default')\n        self.assertEqual('Running', pod_status['phase'])\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_pod')\n    def test_filter_containers_resources(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_pod\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        pods = kl.list_namespaced_pod_by_pattern('octopus.*', 'default')\n        containers = kl.filter_pods_containers_by_name(pods, '.*')\n        self.assertEqual('100m', kl.filter_containers_resources(containers)[0].limits.cpu)\n\n    def test_assert_pod_has_labels(self):\n        pod = mock_list_namespaced_pod('default').items[0]\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        labels = '{}'\n        self.assertTrue(kl.assert_pod_has_labels(pod, labels))\n        labels = '{\"app\":\"octopus\"}'\n        self.assertTrue(kl.assert_pod_has_labels(pod, labels))\n        labels = '{\"app\":\"wrong\"}'\n        self.assertFalse(kl.assert_pod_has_labels(pod, labels))\n        labels = '{\"notexists\":\"octopus\"}'\n        self.assertFalse(kl.assert_pod_has_labels(pod, labels))\n        labels = '{\"badlyformatted:}'\n        self.assertTrue(kl.assert_pod_has_labels(pod, labels) is False)\n\n    def test_assert_pod_has_annotations(self):\n        pod = mock_list_namespaced_pod('default').items[1]\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        labels = '{}'\n        self.assertTrue(kl.assert_pod_has_annotations(pod, labels))\n        labels = '{\"checksum/config\":\"1c42968a1b9eca0bafc3273ca39c4705fe71dc632e721db9e8ce44ab1b8e1428\"}'\n        self.assertTrue(kl.assert_pod_has_annotations(pod, labels))\n        labels = '{\"checksum/config\":\"wrong\"}'\n        self.assertFalse(kl.assert_pod_has_annotations(pod, labels))\n        labels = '{\"notexists\":\"1c42968a1b9eca0bafc3273ca39c4705fe71dc632e721db9e8ce44ab1b8e1428\"}'\n        self.assertFalse(kl.assert_pod_has_annotations(pod, labels))\n        labels = '{\"badlyformatted:}'\n        self.assertTrue(kl.assert_pod_has_annotations(pod, labels) is False)\n\n    def test_assert_container_has_env_vars(self):\n        pod = mock_list_namespaced_pod('default').items[0]\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        container = kl.filter_pods_containers_by_name([pod], '.*')[0]\n        env_vars = '{}'\n        self.assertTrue(kl.assert_container_has_env_vars(container, env_vars))\n        env_vars = '{\"SECRET_NAME\":\"webhook-server-secret\"}'\n        self.assertTrue(kl.assert_container_has_env_vars(container, env_vars))\n        env_vars = '{\"SECRET_NAME\":\"wrong\"}'\n        self.assertFalse(kl.assert_container_has_env_vars(container, env_vars))\n        env_vars = '{\"NOT_EXISTING\":\"wrong\"}'\n        self.assertFalse(kl.assert_container_has_env_vars(container, env_vars))\n        env_vars = '{\"badlyformatted:}'\n        self.assertFalse(kl.assert_container_has_env_vars(container, env_vars))\n\n    @unittest.skip(\"Will overwrite *.json\")\n    def test_gather_pods_obejcts_to_json(self):\n        kl = KubeLibrary(kube_config='~/.kube/k3d')\n        ret = kl.v1.read_namespaced_pod_status('grafana-6769d4b669-fhspj', 'default')\n        pods_str = str(ret).replace(\"'\", '\"') \\\n                           .replace('None', 'null') \\\n                           .replace('True', 'true') \\\n                           .replace('False', 'false')\n        # serialize datetime into fixed timestamp\n        pods = re.sub(r'datetime(.+?)\\)\\)', '1592598289', pods_str)\n        print(pods)\n        with open('test/resources/pod_status.json', 'w') as outfile:\n            json.dump(json.loads(pods), outfile, indent=4)\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespace')\n    def test_list_namespace(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaces\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        namespaces = kl.list_namespace()\n        namespaces2 = kl.get_namespaces()\n        self.assertEqual(kl.filter_names(namespaces), namespaces2)\n        self.assertTrue(len(namespaces) > 0)\n        self.assertEqual(['default', 'kubelib-test-test-objects-chart'], kl.filter_names(namespaces))\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_service_account')\n    def test_list_namespaced_service_account_by_pattern(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_service_accounts\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        sa = kl.list_namespaced_service_account_by_pattern('.*', 'default')\n        sa2 = kl.get_service_accounts_in_namespace('.*', 'default')\n        self.assertEqual(kl.filter_names(sa), kl.filter_service_accounts_names(sa2))\n        self.assertEqual(['default', 'kubelib-test-test-objects-chart'], kl.filter_names(sa))\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_node')\n    def test_get_kubelet_version(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_node_info\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        kl_version = kl.get_kubelet_version()\n        self.assertTrue(len(kl_version) > 0)\n        self.assertEqual(['v1.20.0+k3s2'], kl_version)\n\n    @mock.patch('kubernetes.client.BatchV1Api.list_namespaced_job')\n    def test_list_namespaced_job_by_pattern(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_jobs\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        jobs = kl.list_namespaced_job_by_pattern('.*', 'default')\n        jobs2 = kl.get_jobs_in_namespace('.*', 'default')\n        self.assertEqual(kl.filter_names(jobs), kl.filter_names(jobs2))\n        self.assertEqual(['octopus-0', 'octopus-1', 'octopus-2', 'octopus-3'], kl.filter_names(jobs))\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_secret')\n    def test_list_namespaced_secret_by_pattern(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_secrets\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        secrets = kl.list_namespaced_secret_by_pattern('.*', 'default')\n        secrets2 = kl.get_secrets_in_namespace('.*', 'default')\n        self.assertEqual(kl.filter_names(secrets), kl.filter_names(secrets2))\n        self.assertEqual(['grafana'], kl.filter_names(secrets))\n\n    @mock.patch('kubernetes.stream.stream')\n    def test_get_namespaced_exec_without_container(self, mock_stream):\n        test_string = \"This is test String!\"\n        mock_stream.return_value = test_string\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        stdout = kl.get_namespaced_pod_exec(name=\"pod_name\",\n                                            namespace=\"default\",\n                                            argv_cmd=[\"/bin/bash\", \"-c\", f\"echo {test_string}\"])\n        self.assertFalse(\"container\" in mock_stream.call_args.kwargs.keys())\n        self.assertEqual(stdout, test_string)\n\n    @mock.patch('kubernetes.stream.stream')\n    def test_get_namespaced_exec_with_container(self, mock_stream):\n        test_string = \"This is test String!\"\n        mock_stream.return_value = test_string\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        stdout = kl.get_namespaced_pod_exec(name=\"pod_name\",\n                                            namespace=\"default\",\n                                            container=\"manager\",\n                                            argv_cmd=[\"/bin/bash\", \"-c\", f\"echo {test_string}\"])\n        self.assertTrue(\"container\" in mock_stream.call_args.kwargs.keys())\n        self.assertTrue(\"manager\" in mock_stream.call_args.kwargs.values())\n        self.assertEqual(stdout, test_string)\n\n    @mock.patch('kubernetes.stream.stream')\n    def test_get_namespaced_exec_not_argv_and_list(self, mock_stream):\n        test_string = \"This is test String!\"\n        ex = f\"argv_cmd parameter should be a list and contains values like \" \\\n             f\"[\\\"/bin/bash\\\", \\\"-c\\\", \\\"ls\\\"] not echo {test_string}\"\n        mock_stream.return_value = test_string\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        with self.assertRaises(TypeError) as cm:\n            kl.get_namespaced_pod_exec(name=\"pod_name\",\n                                       namespace=\"default\",\n                                       container=\"manager\",\n                                       argv_cmd=f\"echo {test_string}\")\n        self.assertEqual(str(cm.exception), ex)\n\n    @mock.patch('kubernetes.client.RbacAuthorizationV1Api.list_cluster_role')\n    def test_list_cluster_role(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_cluster_roles\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        cluster_roles = kl.list_cluster_role()\n        cluster_roles2 = kl.get_cluster_roles()\n        self.assertEqual(kl.filter_names(cluster_roles), cluster_roles2)\n        self.assertEqual(['secret-reader'], kl.filter_names(cluster_roles))\n\n    @mock.patch('kubernetes.client.RbacAuthorizationV1Api.list_cluster_role_binding')\n    def test_list_cluster_role_binding(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_cluster_role_bindings\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        cluster_role_bindings = kl.list_cluster_role_binding()\n        cluster_role_bindings2 = kl.get_cluster_role_bindings()\n        self.assertEqual(kl.filter_names(cluster_role_bindings), cluster_role_bindings2)\n        self.assertEqual(['read-secrets-global'], kl.filter_names(cluster_role_bindings))\n\n    @mock.patch('kubernetes.client.RbacAuthorizationV1Api.list_namespaced_role')\n    def test_list_namespaced_role(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_roles\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        roles = kl.list_namespaced_role('default')\n        roles2 = kl.get_roles_in_namespace('default')\n        self.assertEqual(kl.filter_names(roles), roles2)\n        self.assertEqual(['pod-reader'], kl.filter_names(roles))\n\n    @mock.patch('kubernetes.client.RbacAuthorizationV1Api.list_namespaced_role_binding')\n    def test_list_namespaced_role_binding(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_role_bindings\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        role_bindings = kl.list_namespaced_role_binding('default')\n        role_bindings2 = kl.get_role_bindings_in_namespace('default')\n        self.assertEqual(kl.filter_names(role_bindings), role_bindings2)\n        self.assertEqual(['read-pods'], kl.filter_names(role_bindings))\n\n    @mock.patch('kubernetes.client.AppsV1Api.list_namespaced_deployment')\n    def test_list_namespaced_deployment_by_pattern(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_deployments\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        deployments = kl.list_namespaced_deployment_by_pattern('.*', 'default')\n        deployments2 = kl.get_deployments_in_namespace('.*', 'default')\n        self.assertEqual(kl.filter_names(deployments), kl.filter_deployments_names(deployments2))\n        self.assertEqual(['nginx-deployment'], kl.filter_names(deployments))\n\n    @mock.patch('kubernetes.client.AppsV1Api.list_namespaced_replica_set')\n    def test_list_namespaced_replica_set_by_pattern(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_replicasets\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        replicasets = kl.list_namespaced_replica_set_by_pattern('.*', 'test-auto')\n        replicasets2 = kl.get_replicasets_in_namespace('.*', 'test-auto')\n        self.assertEqual(kl.filter_names(replicasets), kl.filter_replicasets_names(replicasets2))\n        self.assertEqual(['nginx-proxy'], kl.filter_names(replicasets))\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_persistent_volume_claim')\n    def test_list_namespaced_persistent_volume_claim(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_pvc\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        pvcs = kl.list_namespaced_persistent_volume_claim('default')\n        pvcs2 = kl.get_pvc_in_namespace('default')\n        self.assertEqual(kl.filter_names(pvcs), pvcs2)\n        self.assertEqual(['myclaim'], kl.filter_names(pvcs))\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_persistent_volume_claim')\n    def test_list_namespaced_persistent_volume_claim_by_pattern(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_pvc\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        pvcs = kl.list_namespaced_persistent_volume_claim_by_pattern('.*', 'default')\n        pvcs2 = kl.get_pvc_in_namespace('default')\n        self.assertEqual(kl.filter_names(pvcs), pvcs2)\n        self.assertEqual(['myclaim'], kl.filter_names(pvcs))\n\n    @mock.patch('kubernetes.client.AppsV1Api.list_namespaced_stateful_set')\n    def test_list_namespaced_stateful_set_by_pattern(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_statefulsets\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        statefulsets = kl.list_namespaced_stateful_set_by_pattern('.*', 'default')\n        statefulsets2 = kl.list_namespaced_stateful_set('default')\n        self.assertEqual(kl.filter_names(statefulsets), kl.filter_names(statefulsets2))\n        self.assertEqual(['nginx-proxy'], kl.filter_names(statefulsets))\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_service')\n    def test_list_namespaced_service(self, mock_service):\n        mock_service.side_effect = mock_list_namespaced_services\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        ret = kl.list_namespaced_service('default')\n        self.assertEqual('test-service', ret[0].metadata.name)\n\n    @mock.patch('kubernetes.client.AppsV1Api.list_namespaced_daemon_set')\n    def test_list_namespaced_daemon_set(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_daemonsets\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        daemonsets = kl.list_namespaced_daemon_set('default')\n        daemonsets2 = kl.get_daemonsets_in_namespace('default')\n        self.assertEqual(kl.filter_names(daemonsets), daemonsets2)\n        self.assertEqual(['fluentd-elasticsearch'], kl.filter_names(daemonsets))\n\n    @mock.patch('kubernetes.client.NetworkingV1Api.list_namespaced_ingress')\n    def test_list_namespaced_ingress(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_ingresses\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        ingresses = kl.list_namespaced_ingress('default')\n        ingresses2 = kl.get_ingresses_in_namespace('default')\n        self.assertEqual(kl.filter_names(ingresses), ingresses2)\n        self.assertEqual(['minimal-ingress'], kl.filter_names(ingresses))\n\n    @mock.patch('kubernetes.client.BatchV1Api.list_namespaced_cron_job')\n    def test_list_namespaced_cron_job(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_cronjobs\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        cronjobs = kl.list_namespaced_cron_job('default')\n        cronjobs2 = kl.get_cron_jobs_in_namespace('default')\n        self.assertEqual(kl.filter_names(cronjobs), cronjobs2)\n        self.assertEqual(['hello'], kl.filter_names(cronjobs))\n\n    @mock.patch('kubernetes.client.CoreV1Api.read_namespaced_endpoints')\n    def test_read_namespaced_endpoints(self, mock_lnp):\n        mock_lnp.side_effect = mock_read_namespaced_endpoints\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        endpoints = kl.read_namespaced_endpoints('.*', 'default')\n        endpoints2 = kl.get_endpoints_in_namespace('.*', 'default')\n        self.assertEqual(endpoints.items[0].metadata.name, endpoints2.items[0].metadata.name)\n        self.assertEqual('my-service', endpoints.items[0].metadata.name)\n\n    @mock.patch('kubernetes.client.CoreV1Api.list_namespaced_config_map')\n    def test_get_configmaps_in_namespace(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_config_map\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        configmaps = kl.list_namespaced_config_map_by_pattern('.*', 'default')\n        configmaps2 = kl.get_configmaps_in_namespace('.*', 'default')\n        self.assertEqual(kl.filter_names(configmaps), kl.filter_configmap_names(configmaps2))\n        self.assertEqual(['game-demo'], kl.filter_names(configmaps))\n\n    @mock.patch('kubernetes.client.AutoscalingV1Api.list_namespaced_horizontal_pod_autoscaler')\n    def test_list_namespaced_horizontal_pod_autoscaler(self, mock_lnp):\n        mock_lnp.side_effect = mock_list_namespaced_hpas\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        hpas = kl.list_namespaced_horizontal_pod_autoscaler('default')\n        hpas2 = kl.get_hpas_in_namespace('default')\n        self.assertEqual(kl.filter_names(hpas), hpas2)\n        self.assertEqual(['kubelib-test-test-objects-chart'], kl.filter_names(hpas))\n\n    @mock.patch('kubernetes.client.AutoscalingV1Api.read_namespaced_horizontal_pod_autoscaler')\n    def test_read_namespaced_horizontal_pod_autoscaler(self, mock_lnp):\n        mock_lnp.side_effect = mock_read_hpa_details_in_namespace\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        hpa_details = kl.read_namespaced_horizontal_pod_autoscaler('kubelib-test-test-objects-chart', 'default')\n        hpa_details2 = kl.get_hpa_details_in_namespace('kubelib-test-test-objects-chart', 'default')\n        self.assertEqual(hpa_details.items.spec.scaleTargetRef.name, hpa_details2.items.spec.scaleTargetRef.name)\n        self.assertEqual('kubelib-test-test-objects-chart', hpa_details.items.spec.scaleTargetRef.name)\n\n    @mock.patch('kubernetes.client.AppsV1Api.read_namespaced_daemon_set')\n    def test_read_namespaced_daemon_set(self, mock_lnp):\n        mock_lnp.side_effect = mock_read_daemonset_details_in_namespace\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        daemonset_details = kl.read_namespaced_daemon_set('fluentd-elasticsearch', 'default')\n        daemonset_details2 = kl.get_daemonset_details_in_namespace('fluentd-elasticsearch', 'default')\n        self.assertEqual(daemonset_details.items.metadata.labels.TestLabel, daemonset_details2.items.metadata.labels.TestLabel)\n        self.assertEqual('mytestlabel', daemonset_details.items.metadata.labels.TestLabel)\n\n    @mock.patch('kubernetes.client.CoreV1Api.read_namespaced_service')\n    def test_read_namespaced_service(self, mock_lnp):\n        mock_lnp.side_effect = mock_read_service_details_in_namespace\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        service_details = kl.read_namespaced_service('minimal-ingress', 'default')\n        service_details2 = kl.get_service_details_in_namespace('minimal-ingress', 'default')\n        self.assertEqual(service_details.items.metadata.labels.Test, service_details2.items.metadata.labels.Test)\n        self.assertEqual('mytest', service_details.items.metadata.labels.Test)\n\n    @mock.patch('kubernetes.client.NetworkingV1Api.read_namespaced_ingress')\n    def test_read_namespaced_ingress(self, mock_lnp):\n        mock_lnp.side_effect = mock_read_ingress_details_in_namespace\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        ingress_details = kl.read_namespaced_ingress('max-ingress', 'default')\n        ingress_details2 = kl.get_ingress_details_in_namespace('max-ingress', 'default')\n        self.assertEqual(ingress_details.items.metadata.labels.TestLabel, ingress_details2.items.metadata.labels.TestLabel)\n        self.assertEqual('mytestlabel', ingress_details.items.metadata.labels.TestLabel)\n\n    @mock.patch('kubernetes.client.BatchV1Api.read_namespaced_cron_job')\n    def test_read_namespaced_cron_job(self, mock_lnp):\n        mock_lnp.side_effect = mock_read_cron_job_details_in_namespace\n        kl = KubeLibrary(kube_config='test/resources/k3d')\n        cron_job_details = kl.read_namespaced_cron_job('hello', 'default')\n        cron_job_details2 = kl.get_cron_job_details_in_namespace('hello', 'default')\n        self.assertEqual(cron_job_details.items.metadata.labels.TestLabel, cron_job_details2.items.metadata.labels.TestLabel)\n        self.assertEqual('mytestlabel', cron_job_details.items.metadata.labels.TestLabel)\n\n    def test_k8s_version(self):\n        mock_resp = mock_k8s_version()\n        self.assertEqual(\"v1.33.5-gke.1308000\", str(mock_resp['gitVersion']))\n"
  },
  {
    "path": "test-objects-chart/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n"
  },
  {
    "path": "test-objects-chart/Chart.yaml",
    "content": "apiVersion: v2\nname: test-objects-chart\ndescription: A Helm chart for Kubernetes\n\n# A chart can be either an 'application' or a 'library' chart.\n#\n# Application charts are a collection of templates that can be packaged into versioned archives\n# to be deployed.\n#\n# Library charts provide useful utilities or functions for the chart developer. They're included as\n# a dependency of application charts to inject those utilities and functions into the rendering\n# pipeline. Library charts do not define any templates and therefore cannot be deployed.\ntype: application\n\n# This is the chart version. This version number should be incremented each time you make changes\n# to the chart and its templates, including the app version.\nversion: 0.1.0\n\n# This is the version number of the application being deployed. This version number should be\n# incremented each time you make changes to the application.\nappVersion: 1.16.0\n"
  },
  {
    "path": "test-objects-chart/README.md",
    "content": "# Helm chart to install requirements for the tests\nWith this helm chart kubernetes objects can be installed to a cluster as prerequisites to some of the tests for this library.\n\n## Install with\nConnect to your k8s cluster, then\n```\nkubectl create namespace kubelib-tests\nhelm install kubelib-test ./test-objects-chart -n kubelib-tests\n```\n\n## Extending this helm chart\nFeel free to extend this helm chart which any other kubernetes objects which are required by any tests of this library."
  },
  {
    "path": "test-objects-chart/templates/NOTES.txt",
    "content": "1. Get the application URL by running these commands:\n{{- if .Values.ingress.enabled }}\n{{- range $host := .Values.ingress.hosts }}\n  {{- range .paths }}\n  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}\n  {{- end }}\n{{- end }}\n{{- else if contains \"NodePort\" .Values.service.type }}\n  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath=\"{.spec.ports[0].nodePort}\" services {{ include \"test-objects-chart.fullname\" . }})\n  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath=\"{.items[0].status.addresses[0].address}\")\n  echo http://$NODE_IP:$NODE_PORT\n{{- else if contains \"LoadBalancer\" .Values.service.type }}\n     NOTE: It may take a few minutes for the LoadBalancer IP to be available.\n           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include \"test-objects-chart.fullname\" . }}'\n  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include \"test-objects-chart.fullname\" . }} --template \"{{\"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}\"}}\")\n  echo http://$SERVICE_IP:{{ .Values.service.port }}\n{{- else if contains \"ClusterIP\" .Values.service.type }}\n  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l \"app.kubernetes.io/name={{ include \"test-objects-chart.name\" . }},app.kubernetes.io/instance={{ .Release.Name }}\" -o jsonpath=\"{.items[0].metadata.name}\")\n  echo \"Visit http://127.0.0.1:8080 to use your application\"\n  kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80\n{{- end }}\n"
  },
  {
    "path": "test-objects-chart/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"test-objects-chart.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\nIf release name contains chart name it will be used as a full name.\n*/}}\n{{- define \"test-objects-chart.fullname\" -}}\n{{- if .Values.fullnameOverride -}}\n{{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- if contains $name .Release.Name -}}\n{{- .Release.Name | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n{{- end -}}\n{{- end -}}\n\n{{/*\nCreate chart name and version as used by the chart label.\n*/}}\n{{- define \"test-objects-chart.chart\" -}}\n{{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCommon labels\n*/}}\n{{- define \"test-objects-chart.labels\" -}}\nhelm.sh/chart: {{ include \"test-objects-chart.chart\" . }}\n{{ include \"test-objects-chart.selectorLabels\" . }}\n{{- if .Chart.AppVersion }}\napp.kubernetes.io/version: {{ .Chart.AppVersion | quote }}\n{{- end }}\napp.kubernetes.io/managed-by: {{ .Release.Service }}\n{{- end -}}\n\n{{/*\nSelector labels\n*/}}\n{{- define \"test-objects-chart.selectorLabels\" -}}\napp.kubernetes.io/name: {{ include \"test-objects-chart.name\" . }}\napp.kubernetes.io/instance: {{ .Release.Name }}\n{{- end -}}\n\n{{/*\nCreate the name of the service account to use\n*/}}\n{{- define \"test-objects-chart.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.create -}}\n    {{ default (include \"test-objects-chart.fullname\" .) .Values.serviceAccount.name }}\n{{- else -}}\n    {{ default \"default\" .Values.serviceAccount.name }}\n{{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "test-objects-chart/templates/cluster_role.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  # \"namespace\" omitted since ClusterRoles are not namespaced\n  name: secret-reader\nrules:\n- apiGroups: [\"\"]\n  #\n  # at the HTTP level, the name of the resource for accessing Secret\n  # objects is \"secrets\"\n  resources: [\"secrets\"]\n  verbs: [\"get\", \"watch\", \"list\"] \n"
  },
  {
    "path": "test-objects-chart/templates/cluster_role_bind.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\n# This cluster role binding allows anyone in the \"manager\" group to read secrets in any namespace.\nkind: ClusterRoleBinding\nmetadata:\n  name: read-secrets-global\nsubjects:\n- kind: Group\n  name: manager # Name is case sensitive\n  apiGroup: rbac.authorization.k8s.io\nroleRef:\n  kind: ClusterRole\n  name: secret-reader\n  apiGroup: rbac.authorization.k8s.io\n"
  },
  {
    "path": "test-objects-chart/templates/cronjob.yaml",
    "content": "apiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: hello\n  labels:\n    TestLabel: mytestlabel\nspec:\n  schedule: \"*/1 * * * *\"\n  jobTemplate:\n    spec:\n      template:\n        metadata:\n          labels:\n            TestLabel: mytestlabel\n        spec:\n          containers:\n          - name: hello\n            image: busybox\n            imagePullPolicy: IfNotPresent\n            args:\n            - /bin/sh\n            - -c\n            - date; echo Hello from the Kubernetes cluster\n          restartPolicy: OnFailure\n"
  },
  {
    "path": "test-objects-chart/templates/daemonset.yaml",
    "content": "apiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: fluentd-elasticsearch\n  labels:\n    TestLabel: mytestlabel\nspec:\n  selector:\n    matchLabels:\n      name: fluentd-elasticsearch\n  template:\n    metadata:\n      labels:\n        name: fluentd-elasticsearch\n    spec:\n      tolerations:\n      # this toleration is to have the daemonset runnable on master nodes\n      # remove it if your masters can't run pods\n      - key: node-role.kubernetes.io/master\n        effect: NoSchedule\n      containers:\n      - name: fluentd-elasticsearch\n        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2\n        resources:\n          limits:\n            memory: 200Mi\n          requests:\n            cpu: 100m\n            memory: 200Mi\n        volumeMounts:\n        - name: varlog\n          mountPath: /var/log\n        - name: varlibdockercontainers\n          mountPath: /var/lib/docker/containers\n          readOnly: true\n      terminationGracePeriodSeconds: 30\n      volumes:\n      - name: varlog\n        hostPath:\n          path: /var/log\n      - name: varlibdockercontainers\n        hostPath:\n          path: /var/lib/docker/containers\n"
  },
  {
    "path": "test-objects-chart/templates/deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: {{ include \"test-objects-chart.fullname\" . }}\n  labels:\n    {{- include \"test-objects-chart.labels\" . | nindent 4 }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  selector:\n    matchLabels:\n      {{- include \"test-objects-chart.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      labels:\n        {{- include \"test-objects-chart.selectorLabels\" . | nindent 8 }}\n    spec:\n    {{- with .Values.imagePullSecrets }}\n      imagePullSecrets:\n        {{- toYaml . | nindent 8 }}\n    {{- end }}\n      serviceAccountName: {{ include \"test-objects-chart.serviceAccountName\" . }}\n      securityContext:\n        {{- toYaml .Values.podSecurityContext | nindent 8 }}\n      containers:\n        - name: {{ .Chart.Name }}\n          securityContext:\n            {{- toYaml .Values.securityContext | nindent 12 }}\n          image: \"{{ .Values.image.repository }}:{{ .Chart.AppVersion }}\"\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          ports:\n            - name: http\n              containerPort: 80\n              protocol: TCP\n          livenessProbe:\n            httpGet:\n              path: /\n              port: http\n          readinessProbe:\n            httpGet:\n              path: /\n              port: http\n          resources:\n            {{- toYaml .Values.resources | nindent 12 }}\n      {{- with .Values.nodeSelector }}\n      nodeSelector:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n    {{- with .Values.affinity }}\n      affinity:\n        {{- toYaml . | nindent 8 }}\n    {{- end }}\n    {{- with .Values.tolerations }}\n      tolerations:\n        {{- toYaml . | nindent 8 }}\n    {{- end }}\n"
  },
  {
    "path": "test-objects-chart/templates/hpa.yaml",
    "content": "\napiVersion: autoscaling/v1\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: {{ include \"test-objects-chart.fullname\" . }}\nspec:\n  maxReplicas: 5\n  minReplicas: 1\n  scaleTargetRef:\n    apiVersion: apps/v1\n    kind: Deployment\n    name: {{ include \"test-objects-chart.fullname\" . }}\n  targetCPUUtilizationPercentage: 50\n"
  },
  {
    "path": "test-objects-chart/templates/ingress.yaml",
    "content": "{{- if .Values.ingress.enabled -}}\n{{- $fullName := include \"test-objects-chart.fullname\" . -}}\n{{- $svcPort := .Values.service.port -}}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: {{ $fullName }}\n  labels:\n    {{- include \"test-objects-chart.labels\" . | nindent 4 }}\n  {{- with .Values.ingress.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{- if .Values.ingress.tls }}\n  tls:\n  {{- range .Values.ingress.tls }}\n    - hosts:\n      {{- range .hosts }}\n        - {{ . | quote }}\n      {{- end }}\n      secretName: {{ .secretName }}\n  {{- end }}\n{{- end }}\n  rules:\n  {{- range .Values.ingress.hosts }}\n    - host: {{ .host | quote }}\n      http:\n        paths:\n        {{- range .paths }}\n          - path: {{ . }}\n            pathType: Prefix\n            backend:\n              service:\n                name: {{ $fullName }}\n                port: \n                  number: {{ $svcPort }}\n        {{- end }}\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "test-objects-chart/templates/job.yml",
    "content": "apiVersion: batch/v1\nkind: Job\nmetadata:\n  labels:\n    TestLabel: mytestlabel\n  name: busybox-job\nspec:\n  backoffLimit: 1\n  completions: 1\n  parallelism: 1\n  template:\n    metadata:\n    spec:\n      containers:\n      - env:\n        - name: MYENVVAR\n          value: my-env-value\n        image: busybox:latest\n        command: [\"ash\"]\n        args: [\"-c\", \"export RANDOM_NAME=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1); while true; do sleep 5; echo I am $RANDOM_NAME at $(date); done\"]\n        imagePullPolicy: IfNotPresent\n        name: busybox\n        resources: {}\n      dnsPolicy: ClusterFirst\n      imagePullSecrets:\n      - name: regcred\n      restartPolicy: Never\n      schedulerName: default-scheduler\n      securityContext: {}\n      terminationGracePeriodSeconds: 30\n\n"
  },
  {
    "path": "test-objects-chart/templates/role.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  name: pod-reader\nrules:\n- apiGroups: [\"\"] # \"\" indicates the core API group\n  resources: [\"pods\"]\n  verbs: [\"get\", \"watch\", \"list\"]\n"
  },
  {
    "path": "test-objects-chart/templates/rolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\n# This role binding allows \"jane\" to read pods in the \"default\" namespace.\n# You need to already have a Role named \"pod-reader\" in that namespace.\nkind: RoleBinding\nmetadata:\n  name: read-pods\nsubjects:\n# You can specify more than one \"subject\"\n- kind: User\n  name: jane # \"name\" is case sensitive\n  apiGroup: rbac.authorization.k8s.io\nroleRef:\n  # \"roleRef\" specifies the binding to a Role / ClusterRole\n  kind: Role #this must be Role or ClusterRole\n  name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to\n  apiGroup: rbac.authorization.k8s.io\n"
  },
  {
    "path": "test-objects-chart/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"test-objects-chart.fullname\" . }}\n  labels:\n    {{- include \"test-objects-chart.labels\" . | nindent 4 }}\nspec:\n  type: {{ .Values.service.type }}\n  ports:\n    - port: {{ .Values.service.port }}\n      targetPort: http\n      protocol: TCP\n      name: http\n  selector:\n    {{- include \"test-objects-chart.selectorLabels\" . | nindent 4 }}\n"
  },
  {
    "path": "test-objects-chart/templates/serviceaccount.yaml",
    "content": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"test-objects-chart.serviceAccountName\" . }}\n  labels:\n{{ include \"test-objects-chart.labels\" . | nindent 4 }}\n{{- end -}}\n"
  },
  {
    "path": "test-objects-chart/templates/tests/test-connection.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"test-objects-chart.fullname\" . }}-test-connection\"\n  labels:\n{{ include \"test-objects-chart.labels\" . | nindent 4 }}\n  annotations:\n    \"helm.sh/hook\": test-success\nspec:\n  containers:\n    - name: wget\n      image: busybox\n      command: ['wget']\n      args:  ['{{ include \"test-objects-chart.fullname\" . }}:{{ .Values.service.port }}']\n  restartPolicy: Never\n"
  },
  {
    "path": "test-objects-chart/values.yaml",
    "content": "# Default values for test-objects-chart.\n# This is a YAML-formatted file.\n# Declare variables to be passed into your templates.\n\nreplicaCount: 1\n\nimage:\n  repository: nginx\n  pullPolicy: IfNotPresent\n\nimagePullSecrets: []\nnameOverride: \"\"\nfullnameOverride: \"\"\n\nserviceAccount:\n  # Specifies whether a service account should be created\n  create: true\n  # The name of the service account to use.\n  # If not set and create is true, a name is generated using the fullname template\n  name:\n\npodSecurityContext: {}\n  # fsGroup: 2000\n\nsecurityContext: {}\n  # capabilities:\n  #   drop:\n  #   - ALL\n  # readOnlyRootFilesystem: true\n  # runAsNonRoot: true\n  # runAsUser: 1000\n\nservice:\n  type: ClusterIP\n  port: 80\n\ningress:\n  enabled: true\n  annotations: {}\n    # kubernetes.io/ingress.class: nginx\n    # kubernetes.io/tls-acme: \"true\"\n  hosts:\n    - host: chart-example.local\n      paths: [\"/\"]\n  tls: []\n  #  - secretName: chart-example-tls\n  #    hosts:\n  #      - chart-example.local\n\nresources: {}\n  # We usually recommend not to specify default resources and to leave this as a conscious\n  # choice for the user. This also increases chances charts run on environments with little\n  # resources, such as Minikube. If you do want to specify resources, uncomment the following\n  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.\n  # limits:\n  #   cpu: 100m\n  #   memory: 128Mi\n  # requests:\n  #   cpu: 100m\n  #   memory: 128Mi\n\nnodeSelector: {}\n\ntolerations: []\n\naffinity: {}\n"
  },
  {
    "path": "testcases/Dockerfile",
    "content": "FROM python:3.9.0-alpine\nCOPY setup.py README.md requirements.txt ./\nCOPY src ./src\nCOPY testcases ./testcases\nRUN pip install robotframework-requests \\\n    && python setup.py install\n\nENTRYPOINT [\"robot\"]\nCMD [\"--help\"]"
  },
  {
    "path": "testcases/cluster_role/cluster_role.robot",
    "content": "*** Settings ***\nResource          ./cluster_role_kw.robot\n\n*** Test Cases ***\nCluster_role test case example\n    [Tags]    other\n    List all cluster_roles\n    List all cluster_role_bindings\n"
  },
  {
    "path": "testcases/cluster_role/cluster_role_kw.robot",
    "content": "*** Settings ***\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all cluster_roles\n    @{cluster_roles_list}=  List Cluster Role\n    @{cluster_roles_name_list}=    Filter Names    ${cluster_roles_list}\n    Log  \\nCluster_role ${cluster_roles_name_list}:  console=True\n\nList all cluster_role_bindings\n    @{cluster_role_bindings_list}=  List Cluster Role Binding\n    @{cluster_role_bindings_names_list}=    Filter Names    ${cluster_role_bindings_list}\n    Log  \\nCluster_role_binding ${cluster_role_bindings_names_list}:  console=True\n"
  },
  {
    "path": "testcases/configmap/configmap.robot",
    "content": "*** Settings ***\nResource          ./configmap_kw.robot\n\n*** Test Cases ***\nConfigmap test case example\n    [Tags]    grafana\n    List all configmaps in namespace  default\n    List all key value pairs in configmap  grafana  default\n\nConfigmap by label\n    [Tags]    grafana    \n    List all configmaps in namespace  default  app=grafana"
  },
  {
    "path": "testcases/configmap/configmap_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all configmaps in namespace\n    [Arguments]  ${namespace}  ${label}=${EMPTY}\n    @{namespace_configmaps}=  List namespaced config map by pattern    .*  ${namespace}  ${label}\n    Log  \\nConfigmaps in namespace ${namespace}:  console=True\n    FOR  ${configmap}  IN  @{namespace_configmaps}\n        Log  ${configmap.metadata.name}  console=True\n    END\n\nList all key value pairs in configmap\n    [Arguments]  ${configmap_name}  ${namespace}\n    @{namespace_configmaps}=  List namespaced config map by pattern    ^${configmap_name}$  ${namespace}\n    Log  \\nList of key value pairs in configmap ${configmap_name}:  console=True\n    FOR  ${configmap}  IN  @{namespace_configmaps}\n        Log key value pairs  ${configmap.data}\n    END\n\nLog key value pairs\n    [Arguments]  ${configmap_data}\n    FOR  ${key}  ${value}  IN  &{configmap_data}\n        Log  ${key} = ${value}  console=True\n    END\n\n\n"
  },
  {
    "path": "testcases/connect_GKE_clusters.robot",
    "content": "*** Settings ***\nLibrary    OperatingSystem\n\nDocumentation    To have a valid kube_config file for a Google Cloud hosted GKE cluster, \n...              you need to run \"gcloud auth activate-service-account\". \n...              gcloud saves an access token with expiration time in your kube_config file.\n...              By running \"gcloud auth activate-service-account\" this token gets renewed.\n\n*** Keywords ***\nConnect to GKE cluster\n    Run    gcloud auth activate-service-account ${GCLOUD_SERVICE_ACCOUNT} --key-file=${GCLOUD_SA_CREDENTIALS_FILE}\n    Import Library    KubeLibrary    kube_config=${kube_config}\n"
  },
  {
    "path": "testcases/cronjob/cronjob.robot",
    "content": "*** Settings ***\nResource          ./cronjob_kw.robot\n\n*** Test Cases ***\nJob test case example\n    [Tags]    other\n    List all cron jobs in namespace  kubelib-tests\n\nJobs by label\n    [Tags]    other\n    List cron jobs with label  ${cron_job_name}  kubelib-tests  TestLabel=mytestlabel\n\t\nWorking on Cron Job\n    [Tags]    other\n    List all cron jobs in namespace    kubelib-tests\n    Edit obtained cron job    test-cronjob\n    Create new cron job in namespace    kubelib-tests\n    Delete created cron job in namespace    test-cronjob    kubelib-tests\n    \n"
  },
  {
    "path": "testcases/cronjob/cronjob_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\nLibrary           String\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all cron jobs in namespace\n    [Arguments]  ${namespace}\n    @{namespace_cron_jobs}=  List Namespaced Cron Job    ${namespace}\n    Log  \\nCron Jobs in namespace ${namespace}:  console=True\n    Length Should Be  ${namespace_cron_jobs}  1\n    FOR  ${cron_job}  IN  @{namespace_cron_jobs}\n        ${cronjob_details}=  Read Namespaced Cron Job  ${cron_job.metadata.name}  ${namespace}\n        Log  ${cronjob_details.metadata.name}  console=True\n        Set Global Variable    ${cron_job_name}    ${cronjob_details.metadata.name}\n\tSet Global Variable    ${cron_job}    ${cronjob_details}\n    END\n\nList cron jobs with label\n    [Arguments]  ${cron_job_name}  ${namespace}  ${label}\n    @{namespace_cron_jobs}=  List Namespaced Cron Job    ${namespace}  ${label}\n    Log  \\nList labels in cron job ${cron_job_name}:  console=True\n    Length Should Be  ${namespace_cron_jobs}  1\n    FOR  ${cron_job}  IN  @{namespace_cron_jobs}\n        ${cron_job_details}=  Read Namespaced Cron Job  ${cron_job.metadata.name}  ${namespace}\n        ${label_key}=  Fetch From Left    ${label}    =\n        ${label_value}=  Fetch From Right    ${label}    =\n        Log  Labels in ${cron_job_details.metadata.labels}  console=True\n        Dictionary Should Contain Item    ${cron_job_details.metadata.labels}    ${label_key}  ${label_value}\n        ...  msg=Expected labels do not match.\n    END\n\nEdit obtained cron job\n    [Arguments]     ${cron_job_name}\n    ${cron_job.metadata.name}=  Set Variable  ${cron_job_name}\n    ${cron_job.metadata.resource_version}=  Set Variable  ${None}\n    Set Global Variable    ${new_cron_job}    ${cron_job}\n\nCreate new cron job in namespace\n    [Arguments]  ${namespace}\n    Log  \\nCreate new cron job in namespace ${namespace}  console=True\n    ${new_cj}=    Create Namespaced Cron Job  ${namespace}  ${new_cron_job}\n    Log  ${new_cj}  console=True\n\nDelete created cron job in namespace\n    [Arguments]  ${cron_job_name}    ${namespace}\n    Log  \\nDeletee cron job in namespace ${namespace}  console=True\n    ${status}=    Delete Namespaced Cron Job  ${cron_job_name}    ${namespace}\n    Log  ${status}\n"
  },
  {
    "path": "testcases/custom_objects/ambassador_crds.robot",
    "content": "*** Settings ***\nLibrary         KubeLibrary\n\nDocumentation  These are example test cases to check custom resource definitions created by Ambassador.\n...            Ambassador is on open source API gateway solution. The most common CRDs created by ambassador \n...            are Mappings and Hosts, which control the routing of API requests to different services\n...            running in your cluster.\n...            https://www.getambassador.io/products/api-gateway/\n...            More details on Ambassador Mappings:\n...            https://www.getambassador.io/docs/pre-release/topics/using/intro-mappings/#introduction-to-the-mapping-resource\n\n*** Test Cases ***\nGet details for all ambassador mappings\n    ${listed_mappings}=  List Cluster Custom Object   getambassador.io   v2   mappings\n    FOR  ${mapping}  IN  @{listed_mappings['items']}\n        Log  Mapping name: ${mapping}[metadata][name]  console=True\n        Log  Mapping namespace: ${mapping}[metadata][namespace]  console=True\n        Log  Mapping prefix: ${mapping}[spec][prefix]  console=True\n        Log  Mapping service: ${mapping}[spec][service]  console=True\n        ${status}=  Run Keyword And Ignore Error  Log  Mapping status: ${mapping}[status][state]  console=True\n        Run Keyword If   '''FAIL''' in '''${status}'''  Log  ! Mapping ${mapping}[metadata][name] is not running  console=True\n        Log  ---------------------------------------------------  console=True\n    END\n\nGet details for all ambassador hosts\n    ${listed_hosts}=  List Cluster Custom Object   getambassador.io   v2   hosts\n    FOR  ${host}  IN  @{listed_hosts['items']}\n        Log  Host name: ${host}[metadata][name]  console=True\n        Log  Host namespace: ${host}[metadata][namespace]  console=True\n        Log  Host hostname: ${host}[spec][hostname]  console=True\n        Log  Host status: ${host}[status][state]  console=True\n        Log  ---------------------------------------------------  console=True\n    END\n"
  },
  {
    "path": "testcases/custom_objects/custom_objects.robot",
    "content": "*** Settings ***\nLibrary         KubeLibrary\n\n*** Test Cases ***\nGet List Of Cluster Custom Objects\n    [Tags]  smoke\n    ${prio_classes}=  List Cluster Custom Object   scheduling.k8s.io   v1   priorityclasses\n    # Log To Console  ${prio_classes}\n    Should Be Equal As Strings  ${prio_classes}[kind]  PriorityClassList\n\nGet Cluster Custom Object\n    [Tags]  smoke\n    ${prio_class}=  Get Cluster Custom Object  scheduling.k8s.io   v1   priorityclasses  system-node-critical\n    Should Be Equal As Strings  ${prio_class}[metadata][name]    system-node-critical\n    Should Be Equal As Strings  ${prio_class}[kind]  PriorityClass\n\nGet Namespaced Custom Object\n    [Tags]  smoke\n    ${fo}=  Get Namespaced Custom Object   discovery.k8s.io  v1  default  endpointslices  kubernetes\n    Should Be Equal As Strings  ${fo}[metadata][name]    kubernetes\n    Should Be Equal As Strings  ${fo}[addressType]  IPv4\n\nGet List Of Namespaced Custom Objects\n    [Tags]  smoke\n    ${fo}=  List Namespaced Custom Object   discovery.k8s.io  v1  default  endpointslices\n    FOR  ${object}  IN  @{fo['items']}\n        Should Be Equal As Strings  ${object}[addressType]  IPv4\n    END\n"
  },
  {
    "path": "testcases/daemonset/daemonsets.robot",
    "content": "*** Settings ***\nResource          ./daemonsets_kw.robot\n\n*** Test Cases ***\nDaemonsets test case example\n    [Tags]    other\n    List all daemonsets  kubelib-tests  \n    List daemonsets filtered by label  kubelib-tests  TestLabel=mytestlabel\n"
  },
  {
    "path": "testcases/daemonset/daemonsets_kw.robot",
    "content": "*** Settings ***\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all daemonsets\n    [Arguments]  ${namespace} \n    @{namespace_daemonsets}=  List Namespaced Daemon Set    ${namespace}  \n    Length Should Be  ${namespace_daemonsets}  1\n    Log  \\nDaemonsets ${namespace_daemonsets}:  console=True\n    FOR  ${daemonset}  IN  @{namespace_daemonsets}\n        Wait Until Keyword Succeeds  1min  5sec  Check Daemonset readiness  ${daemonset.metadata.name}  ${namespace} \n    END\n\nCheck Daemonset readiness\n    [Arguments]  ${daemonset}  ${namespace}\n    ${daemonset_details}=  Read Namespaced Daemon Set  ${daemonset}  ${namespace}\n    Log  \\nDaemonset - ${daemonset}:  console=True\n    Log  \\n\\tDesired Number Scheduled : ${daemonset_details.status.desired_number_scheduled}   console=True\n    Log  \\n\\tNumber Ready : ${daemonset_details.status.number_ready} :  console=True\n    Should be True  ${daemonset_details.status.number_ready} > 0\n    Should be equal   ${daemonset_details.status.desired_number_scheduled}    ${daemonset_details.status.number_ready}\n\n\nList daemonsets filtered by label\n    [Arguments]  ${namespace}   ${label}\n    @{namespace_daemonsets}=  List Namespaced Daemon Set    ${namespace}    ${label}\t\n\tLength Should Be  ${namespace_daemonsets}  1\n    Log  \\nDaemonsets with label ${label} ${namespace_daemonsets}:  console=True\n    FOR  ${daemonset}  IN  @{namespace_daemonsets}\n        ${daemonset_details}=  Read Namespaced Daemon Set  ${daemonset.metadata.name}  ${namespace}\n        Log  \\nDaemonset - ${daemonset}:  console=True\n        Log  \\n\\tDesired Number Scheduled : ${daemonset_details.status.desired_number_scheduled}   console=True\n        Log  \\n\\tNumber Ready : ${daemonset_details.status.number_ready} :  console=True\n        Should be equal   ${daemonset_details.status.desired_number_scheduled}    ${daemonset_details.status.number_ready}\n    END\n"
  },
  {
    "path": "testcases/deployment/deployment.robot",
    "content": "*** Settings ***\nResource          ./deployment_kw.robot\n\n*** Test Cases ***\nDeployment test case example\n    [Tags]    grafana\n    List all deployments in namespace  default\n    Show Grafana Deployment\n    Assert Replica Status\n"
  },
  {
    "path": "testcases/deployment/deployment_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all deployments in namespace\n    [Arguments]  ${namespace}  ${label}=${EMPTY}\n    @{namespace_deployments}=  List Namespaced Deployment By Pattern    .*  ${namespace}  ${label}\n    Log  \\nDeployments in namespace ${namespace}:  console=True\n    FOR  ${deployment}  IN  @{namespace_deployments}\n        Log  ${deployment.metadata.name}  console=True\n    END\n\nShow Grafana Deployment\n    @{namespace_deployments}=  List Namespaced Deployment By Pattern    grafana  default\n    FOR  ${deployment}  IN  @{namespace_deployments}\n        Should be Equal   ${deployment.metadata.name}  grafana\n        Set Global Variable  ${DEPLOYMENT}  ${deployment}\n        Log  \\nDeployment ${deployment.metadata.name}:  console=True\n        Log  ${deployment}  console=True\n        Log  \\n  console=True\n    END\n\nAssert Replica Status\n    Should be Equal  ${DEPLOYMENT.status.available_replicas}  ${DEPLOYMENT.status.replicas}\n    ...  msg=Available replica count (${DEPLOYMENT.status.available_replicas}) doesn't match current replica count (${DEPLOYMENT.status.replicas})\n\n\n\n\n"
  },
  {
    "path": "testcases/dynamic_client/dynamic_client.robot",
    "content": "*** Settings ***\nResource          ./dynamic_client_kw.robot\n\n*** Test Cases ***\nDynamic client test case example\n    [Tags]    dynamic-client    other\n    ${resources}=    discover resources    default\n    Log To Console     ${resources}\nDynamic client test case example 2\n    [Tags]     dynamic-client    other\n    ${conf}=     read conf     testcases/dynamic_client/resources/pod.yaml\n    create pod     ${conf}\n    sleep     5 seconds\n    ${pods}=     get specific pod      default      app=myapp\n    ${metadata}=     Get From Dictionary    ${conf}      metadata\n    ${patched_labels}=     Create Dictionary      app=myapp       tested=true\n    ${patched_metadata}=     Set To Dictionary     ${metadata}      labels      ${patched_labels}\n    ${patched_pod}=      Set To Dictionary     ${conf}      metadata      ${patched_metadata}\n    patch pod    ${patched_pod}\n    sleep     5 seconds\n    ${pods}=     get specific pod      default      tested=true\n    Should Not Be Empty      ${pods.items}\n    ${pods}=     get specific pod    default     tested=false\n    Should Be Empty      ${pods.items}\n    [Teardown]      delete pod     default     myapp-pod\n\nDynamic client test case example 3\n    [Tags]     dynamic-client    other\n    ${conf}=     read conf     testcases/dynamic_client/resources/svc.yaml\n    create svc     ${conf}\n    sleep    5 seconds\n    ${svc}=    get specific svc    default     myservice\n    ${new_selector}=     Create Dictionary     app=svc-lookup\n    ${new_spec}=     Set To Dictionary     ${conf}[spec]     selector     ${new_selector}\n    ${new_spec}=     Set To Dictionary     ${new_spec}      clusterIP     ${svc.spec.clusterIP}\n    ${new_conf}=      Set To Dictionary     ${conf}     spec     ${new_spec}\n    ${new_metadata}=     Create Dictionary     name=myservice     namespace=default     resourceVersion=${svc.metadata.resourceVersion}\n    ${new_conf}=      Set To Dictionary     ${new_conf}     metadata     ${new_metadata}\n    replace svc  ${new_conf}\n    ${conf}=     read conf     testcases/dynamic_client/resources/svc_lookup.yaml\n    create pod     ${conf}\n    sleep     5 seconds\n    [Teardown]      Run Keywords     delete pod     default     svc-lookup       AND         delete svc     default     myservice\n\nDynamic client test case example create Pod with generated name\n    [Tags]     dynamic-client    other    prerelease\n    ${conf}=     read conf     testcases/dynamic_client/resources/pod_generated_name.yaml\n    ${pod}=    create pod     ${conf}\n    sleep     5 seconds\n    ${pod_dict}=    Call Method    ${pod}    to_dict\n    ${pod_name}=     Get From Dictionary     ${pod_dict['metadata']}    name\n    ${created_pod}=    Get    api_version=v1    kind=Pod    namespace=default    name=${pod_name}\n    Should Not Be Empty    ${created_pod}\n    [Teardown]    delete pod    default    ${pod_name}"
  },
  {
    "path": "testcases/dynamic_client/dynamic_client_kw.robot",
    "content": "*** Settings ***\nLibrary           BuiltIn\nLibrary           yaml\nLibrary           OperatingSystem\nLibrary           Collections\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\ndiscover resources\n    [Arguments]    ${namespace}\n    ${deployments}=     get resource names    Deployment     apps/v1     ${namespace}\n    ${statefulsets}=    get resource names    StatefulSet    apps/v1    ${namespace}\n    ${cronjobs}=        get resource names    CronJob    batch/v1    ${namespace}\n    ${secrets}=         get resource names    Secret    v1    ${namespace}\n    ${configmaps}=      get resource names    ConfigMap    v1    ${namespace}\n    ${found}=           BuiltIn.evaluate    ${deployments} + ${statefulsets} + ${cronjobs} + ${secrets} + ${configmaps}\n    [return]    ${found}\nget resource names\n    [Arguments]     ${kind}    ${api_version}    ${namespace}\n    ${resource_list}=     KubeLibrary.get    kind=${kind}     api_version=${api_version}     namespace=${namespace}\n    @{names}=     Create List\n    FOR     ${resource}     IN     @{resource_list.items}\n        Append To List     ${names}    ${resource.metadata.name}\n    END\n    [return]    ${names}\ncreate pod\n    [Arguments]     ${conf}\n    ${new_pod}=    KubeLibrary.create      api_version=v1      kind=Pod      body=${conf}\n    [return]      ${new_pod}\nget specific pod\n    [Arguments]     ${namespace}      ${label_selector}\n    ${pods}=      KubeLibrary.get      api_version=v1      kind=Pod      namespace=${namespace}      label_selector=${label_selector}\n    [return]      ${pods}\npatch pod\n    [Arguments]      ${pod}\n    KubeLibrary.patch      api_version=v1      kind=Pod      body=${pod}\ndelete pod\n    [Arguments]     ${namespace}      ${name}\n    KubeLibrary.delete       api_version=v1    kind=Pod     name=${name}     namespace=${namespace}\nreplace svc\n    [Arguments]     ${conf}\n    KubeLibrary.replace    api_version=v1     kind=Service     body=${conf}\nread conf\n    [Arguments]     ${path}\n    ${stream}=  Get Binary File      ${path}\n    ${conf}=  yaml.Safe Load      ${stream}\n    [return]      ${conf}\ncreate svc\n    [Arguments]    ${conf}\n    KubeLibrary.create     api_version=v1     kind=Service     body=${conf}\ndelete svc\n    [Arguments]    ${namespace}    ${name}\n    KubeLibrary.delete     api_version=v1     kind=Service     name=${name}      namespace=${namespace}\nget specific svc\n    [Arguments]    ${namespace}    ${name}\n    ${svc}=    KubeLibrary.get    api_version=v1     kind=Service     name=${name}     namespace=${namespace}\n    [return]    ${svc}"
  },
  {
    "path": "testcases/dynamic_client/resources/pod.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  namespace: default\n  name: myapp-pod\n  labels:\n    app: myapp\n    tested: \"false\"\nspec:\n  restartPolicy: OnFailure\n  containers:\n  - name: myapp-container\n    image: busybox:1.28\n    command: ['sh', '-c', 'while true; do echo The app is running!; sleep 5; done']"
  },
  {
    "path": "testcases/dynamic_client/resources/pod_generated_name.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  namespace: default\n  generateName: myapp-pod-\n  labels:\n    app: myapp\n    tested: \"false\"\nspec:\n  restartPolicy: OnFailure\n  containers:\n  - name: myapp-container\n    image: busybox:1.28\n    command: ['sh', '-c', 'while true; do echo The app is running!; sleep 5; done']"
  },
  {
    "path": "testcases/dynamic_client/resources/svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: myservice\n  namespace: default\nspec:\n  selector:\n    app: dummy\n  ports:\n    - protocol: TCP\n      port: 80\n      targetPort: 5000"
  },
  {
    "path": "testcases/dynamic_client/resources/svc_lookup.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  namespace: default\n  name: svc-lookup\n  labels:\n    app: svc-lookup\nspec:\n  restartPolicy: OnFailure\n  containers:\n  - name: svc-lookup\n    image: busybox:1.28\n    command: ['sh', '-c', 'until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done']\n    ports:\n      - containerPort: 5000"
  },
  {
    "path": "testcases/exec/exec.robot",
    "content": "*** Settings ***\nResource      ./exec_kw.robot\nForce Tags    exec    other\n\n*** Variables ***\n${string}            Hello\n${POD_NAME_EXEC}          myapp-pod\n${CONTAINER_NAME}    myapp-container\n\n*** Test Cases ***\nExec test case example\n    ${command}    Create List    /bin/sh    -c    echo ${string}\n    Set Pod Name For Namespace\n    ${stdout}    Get Namespaced Pod Exec    name=${POD_NAME_EXEC}\n    ...                                     namespace=${namespace}\n    ...                                     argv_cmd=${command}\n    Should Be Equal    ${stdout}   ${string}\n    ...    msg=Stdout should be ${string} not ${stdout}!\n\nExec multiple commands\n    ${command}    Create List    /bin/sh    -c    echo 1 && echo 2 && echo 3\n    Set Pod Name For Namespace\n    ${stdout}    Get Namespaced Pod Exec    name=${POD_NAME_EXEC}\n    ...                                     namespace=${namespace}\n    ...                                     argv_cmd=${command}\n    Should Be Equal    ${stdout}   1\\n2\\n3\n    ...    msg=Stdout should be ${string} not ${stdout}!\n\nExec command for specific container\n    ${command}    Create List    /bin/sh    -c    echo ${string}\n    Set Pod Name For Namespace\n    ${stdout}    Get Namespaced Pod Exec    name=${POD_NAME_EXEC}\n    ...                                     namespace=${namespace}\n    ...                                     argv_cmd=${command}\n    ...                                     container=${CONTAINER_NAME}\n    Should Be Equal    ${stdout}   ${string}\n    ...    msg=Stdout should be ${string} not ${stdout}!\n\nExec wrong command syntax\n    Set Pod Name For Namespace\n    Run Keyword And Expect Error    STARTS: TypeError:\n    ...    Get Namespaced Pod Exec    name=${POD_NAME_EXEC}\n    ...                               namespace=${namespace}\n    ...                               argv_cmd=echo ${string}\n"
  },
  {
    "path": "testcases/exec/exec_kw.robot",
    "content": "*** Settings ***\n# For regular execution\nLibrary    KubeLibrary\n# For incluster execution\n#Library    KubeLibrary    None    True    False\n# For development\n#Library    ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Variables ***\n${namespace}    default\n${POD_NAME}\n\n*** Keywords ***\nSet Pod Name For namespace\n    ${namespace_pods}    List Namespaced POD By Pattern    .*    ${namespace}\n    ${namespace_pods_names}    Filter Names    ${namespace_pods}\n    Set Test Variable    ${POD_NAME}    ${namespace_pods_names}[0]\n"
  },
  {
    "path": "testcases/grafana/demo-UI-test.robot",
    "content": "**** Settings ***\nLibrary          KubeLibrary\nLibrary          Browser\nLibrary          Collections\n\nDocumentation    This is an example test case to demo the abilities of the KubeLibrary.\n...              This test will assert if all Kubernetes objects of a Grafana installation\n...              were successfully install to the cluster. \n...                \n...              Afterwards it will execute a UI test to perfom the login to the Grafana\n...              dashboard with the url, username and password obtained from Kubernetes.\n...               \n...              This tests requires an installation of Grafana as described here:\n...              https://github.com/devopsspiral/KubeLibrary#grafana-tests\n\n*** Test Cases ***\nGrafana is ready to be tested\n    [Documentation]  Verifying all objects created by the helm deployment\n    Check Grafana Deployment\n    Assert Replica Status\n    Grafana pods are running\n    Check Grafana service\n    Check Grafana secrets\n    Check Grafana serviceaccounts\n\nObtain Grafana URL\n    [Documentation]  Obtaining the url and port from the service object\n    Get URL and port from service\n\nObtain Grafana login credentials\n    [Documentation]  Obtaining username and password from the secrets object\n    Read grafana secrets\n\nSuccessful Login to Grafana\n    [Documentation]  Login to the Grafana UI dashboard\n    Login to Grafana\n\n*** Keywords ***\nCheck Grafana Deployment\n    @{namespace_deployments}=  List Namespaced Deployment By Pattern    grafana  default\n    Length Should Be  ${namespace_deployments}  1\n    FOR  ${deployment}  IN  @{namespace_deployments}\n        Should be Equal   ${deployment.metadata.name}  grafana\n        Set Global Variable  ${DEPLOYMENT}  ${deployment}\n    END\n\nAssert Replica Status\n    Should be Equal  ${DEPLOYMENT.status.available_replicas}  ${DEPLOYMENT.status.replicas}\n    ...  msg=Available replica count (${DEPLOYMENT.status.available_replicas}) doesn't match current replica count (${DEPLOYMENT.status.replicas}\n\nGrafana pods are running\n    Wait Until Keyword Succeeds    1min    5sec   Check grafana pod status\n\nCheck Grafana pod status \n    @{namespace_pods}=    Get Pod Names In Namespace    grafana    default\n    Length Should Be  ${namespace_pods}  1\n    FOR    ${pod}    IN    @{namespace_pods}\n        ${status}=    Get Pod Status In Namespace    ${pod}    default\n        Should Be True     '${status}'=='Running'\n    END\n\nCheck Grafana service\n    ${sevice_details}=  Get Service Details In Namespace  grafana  default\n    Dictionary Should Contain Item    ${sevice_details.metadata.labels}    app.kubernetes.io/name  grafana\n    ...  msg=Expected labels do not match.\n    Should Be Equal    ${sevice_details.spec.type}    LoadBalancer\n    ...  msg=Expected service type does not match.\n\nCheck Grafana secrets\n    @{namespace_secrets}=  List Namespaced Secret By Pattern    grafana  default\n    Length Should Be  ${namespace_secrets}  3\n\nCheck Grafana serviceaccounts\n    @{namespace_service_accounts}=  List Namespaced Service Account By Pattern    grafana  default\n    Length Should Be  ${namespace_service_accounts}  2\n    FOR  ${service_account}  IN  @{namespace_service_accounts}\n        Dictionary Should Contain Item    ${service_account.metadata.labels}    app.kubernetes.io/name  grafana\n    END\n\nGet URL and port from service\n    ${sevice_details}=  Get Service Details In Namespace  grafana  default\n    Set Global Variable  ${URL}  ${sevice_details.status.load_balancer.ingress[0].ip}\n    Set Global Variable  ${PORT}  ${sevice_details.spec.ports[0].port}\n\nRead grafana secrets\n    @{namespace_secrets}=  List Namespaced Secret By Pattern    ^grafana$  default\n    Length Should Be  ${namespace_secrets}  1\n    ${GRAFANA_USER}=  Evaluate  base64.b64decode($namespace_secrets[0].data[\"admin-user\"])  modules=base64\n    Set Global Variable  ${GRAFANA_USER}  ${GRAFANA_USER}\n    ${GRAFANA_PASSWORD}=  Evaluate  base64.b64decode($namespace_secrets[0].data[\"admin-password\"])  modules=base64\n    Set Global Variable  ${GRAFANA_PASSWORD}  ${GRAFANA_PASSWORD}\n\nLogin to Grafana\n    New Browser  chromium  headless=${False}\n    New Page     http://${URL}:${PORT}\n    Wait Until Network Is Idle\n    Sleep  20    #For live demo purposes\n    Fill Text    //input[@name='user']      ${GRAFANA_USER}\n    Fill Text    //input[@name='password']  ${GRAFANA_PASSWORD}\n    Click        button\n    Wait For Response  /api/dashboards/home\n    Wait Until Network Is Idle\n    Get Title    matches  Home - Grafana\n    Get Text     //h1  matches  Welcome to Grafana\n    Sleep  20    #For live demo purposes\n"
  },
  {
    "path": "testcases/grafana/values.yaml",
    "content": "service:\n  type: LoadBalancer\n  port: 3000\npersistence:\n  enabled: true\n  type: pvc\n  size: 1Gi\npodAnnotations:\n  kubelibrary: testing\nresources:\n  requests:\n    memory: \"64Mi\"\n    cpu: \"250m\"\n  limits:\n    memory: \"128Mi\"\n    cpu: \"500m\""
  },
  {
    "path": "testcases/healthcheck/healthcheck.robot",
    "content": "*** Settings ***\nLibrary           Collections\nResource          ./healthcheck_kw.robot\n\n*** Test Cases ***\nHealthcheck\n    [Tags]    other\n    Healthcheck\n\nHealth API Reports Ok\n    [Tags]    cluster    smoke\n    ${response}=  Query Health API  verbose=False\n    Should Be equal As Strings  ${response}[0]  ok\n\nHealth API Reports Checks Passed With Verbose\n    [Tags]    cluster    smoke\n    ${response}=  Query Health API\n\n    # healthz < 1.20, livez >=1.20\n    Should Match Regexp  ${response}[0]  (livez|healthz) check passed\n\nHealth API Reports Ok For informer-sync\n    [Tags]    cluster    smoke\n    ${response}=  Query Health API  /readyz/informer-sync\n    Should Be equal As Strings  ${response}[0]  ok\n\nHealth API Reports Ok For shutdown\n    [Tags]    cluster    smoke\n    ${response}=  Query Health API  /readyz/shutdown\n    Should Be equal As Strings  ${response}[0]  ok\n\nHealth API Reports Ok For ping\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    ping  ok\n\nHealth API Reports Ok For log\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    log  ok\n\nHealth API Reports Ok For etcd\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    etcd  ok\n\nHealth API Reports Ok For poststarthook/start-kube-apiserver-admission-initializer\n    [Tags]    cluster\n    [Template]  Health API Template\n    poststarthook/start-kube-apiserver-admission-initializer  ok\n\nHealth API Reports Ok For poststarthook/generic-apiserver-start-informers\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/generic-apiserver-start-informers  ok\n\nHealth API Reports Ok For poststarthook/max-in-flight-filter\n    [Tags]    cluster\n    [Template]  Health API Template\n    poststarthook/max-in-flight-filter  ok\n\nHealth API Reports Ok For poststarthook/start-apiextensions-informers\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/start-apiextensions-informers  ok\n\nHealth API Reports Ok For poststarthook/start-apiextensions-controllers\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/start-apiextensions-controllers  ok\n\nHealth API Reports Ok For poststarthook/crd-informer-synced\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/crd-informer-synced  ok\n\nHealth API Reports Ok For poststarthook/bootstrap-controller\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/bootstrap-controller  ok\n\nHealth API Reports Ok For poststarthook/scheduling/bootstrap-system-priority-classes\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/scheduling/bootstrap-system-priority-classes  ok\n\nHealth API Reports Ok For poststarthook/start-cluster-authentication-info-controller\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/start-cluster-authentication-info-controller  ok\n\nHealth API Reports Ok For poststarthook/aggregator-reload-proxy-client-cert\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/aggregator-reload-proxy-client-cert  ok\n\nHealth API Reports Ok For poststarthook/start-kube-aggregator-informers\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/start-kube-aggregator-informers  ok\n\nHealth API Reports Ok For poststarthook/apiservice-registration-controller\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/apiservice-registration-controller  ok\n\n#Health API Reports Ok For poststarthook/apiservice-status-available-controller\n#    [Tags]    cluster    smoke\n#    [Template]  Health API Template\n#    poststarthook/apiservice-status-available-controller  ok\n\nHealth API Reports Ok For poststarthook/kube-apiserver-autoregistration\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/kube-apiserver-autoregistration  ok\n\nHealth API Reports Ok For autoregister-completion\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    autoregister-completion  ok\n\nHealth API Reports Ok For poststarthook/apiservice-openapi-controller\n    [Tags]    cluster    smoke\n    [Template]  Health API Template\n    poststarthook/apiservice-openapi-controller  ok\n"
  },
  {
    "path": "testcases/healthcheck/healthcheck_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\nLibrary           String\n# For regular execution\n#Library           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\nLibrary           ../../src/KubeLibrary/KubeLibrary.py\n\n*** Keywords ***\nHealthcheck\n    @{RESPONSE}=  Get Healthcheck\t\n    @{ENDPOINTS} =  Split String    ${RESPONSE}[0]    \\n\n    FOR    ${ELEMENT}    IN    @{ENDPOINTS}\n        Should Be True      \"ok\" or \"healthz check passed\" in \"\"\"${ELEMENT}\"\"\" \n    END\n    Should Be Equal As Strings  ${RESPONSE}[1]  200\n\nQuery Health API\n    [Arguments]  ${endpoint}=/livez  ${verbose}=True\n    ${response}=    get_healthcheck  ${endpoint}  ${verbose}\n    Should Be Equal As integers  ${response}[1]  200\n    [Return]  ${response}\n\nHealth API Template\n    [Documentation]  Checks both /readyz/${endpoint} and /livez/${endpoint}\n    [Arguments]  ${endpoint}  ${expected}\n    ${readyz}=  Query Health API  /readyz/${endpoint}\n    ${livez}=  Query Health API  /livez/${endpoint}\n    Should Match Regexp  ${readyz}[0]  ${expected}\n    Should Match Regexp  ${livez}[0]  ${expected}\n"
  },
  {
    "path": "testcases/horizontalPodAutoscaler/hpa.robot",
    "content": "*** Settings ***\nResource          ./hpa_kw.robot\n\n*** Test Cases ***\nList Horizontal Pod Autoscalers in namespace\n    [Tags]    other    prerelaese\n    List Horizontal Pod Autoscalers by namespace  kubelib-tests"
  },
  {
    "path": "testcases/horizontalPodAutoscaler/hpa_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\nLibrary           String\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList Horizontal Pod Autoscalers by namespace\n    [Arguments]  ${namespace}  \n    @{namespace_hpas}=  List Namespaced Horizontal Pod Autoscaler    ${namespace}  \n    FOR  ${hpa}  IN  @{namespace_hpas}\n        ${hpa_details}=  Read Namespaced Horizontal Pod Autoscaler  ${hpa.metadata.name}  ${namespace}\n        Should be Equal as Strings  ${hpa_details.spec.max_replicas}  5\n        Should be Equal as Strings  ${hpa_details.spec.min_replicas}  1\n        Should be Equal as Strings  ${hpa_details.spec.target_cpu_utilization_percentage}  50\n    END\n\n\n"
  },
  {
    "path": "testcases/ingress/ingress.robot",
    "content": "*** Settings ***\nResource          ./ingress_kw.robot\n\n*** Test Cases ***\nIngresses by label\n    [Tags]    other\n    List ingresses by label  kubelib-tests  app.kubernetes.io/instance=kubelib-test\n\t\n"
  },
  {
    "path": "testcases/ingress/ingress_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\nLibrary           String\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList ingresses by label\n    [Arguments]  ${namespace}  ${label}\n    @{namespace_ingresses}=  List Namespaced Ingress    ${namespace}  ${label}\n    Length Should Be  ${namespace_ingresses}  1\n    FOR  ${ingress}  IN  @{namespace_ingresses}\n        ${ingress_details}=  Read Namespaced Ingress  ${ingress.metadata.name}  ${namespace}\n        ${label_key}=  Fetch From Left    ${label}    =\n        ${label_value}=  Fetch From Right    ${label}    =\n        Dictionary Should Contain Item    ${ingress_details.metadata.labels}    ${label_key}  ${label_value}\n        ...  msg=Expected labels do not match.\n        Log  Ingress Host Url: ${ingress_details.spec.rules[0].host}  console=True\n    END\n"
  },
  {
    "path": "testcases/job/job.robot",
    "content": "*** Settings ***\nResource          ./job_kw.robot\n\n*** Test Cases ***\nJob test case example\n    [Tags]    other\n    List all jobs in namespace  kubelib-tests\n    List labels of job  ${job_name}  kubelib-tests\n    Get pod created by job  ${job_name}  kubelib-tests\n\nJobs by label\n    [Tags]    other\n    List jobs with label  .*  kubelib-tests  TestLabel=mytestlabel"
  },
  {
    "path": "testcases/job/job_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all jobs in namespace\n    [Arguments]  ${namespace}\n    @{namespace_jobs}=  List Namespaced Job By Pattern    .*  ${namespace}\n    Log  \\nJobs in namespace ${namespace}:  console=True\n    FOR  ${job}  IN  @{namespace_jobs}\n        Log  ${job.metadata.name}  console=True\n        Set Global Variable    ${job_name}    ${job.metadata.name}\n    END\n\nList labels of job\n    [Arguments]  ${job_name}  ${namespace}\n    @{namespace_jobs}=  List Namespaced Job By Pattern   ^${job_name}$  ${namespace}\n    Log  \\nList labels in job ${job_name}:  console=True\n    FOR  ${job}  IN  @{namespace_jobs}\n        Log  Labels in ${job.metadata.labels}  console=True\n        Dictionary Should Contain Item    ${job.metadata.labels}    TestLabel    mytestlabel\n        ...  msg=Expected labels do not match.\n    END\n\nList jobs with label\n    [Arguments]  ${job_name}  ${namespace}  ${label}\n    @{namespace_jobs}=  List Namespaced Job By Pattern    ${job_name}  ${namespace}  ${label}\n    Log  \\nList labels in job ${job_name}:  console=True\n    FOR  ${job}  IN  @{namespace_jobs}\n        Log  Labels in ${job.metadata.labels}  console=True\n        Dictionary Should Contain Item    ${job.metadata.labels}    TestLabel    mytestlabel\n        ...  msg=Expected labels do not match.\n    END\n\nGet pod created by job\n    [Arguments]  ${job_name}  ${namespace}\n    @{namespace_pods}=  List Namespaced Job By Pattern  ${job_name}  ${namespace}\n    FOR  ${pod}  IN  @{namespace_pods}\n        Log  \\nList labels in pod ${pod.metadata.name}:  console=True\n        Log  ${pod.metadata.labels}  console=True\n        Dictionary Should Contain Item    ${pod.metadata.labels}    TestLabel    mytestlabel\n        ...  msg=Could not find job name label.\n    END\n\n\n"
  },
  {
    "path": "testcases/namespace/namespace.robot",
    "content": "*** Settings ***\nResource          ./namespace_kw.robot\n\n*** Test Cases ***\nNamespace test case example\n    [Tags]    other\n    List all namespaces\n    List namespaces filtered by label"
  },
  {
    "path": "testcases/namespace/namespace_kw.robot",
    "content": "*** Settings ***\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all namespaces\n    @{namespaces_list}=  List Namespace\n    @{namespace_names}=    Filter Names    ${namespaces_list}\n    Log  \\nNamespaces ${namespace_names}:  console=True\n\nList namespaces filtered by label\n    @{namespaces_list}=  List Namespace  label_selector=test=test\n    @{namespace_names}=    Filter Names    ${namespaces_list}\n    Log  \\nNamespaces with label test=test ${namespace_names}:  console=True\n\n\n\n"
  },
  {
    "path": "testcases/pod/pod.robot",
    "content": "*** Settings ***\nResource          ./pod_kw.robot\n\n*** Variables ***\n${KLIB_POD_PATTERN}                 %{KLIB_POD_PATTERN}\n${KLIB_POD_NAMESPACE}               %{KLIB_POD_NAMESPACE}\n${KLIB_POD_REPLICAS}                %{KLIB_POD_REPLICAS=1}\n${KLIB_POD_TIMEOUT}                 %{KLIB_POD_TIMEOUT=2min}\n${KLIB_POD_RETRY_INTERVAL}          %{KLIB_POD_RETRY_INTERVAL=5sec}\n${KLIB_POD_LABELS}                  %{KLIB_POD_LABELS='Labels missing!'}\n${KLIB_POD_ANNOTATIONS}             %{KLIB_POD_ANNOTATIONS='Annotations missing!'}\n${KLIB_RESOURCE_REQUESTS_CPU}       %{KLIB_RESOURCE_REQUESTS_CPU='Resource requests missing!'}\n${KLIB_RESOURCE_REQUESTS_MEMORY}    %{KLIB_RESOURCE_REQUESTS_MEMORY='Resource requests missing!'}\n${KLIB_RESOURCE_LIMITS_CPU}         %{KLIB_RESOURCE_LIMITS_CPU='Resource limits missing!'}\n${KLIB_RESOURCE_LIMITs_MEMORY}      %{KLIB_RESOURCE_LIMITS_MEMORY='Resource limits missing!'}\n${KLIB_ENV_VARS}                    %{KLIB_ENV_VARS='Env vars missing!'}\n${LOGS_SINCE}                       1000\n\n*** Test Cases ***\n\nPod images has correct version\n    [Tags]    grafana\n    Given waited for pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\" to be READY\n    When getting pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\"\n    Then all pods containers are using \"grafana/grafana\" image\n\nPod has enough replicas\n    [Tags]    grafana\n    Given waited for pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\" to be READY\n    When getting pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\"\n    Then pods have \"${KLIB_POD_REPLICAS}\" replicas\n\nPod has not been restarted\n    [Tags]    grafana\n    Given waited for pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\" to be READY\n    When getting pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\"\n    Then pods containers were not restarted\n\nPod have correct labels\n    [Tags]    grafana\n    Given waited for pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\" to be READY\n    When getting pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\"\n    Then pods have labels \"${KLIB_POD_LABELS}\"\n\nPod has correct annotations\n    [Tags]    grafana\n    Given waited for pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\" to be READY\n    When getting pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\"\n    Then pods have annotations \"${KLIB_POD_ANNOTATIONS}\"\n\nPod has correct limits/requests\n    [Tags]    grafana\n    Given waited for pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\" to be READY\n    When getting pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\"\n    Then pods containers have resource requests cpu \"${KLIB_RESOURCE_REQUESTS_CPU}\"\n    Then pods containers have resource requests memory \"${KLIB_RESOURCE_REQUESTS_MEMORY}\"\n    Then pods containers have resource limits cpu \"${KLIB_RESOURCE_LIMITS_CPU}\"\n    Then pods containers have resource limits memory \"${KLIB_RESOURCE_LIMITS_MEMORY}\"\n\nPod has correct env variables\n    Given waited for pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\" to be READY\n    When getting pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\"\n    Then pods containers have env variables \"${KLIB_ENV_VARS}\"\n\nLogs of pod are available\n    [Tags]    other\n    Given waited for pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\" to be READY\n    When getting pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\"\n    Then logs of pod can be retrived\n    And logs contain expected string\n\nLogs of pod since 1000s are available\n    [Tags]    other\n    Given waited for pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\" to be READY\n    When getting pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\"\n    Then logs of pod can be retrived since \"${LOGS_SINCE}\"\n    And logs contain expected string\n\nList pods by label\n    [Tags]    other\n    Given waited for pods matching \"${KLIB_POD_PATTERN}\" in namespace \"${KLIB_POD_NAMESPACE}\" to be READY\n    When getting pods matching label \"${KLIB_POD_LABELS}\" in namespace \"${KLIB_POD_NAMESPACE}\"\n    Then pods have labels \"${KLIB_POD_LABELS}\""
  },
  {
    "path": "testcases/pod/pod_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\nLibrary           String\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\n\nwaited for pods matching \"${name_pattern}\" in namespace \"${namespace}\" to be READY\n    Wait Until Keyword Succeeds    ${KLIB_POD_TIMEOUT}    ${KLIB_POD_RETRY_INTERVAL}   pod \"${name_pattern}\" status in namespace \"${namespace}\" is READY\n\npod \"${name_pattern}\" status in namespace \"${namespace}\" is READY \n    @{namespace_pods}=    list_namespaced_pod_by_pattern  ${name_pattern}    ${namespace}\n    @{namespace_pods_names}=    Filter Names    ${namespace_pods}\n    ${num_of_pods}=    Get Length    ${namespace_pods_names}\n    Should Be True    ${num_of_pods} >= 1    No pods matching \"${name_pattern}\" found\n    FOR    ${pod}    IN    @{namespace_pods_names}\n        ${status}=    read_namespaced_pod_status    ${pod}    ${namespace}\n        ${conditions}=    Filter by Key    ${status.conditions}    type    Ready\n        Should Be True     '${conditions[0].status}'=='True'\n    END\n\ngetting pods matching \"${name_pattern}\" in namespace \"${namespace}\"\n    @{namespace_pods}=    list_namespaced_pod_by_pattern  ${name_pattern}    ${namespace}\n    Set Test Variable    ${namespace_pods}\n\ngetting pods matching label \"${label}\" in namespace \"${namespace}\"\n    @{namespace_pods}=    list_namespaced_pod_by_pattern  .*    ${namespace}  label_selector=${label}\n    Set Test Variable    ${namespace_pods}\n    ${label_key}=  Fetch From Left    ${KLIB_POD_LABELS}    =\n    ${label_value}=  Fetch From Right    ${KLIB_POD_LABELS}    =\n    Set Test Variable    ${KLIB_POD_LABELS}    {\"${label_key}\": \"${label_value}\"}\n\nall pods containers are using \"${container_image}\" image\n    @{containers}=    filter_pods_containers_by_name    ${namespace_pods}    .*\n    @{containers_images}=    filter_containers_images    ${containers}\n    FOR    ${item}    IN    @{containers_images}\n        Should Contain    ${item}    ${container_image}\n    END\n\npods have \"${pod_replicas}\" replicas\n    ${count}=    Get Length   ${namespace_pods}\n    Should Be True    ${count} == ${pod_replicas}\n\npods containers were not restarted\n    @{containers_statuses}=    filter_pods_containers_statuses_by_name    ${namespace_pods}    .*\n    FOR    ${container_status}    IN    @{containers_statuses}\n        Should Be True    ${container_status.restart_count} == 0\n    END\n\npods have labels \"${pod_labels}\"\n    FOR    ${pod}    IN    @{namespace_pods}\n        ${assertion}=    assert_pod_has_labels    ${pod}    ${pod_labels}\n        Should Be True    ${assertion}\n    END\n\npods have annotations \"${pod_annotations}\"\n    FOR    ${pod}    IN    @{namespace_pods}\n        ${assertion}=    assert_pod_has_annotations    ${pod}    ${pod_annotations}\n        Should Be True    ${assertion}\n    END\n\npods containers have resource requests cpu \"${container_resource_requests_cpu}\"\n    @{containers}=    filter_pods_containers_by_name    ${namespace_pods}    .*\n    @{containers_resources}=    filter_containers_resources    ${containers}\n    FOR    ${item}    IN    @{containers_resources}\n        Should Be Equal As Strings    ${item.requests['cpu']}    ${container_resource_requests_cpu}\n    END\n\npods containers have resource requests memory \"${container_resource_requests_memory}\"\n    @{containers}=    filter_pods_containers_by_name    ${namespace_pods}    .*\n    @{containers_resources}=    filter_containers_resources    ${containers}\n    FOR    ${item}    IN    @{containers_resources}\n        Should Be Equal As Strings    ${item.requests['memory']}    ${container_resource_requests_memory}\n    END\n\npods containers have resource limits cpu \"${container_resource_limits_cpu}\"\n    @{containers}=    filter_pods_containers_by_name    ${namespace_pods}    .*\n    @{containers_resources}=    filter_containers_resources    ${containers}\n    FOR    ${item}    IN    @{containers_resources}\n        Should Be Equal As Strings    ${item.limits['cpu']}    ${container_resource_limits_cpu}\n    END\n\npods containers have resource limits memory \"${container_resource_requests_memory}\"\n    @{containers}=    filter_pods_containers_by_name    ${namespace_pods}    .*\n    @{containers_resources}=    filter_containers_resources    ${containers}\n    FOR    ${item}    IN    @{containers_resources}\n        Should Be Equal As Strings    ${item.limits['memory']}    ${container_resource_requests_memory}\n    END\n\npods containers have env variables \"${container_env_vars}\"\n    @{containers}=    filter_pods_containers_by_name    ${namespace_pods}    .*\n    FOR    ${container}    IN    @{containers}\n        ${assertion}=    assert_container_has_env_vars    ${container}    ${container_env_vars}\n        Should Be True    ${assertion}\n    END\n\nlogs of pod can be retrived\n    Set Test Variable    ${POD_NAME}    ${namespace_pods[0].metadata.name}\n    ${pod_logs}=  Read namespaced pod log  ${POD_NAME}  ${KLIB_POD_NAMESPACE}  busybox\n    Log  ${pod_logs}  console=True\n    Set Test Variable    ${POD_LOGS}    ${pod_logs}\n\nlogs of pod can be retrived since \"${seconds}\"\n    Set Test Variable    ${POD_NAME}    ${namespace_pods[0].metadata.name}\n    ${pod_logs}=  Read namespaced pod log  ${POD_NAME}  ${KLIB_POD_NAMESPACE}  busybox  since_seconds=${seconds}\n    Log  ${pod_logs}  console=True\n    Set Test Variable    ${POD_LOGS}    ${pod_logs}\n\nlogs contain expected string\n    Should Contain    ${POD_LOGS}    I am"
  },
  {
    "path": "testcases/pvc/pvc.robot",
    "content": "*** Settings ***\nResource          ./pvc_kw.robot\n\n*** Test Cases ***\nList Persitent Volume Claims by label\n    [Tags]    grafana\n    List pvcs by label  default  app=grafana\n\nList Persitent Volume Claims by pattern\n    [Tags]    grafana\n    List pvcs by pattern  .*  default"
  },
  {
    "path": "testcases/pvc/pvc_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList pvcs by label\n    [Arguments]  ${namespace}  ${label}\n    @{namespace_pvcs}=  List namespaced persistent volume claim    ${namespace}  ${label}\n    @{namespace_pvcs_names}=    Filter Names    ${namespace_pvcs}\n    Log  List of PVCs in Namespace ${namespace} with Label ${label}: @{namespace_pvcs_names}  console=True\n\nList pvcs by pattern\n    [Arguments]  ${pattern}  ${namespace}\n    @{namespace_pvcs}=  List namespaced persistent volume claim by pattern    ${pattern}  ${namespace}\n    @{namespace_pvcs_names}=    Filter Names    ${namespace_pvcs}\n    Log  List of PVCs in Namespace ${namespace} with Patter ${pattern}: @{namespace_pvcs_names}  console=True"
  },
  {
    "path": "testcases/reload-config/reload-config.robot",
    "content": "*** Settings ***\nResource          ./reload-config_kw.robot\n\nDocumentation    This test requires two k8s clusters running according to \n...              the setup description in the README.md\n\n*** Test Cases ***\nReload config test case example\n    [Tags]    reload-config\n    \n    [Documentation]  The Keyword \"Reload Config\" allows the user to \n    ...  reload the KubeLibrary with different settings. With this \n    ...  one test can validate objects in different clusters.\n\n    GIVEN Connected to cluster-1 \n    THEN Cluster has namespace  test-ns-1\n    AND Cluster has no namespace  test-ns-2\n\n    WHEN Connected to cluster-2 \n    THEN Cluster has namespace  test-ns-2\n    AND Cluster has no namespace  test-ns-1\n\nAuthenticate using bearer token\n    [Tags]    reload-config    auth.bearer-token\n    [Documentation]  Test authentication using brearer token\n\n    WHEN Connected to cluster-1 using bearer token\n    THEN Cluster has namespace  test-ns-1\n    AND Cluster has no namespace  test-ns-2 "
  },
  {
    "path": "testcases/reload-config/reload-config_kw.robot",
    "content": "*** Settings ***\nLibrary           KubeLibrary    %{KUBE_CONFIG1=./cluster1-conf}\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py\n\n\n*** Variables ***\n${KUBE_CONFIG1}         %{KUBE_CONFIG1=./cluster1-conf}\n${KUBE_CONFIG2}         %{KUBE_CONFIG2=./cluster2-conf}\n\n\n*** Keywords ***\nConnected to cluster-1 \n    Reload Config  kube_config=${KUBE_CONFIG1}  incluster=False  cert_validation=False\n    K8s Api Ping\n\nCluster has namespace\n    [Arguments]  ${namespace}\n    @{namespaces_list}=  List Namespace\n    @{namespaces_name_list}=    Filter Names    ${namespaces_list}\n    Should Contain    ${namespaces_name_list}    ${namespace}\n\nConnected to cluster-2 \n    Reload Config  kube_config=${KUBE_CONFIG2}  incluster=False  cert_validation=False\n    K8s Api Ping\n\nConnected to cluster-1 using bearer token \n    Reload Config    api_url=%{K8S_API_URL}    bearer_token=%{K8S_TOKEN}    ca_cert=%{K8S_CA_CRT}\n    K8s Api Ping\n\nCluster has no namespace\n    [Arguments]  ${namespace}\n    @{namespaces_list}=  List Namespace\n    @{namespaces_name_list}=    Filter Names    ${namespaces_list}\n    Should Not Contain    ${namespaces_name_list}    ${namespace}\n\n"
  },
  {
    "path": "testcases/reload-config/sa.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: mysa\n  labels: \n    source: mysa\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: mysa-admin-binding\nsubjects:\n- kind: ServiceAccount\n  name: mysa\n  namespace: default\nroleRef:\n  kind: ClusterRole\n  name: cluster-admin\n  apiGroup: rbac.authorization.k8s.io\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: mysa-token\n  annotations:\n    kubernetes.io/service-account.name: mysa\ntype: kubernetes.io/service-account-token\n"
  },
  {
    "path": "testcases/replicaset/replicaset.robot",
    "content": "*** Settings ***\nResource          ./replicaset_kw.robot\n\n*** Test Cases ***\nReplicaset test case example\n    [Tags]    replicaset    other\n    List all replicasets in namespace  default\n"
  },
  {
    "path": "testcases/replicaset/replicaset_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all replicasets in namespace\n    [Arguments]  ${namespace}  ${label}=${EMPTY}\n    @{namespace_replicasets}=  list_namespaced_replica_set_by_pattern    .*  ${namespace}  ${label}\n    Log  \\nReplicasets in namespace ${namespace}:  console=True\n    FOR  ${replicaset}  IN  @{namespace_replicasets}\n        Log  ${replicaset.metadata.name}  console=True\n    END\n\n"
  },
  {
    "path": "testcases/requirements.txt",
    "content": "robotframework-requests\nrobotframework-kubelibrary\n"
  },
  {
    "path": "testcases/role/role.robot",
    "content": "*** Settings ***\nResource          ./role_kw.robot\n\n*** Test Cases ***\nRole test case example\n    [Tags]    other\n    List all roles in namespace  default\n    List all role bindings in namespace  default\n"
  },
  {
    "path": "testcases/role/role_kw.robot",
    "content": "*** Settings ***\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all roles in namespace\n    [Arguments]  ${namespace}\n    @{namespace_roles}=  List Namespaced Role    ${namespace}\n    Length Should Be  ${namespace_roles}  1\n    Log  \\nRoles in namespace ${namespace_roles}:  console=True\n    \nList all role bindings in namespace\n    [Arguments]  ${namespace}\n    @{namespace_role_bindings}=  List Namespaced Role Binding    ${namespace}\n    Length Should Be  ${namespace_role_bindings}  1\n    Log  \\nRole_binding in namespace ${namespace_role_bindings}:  console=True\n"
  },
  {
    "path": "testcases/secrets/secret.robot",
    "content": "*** Settings ***\nResource          ./secret_kw.robot\n\n*** Test Cases ***\nSecrets test case example\n    [Tags]    grafana\n    List all secrets in namespace  default\n    Read grafana secrets\n"
  },
  {
    "path": "testcases/secrets/secret_kw.robot",
    "content": "*** Settings ***\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all secrets in namespace\n    [Arguments]  ${namespace}  ${label}=${EMPTY}\n    @{namespace_secrets}=  List Namespaced Secret By Pattern    .*  ${namespace}  ${label}\n    Log  \\nSecrets in namespace ${namespace}:  console=True\n    FOR  ${secret}  IN  @{namespace_secrets}\n        Log  ${secret.metadata.name}  console=True\n    END\n\nRead grafana secrets\n    @{namespace_secrets}=  List Namespaced Secret By Pattern    ^grafana$  default\n    Length Should Be  ${namespace_secrets}  1\n  \n    Set Suite Variable  ${GRAFANA_USER}  ${namespace_secrets[0].data[\"admin-user\"]}\n    ${GRAFANA_USER}=  Evaluate  base64.b64decode($GRAFANA_USER)  modules=base64\n    Log  Grafana user: ${GRAFANA_USER}  console=True\n    \n    Set Suite Variable  ${GRAFANA_PASSWORD}  ${namespace_secrets[0].data[\"admin-password\"]}\n    ${GRAFANA_PASSWORD}=  Evaluate  base64.b64decode($GRAFANA_PASSWORD)  modules=base64\n    Log  Grafana password: ${GRAFANA_PASSWORD}  console=True\n"
  },
  {
    "path": "testcases/service/service.robot",
    "content": "*** Settings ***\nResource          ./service_kw.robot\n\n*** Test Cases ***\nServices by label\n    [Tags]    other\n    List services by label  kubelib-tests  app.kubernetes.io/instance=kubelib-test"
  },
  {
    "path": "testcases/service/service_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\nLibrary           String\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList services by label\n    [Arguments]  ${namespace}  ${label}\n    @{namespace_services}=  List Namespaced Service    ${namespace}  ${label}\n    Log  \\nServices in namespace ${namespace}:  console=True\n    FOR  ${service}  IN  @{namespace_services}\n        Log  ${service.metadata.name}  console=True\n        ${sevice_details}=  Read Namespaced Service  ${service.metadata.name}  ${namespace}\n        ${label_key}=  Fetch From Left    ${label}    =\n        ${label_value}=  Fetch From Right    ${label}    =\n        Dictionary Should Contain Item    ${sevice_details.metadata.labels}    ${label_key}  ${label_value}\n        ...  msg=Expected labels do not match.\n    END\n\n\n"
  },
  {
    "path": "testcases/service_account/service_account.robot",
    "content": "*** Settings ***\nResource          ./service_account_kw.robot\n\n*** Test Cases ***\nListing Service Accounts\n    [Tags]    other\n    List all service accounts for matching name pattern in namespace    .*     kubelib-tests\n    List all service accounts for matching name pattern in namespace with label    .*    kubelib-tests    TestLabel=mytestlabel\n\nWorking on Service Accounts\n    [Tags]    other\n    List all service accounts for matching name pattern in namespace    default     kubelib-tests\n    Edit obtained service account    test-sa\n    Create new service account in namespace    kubelib-tests\n    Delete created service account in namespace    test-sa    kubelib-tests"
  },
  {
    "path": "testcases/service_account/service_account_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all service accounts for matching name pattern in namespace\n    [Arguments]  ${name_pattern}    ${namespace}\n    @{namespace_service_account}=  List Namespaced Service Account By Pattern    ${name_pattern}  ${namespace}\n    Log  \\nService Accounts in namespace ${namespace}:  console=True\n    FOR  ${sa}  IN  @{namespace_service_account}\n        Log  ${sa.metadata.name}  console=True\n        Set Global Variable    ${sa_name}    ${sa.metadata.name}\n        Set Global Variable    ${service_account}    ${sa}\n    END\n\nList all service accounts for matching name pattern in namespace with label\n    [Arguments]  ${name_pattern}  ${namespace}  ${label}\n    @{namespace_service_account}=  List Namespaced Service Account By Pattern    ${name_pattern}  ${namespace}  ${label}\n    Log  \\nService Accounts in namespace ${namespace}:  console=True\n    FOR  ${sa}  IN  @{namespace_service_account}\n        Log  ${sa.metadata.name}  console=True\n        Dictionary Should Contain Item    ${sa.metadata.labels}    TestLabel    mytestlabel\n        ...  msg=Expected labels do not match.\n    END\n\nEdit obtained service account\n    [Arguments]     ${service_account_name}\n    ${service_account.metadata.name}=  Set Variable  ${service_account_name}\n    ${service_account.metadata.resource_version}=  Set Variable  ${None}\n    Set Global Variable    ${new_service_account}    ${service_account}\n\nCreate new service account in namespace\n    [Arguments]  ${namespace}\n    ${new_sa}=    create_namespaced_service_account  ${namespace}  ${new_service_account}\n    Log  ${new_sa}\n\nDelete created service account in namespace\n    [Arguments]  ${service_account_name}    ${namespace}\n    ${status}=    delete_namespaced_service_account  ${service_account_name}    ${namespace}\n    Log  ${status}"
  },
  {
    "path": "testcases/sts/sts.robot",
    "content": "*** Settings ***\nResource          ./sts_kw.robot\n\n*** Test Cases ***\nStatefulset test case example\n    [Tags]    statefulset    other\n    List all statefulsets in namespace  default\n"
  },
  {
    "path": "testcases/sts/sts_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../../src/KubeLibrary/KubeLibrary.py  ~/.kube/k3d\n\n*** Keywords ***\nList all statefulsets in namespace\n    [Arguments]  ${namespace}  ${label}=${EMPTY}\n    @{namespace_statefulsets}=  list_namespaced_stateful_set_by_pattern    .*  ${namespace}  ${label}\n    Log  \\nStatefulsets in namespace ${namespace}:  console=True\n    FOR  ${statefulset}  IN  @{namespace_statefulsets}\n        Log  ${statefulset.metadata.name}  console=True\n    END\n\n"
  },
  {
    "path": "testcases/system_smoke.robot",
    "content": "*** Settings ***\nResource          ./system_smoke_kw.robot\n\n*** Variables ***\n${KUBELET_VERSION}     %{KUBELET_VERSION}\n${NUM_NODES}           2\n${NUM_WORKERS}         1\n\n*** Test Cases ***\nKubernetes has correct version\n    [Documentation]  Test if Kubernetes has correct version\n    [Tags]    cluster\n    Given kubernetes has \"${NUM_NODES}\" healthy nodes\n    When getting kubelet version\n    Then Kubernetes version is correct\n\nPods in kube-system are ok\n    [Documentation]  Test if all pods in kube-system initiated correctly and are running or succeeded\n    [Tags]    cluster    smoke\n    Given kubernetes API responds\n    When getting all pods names in \"kube-system\"\n    Then all pods in \"kube-system\" are running or succeeded\n\nTraefik has enough replicas\n    [Documentation]  Test if Ingress (Traefik) has enough replicas\n    [Tags]    cluster    smoke\n    Given kubernetes API responds\n    When getting all pods names in \"kube-system\"\n    Then \"traefik*\" has \"${NUM_WORKERS}\" replicas\n\nGrafana is persistent\n    [Documentation]  Test if Grafana is deployed with persistent storage\n    [Tags]    grafana\n    Given kubernetes API responds\n    When getting pvcs in \"default\"\n    Then \"grafana\" has \"1\" pvcs\n\nGrafana has 1GB storage\n    [Documentation]  Test if Grafana has 1GB storage\n    [Tags]    grafana\n    Given kubernetes API responds\n    When getting pvc size for \"grafana\" in \"default\"\n    Then pvc size is \"1Gi\"\n\nGrafana service points to pods\n    [Documentation]  Test if Grafana service selectors points to pods\n    [Tags]    grafana\n    Given kubernetes API responds\n    When getting \"grafana\" endpoint in \"default\"\n    Then endpoint points to \"grafana*\" pod\n\nGrafana service is correctly exposed\n    [Documentation]  Test if Grafana service is correctly exposed\n    [Tags]    grafana\n    Given kubernetes API responds\n    When getting service \"grafana\" details in \"default\"\n    Then service is exposed on \"3000\" port\n    And service has \"LoadBalancer\" type\n    And service has LB ip assigned\n\nGrafana is responding\n    [Documentation]  Test if Grafana service ip is accessible\n    [Tags]    grafana\n    Given \"grafana\" service ip and port in \"default\" is known\n    When session is created\n    Then service is responding on path \"/\"\n"
  },
  {
    "path": "testcases/system_smoke_kw.robot",
    "content": "*** Settings ***\nLibrary           Collections\nLibrary           RequestsLibrary\n# For regular execution\nLibrary           KubeLibrary\n# For incluster execution\n#Library           KubeLibrary    None    True    False\n# For development\n#Library           ../src/KubeLibrary/KubeLibrary.py\n\n*** Keywords ***\nkubernetes API responds\n    [Documentation]  Check if API response code is 200\n    ${ping}=    k8s_api_ping\n    Should Be Equal As integers    ${ping}[1]    200\n\nkubernetes has \"${number}\" healthy nodes\n    ${node_count}=    get_healthy_nodes_count\n    Should Be Equal As integers    ${node_count}    ${number}\n\ngetting all pods names in \"${namespace}\"\n    @{namespace_pods}=    list_namespaced_pod_by_pattern    .*    ${namespace}\n    @{namespace_pods_names}=    Filter Names    ${namespace_pods}\n    Log    ${namespace_pods_names}\n    Set Test Variable    ${namespace_pods_names}\n\nall pods in \"${namespace}\" are running or succeeded\n    FOR    ${name}    IN    @{namespace_pods_names}\n         ${status}=    read_namespaced_pod_status    ${name}    ${namespace}\n         Should Be True     '${status.phase}'=='Running' or '${status.phase}'=='Succeeded'\n    END\n\naccessing \"${pattern}\" excluding \"${exclude}\" container images version in \"${namespace}\"\n    @{pods_images}=    get_pods_images_in_namespace    ${pattern}   ${namespace}    ${exclude}\n    Log    ${pods_images}\n    Set Test Variable    ${pods_images}\n\n\"${version}\" version is used\n    FOR    ${Item}    IN    @{pods_images}\n         Should Be Equal As Strings    ${Item}    ${version}\n    END\n\ngetting kubelet version\n    @{node_kubelet_versions}=    get_kubelet_version\n    Log    ${node_kubelet_versions}\n    Set Test Variable    ${node_kubelet_versions}\n\nKubernetes version is correct\n    FOR    ${Item}    IN    @{node_kubelet_versions}\n         Should Contain    ${Item}    ${KUBELET_VERSION}\n    END\n\n\"${service}\" has \"${number}\" replicas\n    ${count}=    Get Match Count    ${namespace_pods_names}    ${service}\n    Should Be True    ${number} == ${count}\n\n\"${service}\" has at least \"${number}\" replicas\n    ${count}=    Get Match Count    ${namespace_pods_names}    ${service}\n    Should Be True    ${count} >= ${number}\n\ngetting pvcs in \"${namespace}\"\n    @{namespace_pvcs}=    list_namespaced_persistent_volume_claim    ${namespace}\n    @{namespace_pvc_names}=    Filter Names    ${namespace_pvcs}\n    Log    ${namespace_pvc_names}\n    Set Test Variable    ${namespace_pvc_names}\n\n\"${service}\" has \"${number}\" pvcs\n    ${count}=    Get Match Count    ${namespace_pvc_names}    ${service}\n    Should Be True    ${number} == ${count}\n\ngetting pvc size for \"${volume}\" in \"${namespace}\"\n    ${pvc}=    read_namespaced_persistent_volume_claim    ${volume}    ${namespace}\n    Log    ${pvc}\n    ${pvc_size}=    Set Variable    ${pvc.status.capacity[\"storage\"]}\n    Set Test Variable    ${pvc_size}\n\npvc size is \"${size}\"\n\tShould Be Equal As Strings     ${size}       ${pvc_size}\n\ngetting services in \"${namespace}\"\n    @{namespace_services}=    list_namespaced_service    ${namespace}\n    Log    ${namespace_services}\n    Set Test Variable    ${namespace_services}\n\ngetting service \"${service}\" details in \"${namespace}\"\n    ${service_details}=    read_namespaced_service    ${service}    ${namespace}\n    Set Test Variable    ${service_details}\n\nservice is exposed on \"${port}\" port\n    Should Be Equal As integers    ${service_details.spec.ports[0].port}    ${port}\n\nservice has \"${type}\" type\n    Should Be Equal As Strings    ${service_details.spec.type}    ${type}\n\nservice has LB ip assigned\n    Should Not Be Equal As Strings    ${service_details.status.load_balancer.ingress[0].ip}    None\n\ngetting \"${endpoint}\" endpoint in \"${namespace}\"\n    ${endpoint_details}=    read_namespaced_endpoints    ${endpoint}    ${namespace}\n    Set Test Variable    ${endpoint_details}\n\nendpoint points to \"${pod}\" pod\n    Should Match    ${endpoint_details.subsets[0].addresses[0].target_ref.name}    ${pod}\n\n\"${service}\" service ip and port in \"${namespace}\" is known\n    ${service_details}=    read_namespaced_service    ${service}    ${namespace}\n    ${service_ip}=    Set Variable    ${service_details.status.load_balancer.ingress[0].ip}\n    ${service_port}=    Set Variable    ${service_details.spec.ports[0].port}\n    Set Test Variable    ${service_ip}\n    Set Test Variable    ${service_port}\n\nsession is created\n    Create Session    service_session    http://${service_ip}:${service_port}\n\nservice is responding on path \"${path}\"\n    ${resp}=    Get Request    service_session    ${path}\n    Should Be Equal As Strings    ${resp.status_code}    200\n"
  },
  {
    "path": "testcases/test_version.robot",
    "content": "*** Settings ***\nLibrary    KubeLibrary\n\n*** Test Cases ***\nKubernetes Cluster Version Test\n    [Tags]    prerelease\n    Get Kubernetes Cluster Version\n\n*** Keywords ***\nGet Kubernetes Cluster Version\n    ${version}    K8s Version\n    Log    \\nk8s version output:    console=True\n    FOR    ${key}    ${value}    IN    &{version}\n        Log    ${key}: ${value}    console=True\n    END\n    Log    Just the k8s cluster version: ${version['gitVersion']}    console=True"
  }
]