{ "info": { "author": "Matthieu Simonin", "author_email": "matthieu.simonin@inria.fr", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Science/Research", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "===============\npython-grid5000\n===============\n\n\n``python-grid5000`` is a python package wrapping the Grid\u20195000 REST API. You can\nuse it as a library in your python project or you can explore the Grid\u20195000\nresources interactively using the embedded shell.\n\n.. warning::\n\n The code is currently being developed heavily. Jump to the contributing section\n if you want to be involved.\n\n1 Thanks\n--------\n\nThe core code is borrowed from `python-gitlab `_ with small adaptations to\nconform with the Grid5000 API models (with an \u2019s\u2019!)\n\n2 Contributing\n--------------\n\n- To contribute, you can drop me an email or open an issue for a bug report, or feature request.\n\n- There are many areas where this can be improved some of them are listed here:\n\n - The complete coverage of the API isn\u2019t finished (yet) but this should be fairly easy to reach.\n Most of the logic go in ```grid5000.objects`` `_. And to be honnest I only\n implemented the feature that I needed the most.\n\n - Returned `status code `_ aren\u2019t yet well treated.\n\n3 Comparison with ...\n---------------------\n\n- `RESTfully `_: \n It consumes REST API following the `HATEOAS `_ principles. This allows the client\n to fully discover the resources and actions available. Most of the G5K API\n follow theses principles but, for instance the `Storage API `_ don\u2019t. Thus\n RESTfully isn\u2019t compatible with all the features offered by the Grid\u20195000 API.\n It\u2019s a ruby library. Python-grid5000 borrows the friendly syntax for resource\n browsing, but in python.\n\n- `Execo `_: \n Written in Python. The api module gathers a lot of utils functions leveraging\n the Grid\u20195000 API. Resources aren\u2019t exposed in a syntax friendly manner,\n instead functions for some classical operations are exposed (mainly getters).\n It has a convenient way of caching the reference API. Python-grid5000 is a\n wrapper around the Grid\u20195000 that seeks 100% coverage. Python-grid5000 is\n resource oriented.\n\n- `Raw requests `_: \n **The** reference for HTTP library in python. Good for prototyping but low-level.\n python-grid5000 encapsulates this library.\n\n4 Installation and examples\n---------------------------\n\n- Please refer to `https://api.grid5000.fr/doc/4.0/reference/spec.html `_ for \n the complete specification.\n\n- All the examples are exported in the examples subdirectory so you can\n easily test and adapt them.\n\n- The configuration is read from a configuration file located in the home\n directory (should be compatible with the restfully one). \n It can be created with the following:\n\n::\n\n echo '\n username: MYLOGIN\n password: MYPASSWORD\n ' > ~/.python-grid5000.yaml\n\n.. hint::\n\n From a Grid\u20195000 frontend this file is optionnal. In all other cases the\n configuration file is mandatory.\n\n- Using a virtualenv is recommended (python 3.5+ is required)\n\n::\n\n virtualenv -p python3 venv\n source venv/bin/activate\n pip install python-grid5000\n\n4.1 Grid\u20195000 shell\n~~~~~~~~~~~~~~~~~~~\n\nIf you call ``grid5000`` on the command line you should land in a ipython shell.\nBefore starting, the file ``$HOME/.python-grid5000.yaml`` will be loaded.\n\n::\n\n $) grid5000\n\n Python 3.6.5 (default, Jun 17 2018, 21:32:15) \n Type 'copyright', 'credits' or 'license' for more information\n IPython 7.3.0 -- An enhanced Interactive Python. Type '?' for help.\n\n In [1]: gk.sites.list() \n Out[1]: \n [,\n ,\n ,\n ,\n ,\n ,\n ,\n ]\n\n In [2]: # gk is your entry point \n\n4.2 Reference API\n~~~~~~~~~~~~~~~~~\n\n4.2.1 Get node information\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n import logging\n import os\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n node_info = gk.sites[\"nancy\"].clusters[\"grisou\"].nodes[\"grisou-1\"]\n print(\"grisou-1 has {threads} threads and has {ram} bytes of RAM\".format(\n threads=node_info.architecture[\"nb_threads\"],\n ram=node_info.main_memory[\"ram_size\"]))\n\n4.2.2 Get Versions of resources\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n import logging\n import os\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n root_versions = gk.root.get().versions.list()\n print(root_versions)\n\n rennes = gk.sites[\"rennes\"]\n site_versions = rennes.versions.list()\n print(site_versions)\n\n cluster = rennes.clusters[\"paravance\"]\n cluster_versions = cluster.versions.list()\n print(cluster_versions)\n\n node_versions = cluster.nodes[\"paravance-1\"]\n print(node_versions)\n\n4.3 Monitoring API\n~~~~~~~~~~~~~~~~~~\n\n4.3.1 Get Statuses of resources\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n import logging\n import os\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n rennes = gk.sites[\"rennes\"]\n site_statuses = rennes.status.list()\n print(site_statuses)\n\n cluster = rennes.clusters[\"paravance\"]\n cluster_statuses = cluster.status.list()\n\n4.4 Job API\n~~~~~~~~~~~\n\n4.4.1 Job filtering\n^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n import logging\n import os\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n # state=running will be placed in the query params\n running_jobs = gk.sites[\"rennes\"].jobs.list(state=\"running\")\n print(running_jobs)\n\n # get a specific job by its uid\n job = gk.sites[\"rennes\"].jobs.get(\"424242\")\n print(job)\n # or using the bracket notation\n job = gk.sites[\"rennes\"].jobs[\"424242\"]\n print(job)\n\n4.4.2 Submit a job\n^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n import logging\n import os\n import time\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n # This is equivalent to gk.sites.get(\"rennes\")\n site = gk.sites[\"rennes\"]\n\n job = site.jobs.create({\"name\": \"pyg5k\",\n \"command\": \"sleep 3600\"})\n\n while job.state != \"running\":\n job.refresh()\n print(\"Waiting for the job [%s] to be running\" % job.uid)\n time.sleep(10)\n\n print(job)\n print(\"Assigned nodes : %s\" % job.assigned_nodes)\n\n4.5 Deployment API\n~~~~~~~~~~~~~~~~~~\n\n4.5.1 Deploy an environment\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n import logging\n import os\n import time\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n # This is equivalent to gk.sites.get(\"rennes\")\n site = gk.sites[\"rennes\"]\n\n job = site.jobs.create({\"name\": \"pyg5k\",\n \"command\": \"sleep 3600\",\n \"types\": [\"deploy\"]})\n\n while job.state != \"running\":\n job.refresh()\n print(\"Waiting the job [%s] to be running\" % job.uid)\n time.sleep(10)\n\n print(\"Assigned nodes : %s\" % job.assigned_nodes)\n\n deployment = site.deployments.create({\"nodes\": job.assigned_nodes,\n \"environment\": \"debian9-x64-min\"})\n # To get SSH access to your nodes you can pass your public key\n #\n # from pathlib import Path\n #\n # key_path = Path.home().joinpath(\".ssh\", \"id_rsa.pub\")\n #\n #\n # deployment = site.deployments.create({\"nodes\": job.assigned_nodes,\n # \"environment\": \"debian9-x64-min\"\n # \"key\": key_path.read_text()})\n\n while deployment.status != \"terminated\":\n deployment.refresh()\n print(\"Waiting for the deployment [%s] to be finished\" % deployment.uid)\n time.sleep(10)\n\n print(deployment.result)\n\n4.6 Storage API\n~~~~~~~~~~~~~~~\n\n4.6.1 Get Storage accesses\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n import logging\n import os\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n print(gk.sites[\"rennes\"].storage[\"msimonin\"].access.list())\n\n4.6.2 Set storage accesses (e.g for vms)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n from netaddr import IPNetwork\n import logging\n import os\n import time\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n site = gk.sites[\"rennes\"]\n\n job = site.jobs.create({\"name\": \"pyg5k\",\n \"command\": \"sleep 3600\",\n \"resources\": \"slash_22=1+nodes=1\"})\n\n while job.state != \"running\":\n job.refresh()\n print(\"Waiting the job [%s] to be running\" % job.uid)\n time.sleep(5)\n\n subnet = job.resources_by_type['subnets'][0]\n ip_network = [str(ip) for ip in IPNetwork(subnet)]\n\n # create acces for all ips in the subnet\n access = site.storage[\"msimonin\"].access.create({\"ipv4\": ip_network,\n \"termination\": {\"job\": job.uid,\n \"site\": site.uid}})\n\n4.7 Vlan API\n~~~~~~~~~~~~\n\n4.7.1 Get vlan(s)\n^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n import logging\n import os\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n site = gk.sites[\"rennes\"]\n\n # Get all vlans\n vlans = site.vlans.list()\n print(vlans)\n\n # Get on specific\n vlan = site.vlans.get(\"4\")\n print(vlan)\n\n vlan = site.vlans[\"4\"]\n print(vlan)\n\n # Get vlan of some nodes\n print(site.vlansnodes.submit({\"nodes\": [\"paravance-1.rennes.grid5000.fr\", \"paravance-2.rennes.grid5000.fr\"]}))\n\n\n # Get nodes in vlan\n print(site.vlans[\"4\"].nodes.list())\n\n4.7.2 Set nodes in vlan\n^^^^^^^^^^^^^^^^^^^^^^^\n\n- Putting primary interface in a vlan\n\n .. code:: python\n\n import logging\n import os\n import time\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n site = gk.sites[\"rennes\"]\n\n job = site.jobs.create({\"name\": \"pyg5k\",\n \"command\": \"sleep 3600\",\n \"resources\": \"{type='kavlan'}/vlan=1+nodes=1\",\n \"types\": [\"deploy\"]})\n\n while job.state != \"running\":\n job.refresh()\n print(\"Waiting the job [%s] to be runnning\" % job.uid)\n time.sleep(5)\n\n deployment = site.deployments.create({\"nodes\": job.assigned_nodes,\n \"environment\": \"debian9-x64-min\",\n \"vlan\": job.resources_by_type[\"vlans\"][0]})\n\n while deployment.status != \"terminated\":\n deployment.refresh()\n print(\"Waiting for the deployment [%s] to be finished\" % deployment.uid)\n time.sleep(10)\n\n print(deployment.result)\n\n- Putting the secondary interface in a vlan\n\n .. code:: python\n\n import logging\n import os\n import time\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n\n def _to_network_address(host, interface):\n \"\"\"Translate a host to a network address\n e.g:\n paranoia-20.rennes.grid5000.fr -> paranoia-20-eth2.rennes.grid5000.fr\n \"\"\"\n splitted = host.split('.')\n splitted[0] = splitted[0] + \"-\" + interface\n\n return \".\".join(splitted)\n\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n site = gk.sites[\"rennes\"]\n\n job = site.jobs.create({\"name\": \"pyg5k\",\n \"command\": \"sleep 3600\",\n \"resources\": \"{type='kavlan'}/vlan=1+{cluster='paranoia'}nodes=1\",\n \"types\": [\"deploy\"]\n })\n\n while job.state != \"running\":\n job.refresh()\n print(\"Waiting the job [%s] to be runnning\" % job.uid)\n time.sleep(5)\n\n vlanid = job.resources_by_type[\"vlans\"][0]\n\n # we hard code the interface but this can be discovered in the node info\n # TODO: write the code here to discover\n nodes = [_to_network_address(n, \"eth2\") for n in job.assigned_nodes]\n print(nodes)\n\n # set in vlan\n site.vlans[vlanid].submit({\"nodes\": nodes})\n\n4.8 More snippets\n~~~~~~~~~~~~~~~~~\n\n4.8.1 Site of a cluster\n^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n import logging\n import os\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n clusters = [\"dahu\", \"parasilo\", \"chetemi\"]\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n sites = gk.sites.list()\n matches = []\n for site in sites:\n candidates = site.clusters.list()\n matching = [c.uid for c in candidates if c.uid in clusters]\n if len(matching) == 1:\n matches.append((site, matching[0]))\n clusters.remove(matching[0])\n print(\"We found the following matches %s\" % matches)\n\n4.8.2 Get all job with a given name on all the sites\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n\n import logging\n import os\n\n from grid5000 import Grid5000\n\n\n logging.basicConfig(level=logging.DEBUG)\n\n NAME = \"pyg5k\"\n\n conf_file = os.path.join(os.environ.get(\"HOME\"), \".python-grid5000.yaml\")\n gk = Grid5000.from_yaml(conf_file)\n\n sites = gk.sites.list()\n site = gk.sites[\"rennes\"]\n sites = [gk.sites[\"rennes\"], gk.sites[\"nancy\"], gk.sites[\"grenoble\"]]\n\n # creates some jobs\n jobs = []\n for site in sites:\n job = site.jobs.create({\"name\": \"pyg5k\",\n \"command\": \"sleep 3600\"})\n jobs.append(job)\n\n _jobs = []\n for site in sites:\n _jobs.append((site.uid, site.jobs.list(name=NAME,\n state=\"waiting,launching,running\")))\n\n print(\"We found %s\" % _jobs)\n\n # deleting the jobs\n for job in jobs:\n job.delete()\n\n4.8.3 Caching API responses\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe Grid\u20195000 reference API is static. In this situation to speed up the\nrequests, one could leverage heavily on caching. Currently\n``python-grid5000`` doesn\u2019t do caching out-of the box but defers that to the\nconsuming application. There are many solutions to implement a cache.\nAmongst them LRU cache\n(`https://docs.python.org/3/library/functools.html#functools.lru_cache `_)\nprovides an in-memory caching facilities but doesn\u2019t give you control on the\ncache. The ring library (`https://ring-cache.readthedocs.io/en/stable/ `_) is\ngreat as it implements different backends for your cache (esp.\ncross-processes cache) and give you control on the cached object. Enough talking:\n\n\n.. code:: python\n\n import logging\n import threading\n import os\n\n import diskcache\n from grid5000 import Grid5000\n import ring\n\n\n _api_lock = threading.Lock()\n # Keep track of the api client\n _api_client = None\n\n storage = diskcache.Cache('cachedir')\n\n def get_api_client():\n \"\"\"Gets the reference to the API cient (singleton).\"\"\"\n with _api_lock:\n global _api_client\n if not _api_client:\n conf_file = os.path.join(os.environ.get(\"HOME\"),\n \".python-grid5000.yaml\")\n _api_client = Grid5000.from_yaml(conf_file)\n\n return _api_client\n\n\n @ring.disk(storage)\n def get_sites_obj():\n \"\"\"Get all the sites.\"\"\"\n gk = get_api_client()\n return gk.sites.list()\n\n\n @ring.disk(storage)\n def get_all_clusters_obj():\n \"\"\"Get all the clusters.\"\"\"\n sites = get_sites_obj()\n clusters = []\n for site in sites:\n # should we cache the list aswell ?\n clusters.extend(site.clusters.list())\n return clusters\n\n\n if __name__ == \"__main__\":\n logging.basicConfig(level=logging.DEBUG)\n clusters = get_all_clusters_obj()\n print(clusters)\n print(\"Known key in the cache\")\n print(get_all_clusters_obj.get())\n print(\"Calling again the function is now faster\")\n clusters = get_all_clusters_obj()\n print(clusters)\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://gitlab.inria.fr/msimonin/python-grid5000", "keywords": "REST,evaluation,reproducible research,Grid5000", "license": "", "maintainer": "", "maintainer_email": "", "name": "python-grid5000", "package_url": "https://pypi.org/project/python-grid5000/", "platform": "", "project_url": "https://pypi.org/project/python-grid5000/", "project_urls": { "Homepage": "https://gitlab.inria.fr/msimonin/python-grid5000" }, "release_url": "https://pypi.org/project/python-grid5000/0.1.3/", "requires_dist": [ "requests (>=2.21)", "pyyaml (>=5.1)", "ipython (>=7.3.0)" ], "requires_python": "", "summary": "", "version": "0.1.3" }, "last_serial": 5949590, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "b427b986576096266d089d6b74676cf3", "sha256": "9f86ecc880247be308187dbc7279a2eadd4e2070bb017fb1eb9dcf96052e0d91" }, "downloads": -1, "filename": "python_grid5000-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b427b986576096266d089d6b74676cf3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15922, "upload_time": "2019-02-26T23:59:30", "url": "https://files.pythonhosted.org/packages/09/fb/8626d58cd8b6603e6c78095914231dfeb83faf791515b692fe4de3b49797/python_grid5000-0.0.1-py3-none-any.whl" } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "1ce3fb0b406117f24728515809d84b51", "sha256": "febdf7014f79661915559e3e99439dddd1de59017cf2dd2d15280738a1a5e3d5" }, "downloads": -1, "filename": "python_grid5000-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "1ce3fb0b406117f24728515809d84b51", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18156, "upload_time": "2019-03-17T15:53:16", "url": "https://files.pythonhosted.org/packages/b2/f1/76b078455783c1f371310975885e99e61fc36a48358cf3feaee7164df97e/python_grid5000-0.0.10-py3-none-any.whl" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "e78f60678f6d064d3169dcb1c704f9d8", "sha256": "7eebe798241bbb3e0385d5482ab5a97ef1f9464fa141a6e8c86a554a9d149269" }, "downloads": -1, "filename": "python_grid5000-0.0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "e78f60678f6d064d3169dcb1c704f9d8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18279, "upload_time": "2019-03-18T09:19:39", "url": "https://files.pythonhosted.org/packages/f3/b8/ae828fb7842e42e04883f2117f8c0077bd897c80d9e7f1902fdd424cb8c7/python_grid5000-0.0.11-py3-none-any.whl" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "da73efa9f9936342a797e64c2959d771", "sha256": "1332cfbb65ad955e4bbe59d285eb0b0f23ac3993eb9242ed717db3f91942b0fc" }, "downloads": -1, "filename": "python_grid5000-0.0.12-py3-none-any.whl", "has_sig": false, "md5_digest": "da73efa9f9936342a797e64c2959d771", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18280, "upload_time": "2019-03-18T18:09:49", "url": "https://files.pythonhosted.org/packages/2c/f3/ed3073565aeb59c9b576dd41255000dbdd3374df54924fe20dfd86e60f62/python_grid5000-0.0.12-py3-none-any.whl" } ], "0.0.13": [ { "comment_text": "", "digests": { "md5": "3589c2b8ca9deec3e82e8761221f0eca", "sha256": "dc911acf6b8e63f982f9984abdf404203aec45b69531b714f7ea3da64ac45fe0" }, "downloads": -1, "filename": "python_grid5000-0.0.13-py3-none-any.whl", "has_sig": false, "md5_digest": "3589c2b8ca9deec3e82e8761221f0eca", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18306, "upload_time": "2019-03-28T14:01:17", "url": "https://files.pythonhosted.org/packages/72/1a/15e88ef3f1a74af7d4cf75c739868b965051ec39fd4cf338c5f77266d236/python_grid5000-0.0.13-py3-none-any.whl" } ], "0.0.14": [ { "comment_text": "", "digests": { "md5": "a31638be856eceb048e561090af81f8c", "sha256": "82a5c4615a40aedf63bd1d0a822ed3d71bbf13c812674da077e6e30aa371247c" }, "downloads": -1, "filename": "python_grid5000-0.0.14-py3-none-any.whl", "has_sig": false, "md5_digest": "a31638be856eceb048e561090af81f8c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18386, "upload_time": "2019-04-20T20:40:06", "url": "https://files.pythonhosted.org/packages/5f/fc/f71c30d4bdf949a4567332d17e40c3aa1145b11d6956db56421acc844b8f/python_grid5000-0.0.14-py3-none-any.whl" } ], "0.0.15": [ { "comment_text": "", "digests": { "md5": "528202722a2a6b10f09e160e1318d246", "sha256": "0553b545e1244b36269a2f0a2c44d99ceaacc6c6c6bb65cec233f8e7eacd4efc" }, "downloads": -1, "filename": "python_grid5000-0.0.15-py3-none-any.whl", "has_sig": false, "md5_digest": "528202722a2a6b10f09e160e1318d246", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18422, "upload_time": "2019-04-23T10:02:20", "url": "https://files.pythonhosted.org/packages/22/ca/8a2dbdae21e74a4c7d5fabf471306c44ba684bff0cf6d7ed7b44769b528b/python_grid5000-0.0.15-py3-none-any.whl" } ], "0.0.16": [ { "comment_text": "", "digests": { "md5": "e9d0731ef290f89dff8c2620484ded8c", "sha256": "003436a7d90e8e1445a089efe228142b3c2152030da9e70b5799e8f41d5d86d5" }, "downloads": -1, "filename": "python_grid5000-0.0.16-py3-none-any.whl", "has_sig": false, "md5_digest": "e9d0731ef290f89dff8c2620484ded8c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18532, "upload_time": "2019-05-27T14:49:23", "url": "https://files.pythonhosted.org/packages/54/8c/3b83fcaf5ccbc2a5452a7af4b405914e2f33b20567e89a3cc359b51e6a85/python_grid5000-0.0.16-py3-none-any.whl" } ], "0.0.17": [ { "comment_text": "", "digests": { "md5": "c168c4c0187c6016fba8705d273e838d", "sha256": "c9228c1a097b9f82c29bf8544c3d1143fe089baed75caf90c16266ade19ce0b7" }, "downloads": -1, "filename": "python_grid5000-0.0.17-py3-none-any.whl", "has_sig": false, "md5_digest": "c168c4c0187c6016fba8705d273e838d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18531, "upload_time": "2019-05-27T14:49:30", "url": "https://files.pythonhosted.org/packages/31/80/7d67d420b86080b96e1baafe48c5c001fd7f0c7e58637b75b632c6ce33c2/python_grid5000-0.0.17-py3-none-any.whl" } ], "0.0.18": [ { "comment_text": "", "digests": { "md5": "f9f317d6b5d068af6fa5b24d07b3a38e", "sha256": "43be45d82581a279a01429bb354bc265eea60d701ec3ebc573562e5855df7166" }, "downloads": -1, "filename": "python_grid5000-0.0.18-py3-none-any.whl", "has_sig": false, "md5_digest": "f9f317d6b5d068af6fa5b24d07b3a38e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18549, "upload_time": "2019-05-29T17:06:59", "url": "https://files.pythonhosted.org/packages/fc/d9/3196c151e4ad60ccae7c1c23e16c094c140d185ce8be1fb3bcc28f1f40f0/python_grid5000-0.0.18-py3-none-any.whl" } ], "0.0.19": [ { "comment_text": "", "digests": { "md5": "9c82917477bd77c3d28ba18d53cf9bbc", "sha256": "edf74df5eafc1af700291c8ddcbf74aaf283e2f36e26a1e262adf52bc4e52fa4" }, "downloads": -1, "filename": "python_grid5000-0.0.19-py3-none-any.whl", "has_sig": false, "md5_digest": "9c82917477bd77c3d28ba18d53cf9bbc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19252, "upload_time": "2019-06-05T13:30:37", "url": "https://files.pythonhosted.org/packages/ba/91/b0e488a2876320771502d2e3b484bb157031bddaed40a98330aa101effb4/python_grid5000-0.0.19-py3-none-any.whl" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "767effefcd35f4c3303685d4c662bd48", "sha256": "aea37a8e9b7aa03cd76651957b2d992832b6ba5823694b11389bcb3b314bfaee" }, "downloads": -1, "filename": "python_grid5000-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "767effefcd35f4c3303685d4c662bd48", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15921, "upload_time": "2019-02-27T00:03:43", "url": "https://files.pythonhosted.org/packages/68/73/ccb8bdd98d67f428fbc836852169e5e9798209e8362fcd82a0244ceed9ae/python_grid5000-0.0.2-py3-none-any.whl" } ], "0.0.20": [ { "comment_text": "", "digests": { "md5": "125d5aea58e27a91f3a5c7eb2588c81f", "sha256": "96815341de9747c7d209369a252aef3f7ef0326eff1c9061c335fa26dd462a4f" }, "downloads": -1, "filename": "python_grid5000-0.0.20-py3-none-any.whl", "has_sig": false, "md5_digest": "125d5aea58e27a91f3a5c7eb2588c81f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19252, "upload_time": "2019-08-26T13:04:00", "url": "https://files.pythonhosted.org/packages/d0/80/1aaff71d80489364a0835b7f794306267d7ba9ee37af5d2a88c43dcf8d6a/python_grid5000-0.0.20-py3-none-any.whl" } ], "0.0.21": [ { "comment_text": "", "digests": { "md5": "4d5c63c72fd50fcfd78a6d63f163b821", "sha256": "4e4a6cb16d9fb69c6e1a43483d2908dfac8e9166a66feb874111d4059d2fc4b5" }, "downloads": -1, "filename": "python_grid5000-0.0.21-py3-none-any.whl", "has_sig": false, "md5_digest": "4d5c63c72fd50fcfd78a6d63f163b821", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19235, "upload_time": "2019-08-31T10:36:01", "url": "https://files.pythonhosted.org/packages/8c/e2/06afc1ba9ee128ca70341e9c2afa9014cf5fbdcaec1b9e115e66ee672b36/python_grid5000-0.0.21-py3-none-any.whl" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "577ea4dd4b6934a6d8ce34f3f9f523d8", "sha256": "20c58b78d8bceec440ca967c3d78a404ae2d743038fa80485ab28b97c01b10aa" }, "downloads": -1, "filename": "python_grid5000-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "577ea4dd4b6934a6d8ce34f3f9f523d8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15971, "upload_time": "2019-02-27T00:20:14", "url": "https://files.pythonhosted.org/packages/5f/65/fb49c8899d40a2e64d89cb70ad098544aa00f9d06e7ed6991382ea9329a7/python_grid5000-0.0.3-py3-none-any.whl" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "a03f743f96d95348a04e99f6d0dc4d7e", "sha256": "d2356ff16754b99cae1fe2c22304b82e01d226fd9201fa6b30a1cfaa847bd9e6" }, "downloads": -1, "filename": "python_grid5000-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "a03f743f96d95348a04e99f6d0dc4d7e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16207, "upload_time": "2019-02-28T23:06:46", "url": "https://files.pythonhosted.org/packages/08/09/db879f1023c39a0a572df5c005a570b4ac07542f7b4d56aa7b3a12f1f338/python_grid5000-0.0.4-py3-none-any.whl" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "6c0d05c9a4c55d3616abc6216b3e5155", "sha256": "401cb9d7e6fe24d1df57665234806f24199ad3f06370790159f05cc777c8d529" }, "downloads": -1, "filename": "python_grid5000-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "6c0d05c9a4c55d3616abc6216b3e5155", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16596, "upload_time": "2019-03-01T23:09:56", "url": "https://files.pythonhosted.org/packages/8e/87/5035b35444d97735ceba22671abc0df7c685caa586441a99bf7cf2a8d9f0/python_grid5000-0.0.5-py3-none-any.whl" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "597a7755356d5148d625b9e94c76cfe5", "sha256": "4f33fac45ba05ba115329b686beafd5767e912f0f408084c840194eca981e0db" }, "downloads": -1, "filename": "python_grid5000-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "597a7755356d5148d625b9e94c76cfe5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16689, "upload_time": "2019-03-03T12:37:01", "url": "https://files.pythonhosted.org/packages/f3/fe/2c454f9dc701b3b5f88570678169f4b03e767b298777c295f53f9d0905a8/python_grid5000-0.0.6-py3-none-any.whl" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "d1aa083621509d7c88fd8d5cb0a80ff6", "sha256": "a90926efc9083d962190113398f4451854391486fee22f0f8defa1c0ad4584a9" }, "downloads": -1, "filename": "python_grid5000-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "d1aa083621509d7c88fd8d5cb0a80ff6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16964, "upload_time": "2019-03-04T10:01:32", "url": "https://files.pythonhosted.org/packages/b5/e8/32eb8baaede0166b471e9821077464180d370ea9e00bae37b03272ca7a0b/python_grid5000-0.0.7-py3-none-any.whl" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "b6fd6fd7a84dc1741792f5a004cf17d6", "sha256": "a07d57fc8a7bc6a88b0b91927a4e8e263e472f0dfba964c56d41db55f4de88c1" }, "downloads": -1, "filename": "python_grid5000-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "b6fd6fd7a84dc1741792f5a004cf17d6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17882, "upload_time": "2019-03-04T23:04:17", "url": "https://files.pythonhosted.org/packages/5e/46/e4eb13df2c617e59f9fe4a21d733337e01601926951c541477880e9cd53c/python_grid5000-0.0.8-py3-none-any.whl" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "30ec263acb01aa082f0a41bfaae8c5fa", "sha256": "a598e090f1bcc8b00b4892e4bc3e58ec7ecdfcef81c8a771f8228efee0abe1ff" }, "downloads": -1, "filename": "python_grid5000-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "30ec263acb01aa082f0a41bfaae8c5fa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17899, "upload_time": "2019-03-05T07:57:06", "url": "https://files.pythonhosted.org/packages/47/23/84d6964f69f23245f7cba631876cf3ec7a4ed9bcf35afb4c0b47f1961cb1/python_grid5000-0.0.9-py3-none-any.whl" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "750831674f6503e968c2296b4db1698e", "sha256": "b29b07bd4b197747478e47f06d72d39850bdafa784eb8eb60412b278b64acaf4" }, "downloads": -1, "filename": "python_grid5000-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "750831674f6503e968c2296b4db1698e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19345, "upload_time": "2019-09-16T12:49:05", "url": "https://files.pythonhosted.org/packages/eb/1c/defb20d327efb3c10d2e4523a425bc764a7051b78242425adf0d23221b5d/python_grid5000-0.1.0-py3-none-any.whl" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "57491986ae512215c69c0ed6a0721d03", "sha256": "b832eee87dbb4c18626e06392fc267d3b4143f33674f43d6cda69835278a79b5" }, "downloads": -1, "filename": "python_grid5000-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "57491986ae512215c69c0ed6a0721d03", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19548, "upload_time": "2019-09-23T11:33:52", "url": "https://files.pythonhosted.org/packages/5c/c9/9df08a6e1e79fd9d3f72f677d80ab62f5d299f4003a2aeeee06e89508cbf/python_grid5000-0.1.1-py3-none-any.whl" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "575812db591c2fad24bed895c99e9426", "sha256": "93a5ec2f38da1dbdbb431dd96995f6ef5b35bfcc67dc0edbe56d6688ef2af2de" }, "downloads": -1, "filename": "python_grid5000-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "575812db591c2fad24bed895c99e9426", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19546, "upload_time": "2019-09-23T14:32:17", "url": "https://files.pythonhosted.org/packages/2e/de/27c981afa609ac941678c1cee07c3e57c10b50ec99b4ba6b76f88bd20bfc/python_grid5000-0.1.2-py3-none-any.whl" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "7aaf88b3224ee4f06998750aa79e4e5e", "sha256": "200d89d9a1354709384495279bc623ff4d2fed0d8acf5576866632b6f0f99daf" }, "downloads": -1, "filename": "python_grid5000-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "7aaf88b3224ee4f06998750aa79e4e5e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19608, "upload_time": "2019-10-09T12:50:16", "url": "https://files.pythonhosted.org/packages/bf/c4/31f6201a1cba10a34c1bdb4cf9825e3e8cb4d864c23e68006c503b5303e6/python_grid5000-0.1.3-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7aaf88b3224ee4f06998750aa79e4e5e", "sha256": "200d89d9a1354709384495279bc623ff4d2fed0d8acf5576866632b6f0f99daf" }, "downloads": -1, "filename": "python_grid5000-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "7aaf88b3224ee4f06998750aa79e4e5e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19608, "upload_time": "2019-10-09T12:50:16", "url": "https://files.pythonhosted.org/packages/bf/c4/31f6201a1cba10a34c1bdb4cf9825e3e8cb4d864c23e68006c503b5303e6/python_grid5000-0.1.3-py3-none-any.whl" } ] }