{ "info": { "author": "Vadim Reyder", "author_email": "vadim.reyder@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# k8s-handle\n\nEasy CI/CD for Kubernetes clusters with python and jinja2\n\nk8s-handle is a command line tool that facilitates continuous delivery for Kubernetes applications.\nAlso k8s-handle supports environments, so you can use same deployment templates for different environments like `staging` and `production`.\nk8s-handle is a helm alternative, but without package manager\n\n# Table of contents\n* [Features](#features)\n* [k8s-handle vs helm](#k8s-handle-vs-helm)\n* [Before you begin](#before-you-begin)\n* [Installation with pip](#installation-with-pip)\n* [Usage with docker](#usage-with-docker)\n* [Usage with CI/CD tools](#usage-with-cicd-tools)\n* [Usage](#usage)\n* [Example](#example)\n* [Docs](#docs)\n * [Configuration structure](#configuration-structure)\n * [Environments](#environments)\n * [Common section](#common-section)\n * [Any other sections](#any-other-sections)\n * [Deploy specific environment](#deploy-specific-environment)\n * [Templates](#templates)\n * [Variables](#variables)\n * [Merging with common](#merging-with-common)\n * [Load variables from environment](#load-variables-from-environment)\n * [Load variables from yaml file](#load-variables-from-yaml-file)\n * [How to use in CI/CD](#how-to-use-in-cicd)\n * [Gitlab CI](#gitlab-ci)\n * [Native integration](#native-integration)\n * [Through variables](#through-variables)\n * [Working modes](#working-modes)\n * [Sync mode](#sync-mode)\n * [Strict mode](#strict-mode)\n * [Destroy](#destroy)\n * [Operating without config.yaml](#operating-without-configyaml)\n * [Render](#render)\n * [Apply](#apply)\n * [Delete](#delete)\n\n# Features\n* Easy to use command line interface\n* Configure any variables in one configuration file (config.yaml)\n* Templating for kubernetes resource files (jinja2) with includes, loops, if-else and so on. \n* Loading variables from environment\n* Includes for configuration (includes in config.yaml) for big deploys\n* Async and sync mode for deploy (wait for deployment, statefulset, daemonset ready)\n* Strict mode, stop deploy if any warning appear\n* Easy integration with CI pipeline (gitlab ci for example)\n* Ability to destroy resources (deploy and destroy from git branches, gitlab environments)\n\n# k8s-handle vs helm\n* k8s-handle acts like template parser and provisioning tool, but not package manager included like in helm\n* k8s-handle don't need in cluster tools like The Tiller Server, you need only ServiceAccount for deploy\n* k8s-handle secure by default, you don't need to generate any certificates for deploying application, k8s-handle uses kubernetes REST API with https, like kubectl\n\n![Deploy process](/helmVsK8s-handle.png)\n\n# Before you begin\n* Setup Kubernetes cluster [https://kubernetes.io/docs/setup/](https://kubernetes.io/docs/setup/), or use any predefined\n* Install `kubectl` if you don't have it [https://kubernetes.io/docs/tasks/tools/install-kubectl/](https://kubernetes.io/docs/tasks/tools/install-kubectl/)\n* Create kubeconfig(~/.kube/config) or skip if you already have one\n```bash\n$ cat > ~/.kube/kubernetes.ca.crt << EOF\n> \n>EOF\ncat > ~/.kube/config << EOF\napiVersion: v1\nkind: Config\npreferences: {}\nclusters:\n- cluster:\n certificate-authority: kubernetes.ca.crt\n server: < protocol://masterurl:port >\n name: my-cluster\ncontexts:\n- context:\n cluster: my-cluster\n namespace: my-namespace\n user: my-user\n name: my-context\ncurrent-context: my-context\nusers:\n- name: my-user\n user:\n token: \nEOF\n```\n# Installation with pip\nRequired python 3.4 or higher\n```\n$ pip install k8s-handle\n -- or --\n$ pip install --user k8s-handle\n```\n\n\n# Usage with docker\n```bash\n$ cd $WORKDIR\n$ git clone https://github.com/2gis/k8s-handle-example.git\n$ cd k8s-handle-example\n$ docker run --rm -v $(pwd):/tmp/ -v \"$HOME/.kube:/root/.kube\" 2gis/k8s-handle k8s-handle deploy -s staging --use-kubeconfig\nINFO:templating:File \"/tmp/k8s-handle/configmap.yaml\" successfully generated\nINFO:templating:Trying to generate file from template \"secret.yaml.j2\" in \"/tmp/k8s-handle\"\nINFO:templating:File \"/tmp/k8s-handle/secret.yaml\" successfully generated\nINFO:templating:Trying to generate file from template \"deployment.yaml.j2\" in \"/tmp/k8s-handle\"\nINFO:templating:File \"/tmp/k8s-handle/deployment.yaml\" successfully generated\nINFO:k8s.resource:ConfigMap \"k8s-starter-kit-nginx-conf\" already exists, replace it\nINFO:k8s.resource:Secret \"k8s-starter-kit-secret\" already exists, replace it\nINFO:k8s.resource:Deployment \"k8s-starter-kit\" does not exist, create it\n\n _(_)_ wWWWw _\n @@@@ (_)@(_) vVVVv _ @@@@ (___) _(_)_\n @@()@@ wWWWw (_)\\ (___) _(_)_ @@()@@ Y (_)@(_)\n @@@@ (___) `|/ Y (_)@(_) @@@@ \\|/ (_)\n / Y \\| \\|/ /(_) \\| |/ |\n \\ | \\ |/ | / \\ | / \\|/ |/ \\| \\|/\n \\|// \\|/// \\|// \\|/// \\|/// \\|// |// \\|//\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n```\n\n# Usage with CI/CD tools\nIf you using Gitlab CI, TeamCity or something else, you can use docker runner/agent, script will slightly different: \n```bash\n$ k8s-handle deploy -s staging\n```\nConfigure checkout for https://github.com/2gis/k8s-handle-example.git and specific branch `without-kubeconfig`\nAlso you need to setup next env vars:\n* K8S_NAMESPACE\n* K8S_MASTER_URI\n* K8S_CA_BASE64 (optional)\n* K8S_TOKEN\n\nuse image 2gis/k8s-handle:\n\nNotice: If you use Gitlab CI, you can configure [Kubernetes integration](https://docs.gitlab.com/ee/user/project/clusters/#adding-an-existing-kubernetes-cluster) and just use `--use-kubeconfig` flag.\n\n# Usage\n```bash\n$ k8s-handle deploy -s staging --use-kubeconfig\nINFO:templating:Trying to generate file from template \"configmap.yaml.j2\" in \"/tmp/k8s-handle\"\nINFO:templating:File \"/tmp/k8s-handle/configmap.yaml\" successfully generated\nINFO:templating:Trying to generate file from template \"secret.yaml.j2\" in \"/tmp/k8s-handle\"\nINFO:templating:File \"/tmp/k8s-handle/secret.yaml\" successfully generated\nINFO:templating:Trying to generate file from template \"deployment.yaml.j2\" in \"/tmp/k8s-handle\"\nINFO:templating:File \"/tmp/k8s-handle/deployment.yaml\" successfully generated\nINFO:k8s.resource:ConfigMap \"k8s-starter-kit-nginx-conf\" already exists, replace it\nINFO:k8s.resource:Secret \"k8s-starter-kit-secret\" already exists, replace it\nINFO:k8s.resource:Deployment \"k8s-starter-kit\" does not exist, create it\n\n _(_)_ wWWWw _\n @@@@ (_)@(_) vVVVv _ @@@@ (___) _(_)_\n @@()@@ wWWWw (_)\\ (___) _(_)_ @@()@@ Y (_)@(_)\n @@@@ (___) `|/ Y (_)@(_) @@@@ \\|/ (_)\n / Y \\| \\|/ /(_) \\| |/ |\n \\ | \\ |/ | / \\ | / \\|/ |/ \\| \\|/\n \\|// \\|/// \\|// \\|/// \\|/// \\|// |// \\|//\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n$ kubectl get configmap \nNAME DATA AGE\nk8s-starter-kit-nginx-conf 1 1m\n$ kubectl get secret | grep starter-kit\nk8s-starter-kit-secret Opaque 1 1m\n$ kubectl get deploy\nNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE\nk8s-starter-kit 1 1 1 1 3m\n```\nNow set replicas_count in config.yaml to 3, and run again in sync mode \n```bash\n$ k8s-handle deploy -s staging --use-kubeconfig --sync-mode\n...\nINFO:k8s.resource:Deployment \"k8s-starter-kit\" already exists, replace it\nINFO:k8s.resource:desiredReplicas = 3, updatedReplicas = 3, availableReplicas = 1\nINFO:k8s.resource:Deployment not completed on 1 attempt, next attempt in 5 sec.\nINFO:k8s.resource:desiredReplicas = 3, updatedReplicas = 3, availableReplicas = 2\nINFO:k8s.resource:Deployment not completed on 2 attempt, next attempt in 5 sec.\nINFO:k8s.resource:desiredReplicas = 3, updatedReplicas = 3, availableReplicas = 3\nINFO:k8s.resource:Deployment completed on 3 attempt\n...\n$ kubectl get deploy\nNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE\nk8s-starter-kit 3 3 3 3 7m\n```\n\n# Example\nYou can start by example https://github.com/2gis/k8s-handle-example. There are nginx with index.html and all needed kubernetes resources for deploy them.\n```bash\n$ cd $WORKDIR\n$ git clone https://github.com/2gis/k8s-handle-example.git\n$ cd k8s-handle-example\n$ k8s-handle deploy -s staging --use-kubeconfig --sync-mode\nINFO:__main__:Using default namespace k8s-handle-test\nINFO:templating:Trying to generate file from template \"configmap.yaml.j2\" in \"/tmp/k8s-handle\"\nINFO:templating:File \"/tmp/k8s-handle/configmap.yaml\" successfully generated\nINFO:templating:Trying to generate file from template \"deployment.yaml.j2\" in \"/tmp/k8s-handle\"\nINFO:templating:File \"/tmp/k8s-handle/deployment.yaml\" successfully generated\nINFO:templating:Trying to generate file from template \"service.yaml.j2\" in \"/tmp/k8s-handle\"\nINFO:templating:File \"/tmp/k8s-handle/service.yaml\" successfully generated\nINFO:k8s.resource:ConfigMap \"example-nginx-conf\" does not exist, create it\nINFO:k8s.resource:Deployment \"example\" does not exist, create it\nINFO:k8s.resource:desiredReplicas = 1, updatedReplicas = 1, availableReplicas = None\nINFO:k8s.resource:Deployment not completed on 1 attempt, next attempt in 5 sec.\nINFO:k8s.resource:desiredReplicas = 1, updatedReplicas = 1, availableReplicas = None\nINFO:k8s.resource:Deployment not completed on 2 attempt, next attempt in 5 sec.\nINFO:k8s.resource:desiredReplicas = 1, updatedReplicas = 1, availableReplicas = 1\nINFO:k8s.resource:Deployment completed on 3 attempt\nINFO:k8s.resource:Service \"example\" does not exist, create it\n$ kubectl -n k8s-handle-test get svc \nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nexample NodePort 10.100.132.168 80:31153/TCP 52s\n$ curl http://:31153\n

Hello world!

\nDeployed with k8s-handle.\n```\n\n# Docs\n## Configuration structure\nk8s-handle works with 2 components:\n * config.yaml (or any other yaml file through -c argument) that stores all configuration for deploy\n * templates catalog, where your can store all required templates for kubernetes resource files (can be changed through\n TEMPLATES_DIR env var)\n\n## Environments\nIf your have testing, staging, production-zone-1, production-zone-2, etc, you can easily cover all environments with\none set of templates for your application without duplication.\n### Common section\nIn the common section you can specify variables that you want to combine with the variables of the selected section:\n```yaml\ncommon:\n app_name: my-shiny-app\n app_port: 8080\n```\nBoth of these example variables will be added to variables of the selected section.\nCommon section is optional and can be omitted.\n### Any other sections\nLet's specify testing environment\n```yaml\ntesting:\n replicas: 1\n request_cpu: 100m \n request_memory: 128M\n some_option: disabled\n```\nIn testing in most cases we don't want performance from our application so we can keep 1 replica and small\namount of resources for it. Also you can set some options to disabled state, in case when you don't want to affect\nany integrated systems during testing during testing.\n```yaml\nstaging:\n replicas: 2\n request_cpu: 200m \n request_memory: 512M\n```\nSome teams use staging for integration and demo, so we can increase replicas and resources for our service.\n```yaml\nproduction-zone-1:\n replicas: 50\n request_cpu: 1000m\n request_memory: 1G\n production: \"true\"\n never_give_up: \"true\"\n```\nIn production we need to process n thousand RPS, so set replicas to 50, increase resources and set all production\nvariables to ready for anything values.\n### Deploy specific environment\nIn your CI/CD script you can deploy any environment\n```bash\n$ k8s-handle deploy -s staging # Or testing or production-zone-1\n```\nIn Gitlab CI for example you can create manual job for each environment\n\n## Templates \nTemplates in k8s-handle use jinja2 syntax and support all standard filters + some special\n### Filters\n* `{{ my_var | b64encode }}` - encode value of my_var to base64\n* `{{ my_var | b64decode }}` - decode value of my_var from base64\n* `{{ my_var | hash_sha256 }}` - encode value of my_var to sha256sum\n> Warning: You can use filters only for templates and can't for config.yaml\n### Functions\n* `{{ include_file('my_file.txt') }}` - include my_file.txt to resulting resource w/o parsing it, useful for include configs to configmap.\nmy_file.txt will be searched in parent directory of templates dir(most of the time - k8s-handle project dir):\n```bash\n$ ls -1\nconfig.yaml\ntemplates\nmy_file.txt\n...\n``` \n> Note, `include_file` also support unix glob. You can import all files from directory conf.d/*.conf for example.\n\nYou can put *.j2 templates in 'templates' directory and specify it in config.yaml\n```yaml\ntesting:\n replicas: 1\n request_cpu: 100m \n request_memory: 128M\n some_option: disabled\n templates:\n - template: my-deployment.yaml.j2\n```\nthe same template you can use in each section you want:\n```yaml\nstaging:\n ...\n templates:\n - template: my-deployment.yaml.j2\n\nproduction-zone-1:\n ...\n templates:\n - template: my-deployment.yaml.j2\n```\n### Template loader path \nk8s-handle uses jinja2 template engine and initializes it with base folder specified in the TEMPLATES_DIR env variable.\nJinja environment considers template paths as specified relatively to its base init directory. \n\nTherefore, users **must** specify paths in `{% include %}` (and other) blocks relatively to the base (TEMPLATES_DIR) folder, not relative to the importer template location.\n\nExample\n\nWe have the following templates dir content layout:\n```\ntemplates /\n subdirectory /\n template_A.yaml\n template_B.yaml\n```\nIn that scheme, if template_A contains jinja2 import of the template_B, that import statement must be\n```\n{% include \"subdirectory/template_B.yaml\" %}\n```\ndespite that included template lies as the same level as the template where include is used.\n\n### Tags\nIf you have a large deployment with many separate parts (for ex. main application and migration job), you can want to deploy them independently. In this case you have two options:\n* Use multiple isolated sections (like `production_app`, `production_migration`, etc.)\n* Use one section and tag yours templates. For example:\n ```yaml\n production:\n templates:\n - template: my-job.yaml.j2\n tags: migration\n - template: my-configmap.yaml.j2\n tags: ['app', 'config']\n - template: my-deployment.yaml.j2\n tags:\n - app\n - deployment\n - template: my-service.yaml.j2\n tags: \"app,service\"\n ```\nSince you templates are tagged you can use `--tags`/`--skip-tags` keys to partial deploy. For example, you can delete only a migration job:\n```\nk8s-handle destroy --section production --tags migration\n```\nCommand line keys `--tags` and `--skip-tags` can be specified multiple times, for ex.:\n```\nk8s-handle deploy --section production --tags=tag1 --tags=tag2 --tags=tag3\n```\n\n### Groups\nYou can make groups for templates. For example:\n```yaml\nproduction:\n templates:\n - group:\n - template: my-configmap.yaml.j2\n - template: my-deployment.yaml.j2\n - template: my-service.yaml.j2\n tags: service-one\n - group:\n - template: my-job.yaml.j2\n```\nIt is useful for creating different sets of templates for other environments, or tag a bunch of templates at once\n\n## Variables\n### Required parameters\nk8s-handle needs several parameters to be set in order to connect to k8s, such as:\n* K8S master uri\n* K8S CA base64\n* K8S token\n\nEach of these parameters can be set in various ways in any combination and are applied with the following order \n(from highest to lowest precedence):\n1. From the command line via corresponding keys\n2. From the config.yaml section, lowercase, underscore-delimited, e.g. `k8s_master_uri`\n3. From environment, uppercase, underscore-delimited, e.g `K8S_MASTER_URI`\n\nIf the --use-kubeconfig flag is used, these explicitly specified parameters are ignored.\n\nIn addition, the `K8S namespace` parameter also must be specified.\nk8s-handle uses namespace specified in `metadata: namespace` block of a resource.\nIf it is not present, the default namespace is used, which is evaluated in the following \norder (from highest to lowest precedence):\n1. From the config.yaml `k8s_namespace` key\n2. From the kubeconfig `current-context` field, if --use-kubeconfig flag is used\n3. From the environment `K8S_NAMESPACE` variable\n\nIf the namespace is not specified in the resource spec, and the default namespace is also not specified, \nthis will lead to a provisioning error.\n\nThe one of the common ways is to specify connection parameters and/or k8s_namespace in the `common` section of your \nconfig.yaml, but you can do it in another way if necessary.\n\nThus, the k8s-handle provides flexible ways to set the required parameters. \n\n### Merging with common\nAll variables defined in `common` will be merged with deployed section and available as context dict in templates rendering,\nfor example: \n```yaml\ncommon:\n common_var: common_value \ntesting:\n testing_variable: testing_value\n```\nAfter the rendering of this template some-file.txt.j2:\n```txt\ncommon_var = {{ common_var }}\ntesting_variable = {{ testing_variable }}\n```\nfile some-file.txt will be generated with the following content:\n```txt\ncommon_var = common_value\ntesting_variable = testing_value\n```\n\nIf the variable is declared both in `common` section and the selected one, the value from the \nselected section will be chosen.\n\nIf the particular variable is a dictionary in both (`common` and the selected one) sections, resulting variable\nwill contain merge of these two dictionaries.\n\n### Load variables from environment\nIf you want to use environment variables in your templates(for docker image tag generated by build for example),\nyou can use next construction in config.yaml:\n```yaml\ncommon:\n image_version: \"{{ env='TAG' }}\"\n```\n### Load variables from yaml file\n```yaml\ncommon:\n test: \"{{ file='include.yaml' }}\"\n```\ninclude.yaml:\n```yaml\n- 1\n- 2 \n- 3\n```\ntemplate:\n```text\n{{ test[0] }}\n{{ test[1] }}\n{{ test[2] }}\n```\nAfter rendering you get:\n```text\n1\n2\n3\n```\n## How to use in CI/CD\n### Gitlab CI\n#### Native integration\nUse Gitlab CI integration with Kubernetes (https://docs.gitlab.com/ee/user/project/clusters/index.html#adding-an-existing-kubernetes-cluster)\n.gitlab-ci.yaml:\n```yaml\ndeploy:\n image: 2gis/k8s-handle:latest\n script:\n - k8s-handle deploy --section --use-kubeconfig\n```\n#### Through variables\nAlternatively you can setup Gitlab CI variables:\n* K8S_TOKEN_STAGING = < serviceaccount token for staging >\n* K8S_TOKEN_PRODUCTION = < serviceaccount token for production >\n> Don't forget mark variables as protected\n\nthen add next lines to config.yaml\n```yaml\nstaging:\n k8s_master_uri: \n k8s_token: \"{{ env='K8S_TOKEN_STAGING' }}\"\n k8s_ca_base64: \n\nproduction:\n k8s_master_uri: \n k8s_token: \"{{ env='K8S_TOKEN_PRODUCTION' }}\"\n k8s_ca_base64: \n```\nNow just run proper gitlab job(without --use-kubeconfig option):\n```yaml\ndeploy:\n image: 2gis/k8s-handle:latest\n script:\n - k8s-handle deploy --section \n```\n## Working modes\n### Sync mode\n> Works only with Deployment, Job, StatefulSet and DaemonSet\n\nBy default k8s-handle just apply resources to kubernetes and exit. In sync mode k8s-handle wait for resources up and\nrunning\n```bash\n$ k8s-handle deploy --section staging --sync-mode\n...\nINFO:k8s.resource:Deployment \"k8s-starter-kit\" already exists, replace it\nINFO:k8s.resource:desiredReplicas = 3, updatedReplicas = 3, availableReplicas = 1\nINFO:k8s.resource:Deployment not completed on 1 attempt, next attempt in 5 sec.\nINFO:k8s.resource:desiredReplicas = 3, updatedReplicas = 3, availableReplicas = 2\nINFO:k8s.resource:Deployment not completed on 2 attempt, next attempt in 5 sec.\nINFO:k8s.resource:desiredReplicas = 3, updatedReplicas = 3, availableReplicas = 3\nINFO:k8s.resource:Deployment completed on 3 attempt\n...\n```\nYou can specify number of tries before k8s-handle exit with non zero exit code and delay before checks:\n```bash\n--tries (360 by default)\n--retry-delay (5 by default)\n```\n### Strict mode\nIn some cases k8s-handle warn you about ambiguous situations and keep working. With `--strict` mode k8s-handle warn and exit \nwith non zero code. For example when some used environment variables is empty.\n```bash\n$ k8s-handle-os deploy -s staging --use-kubeconfig --strict\nERROR:__main__:RuntimeError: Environment variable \"IMAGE_VERSION\" is not set\n$ echo $?\n1\n```\n### Destroy\nIn some cases you need to destroy early created resources(demo env, deploy from git branches, testing etc.), k8s-handle\nsupport `destroy` subcommand for you. Just use `destroy` instead of `deploy`. k8s-handle process destroy as deploy, but\ncall delete kubernetes api calls instead of create or replace. \n> Sync mode is available for destroy as well.\n\n## Operating without config.yaml\nThe most common way for the most of use cases is to operate with k8s-handle via `config.yaml`, specifying\nconnection parameters, targets (sections and tags) and variables in one file. The deploy command that runs after that, \nat first will trigger templating process: filling your spec templates with variables, creating resource spec files.\nThat files become a targets for the provisioner module, which does attempts to create K8S resources.\n\nBut in some cases, such as the intention to use your own templating engine or, probably, necessity to make specs \nbeforehand and to deploy them separately and later, there may be a need to divide the process into the separate steps:\n1. Templating\n2. Direct, `kubectl apply`-like provisioning without config.yaml context.\n\nFor this reason, `k8s-handle render`, `k8s-handle apply`, `k8s-handle delete` commands are implemented.\n\n### Render\n\n`render` command is purposed for creating specs from templates without their subsequent deployment. \n\nAnother purpose is to check the generation of the templates: previously, this functionality was achieved by using the\n`--dry-run` optional flag. The support of `--dry-run` in `deploy` and `destroy` commands remains at this time for the\nsake of backward compatibility but it's **discouraged** for the further usage.\n\nJust like with `deploy` command, `-s/--section` and `--tags`/`--skip-tags` targeting options are provided to make it\nhandy to render several specs. Connection parameters are not needed to be specified cause no k8s cluster availability\nchecks are performed.\n\nTemplates directory path is taken from env `TEMPLATES_DIR` and equal to 'templates' by default.\nResources generated by this command can be obtained in directory that set in `TEMP_DIR` env variable\nwith default value '/tmp/k8s-handle'. Users that want to preserve generated templates might need to change this default \nto avoid loss of the generated resources.\n\n```\nTEMP_DIR=\"/home/custom_dir\" k8s-handle render -s staging\n2019-02-15 14:44:44 INFO:k8s_handle.templating:Trying to generate file from template \"service.yaml.j2\" in \"/home/custom_dir\"\n2019-02-15 14:44:44 INFO:k8s_handle.templating:File \"/home/custom_dir/service.yaml\" successfully generated\n```\n\n### Apply\n\n`apply` command with the `-r/--resource` required flag starts the process of provisioning of separate resource \nspec to k8s.\n\nThe value of `-r` key is considered as absolute path if it's started with slash. Otherwise, it's considered as\nrelative path from directory specified in `TEMP_DIR` env variable.\n\nNo config.yaml-like file is required (and not taken into account even if exists). The connection parameters can be set\nvia `--use-kubeconfig` mode which is available and the most handy, or via the CLI/env flags and variables.\nOptions related to output and syncing, like `--sync-mode`, `--tries` and `--show-logs` are available as well.\n\n```\n$ k8s-handle apply -r /tmp/k8s-handle/service.yaml --use-kubeconfig\n2019-02-15 14:22:58 INFO:k8s_handle:Default namespace \"test\"\n2019-02-15 14:22:58 INFO:k8s_handle.k8s.resource:Using namespace \"test\"\n2019-02-15 14:22:58 INFO:k8s_handle.k8s.resource:Service \"k8s-handle-example\" does not exist, create it\n\n```\n\n### Delete\n`delete` command with the `-r/--resource` required flag acts similarly to `destroy` command and does a try to delete\n the directly specified resource from k8s if any.\n\n```\n$ k8s-handle delete -r service.yaml --use-kubeconfig\n\n2019-02-15 14:24:06 INFO:k8s_handle:Default namespace \"test\"\n2019-02-15 14:24:06 INFO:k8s_handle.k8s.resource:Using namespace \"test\"\n2019-02-15 14:24:06 INFO:k8s_handle.k8s.resource:Trying to delete Service \"k8s-handle-example\"\n2019-02-15 14:24:06 INFO:k8s_handle.k8s.resource:Service \"k8s-handle-example\" deleted\n```\n\n### Custom resource definitions and custom resources\nSince version 0.5.5 k8s-handle supports Custom resource definition (CRD) and custom resource (CR) kinds.\nIf your deployment involves use of such kinds, make sure that CRD was deployed before CR and check correctness of the CRD's scope.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/2gis/k8s-handle", "keywords": "", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "k8s-handle", "package_url": "https://pypi.org/project/k8s-handle/", "platform": "", "project_url": "https://pypi.org/project/k8s-handle/", "project_urls": { "Homepage": "http://github.com/2gis/k8s-handle" }, "release_url": "https://pypi.org/project/k8s-handle/0.7.3/", "requires_dist": [ "requests (==2.22.0)", "jinja2 (==2.10.1)", "PyYAML (==5.1)", "kubernetes (==9.0.0)", "semver (==2.8.1)" ], "requires_python": "", "summary": "Provisioning tool for Kubernetes apps", "version": "0.7.3" }, "last_serial": 5905290, "releases": { "0.2.3": [ { "comment_text": "", "digests": { "md5": "1e4d1d50e2042d680ceef24835a6874c", "sha256": "8f394c1624f54365949c35e61f316919c03d7e7abdc9da589365288ea239db40" }, "downloads": -1, "filename": "k8s_handle-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "1e4d1d50e2042d680ceef24835a6874c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 30992, "upload_time": "2019-01-18T06:11:17", "url": "https://files.pythonhosted.org/packages/fa/05/ea4e8efb5e227a2a491c43e163334676977d65b012b94b12f0d0c68548dc/k8s_handle-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "34a4f08f5f1225737a0684e5cfe30601", "sha256": "16a33ed9871b8eecf8167352d7aba1398c16252b32cacce7fb80dea56ebbdb7f" }, "downloads": -1, "filename": "k8s-handle-0.2.3.tar.gz", "has_sig": false, "md5_digest": "34a4f08f5f1225737a0684e5cfe30601", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25457, "upload_time": "2019-01-18T06:11:19", "url": "https://files.pythonhosted.org/packages/26/ac/f68df9e1dc47259308cd1cb02cbd06c9479a8944ca6b13699a1cb8a11ba6/k8s-handle-0.2.3.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "feb60112276c2c4e7c1e629241745529", "sha256": "c090ac125824fd49f28b1f3a8f24cd2376b0ee2bfebc75db98b8d4d8b7bba19a" }, "downloads": -1, "filename": "k8s_handle-0.3.5-py3-none-any.whl", "has_sig": false, "md5_digest": "feb60112276c2c4e7c1e629241745529", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31090, "upload_time": "2019-02-05T03:42:58", "url": "https://files.pythonhosted.org/packages/ab/70/b0be4ea3afa8891f90039662a0762404e6c80bbbc4d1732d49ef6c23c9a3/k8s_handle-0.3.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "976fbc84caec6ac2332488c7e9217bb3", "sha256": "47cd7092a3dccca36ec6622417f29e907e3d3264fc46e3c09833b8d417463fdc" }, "downloads": -1, "filename": "k8s-handle-0.3.5.tar.gz", "has_sig": false, "md5_digest": "976fbc84caec6ac2332488c7e9217bb3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25633, "upload_time": "2019-02-05T03:43:00", "url": "https://files.pythonhosted.org/packages/04/6d/82051c0395f5635897ba52f0448e8fbb4989a753f66c862cee1e0971bf73/k8s-handle-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "f49977d0a9019e4438427cd29a98f9bb", "sha256": "60ca19221bd46ff60f2ec81a73dfa108a3432a7ba727d9ce08fab45aa0034a99" }, "downloads": -1, "filename": "k8s_handle-0.3.6-py3-none-any.whl", "has_sig": false, "md5_digest": "f49977d0a9019e4438427cd29a98f9bb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31015, "upload_time": "2019-02-05T05:05:35", "url": "https://files.pythonhosted.org/packages/30/c1/cdfd46ee5704288582897c7264296cbf3dbde022fa2c694ae87180292e72/k8s_handle-0.3.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1a42a038cf347db8d6f073646bf0fafa", "sha256": "ec1b2e91759d6699d3a9ed8d9a2b1f3a9c006d954fef10be080122316b6bf4f2" }, "downloads": -1, "filename": "k8s-handle-0.3.6.tar.gz", "has_sig": false, "md5_digest": "1a42a038cf347db8d6f073646bf0fafa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25509, "upload_time": "2019-02-05T05:05:37", "url": "https://files.pythonhosted.org/packages/bd/6f/4c6c2d9b697297dec1d883bd0db76ba51fe5dfc52cfdf28887a689d5af6d/k8s-handle-0.3.6.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "2a379971c8274a0f4fd0270e1c3a596a", "sha256": "3427f76db2b1e2aefa9ded29dcb61fb390317d5d188fbc4feafd4d77b2a9d066" }, "downloads": -1, "filename": "k8s_handle-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2a379971c8274a0f4fd0270e1c3a596a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31775, "upload_time": "2019-02-11T02:52:44", "url": "https://files.pythonhosted.org/packages/d1/5b/51ae4c15cf69a7781d36008dc780e6f1458cd279faf13f3b3085cabbd55e/k8s_handle-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "46c0ebdd23c29877dab9e90533c3cb48", "sha256": "112c8729ec7b207e67adcc5628d9dd2f0bcc2a69bc9a748ab548288b0630c8d1" }, "downloads": -1, "filename": "k8s-handle-0.4.0.tar.gz", "has_sig": false, "md5_digest": "46c0ebdd23c29877dab9e90533c3cb48", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26508, "upload_time": "2019-02-11T02:52:45", "url": "https://files.pythonhosted.org/packages/f2/22/c06f973e55530bee4f39f4116284e76c4f969d85ca388212c5c1a78616e4/k8s-handle-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "3ac71711bcc3be60a91a5aaae6f6770b", "sha256": "0bcdb98c05b8b053f39a1f59834aa535532095a46418f3c4d60afdf5229c7654" }, "downloads": -1, "filename": "k8s_handle-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3ac71711bcc3be60a91a5aaae6f6770b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32059, "upload_time": "2019-02-11T04:57:26", "url": "https://files.pythonhosted.org/packages/12/bf/309968592a22381f2871a87cf95b8be070d3d9daa0207e48f29571669ae2/k8s_handle-0.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0e9527b2d8886fb7182b2b0e81b36d97", "sha256": "08d78f21cfce5255766980c19d92dee744e8dd7f32b45ea52b83d9f6e8efbf6e" }, "downloads": -1, "filename": "k8s-handle-0.4.1.tar.gz", "has_sig": false, "md5_digest": "0e9527b2d8886fb7182b2b0e81b36d97", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26564, "upload_time": "2019-02-11T04:57:28", "url": "https://files.pythonhosted.org/packages/fc/d1/62cb41bfac939a27d5ca9bd8359278bfe73fb33c4f49cc979b3a531f1012/k8s-handle-0.4.1.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "4a87ca030cc467f8e12192e85d45dcf4", "sha256": "debdfe9263e7f7c45fc361e8dd370c52c93a2146db811af067c6ca683ef1ae60" }, "downloads": -1, "filename": "k8s_handle-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4a87ca030cc467f8e12192e85d45dcf4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33675, "upload_time": "2019-02-18T07:36:18", "url": "https://files.pythonhosted.org/packages/b6/34/03a7937d316654d4eaba230731c655209d53adebe518a12fbd65f2b229c0/k8s_handle-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5a169d140556b8f6c3559d8078848f3f", "sha256": "3d424b2bae1b59b5b5cdd6124d8e1d1d4d21497390da7657b1395ed42a61af15" }, "downloads": -1, "filename": "k8s-handle-0.5.0.tar.gz", "has_sig": false, "md5_digest": "5a169d140556b8f6c3559d8078848f3f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28526, "upload_time": "2019-02-18T07:36:20", "url": "https://files.pythonhosted.org/packages/48/7f/79964eca01dd72e7268bb3b4e40c32024fed994db56b405a0c36929f2861/k8s-handle-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "0dae4dcb6bbffe47ae1a6addeba5559e", "sha256": "534905ff917d30b526b0e56f62579df7bc32247319bdbf42c835509c872f71ea" }, "downloads": -1, "filename": "k8s_handle-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "0dae4dcb6bbffe47ae1a6addeba5559e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33979, "upload_time": "2019-02-20T04:56:35", "url": "https://files.pythonhosted.org/packages/a9/a3/2e76a95c2f7d50c7eacb3fe5752334afd1e38dc3d2ffd315e4484a61e2cf/k8s_handle-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cb46e5566980ba5aaa3418ce7f1c18c5", "sha256": "233c83ec78fdb5a7aef23884cc940642efedb13b772f3ab815e38ada212c3751" }, "downloads": -1, "filename": "k8s-handle-0.5.1.tar.gz", "has_sig": false, "md5_digest": "cb46e5566980ba5aaa3418ce7f1c18c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29091, "upload_time": "2019-02-20T04:56:36", "url": "https://files.pythonhosted.org/packages/ce/b7/481421fd23b4eabf770da06c6a9c1d16c58f9bec42c58164b3a3499b0af4/k8s-handle-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "d9b6aa2670b27a6bb0250921b1d0a21b", "sha256": "5b58d1d3677e6a5e785a1d471cefbfecf8aa34215a7d838ce37ecab1b44f0c23" }, "downloads": -1, "filename": "k8s_handle-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d9b6aa2670b27a6bb0250921b1d0a21b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34003, "upload_time": "2019-02-28T07:50:23", "url": "https://files.pythonhosted.org/packages/a7/78/03000fe22490db5dc7499ba8290ec4661ba970ad2f3991c7cf82b0dc65ef/k8s_handle-0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "825061337c175b1b7da51563d1cfb501", "sha256": "3c39dced828d99112143311d955678d706108e4770005626b465f583549ce6e8" }, "downloads": -1, "filename": "k8s-handle-0.5.2.tar.gz", "has_sig": false, "md5_digest": "825061337c175b1b7da51563d1cfb501", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29102, "upload_time": "2019-02-28T07:50:25", "url": "https://files.pythonhosted.org/packages/ae/c6/87950c4d5c69c7c50f1d21fb3e07c09ce54f6627b0bfa0237eca9658ec92/k8s-handle-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "96bf285c53b115eb0c0525333bc7a2e3", "sha256": "fd810a70eff0e90d2abe87b34de10fe58fe855464e6274eb8838566fb2a64cd8" }, "downloads": -1, "filename": "k8s_handle-0.5.3-py3-none-any.whl", "has_sig": false, "md5_digest": "96bf285c53b115eb0c0525333bc7a2e3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33997, "upload_time": "2019-03-28T05:59:52", "url": "https://files.pythonhosted.org/packages/81/52/498697245049f1234add7e17253f37bcef118bde3966c02653033366705f/k8s_handle-0.5.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c38802b4475272f7a3e37b2798fda03c", "sha256": "da914f29020f1974719dd0476cbca5973a30f402a7718b7398f8afa5230d1026" }, "downloads": -1, "filename": "k8s-handle-0.5.3.tar.gz", "has_sig": false, "md5_digest": "c38802b4475272f7a3e37b2798fda03c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29100, "upload_time": "2019-03-28T05:59:54", "url": "https://files.pythonhosted.org/packages/8d/12/ea42ab76e8ad9e8871d5480e68afff0708ea3d897852ca1ac347e98bc19d/k8s-handle-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "99d0faa5469996803f9bca0d01da459b", "sha256": "d17d5bbe693168f482f0dec98edcb642d8681bc789f2bae65807c03b7e923a42" }, "downloads": -1, "filename": "k8s_handle-0.5.4-py3-none-any.whl", "has_sig": false, "md5_digest": "99d0faa5469996803f9bca0d01da459b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34073, "upload_time": "2019-04-02T02:00:02", "url": "https://files.pythonhosted.org/packages/1c/79/97d60c0c7a034db07b2f0fa5fc2071c37669079c2419b42e7d2b287f1061/k8s_handle-0.5.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5eecbb8a37d86499dfab9c3e27e0c1ab", "sha256": "55f73b54e21fa8306d370b9a06cf9f85761f8edc4b5f7078d21e87bf7f9d035e" }, "downloads": -1, "filename": "k8s-handle-0.5.4.tar.gz", "has_sig": false, "md5_digest": "5eecbb8a37d86499dfab9c3e27e0c1ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28781, "upload_time": "2019-04-02T02:00:04", "url": "https://files.pythonhosted.org/packages/ca/0e/20febf81fc2532dc7c18d6bf9056a88c07c63e4a1cfdeb25e867928070bf/k8s-handle-0.5.4.tar.gz" } ], "0.5.5": [ { "comment_text": "", "digests": { "md5": "a15bb30b33a03f6b8fe4c69c489dd194", "sha256": "b256fb8569d6b7401fd879b445a7d843487b4108d549e729f5e87b8021ad1a21" }, "downloads": -1, "filename": "k8s_handle-0.5.5-py3-none-any.whl", "has_sig": false, "md5_digest": "a15bb30b33a03f6b8fe4c69c489dd194", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37592, "upload_time": "2019-04-10T12:53:24", "url": "https://files.pythonhosted.org/packages/02/8f/87a3cc5148a5b63e4bed3dccfd85b85a861e8e4b314acbc1bca78986445a/k8s_handle-0.5.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "64fb322f16b972db988df352165c3b8b", "sha256": "89cd8099bbb9909ec9dec30c719dbe8135b6d84256f49c0d724a50f59a852df7" }, "downloads": -1, "filename": "k8s-handle-0.5.5.tar.gz", "has_sig": false, "md5_digest": "64fb322f16b972db988df352165c3b8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31031, "upload_time": "2019-04-10T12:53:26", "url": "https://files.pythonhosted.org/packages/fc/b7/b0dfbb660fc7ae6ae27092715aad71f8a2d694fdee9e23c7d62be8062f83/k8s-handle-0.5.5.tar.gz" } ], "0.5.6": [ { "comment_text": "", "digests": { "md5": "10a0ad414dcd919cb308e2aee8097d9c", "sha256": "571fc6bb3a4195ec716dea106d006724ae3dd829f043f4f317b2a03c8dff4ddc" }, "downloads": -1, "filename": "k8s_handle-0.5.6-py3-none-any.whl", "has_sig": false, "md5_digest": "10a0ad414dcd919cb308e2aee8097d9c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37417, "upload_time": "2019-04-15T00:09:23", "url": "https://files.pythonhosted.org/packages/74/a9/15e79a2f4a9292d69f4201fa173c7fd0dad8b9e791103d8da660a9d2bf17/k8s_handle-0.5.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9ed525ffce3852e4ba3812f524d18882", "sha256": "984deb36dab4fb5bf41e9ff39c87acfd184425612e04f758e7b15766b10be9ae" }, "downloads": -1, "filename": "k8s-handle-0.5.6.tar.gz", "has_sig": false, "md5_digest": "9ed525ffce3852e4ba3812f524d18882", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30826, "upload_time": "2019-04-15T00:09:25", "url": "https://files.pythonhosted.org/packages/58/c1/b0515909dca923be44ab2d4c40b46c69d488a40658f21e48889ea9f892e8/k8s-handle-0.5.6.tar.gz" } ], "0.5.7": [ { "comment_text": "", "digests": { "md5": "6041f8cbeb7af82c69c9b6e497775707", "sha256": "5e7a118492f5fddc485f4a2a0ca632228db356f376e9360337f0a7d479d730e0" }, "downloads": -1, "filename": "k8s_handle-0.5.7-py3-none-any.whl", "has_sig": false, "md5_digest": "6041f8cbeb7af82c69c9b6e497775707", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37416, "upload_time": "2019-05-21T10:59:47", "url": "https://files.pythonhosted.org/packages/22/c4/039da9e883b0b4a287a5aa37dcf5673aaf36f08c65c1fcf9a4b2dfc314ac/k8s_handle-0.5.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6604e6552bc5da9d2cd60c3aed46e114", "sha256": "8d1c6bae916b86d1cd7846d3bff53f5086a7fd934cddf4dae6dd0c4e59b478f7" }, "downloads": -1, "filename": "k8s-handle-0.5.7.tar.gz", "has_sig": false, "md5_digest": "6604e6552bc5da9d2cd60c3aed46e114", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30831, "upload_time": "2019-05-21T10:59:49", "url": "https://files.pythonhosted.org/packages/05/f8/2d5bb5bb86267dbfb3ffe4869815e0f0ae5e202995d2eb601a29c4003b63/k8s-handle-0.5.7.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "d15d916619afd87e1fc2d456576b8a3d", "sha256": "0b1ef54e0eb449034f46f360eeece967a03985ee54674c8763287ed26d2d0271" }, "downloads": -1, "filename": "k8s_handle-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d15d916619afd87e1fc2d456576b8a3d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37575, "upload_time": "2019-05-23T09:28:41", "url": "https://files.pythonhosted.org/packages/bc/f3/a965571e72e0d814d0b92c7d983b69762480a301062464dac30221b0be3d/k8s_handle-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dbdb4ff616c9be48fe0a32fc8c722c3d", "sha256": "5868ea5b69675f3cd443c9ee60c86e9043cd3cd86d2dd0fc20df46d944a2723b" }, "downloads": -1, "filename": "k8s-handle-0.6.0.tar.gz", "has_sig": false, "md5_digest": "dbdb4ff616c9be48fe0a32fc8c722c3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30975, "upload_time": "2019-05-23T09:28:43", "url": "https://files.pythonhosted.org/packages/07/b1/baf9f4118289e7a07d833ed734f6963010f3b1178c059a64f837a549be3a/k8s-handle-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "8a027e3530ec13f90a489f84f29d8cc7", "sha256": "425184802db58d994ef38e7da13eecb61d4cc83b61366696e4e51204a88c9701" }, "downloads": -1, "filename": "k8s_handle-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "8a027e3530ec13f90a489f84f29d8cc7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37574, "upload_time": "2019-05-23T10:15:55", "url": "https://files.pythonhosted.org/packages/58/94/a5a33394a60fb40783ebefb10dea62ef54a134c9553fb76e7fbc05910e40/k8s_handle-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2bbc5bc63536f8d9cb929b60bcc3f6e7", "sha256": "33d30c94d0abaeba8452bd3975c52e5b4ea7ac147b251588c3c84dc35dad21d5" }, "downloads": -1, "filename": "k8s-handle-0.6.1.tar.gz", "has_sig": false, "md5_digest": "2bbc5bc63536f8d9cb929b60bcc3f6e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30972, "upload_time": "2019-05-23T10:15:58", "url": "https://files.pythonhosted.org/packages/7c/27/92a518971bca35511e83883b635d44f5a07c37e3a4bb62fd27fd4a4eec2f/k8s-handle-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "7328922139730b384ff9accd79389d91", "sha256": "c3a9570e36b58874fc71f8c29863c4361b1defc8999a2b3eba3f6fce25d0d152" }, "downloads": -1, "filename": "k8s_handle-0.6.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7328922139730b384ff9accd79389d91", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37643, "upload_time": "2019-07-05T07:09:45", "url": "https://files.pythonhosted.org/packages/40/d6/f8dc712f52edaf144b065c9e0b340630c956c7e7f7f17a892016c365fa58/k8s_handle-0.6.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8107dfe62c4d22eaf910e9160221304d", "sha256": "f320d6fa500a9fd77886a08b2e998b611d8a90461b97d0ef53ed063f30ff8b1b" }, "downloads": -1, "filename": "k8s-handle-0.6.2.tar.gz", "has_sig": false, "md5_digest": "8107dfe62c4d22eaf910e9160221304d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31023, "upload_time": "2019-07-05T07:09:47", "url": "https://files.pythonhosted.org/packages/53/73/91694a59d912fd7b84d206cb812e1768d33ac50c8179854bcbafff078e5c/k8s-handle-0.6.2.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "6c5f9498e07f405e25f3dbe892daebe8", "sha256": "f75b71737ff5a183bf832a776068d9adb87d9367b226280bde528bea827cd69d" }, "downloads": -1, "filename": "k8s_handle-0.6.3-py3-none-any.whl", "has_sig": false, "md5_digest": "6c5f9498e07f405e25f3dbe892daebe8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37829, "upload_time": "2019-07-05T07:22:56", "url": "https://files.pythonhosted.org/packages/e3/d1/211572031b10dcb7b016c7c9d6d9a8c2a9d8630c858542f2330c1dde7f18/k8s_handle-0.6.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d451b358a5c42d0cb8947195dc15e95c", "sha256": "ad1a12125f99fa7052677f01b2fdca6755627a64d9ebb3c9f8960e5bd044a62e" }, "downloads": -1, "filename": "k8s-handle-0.6.3.tar.gz", "has_sig": false, "md5_digest": "d451b358a5c42d0cb8947195dc15e95c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31199, "upload_time": "2019-07-05T07:22:59", "url": "https://files.pythonhosted.org/packages/85/28/e0b928209d669be63d98585d027a4ebdb6e8547cda6245d36090b7db913d/k8s-handle-0.6.3.tar.gz" } ], "0.6.4": [ { "comment_text": "", "digests": { "md5": "143e6845cda915a8ad5ea89b69e7cb21", "sha256": "2cd5af8cb2abf7512c36df8c6be6bf92de526ef979e3fd21528068e490e89def" }, "downloads": -1, "filename": "k8s_handle-0.6.4-py3-none-any.whl", "has_sig": false, "md5_digest": "143e6845cda915a8ad5ea89b69e7cb21", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37885, "upload_time": "2019-07-26T06:16:46", "url": "https://files.pythonhosted.org/packages/8f/5f/8c6c86ba0cb6907ae64a2bb02545374b08d48c46bd1add6457ea39e0e0e3/k8s_handle-0.6.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b52199b74368a5187dde0a7adbe7c8d", "sha256": "0cc656ad9670fda6d774c9fc12eebc55b963c07acd60a637504dee23da6a143b" }, "downloads": -1, "filename": "k8s-handle-0.6.4.tar.gz", "has_sig": false, "md5_digest": "8b52199b74368a5187dde0a7adbe7c8d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31279, "upload_time": "2019-07-26T06:16:48", "url": "https://files.pythonhosted.org/packages/b6/3e/eb872fd7160deb1e70c2dd8db1451c6fd048cd47db9e0433a7c7b0e65237/k8s-handle-0.6.4.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "ce2cbd1626cdcf5dafa31646f7cccb0d", "sha256": "f728b61fc225565f89a7511ef0cc634a00465100e5dc5c410822e8e29b717590" }, "downloads": -1, "filename": "k8s_handle-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ce2cbd1626cdcf5dafa31646f7cccb0d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38090, "upload_time": "2019-08-09T07:46:59", "url": "https://files.pythonhosted.org/packages/e6/31/ad0d64ccf08262c230709ac5bbd1aa2ff70d9f137ce9f6ee94cf13e5b08a/k8s_handle-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c1e580d3bc25921635475d8c2dc3f41", "sha256": "73a104425b3a70e4f2f801f1ad8d6dadcb0578bcc0815d08258087e1d5a8d63e" }, "downloads": -1, "filename": "k8s-handle-0.7.0.tar.gz", "has_sig": false, "md5_digest": "5c1e580d3bc25921635475d8c2dc3f41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31531, "upload_time": "2019-08-09T07:47:01", "url": "https://files.pythonhosted.org/packages/b0/a3/ea4e3b313672b08d07247daae5c6b22c476e5d51cd0ffba658c34ce28322/k8s-handle-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "3290693f27baf6b8a11886cffdab0c51", "sha256": "d5aa17322a40cfb368a8c8a59b9c972073c7f387926f6915145c942101eb8fd8" }, "downloads": -1, "filename": "k8s_handle-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3290693f27baf6b8a11886cffdab0c51", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38098, "upload_time": "2019-08-28T01:32:46", "url": "https://files.pythonhosted.org/packages/43/80/0a54d4c0f9dd3d926e36b790823941cd514638f1e60b072e1c81b87c00bd/k8s_handle-0.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "972a064a1c06b874139ef07a536263ec", "sha256": "c0006fe1aa7bb2921e61be9330248a934096169ce7968f528093edf103776a1e" }, "downloads": -1, "filename": "k8s-handle-0.7.1.tar.gz", "has_sig": false, "md5_digest": "972a064a1c06b874139ef07a536263ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31543, "upload_time": "2019-08-28T01:32:48", "url": "https://files.pythonhosted.org/packages/d6/f6/b9dfcccc624407c96191c71082e7c9850aa59d564715731647c683c114fb/k8s-handle-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "6d5b3e6be44ebf5cebb7dd35eefde200", "sha256": "578c26174705aaa133dacd3137fe7bd69606008605f01517f39044074cea0830" }, "downloads": -1, "filename": "k8s_handle-0.7.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6d5b3e6be44ebf5cebb7dd35eefde200", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38161, "upload_time": "2019-08-30T04:56:52", "url": "https://files.pythonhosted.org/packages/63/1d/071d5d9327b03fa7c185bb24b0ad94bb255e8ec52d70813c828fa147634a/k8s_handle-0.7.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e377a20c1e4abdeffda003881202e46e", "sha256": "dd3e7e4d454ab51345d72e2fd821ca1165511c7224f14a28173757430ed10f65" }, "downloads": -1, "filename": "k8s-handle-0.7.2.tar.gz", "has_sig": false, "md5_digest": "e377a20c1e4abdeffda003881202e46e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31633, "upload_time": "2019-08-30T04:56:54", "url": "https://files.pythonhosted.org/packages/78/bf/aa0631875be88f35238851a6cabb72fda7ba4968e21156ca2ad236136e4a/k8s-handle-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "bc876714a992b97feb7a330034afe8b4", "sha256": "c56f16e452ceefdac2f28f84c41540c28b27bbee0b8506070bf4849b37e330ce" }, "downloads": -1, "filename": "k8s_handle-0.7.3-py3-none-any.whl", "has_sig": false, "md5_digest": "bc876714a992b97feb7a330034afe8b4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38245, "upload_time": "2019-09-30T07:26:30", "url": "https://files.pythonhosted.org/packages/8f/d2/3ca6ccafcb9c8a82adbf8e5f52670d7bf9159d300cff41b8cd3ef4592e0c/k8s_handle-0.7.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f68331df4f2230051562ca993dbdaf88", "sha256": "3d66e306e1240f05392c3a57fda05209c2a79ee30fbcc4d144f8957436fb8c0a" }, "downloads": -1, "filename": "k8s-handle-0.7.3.tar.gz", "has_sig": false, "md5_digest": "f68331df4f2230051562ca993dbdaf88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31701, "upload_time": "2019-09-30T07:26:32", "url": "https://files.pythonhosted.org/packages/db/3c/77b7b1c5cff25657c6afea4c5d14fcd236e2ad2e9cab6ad9a790a311f06e/k8s-handle-0.7.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bc876714a992b97feb7a330034afe8b4", "sha256": "c56f16e452ceefdac2f28f84c41540c28b27bbee0b8506070bf4849b37e330ce" }, "downloads": -1, "filename": "k8s_handle-0.7.3-py3-none-any.whl", "has_sig": false, "md5_digest": "bc876714a992b97feb7a330034afe8b4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38245, "upload_time": "2019-09-30T07:26:30", "url": "https://files.pythonhosted.org/packages/8f/d2/3ca6ccafcb9c8a82adbf8e5f52670d7bf9159d300cff41b8cd3ef4592e0c/k8s_handle-0.7.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f68331df4f2230051562ca993dbdaf88", "sha256": "3d66e306e1240f05392c3a57fda05209c2a79ee30fbcc4d144f8957436fb8c0a" }, "downloads": -1, "filename": "k8s-handle-0.7.3.tar.gz", "has_sig": false, "md5_digest": "f68331df4f2230051562ca993dbdaf88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31701, "upload_time": "2019-09-30T07:26:32", "url": "https://files.pythonhosted.org/packages/db/3c/77b7b1c5cff25657c6afea4c5d14fcd236e2ad2e9cab6ad9a790a311f06e/k8s-handle-0.7.3.tar.gz" } ] }