{ "info": { "author": "Jay Johnson", "author_email": "jay.p.h.johnson@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Metalnetes\n==========\n\nTools for managing multiple Kubernetes **1.14** clusters on KVM (3 CentOS 7 VMs) running on a bare metal Fedora 29 server (also tested on Ubuntu 18.04 until 1.13). Use this repo if you want to create, destroy and manage native Kubernetes clusters. It is a full installer for taking a brand new server up to speed using just bash and environment variables.\n\n.. image:: https://i.imgur.com/awLwim1.png\n\nGetting Started\n---------------\n\nThis `repo `__ automates:\n\n- installing many rpms, systems and tools to prepare a bare metal server (on Fedora 29) to host multiple Kubernetes clusters\n- deploying Kubernetes clusters on 3 CentOS 7 VMs\n- each VM has 100 GB, 4 cpu cores, 16 GB ram, and auto-configured for static IP assignment from env vars\n- hosting VMs using KVM which requires access to the server's hypervisor (running this in a vm will not work)\n- deploying a Rook Ceph storage cluster for Kubernetes persistent volumes\n- installs a local dns server (named) with working example for mapping VM static ips to urls that a browser can use with any Kubernetes nginx ingress endpoint\n- ssh access for manually fixing a VM after deployment\n- optional - deploy the `Stock Analysis Engine `__ which includes helm charts for running: Minio (on-premise s3), Redis cluster, Jupyter, Grafana + Prometheus for monitoring (required for ceph cluster monitoring)\n\nFedora Bare Metal Install Guide\n===============================\n\nServer Resource Requirements\n----------------------------\n\nMinimum hardware specs to run 1 cluster:\n\n- 50 GB RAM\n- 12 cpu cores\n- 500 GB hdd space for each cluster (400 GB if you do not want to use base images and slow down each cluster deployment)\n\nClone\n-----\n\n::\n\n git clone https://github.com/jay-johnson/metalnetes.git\n cd metalnetes\n\nEdit Cluster Configuration\n==========================\n\nPlease edit the default `Cluster Config k8.env `__ as needed\n\nLaunch Checklist\n----------------\n\nUninstalling and reinstalling clusters is not a slow process, and it helps to take a moment to review the VM's networking, Kubernetes cluster deployment, and KVM configuration before starting or testing a new idea for your next cluster deployment:\n\n#. `Set a name for the cluster `__\n#. KVM\n\n #. `K8_VMS `__ - short VM names for showing in ``virsh list`` and must be unique\n #. `K8_DOMAIN `__ - search domain for cluster ``example.com`` and must work with the dns server records and VM ip addresses\n #. `K8_INITIAL_MASTER `__ - initial fqdn to set ``m10.example.com``\n #. `K8_SECONDARY_MASTERS `__ - additional fqdns to set ``m11.example.com m12.example.com`` and space separated\n#. Networking\n\n #. `Confirm VM IP Addresses `__\n #. `Confirm VM MAC Addresses `__\n #. `Confirm DNS `__\n#. `Confirm User For Private Docker Registry `__\n#. `Confirm User For SSH Access to VMs `__\n#. `Confirm CPU Per VM (4 cores) `__\n#. `Confirm Memory Per VM (16 GB ram) `__\n#. `Confirm Storage Per VM (100 GB harddrives and qemu raw image format) `__\n#. `Confirm Cluster Storage (rook-ceph by default) `__\n#. `Confirm Ingress (nginx by default) `__\n#. `Confirm Bridge (br0 by default) `__\n#. `Confirm Base VM IP and Mac Address `__\n#. `Confirm Base VM Allow Query DNS CIDR `__\n\nStart Install\n=============\n\nChange to root and start the Fedora bare metal server installer:\n\n::\n\n sudo su\n ./fedora/server-install.sh\n\nInstall Bridge\n==============\n\nThis will install a bridge network device called ``br0`` from a network device ``eno1``. This ``br0`` bridge is used by KVM as a shared networking device for all VMs in all Kubernetes clusters.\n\n::\n\n ./fedora/install-bridge.sh\n\nI am not sure this is required, but I reboot the server at this point. This ensures the OS reboots correctly before creating any VMs, and I can confirm the ``br0`` bridge shows up after a clean restart using ``ifconfig -a | grep br0`` or ``nmcli dev | grep br0``.\n\nStart the Kubernetes Cluster\n============================\n\nBoot your cluster as your user (which should have KVM access). The `boot.sh `__ uses a base VM to bootstrap and speed up future deployments. Once the base VM is built, it will copy and launch 3 VMs (from the base) and install the latest Kubernetes build in all VMs. Once installed and running the 2nd and 3rd nodes join the 1st node to initialize the cluster. After initializing the cluster, helm and tiller will install and a rook-ceph storage layer will be deployed for persisting your data in volumes:\n\n.. note:: Initial benchmarks take around 30 minutes to build all VMs and bring a new cluster online. Cleaning and restarting the cluster does not take nearly as long as creating VMs for a new cluster. Also the first time running ``./boot.sh`` will take the longest because it builds a shared base VM image to decrease future cluster deploy time.\n\n::\n\n # go to the base of the repo\n source k8.env\n ./boot.sh\n\nFor help with issues please refer to the `FAQ `__\n\nView Kubernetes Nodes\n---------------------\n\nOnce it finishes you can view your new cluster nodes with:\n\n::\n\n ./tools/show-nodes.sh\n\nChanging Between Kubernetes Clusters\n====================================\n\nIf you create a new ``k8.env`` file for each cluster, like ``dev_k8.env`` and ``prod_k8.env`` then you can then quickly toggle between clusters using:\n\n#. Load ``dev`` Cluster Config file\n\n ::\n\n source dev_k8.env\n\n#. Use the ``metal`` bash function to sync the ``KUBECONFIG`` through the ``dev`` cluster and local host\n\n ::\n\n metal\n\n#. Load ``prod`` Cluster Config file\n\n ::\n\n source prod_k8.env\n\n#. Use the ``metal`` bash function to sync the ``KUBECONFIG`` through the ``prod`` cluster and local host\n\n ::\n\n metal\n\nCustomizing the Kubernetes Cluster\n==================================\n\nIf you are looking to swap out parts of the deployment, please ensure the hosting server has a replacement in place for these bare minimum components:\n\n- a dns server that can host the ``example.com`` zone\n- access to a docker-ce daemon (latest stable)\n- a private docker registry\n- KVM (requires **hypervisor** access)\n- a network device that supports static bridging for KVM (please review the ``centos/install-network-device.sh`` for examples)\n- default static network ip assignment from a router or switch that can map a VM's MAC address to a static ip address that the dns server can map to for helping browsers access nginx ingress endpoints\n- access to arp-scan tool for detecting when each VM is ready for ssh scripting using dns name resolution\n\nBefore starting a second cluster there are some deployment sections to change from the default ``k8.env`` Cluster Config file.\n\nPlease review these sections to prevent debugging collision-related issues:\n\nVM and Kubernetes Node Configuration\n------------------------------------\n\n- `VM names, Cluster Nodes, Node Labels, Cluster Tools section `__\n\n**Considerations and Deployment Constraints**\n\n- ``K8_ENV`` must be a unique name for the cluster (``dev`` vs ``prod`` for example)\n- VM names need to be unique (and on the dns server with fqdn: ``VM_NAME.example.com`` as the default naming convention\n- IPs must be unique (or the dns server will have problems)\n- MAC addressess must be unique\n\nHelm and Tiller Configuration\n-----------------------------\n\n- `Helm and Tiller `__\n\nCluster Storage Configuation\n----------------------------\n\n**Considerations and Deployment Constraints**\n\n- Operator redundancy\n\n- `Storage (rook-ceph by default) `__\n- `Additional Block Devices per VM `__\n\nPrivate Docker Registry\n-----------------------\n\nPlease export the address to your private docker registy before deploying with format:\n\n::\n\n export DOCKER_REGISTRY_FQDN=REGISTRY_HOST:PORT\n\n- `Registry `__\n\nManaging a Running Kubernetes Cluster\n=====================================\n\nRun these steps to manage a running kubernetes cluster.\n\nLoad the CLUSTER_CONFIG environment\n-----------------------------------\n\n::\n\n # from within the repo's root dir:\n export CLUSTER_CONFIG=$(pwd)/k8.env\n\nFully Clean and Reinitialize the Kubernetes Cluster\n---------------------------------------------------\n\n::\n\n ./clean.sh\n\nStart Kubernetes Cluster with a Private Docker Registry + Rook Ceph\n-------------------------------------------------------------------\n\n::\n\n ./start.sh\n\nCheck Kubernetes Nodes\n----------------------\n\n::\n\n ./tools/show-labels.sh\n\nCluster Join Tool\n=================\n\nIf you want to reboot VMs and have the nodes re-join and rebuild the Kubernetes cluster use:\n\n::\n\n ./join.sh\n\nDeployment Tools\n================\n\nNginx Ingress\n-------------\n\nDeploy `the nginx ingress `__\n\n::\n\n ./deploy-nginx.sh\n\nRook-Ceph\n---------\n\nDeploy `rook-ceph `__ using the `Advanced Configuration `__\n\n::\n\n ./deploy-rook-ceph.sh\n\nConfirm Rook-Ceph Operator Started\n\n::\n\n ./rook-ceph/describe-operator.sh\n\nPrivate Docker Registry\n-----------------------\n\nDeploy a private docker registry for use with the cluster with:\n\n::\n\n ./deploy-registry.sh\n\nDeploy Helm\n-----------\n\nDeploy `helm `__\n\n::\n\n ./deploy-helm.sh\n\nDeploy Tiller\n-------------\n\nDeploy tiller:\n\n::\n\n ./deploy-tiller.sh\n\n(Optional Validation) - Deploy Stock Analysis Engine\n====================================================\n\nThis repository was created after trying to decouple the `AI Kubernetes cluster for analyzing network traffic `__ and the `Stock Analysis Engine (ae) that uses many deep neural networks to predict future stock prices during live-trading hours `__ from using the same Kubernetes cluster. Additionally with the speed ae is moving, I am looking to keep trying new high availablity solutions and configurations to ensure the intraday data collection never dies (hopefully out of the box too!).\n\nDeploy AE\n---------\n\n- `Configure AE `__\n\n::\n\n ./deploy-ae.sh\n\nRedeploying Using Helm\n----------------------\n\n#. Find the Helm Chart to Remove (this example uses ``ae-grafana``):\n\n ::\n\n helm ls ae-grafana\n\n#. Delete and Purge the Helm Chart Deployment:\n\n ::\n\n helm delete --purge ae-grafana\n\n#. Deploy AE Helm Charts:\n\n ::\n\n ./ae/start.sh\n\nMonitoring the Kubernetes Cluster\n---------------------------------\n\n.. note:: Grafana will only deploy if monitoring is enabled when running ``./deploy-ae.sh`` or if you run ``./ae/monitor-start.sh``.\n\nLog in to Grafana from a browser:\n\n- Username: **trex**\n- Password: **123321**\n\nhttps://grafana.example.com\n\nGrafana comes ready-to-go with these starting dashboards:\n\nView Kubernetes Pods in Grafana\n-------------------------------\n\n.. image:: https://i.imgur.com/GHo7dbd.png\n\nView Rook Ceph Cluster in Grafana\n----------------------------------\n\n.. image:: https://i.imgur.com/wptrQW2.png\n\nView Redis Cluster in Grafana\n-----------------------------\n\n.. image:: https://i.imgur.com/kegYzXZ.png\n\nUninstall AE\n------------\n\n::\n\n ./ae/_uninstall.sh\n\nPlease wait for the Persistent Volume Claims to be deleted\n\n::\n\n kubetl get pvc -n ae\n\n.. warning:: The Redis pvc ``redis-data-ae-redis-master-0`` must be manually deleted to prevent issues with redeployments after an uninstall\n ::\n\n kubectl -n ae delete pvc redis-data-ae-redis-master-0\n\nDelete Cluster VMs\n==================\n\n::\n\n ./kvm/_uninstall.sh\n\nLicense\n=======\n\nApache 2.0 - Please refer to the `LICENSE `__ for more details.\n\nFAQ\n===\n\nWhat IP did my VMs get?\n-----------------------\n\nFind VMs by MAC address using the ``K8_VM_BRIDGE`` bridge device using:\n\n::\n\n ./kvm/find-vms-on-bridge.sh\n\nFind your MAC addresses with a tool that uses ``arp-scan`` to list all ip addresses on the configured bridge device (``K8_VM_BRIDGE``):\n\n::\n\n ./kvm/list-bridge-ips.sh\n\nWhy Are Not All Rook Ceph Operators Starting?\n---------------------------------------------\n\nRestart the cluster if you see an error like this when looking at the ``rook-ceph-operator``:\n\n::\n\n # find pods: kubectl get pods -n rook-ceph-system | grep operator\n kubectl -n rook-ceph-system describe po rook-ceph-operator-6765b594d7-j56mw\n\n::\n\n Warning FailedCreatePodSandBox 7m56s kubelet, m12.example.com Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container \"9ab1c663fc53f75fa4f0f79effbb244efa9842dd8257eb1c7dafe0c9bad1ee6c\" network for pod \"rook-ceph-operator-6765b594d7-j56mw\": NetworkPlugin cni failed to set up pod \"rook-ceph-operator-6765b594d7-j56mw_rook-ceph-system\" network: failed to set bridge addr: \"cni0\" already has an IP address different from 10.244.2.1/24\n\n::\n\n ./clean.sh\n ./deploy-rook-ceph.sh\n\nHelm fails with connection refused\n----------------------------------\n\nIf you see this:\n\n::\n\n metalnetes$ helm ls\n Error: Get http://localhost:8080/api/v1/namespaces/kube-system/pods?labelSelector=app%3Dhelm%2Cname%3Dtiller: dial tcp 127.0.0.1:8080: connect: connection refused\n\nSource the ``k8.env`` Cluster Config file:\n\n::\n\n metalnetes$ source k8.env\n metalnetes$ helm ls\n NAME \tREVISION\tUPDATED \tSTATUS \tCHART \tAPP VERSION\tNAMESPACE\n ae \t1 \tThu Mar 21 05:49:38 2019\tDEPLOYED\tae-0.0.1 \t0.0.1 \tae\n ae-grafana \t1 \tThu Mar 21 05:57:17 2019\tDEPLOYED\tgrafana-2.2.0 \t6.0.0 \tae\n ae-jupyter \t1 \tThu Mar 21 05:49:43 2019\tDEPLOYED\tae-jupyter-0.0.1\t0.0.1 \tae\n ae-minio \t1 \tThu Mar 21 05:49:40 2019\tDEPLOYED\tminio-2.4.7 \t2019-02-12 \tae\n ae-prometheus\t1 \tThu Mar 21 05:57:16 2019\tDEPLOYED\tprometheus-8.9.0\t2.8.0 \tae\n ae-redis \t1 \tThu Mar 21 05:49:42 2019\tDEPLOYED\tredis-6.4.2 \t4.0.14 \tae\n\nComparing Repo Example Files vs Yours\n-------------------------------------\n\nWhen starting a server from scratch, I like to compare notes from previous builds. I have uploaded the Fedora 29 server's files to help debug common initial installer-type issues. Let me know if you think another one should be added to help others. Please take a moment to compare your server's configured files after the install finishes by looking at the `fedora/etc directory `__ with structure and notes:\n\n::\n\n tree fedora/etc/\n fedora/etc/\n \u251c\u2500\u2500 dnsmasq.conf # dnsmasq that was conflicting with named later (http://www.thekelleys.org.uk/dnsmasq/doc.html) - dnsqmasq was disabled and stopped on the server using systemctl\n \u251c\u2500\u2500 docker\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 daemon.json # examples for setting up your private docker registry\n \u251c\u2500\u2500 named.conf\n \u251c\u2500\u2500 NetworkManager\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 NetworkManager.conf # this is enabled and running using systemctl\n \u251c\u2500\u2500 resolv.conf # locked down with: sudo chattr +i /etc/resolv.conf\n \u251c\u2500\u2500 resolv.dnsmasq\n \u251c\u2500\u2500 ssh\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 sshd_config # initial ssh config for logging in remotely as fast as possible - please lock this down after install finishes\n \u251c\u2500\u2500 sysconfig\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 network-scripts\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ifcfg-br0 # bridge network device - required for persisting through a reboot\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ifcfg-eno1 # server network device - required for persisting through a reboot\n \u2514\u2500\u2500 var\n \u2514\u2500\u2500 named\n \u2514\u2500\u2500 example.com.zone # dns zone\n\nHow do I know when my VMs have an IP address?\n---------------------------------------------\n\nI use this bash alias in my ``~/.bashrc`` to monitor VMs on the ``br0`` device:\n\n::\n\n showips() {\n watch -n1 'sudo arp-scan -q -l --interface br0 | sort'\n }\n\nThen ``source ~/.bashrc`` and then run: ``showips`` to watch everything on the ``br0`` bridge networking device with each IP's MAC address. (Exit with ``ctrl + c``)\n\nManually Fix Fedora /etc/resolv.conf\n------------------------------------\n\nNetworkManager and dnsmasq had lots of conflicts initially. I used this method to **lock down** ``/etc/resolv.conf`` to ensure the dns routing was stable after reboots.\n\n::\n\n sudo su\n nmcli connection modify eth0 ipv4.dns \"192.168.0.100 8.8.8.8 8.8.4.4\"\n vi /etc/resolv.conf\n chattr +i /etc/resolv.conf\n systemctl restart NetworkManager\n\nWhat do I do when Rook-Ceph Uninstall Hangs?\n--------------------------------------------\n\nThe `rook-ceph operator `__ runs outside of Kubernetes on the nodes. Because this runs outside Kubernetes it can get into bad states requiring vm deletes and recreation for issues around server reboots. Please a open a PR if you know how to fix this uninstall issues.\n\nHere's `Rook-Ceph Troubleshooting Guide as well `__\n\nWhen I hit issues like below where there are pids that never die and are outside Kubernetes, I just destroy and recreate the VMs with: ``./kvm/_uninstall.sh; sleep 10; ./boot.sh``\n\n::\n\n root@m11:~# ps auwwx | grep ceph | grep -v grep\n root 14571 0.0 0.0 0 0 ? S< 22:59 0:00 [ceph-watch-noti]\n root 17532 0.0 0.0 123532 844 ? D 22:59 0:00 /usr/bin/mount -t xfs -o rw,defaults /dev/rbd1 /var/lib/kubelet/plugins/ceph.rook.io/rook-ceph-system/mounts/pvc-9aaa30e5-535e-11e9-9fb8-0010019c9110\n root 19537 0.0 0.0 0 0 ? S< 22:58 0:00 [ceph-msgr]\n root@m11:~# kill -9 17532\n root@m11:~# kill -9 14571\n root@m11:~# kill -9 19537\n root@m11:~# kill -9 $(ps auwwx | grep ceph | grep -v grep | awk '{print $2}')\n root@m11:~# ps auwwx | grep ceph | grep -v grep\n root 14571 0.0 0.0 0 0 ? S< 22:59 0:00 [ceph-watch-noti]\n root 17532 0.0 0.0 123532 844 ? D 22:59 0:00 /usr/bin/mount -t xfs -o rw,defaults /dev/rbd1 /var/lib/kubelet/plugins/ceph.rook.io/rook-ceph-system/mounts/pvc-9aaa30e5-535e-11e9-9fb8-0010019c9110\n root 19537 0.0 0.0 0 0 ? S< 22:58 0:00 [ceph-msgr]\n root@m11:~#\n\nKubeadm Reset or Deleting /var/lib/kubelet Hangs Forever\n--------------------------------------------------------\n\nPlease review the official guide for help:\nhttps://kubernetes.io/docs/setup/independent/troubleshooting-kubeadm/#kubeadm-blocks-when-removing-managed-containers\n\nHere is a stack trace seen running ``dmesg``:\n\n::\n\n [ 841.081661] INFO: task alertmanager:27274 blocked for more than 120 seconds.\n [ 841.086662] \"echo 0 > /proc/sys/kernel/hung_task_timeout_secs\" disables this message.\n [ 841.090801] alertmanager D ffff9cd1d3e38640 0 27274 27158 0x00000084\n [ 841.094932] Call Trace:\n [ 841.096929] [] ? __switch_to+0x151/0x580\n [ 841.100066] [] schedule+0x29/0x70\n [ 841.102759] [] schedule_timeout+0x221/0x2d0\n [ 841.105984] [] ? blk_finish_plug+0x14/0x40\n [ 841.109079] [] wait_for_completion+0xfd/0x140\n [ 841.112144] [] ? wake_up_state+0x20/0x20\n [ 841.115060] [] ? _xfs_buf_read+0x23/0x40 [xfs]\n [ 841.118251] [] xfs_buf_submit_wait+0xf9/0x1d0 [xfs]\n [ 841.121630] [] ? xfs_trans_read_buf_map+0x211/0x400 [xfs]\n [ 841.125157] [] _xfs_buf_read+0x23/0x40 [xfs]\n [ 841.128128] [] xfs_buf_read_map+0xf9/0x160 [xfs]\n [ 841.131806] [] xfs_trans_read_buf_map+0x211/0x400 [xfs]\n [ 841.135206] [] xfs_read_agi+0x9d/0x130 [xfs]\n [ 841.138502] [] xfs_ialloc_read_agi+0x34/0xd0 [xfs]\n [ 841.141801] [] xfs_ialloc_pagi_init+0x31/0x70 [xfs]\n [ 841.145038] [] xfs_ialloc_ag_select+0x18f/0x220 [xfs]\n [ 841.148463] [] xfs_dialloc+0x8f/0x280 [xfs]\n [ 841.151466] [] xfs_ialloc+0x71/0x520 [xfs]\n [ 841.154291] [] ? xlog_grant_head_check+0x54/0x100 [xfs]\n [ 841.157607] [] xfs_dir_ialloc+0x73/0x1f0 [xfs]\n [ 841.160588] [] ? down_write+0x12/0x3d\n [ 841.163299] [] xfs_create+0x498/0x750 [xfs]\n [ 841.166212] [] xfs_generic_create+0xd0/0x2b0 [xfs]\n [ 841.169452] [] xfs_vn_mknod+0x14/0x20 [xfs]\n [ 841.172378] [] xfs_vn_create+0x13/0x20 [xfs]\n [ 841.175338] [] vfs_create+0xd3/0x140\n [ 841.178045] [] do_last+0x10cd/0x12a0\n [ 841.180818] [] ? selinux_file_alloc_security+0x3c/0x60\n [ 841.184077] [] path_openat+0xd7/0x640\n [ 841.186864] [] do_filp_open+0x4d/0xb0\n [ 841.189668] [] ? __alloc_fd+0x47/0x170\n [ 841.192394] [] do_sys_open+0x137/0x240\n [ 841.195172] [] ? system_call_after_swapgs+0xa2/0x146\n [ 841.198288] [] SyS_openat+0x14/0x20\n [ 841.201016] [] system_call_fastpath+0x22/0x27\n [ 841.203957] [] ? system_call_after_swapgs+0xae/0x146\n\nAdditionally there are times where the user is prevented from manually deleting the ``/var/lib/kubelet/`` directory (likely due to some mounted volume) and this hangs the ssh session where even ``ctrl + c`` fails to stop it:\n\n::\n\n root@m10:~# rm -rf /var/lib/kubelet/*\n ^C^C^C\n\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jay-johnson/metalnetes", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "metalnetes", "package_url": "https://pypi.org/project/metalnetes/", "platform": "", "project_url": "https://pypi.org/project/metalnetes/", "project_urls": { "Homepage": "https://github.com/jay-johnson/metalnetes" }, "release_url": "https://pypi.org/project/metalnetes/1.0.16/", "requires_dist": [ "awscli", "boto3", "bs4", "celery", "celery[redis]", "colorlog", "coverage", "flake8 (<=3.4.1)", "future", "mock", "pep8 (>=1.7.1)", "pycodestyle (<=2.3.1)", "pylint", "recommonmark", "redis (>=3.2.0)", "sphinx", "sphinx-autobuild", "sphinx-rtd-theme", "tabulate", "unittest2", "urllib3 (<=1.23)", "ujson" ], "requires_python": "", "summary": "Tools for managing multiple Kubernetes clusters on KVM (on 3 Centos 7 VMs) running on a bare metal Fedora 29 server (Ubuntu 18.04 was tested until Kubernetes v1.14)", "version": "1.0.16" }, "last_serial": 5122066, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "8847ef09098a09fc9d374716a0429a98", "sha256": "5f8fbd41df0d44a74c6f20085443201f6e16fce5a7d5ef6bc0fc33822c0967fb" }, "downloads": -1, "filename": "metalnetes-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8847ef09098a09fc9d374716a0429a98", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8944, "upload_time": "2019-03-20T07:16:52", "url": "https://files.pythonhosted.org/packages/d4/47/047ffb7aab4d1a91179df428736694c388bb86885347c3e62a78b3c53714/metalnetes-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "efd82a1a941b917afb7c3ff8ba913663", "sha256": "683f45de52c14da2bb3fdd74f508c11bb5d5f056b7246682fc3775d214d2d81d" }, "downloads": -1, "filename": "metalnetes-1.0.0.tar.gz", "has_sig": false, "md5_digest": "efd82a1a941b917afb7c3ff8ba913663", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5772, "upload_time": "2019-03-20T07:16:54", "url": "https://files.pythonhosted.org/packages/d0/e2/5bff3707a204a40d909427cebc4e44ab74212da8377d23bc215946704045/metalnetes-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "587e90dd98e36ba159016328123a9b38", "sha256": "f73866068a795c60185088db0644e39d65a7768553aeb9bfb4d9cdc41547f6ac" }, "downloads": -1, "filename": "metalnetes-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "587e90dd98e36ba159016328123a9b38", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9140, "upload_time": "2019-03-21T05:20:42", "url": "https://files.pythonhosted.org/packages/c3/6c/acacf1d1d450b64534bfa9dde1f53f115aa00af61e8ebb509a2852568e25/metalnetes-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9da5e9e80a271c23108169acf7edd563", "sha256": "879234034a4c44938c4f93db329ba392519f5d9f25920026cf0925e1be73f2c9" }, "downloads": -1, "filename": "metalnetes-1.0.1.tar.gz", "has_sig": false, "md5_digest": "9da5e9e80a271c23108169acf7edd563", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6014, "upload_time": "2019-03-21T05:20:43", "url": "https://files.pythonhosted.org/packages/0c/14/108c3883cf072d2b90f21cd1a2b1259d90892f552cf8ae13939225b6fe9b/metalnetes-1.0.1.tar.gz" } ], "1.0.10": [ { "comment_text": "", "digests": { "md5": "7a2dfde5ac264395ddc3f1d84ebf7b92", "sha256": "6e25121bc1150991b3e2ecfdc5ab404d285574e67c2795eb933e7f3c41960a66" }, "downloads": -1, "filename": "metalnetes-1.0.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7a2dfde5ac264395ddc3f1d84ebf7b92", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12275, "upload_time": "2019-03-28T18:22:21", "url": "https://files.pythonhosted.org/packages/61/6a/9b42ad1317209ace563e85a25fa2eaf0de83fb9106ee1450aab0dcc0caa2/metalnetes-1.0.10-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2bd2fa59e92b0b830fc366957d42adf8", "sha256": "ed71229e5d8c62e3737fb45b34bc2acc266ff52c14726ed9512a0bc61e992861" }, "downloads": -1, "filename": "metalnetes-1.0.10.tar.gz", "has_sig": false, "md5_digest": "2bd2fa59e92b0b830fc366957d42adf8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11143, "upload_time": "2019-03-28T18:22:22", "url": "https://files.pythonhosted.org/packages/39/fa/d466c62014fb74483d767e2d365b5d4d93332b54d1379fb62bd4dd3c5195/metalnetes-1.0.10.tar.gz" } ], "1.0.11": [ { "comment_text": "", "digests": { "md5": "6c444805c6a4b0552f2ef58413989424", "sha256": "336a28b075a681c58ca4ddc24659b7b84010b190e1ffd30ce5da1c0023d7999f" }, "downloads": -1, "filename": "metalnetes-1.0.11-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6c444805c6a4b0552f2ef58413989424", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12270, "upload_time": "2019-03-28T18:26:23", "url": "https://files.pythonhosted.org/packages/17/9a/1aa4f30d5853f8561fc44aaeef378943ee184561aaae3a5989774a3d5127/metalnetes-1.0.11-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bad8ccb8156981911078b41007fde5f1", "sha256": "6eda9d974af846439b970e5481925f70dba00a5503f6d853b6a702ca2d5d94bc" }, "downloads": -1, "filename": "metalnetes-1.0.11.tar.gz", "has_sig": false, "md5_digest": "bad8ccb8156981911078b41007fde5f1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11128, "upload_time": "2019-03-28T18:26:24", "url": "https://files.pythonhosted.org/packages/45/19/070b15432ca72d9fa2ede6287461e01cb7f5322790a6dca82a25157e0968/metalnetes-1.0.11.tar.gz" } ], "1.0.12": [ { "comment_text": "", "digests": { "md5": "3b8fa7b00bc96a70446d4c5d13f3a4d2", "sha256": "4ad02a4b39d52e2f88f93833cf566838010765ccd8a00f607309ac63b7038a4e" }, "downloads": -1, "filename": "metalnetes-1.0.12-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3b8fa7b00bc96a70446d4c5d13f3a4d2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14056, "upload_time": "2019-04-01T00:16:19", "url": "https://files.pythonhosted.org/packages/5d/83/6ee4a37c38a11f52b283e67c90795ea4569aecbb870e5b569f1b87bb4d14/metalnetes-1.0.12-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5ac0abf5326b46173a43e9af665fc084", "sha256": "aad47dcd0fb66d38305a19147f90aab7fbe743f65f2ec2eb547a6b9dbf0ab7a4" }, "downloads": -1, "filename": "metalnetes-1.0.12.tar.gz", "has_sig": false, "md5_digest": "5ac0abf5326b46173a43e9af665fc084", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19511, "upload_time": "2019-04-01T00:16:21", "url": "https://files.pythonhosted.org/packages/50/9d/9c9fe2f0dcdba389300ce5d3f5edee60c90b3c62f4563adaa3f27d420a3d/metalnetes-1.0.12.tar.gz" } ], "1.0.13": [ { "comment_text": "", "digests": { "md5": "86d69fc205f8e49c0c203af9b5c44362", "sha256": "d2b102a4ca288ec998d73b4396533c4d545af82e53fa036f4316e2c20c631d17" }, "downloads": -1, "filename": "metalnetes-1.0.13-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "86d69fc205f8e49c0c203af9b5c44362", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14057, "upload_time": "2019-04-01T01:54:21", "url": "https://files.pythonhosted.org/packages/e5/16/8696ae6d4cdd10d96260e1eca8ba57833b9cbdf102e84e8318e927e20c14/metalnetes-1.0.13-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "594e3facb474ace108a3a056b8c9cb76", "sha256": "fa0e2552cc99ecab0c6fe1e7e0f0b79a14b676be53ad8a79ed8f596a564e96b3" }, "downloads": -1, "filename": "metalnetes-1.0.13.tar.gz", "has_sig": false, "md5_digest": "594e3facb474ace108a3a056b8c9cb76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19513, "upload_time": "2019-04-01T01:54:23", "url": "https://files.pythonhosted.org/packages/1d/8c/f994fe0ae3aca1da49e5199783bbeea526250c3e5ff721b9b74d4ad64160/metalnetes-1.0.13.tar.gz" } ], "1.0.14": [ { "comment_text": "", "digests": { "md5": "5092500bbbf07c9882c6d8d964d16973", "sha256": "cc680a7f392207e0a50786fbe539c923d4b1c322c9b196322ef5b5b589b25144" }, "downloads": -1, "filename": "metalnetes-1.0.14-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5092500bbbf07c9882c6d8d964d16973", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14061, "upload_time": "2019-04-01T02:02:39", "url": "https://files.pythonhosted.org/packages/5e/e7/eb19c30e504c6d4e000177499b5f6f7d33a9b395bba6d51cc95bdbb0f7af/metalnetes-1.0.14-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "489cdea321f60a20eae4f988c15da518", "sha256": "8a473fb14700cb8c5735c02ed1ed2569191ed53651627949e118b140dc7a466f" }, "downloads": -1, "filename": "metalnetes-1.0.14.tar.gz", "has_sig": false, "md5_digest": "489cdea321f60a20eae4f988c15da518", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19514, "upload_time": "2019-04-01T02:02:41", "url": "https://files.pythonhosted.org/packages/f8/6b/67e8d1a5d70cdd701c18f48bc4ba15cf615cb22f870f1d5e2a1c558eae56/metalnetes-1.0.14.tar.gz" } ], "1.0.15": [ { "comment_text": "", "digests": { "md5": "b1460aa93ed971f09bad08644453d46e", "sha256": "2b85a9cf1f7dea1f7ed7a4d0a626b0bc5ca330d3589ab5a509848f8ab47c7190" }, "downloads": -1, "filename": "metalnetes-1.0.15-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b1460aa93ed971f09bad08644453d46e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14062, "upload_time": "2019-04-01T03:15:02", "url": "https://files.pythonhosted.org/packages/c1/57/51696c2507f73c3a935d38983bae9ddb6f96278545e03c60ae56f2ac023f/metalnetes-1.0.15-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f8d95c7d3c537df952b0d342d711f578", "sha256": "87df4ed07374661d6b76f3b1f7f99654c9d629011700f7c677290dc6b8c9bedd" }, "downloads": -1, "filename": "metalnetes-1.0.15.tar.gz", "has_sig": false, "md5_digest": "f8d95c7d3c537df952b0d342d711f578", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19511, "upload_time": "2019-04-01T03:15:03", "url": "https://files.pythonhosted.org/packages/86/3a/a4efbb6ea82125696b55d1f803dd723cb1fe57fcd2103f28301e4fda250c/metalnetes-1.0.15.tar.gz" } ], "1.0.16": [ { "comment_text": "", "digests": { "md5": "c8fe371796768940096f83f875695ff4", "sha256": "47ee65080fe53fd972b522ac7f3b13f4d51701d28068181e8d8a6d0558d18e47" }, "downloads": -1, "filename": "metalnetes-1.0.16-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c8fe371796768940096f83f875695ff4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14060, "upload_time": "2019-04-10T04:10:34", "url": "https://files.pythonhosted.org/packages/76/9b/39b8ec98260207734c3547cbbc9b6d871adb387f113ee7bf483ddc62e4f8/metalnetes-1.0.16-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2e242556e0935b9aecf248736e0a62ee", "sha256": "09c05db06da24ac2e0e765856c12cf90aa5653d7c723fadf5749608fc47d1424" }, "downloads": -1, "filename": "metalnetes-1.0.16.tar.gz", "has_sig": false, "md5_digest": "2e242556e0935b9aecf248736e0a62ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19518, "upload_time": "2019-04-10T04:10:36", "url": "https://files.pythonhosted.org/packages/1a/40/54c902e70b790595218b02042e8c2a1615bfeddbfebdde2862d06d3f3259/metalnetes-1.0.16.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "cca07ea795a923189ec290fc01c46f21", "sha256": "97a774e085b23d05f4116d43829d107c732dfce8306f6ea8f35fe94dabecab55" }, "downloads": -1, "filename": "metalnetes-1.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cca07ea795a923189ec290fc01c46f21", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9136, "upload_time": "2019-03-21T06:02:32", "url": "https://files.pythonhosted.org/packages/85/ea/8b7cf7425395f1fd64b1bd6018d3ee59e8cfacd6b095de26efadf16c2a7a/metalnetes-1.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3e0ec1847ba05a225517bda57ce1fc5c", "sha256": "e5f74a48369879e180e824ca0bcad739a1b6d12552f1709680d05a0626958a25" }, "downloads": -1, "filename": "metalnetes-1.0.2.tar.gz", "has_sig": false, "md5_digest": "3e0ec1847ba05a225517bda57ce1fc5c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6014, "upload_time": "2019-03-21T06:02:34", "url": "https://files.pythonhosted.org/packages/6d/5c/664ed24aeae1340210f8ba58dd5e765304f3b1739f6ab01f54cf861bf27a/metalnetes-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "a0d02d6f27695381e6193228f46e1b96", "sha256": "923827e3184d5211590a28700b2d93344835e17c761f7ccfa51133f219410195" }, "downloads": -1, "filename": "metalnetes-1.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a0d02d6f27695381e6193228f46e1b96", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9134, "upload_time": "2019-03-21T06:12:30", "url": "https://files.pythonhosted.org/packages/54/67/fc44f995dddbad9b6041a02071c9146c75cd164632659adefb14a787a49a/metalnetes-1.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c297b170777a496e47f531096efb9fae", "sha256": "72c0ab82bc7e30a786562798755780c0390d78e201d986e6ec967a61447ac3a6" }, "downloads": -1, "filename": "metalnetes-1.0.3.tar.gz", "has_sig": false, "md5_digest": "c297b170777a496e47f531096efb9fae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6014, "upload_time": "2019-03-21T06:12:39", "url": "https://files.pythonhosted.org/packages/29/24/067d8456025580fc458ae7135a457e6e7967efa842b55de4df3194542b20/metalnetes-1.0.3.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "6b50110d40a723694ba88d38aba19d6a", "sha256": "2f075ac20ca28fe465370a7e3e40b1d7b9ebf0b8e8f1fd75b3e1f5f463f1a230" }, "downloads": -1, "filename": "metalnetes-1.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6b50110d40a723694ba88d38aba19d6a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9271, "upload_time": "2019-03-21T06:29:29", "url": "https://files.pythonhosted.org/packages/f3/c4/36a534f65f3cd40eb49d1d9f5f3a85986eabb879e542fc940cc1456cb3e0/metalnetes-1.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "84cca00bd5c95c5ae7b2f73717d6eddd", "sha256": "a79c5eae580da9be3a970b51233705705b5136ff043ba88d45a3723dcd4e33c1" }, "downloads": -1, "filename": "metalnetes-1.0.5.tar.gz", "has_sig": false, "md5_digest": "84cca00bd5c95c5ae7b2f73717d6eddd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6166, "upload_time": "2019-03-21T06:29:30", "url": "https://files.pythonhosted.org/packages/2c/d3/8285553dd53492c95e82428b572c829cfb5f3d0c5be141d9e8db8bab739d/metalnetes-1.0.5.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "4268b3355406a86bb1d7356a1f168f5d", "sha256": "a3f4b05f4071ff383ae308ccc4e5fed55ae302704d44c64325213c9f7410d6f6" }, "downloads": -1, "filename": "metalnetes-1.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4268b3355406a86bb1d7356a1f168f5d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9849, "upload_time": "2019-03-22T00:19:33", "url": "https://files.pythonhosted.org/packages/09/0f/694572e6f10f0601d9241d5f47c8902f6fb51d3fc11e7797b37b30111aa2/metalnetes-1.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef6f5724d81cc60596a39c79e6d7adc0", "sha256": "67949f6181220a95f8163a113e0da2a54605ddcf3100556ffe7f9c9ff896a27d" }, "downloads": -1, "filename": "metalnetes-1.0.6.tar.gz", "has_sig": false, "md5_digest": "ef6f5724d81cc60596a39c79e6d7adc0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6940, "upload_time": "2019-03-22T00:19:34", "url": "https://files.pythonhosted.org/packages/0b/ed/7295ad902c9845ff119f53b331c45ea65d0b0baa33ce1731115f2ff8756c/metalnetes-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "c277b3d607c6fd4620ecbc37b02327b6", "sha256": "c03994755e086f89fc9ccb4147887da6956099a5d1e40a2027424f911918ef9f" }, "downloads": -1, "filename": "metalnetes-1.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c277b3d607c6fd4620ecbc37b02327b6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9913, "upload_time": "2019-03-22T03:51:25", "url": "https://files.pythonhosted.org/packages/1b/7c/378cb2ced6497e030d6e68b045d0e30bbb54ef79601e9539dfb2d278a29c/metalnetes-1.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "84f6cd85d3a936dfc611efe4bee70d97", "sha256": "8e7243c4399b008115fd6cb1b647ddf2871197c9803b3d491cda13384888c6ce" }, "downloads": -1, "filename": "metalnetes-1.0.7.tar.gz", "has_sig": false, "md5_digest": "84f6cd85d3a936dfc611efe4bee70d97", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7015, "upload_time": "2019-03-22T03:51:27", "url": "https://files.pythonhosted.org/packages/03/87/a1fe799497f752361fad0fe979df951684dd3fbec646e8ce6384c5761a99/metalnetes-1.0.7.tar.gz" } ], "1.0.8": [ { "comment_text": "", "digests": { "md5": "89c0d342bc438311d3dc770910bac99d", "sha256": "1b0f2426b025e1390a48ba3c809ea4d695d42ca730839dc51ab75f660b83b568" }, "downloads": -1, "filename": "metalnetes-1.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "89c0d342bc438311d3dc770910bac99d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12280, "upload_time": "2019-03-28T06:43:05", "url": "https://files.pythonhosted.org/packages/88/aa/f1460564380614b07c0f3c7f30bfdbab860a5b819d505f5d4e7560652f27/metalnetes-1.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a6e49b10f349fe52132fc24fd3bb819f", "sha256": "9ce320561b27d9afc5e978891c76866bf24fbd47e4e92d106454cb4c97a0138e" }, "downloads": -1, "filename": "metalnetes-1.0.8.tar.gz", "has_sig": false, "md5_digest": "a6e49b10f349fe52132fc24fd3bb819f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11181, "upload_time": "2019-03-28T06:43:07", "url": "https://files.pythonhosted.org/packages/0b/34/06748ee074f87a10412dcf0f6331d0334104e90ef15440fc9a16564115b9/metalnetes-1.0.8.tar.gz" } ], "1.0.9": [ { "comment_text": "", "digests": { "md5": "d374ec78f73cbe8f6cafb645791a6dfa", "sha256": "0a2c2e6dd6769e76cfd75f049fca22fc96faa4ddc8a7013abb14dfa6e3a10f31" }, "downloads": -1, "filename": "metalnetes-1.0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d374ec78f73cbe8f6cafb645791a6dfa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12286, "upload_time": "2019-03-28T06:54:38", "url": "https://files.pythonhosted.org/packages/ce/41/0d4f2be7fe2bc391624504b8e3c2ebb041545511d520944c4f5d95a7f229/metalnetes-1.0.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5328b96f41d67a7367ff7efc029e00f7", "sha256": "0c067d15ddc551a1f4441ff93c233affcde735413a597c809fe898a90389c945" }, "downloads": -1, "filename": "metalnetes-1.0.9.tar.gz", "has_sig": false, "md5_digest": "5328b96f41d67a7367ff7efc029e00f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11191, "upload_time": "2019-03-28T06:54:40", "url": "https://files.pythonhosted.org/packages/97/7f/dc27d2946394cec82eb868cac00256d0e47971b7d2cd996a9f12f7d66339/metalnetes-1.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c8fe371796768940096f83f875695ff4", "sha256": "47ee65080fe53fd972b522ac7f3b13f4d51701d28068181e8d8a6d0558d18e47" }, "downloads": -1, "filename": "metalnetes-1.0.16-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c8fe371796768940096f83f875695ff4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14060, "upload_time": "2019-04-10T04:10:34", "url": "https://files.pythonhosted.org/packages/76/9b/39b8ec98260207734c3547cbbc9b6d871adb387f113ee7bf483ddc62e4f8/metalnetes-1.0.16-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2e242556e0935b9aecf248736e0a62ee", "sha256": "09c05db06da24ac2e0e765856c12cf90aa5653d7c723fadf5749608fc47d1424" }, "downloads": -1, "filename": "metalnetes-1.0.16.tar.gz", "has_sig": false, "md5_digest": "2e242556e0935b9aecf248736e0a62ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19518, "upload_time": "2019-04-10T04:10:36", "url": "https://files.pythonhosted.org/packages/1a/40/54c902e70b790595218b02042e8c2a1615bfeddbfebdde2862d06d3f3259/metalnetes-1.0.16.tar.gz" } ] }