{ "cells": [ { "cell_type": "markdown", "id": "racial-puppy", "metadata": { "tags": [] }, "source": [ "# Setup and basic objects\n", "\n", "Get started with EnOSlib on Grid'5000.\n", "\n", "---\n", "\n", "- Website: https://discovery.gitlabpages.inria.fr/enoslib/index.html\n", "- Instant chat: https://framateam.org/enoslib\n", "---\n", "\n", "This is the first notebooks of a series that will let you discover the main features of EnOSlib/Grid'5000.\n", "\n", "If you want to actually execute them you'll need to setup your environment properly. \n", "We sum up here the different steps to achieve this process.\n", "\n", "1. Get a Grid'5000 account\n", " - Register using this [page](https://www.grid5000.fr/w/Grid5000:Get_an_account). \n", " Pay attention to the fact that uploading a SSH key (public part) is mandatory to perform any EnOSlib action.\n", " - Make sure the SSH connection is ready. You can follow this [tutorial](https://www.grid5000.fr/w/Getting_Started).\n", "2. Make sure EnOSlib is available in your notebook environment\n", " - Follow the steps [here](https://discovery.gitlabpages.inria.fr/enoslib/tutorials/grid5000.html#installation).\n", " Using a virtualenv is the way to go, make sure to use one.\n", " \n" ] }, { "cell_type": "markdown", "id": "8b961d12-5752-4181-a672-a00013c20163", "metadata": {}, "source": [ "## Testing the import" ] }, { "cell_type": "code", "execution_count": 1, "id": "indirect-delicious", "metadata": {}, "outputs": [], "source": [ "import enoslib as en" ] }, { "cell_type": "markdown", "id": "818254cb-c26f-4457-bf41-a2229eb8243d", "metadata": { "tags": [] }, "source": [ "## Resources abstractions\n", "\n", "In this notebook we won't execute anything remotely, instead we'll just cover some basic abstractions provided by the library.\n", "We start with the abstractions of the resources (machines and networks that are usually given by an infrastructure)\n", "\n", "\n", "### Host\n", "\n", "An host is anything we can connect to and act on it. Most of the time it corresponds to a machine reachable through SSH.\n", "The datastructure reflects this.\n", "\n", "Usually you don't instantiate hosts manually, instead they are brought to you by EnOSlib (because they depend on a scheduler decision like OAR on Grid'5000).\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "665c334b-6c6e-4ca1-95ed-010f683d81b0", "metadata": {}, "outputs": [], "source": [ "bare_host = en.Host(\"192.168.0.1\")\n", "host_with_alias = en.Host(\"192.168.0.2\", alias=\"one_alias\")\n", "host_with_alias_and_username = en.Host(\"192.168.0.3\", alias=\"one_alias\", user=\"foo\")" ] }, { "cell_type": "code", "execution_count": 15, "id": "ae526e0b-ca1a-429b-a3a1-a7d3623c9e28", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " <style> .enoslib {\n", " width: auto;\n", "}\n", "\n", ".enoslib_object {\n", " width: auto;\n", " font-size: 1em;\n", " line-height: 1.5;\n", " background-color: rgb(250, 249, 249);\n", " font-family: 'Segoe UI';\n", " color: black;\n", "}\n", "\n", ".enoslib_object ul {\n", " padding: 0;\n", "}\n", "\n", ".enoslib_object input+label {\n", " margin-bottom: 0%;\n", "}\n", "\n", ".object_name {\n", " padding: 6px 0 6px 3px;\n", " border-bottom-width: 1px;\n", " border-bottom-style: solid;\n", " border-bottom-color: #777;\n", " color: #555;\n", "}\n", "\n", ".object_name>div,\n", ".object_name>ul {\n", " display: inline;\n", " margin-top: 0;\n", " margin-bottom: 0;\n", "}\n", "\n", "ul {\n", " list-style: none !important;\n", " padding: 3px !important;\n", " margin: 0 !important;\n", "}\n", "\n", "input.att+label {\n", " display: inline-block;\n", " /*width: 140px;*/\n", " color: rgb(36, 35, 35);\n", " font-weight: 500;\n", " padding: 4px 0 2px 0;\n", "}\n", "\n", "input.att:enabled+label {\n", " cursor: pointer;\n", " width: auto;\n", "}\n", "\n", "input.att {\n", " display: none;\n", "}\n", "\n", "input.att+label:before {\n", " display: inline-block;\n", " content: '►';\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", "}\n", "\n", "input.att:checked+label:before {\n", " content: '▼';\n", "}\n", "\n", "input.att:disabled+label:before {\n", " content: none;\n", "}\n", "\n", "input.att+label>span {\n", " display: inline-block;\n", " margin-left: 4px;\n", "}\n", "\n", "input.att+label>span.len {\n", " font-size: small;\n", "}\n", "\n", "input.att:checked+label>span.len {\n", " display: none;\n", "}\n", "\n", "label+span {\n", " color: rgb(70, 69, 69);\n", "}\n", "\n", "input.att~ul {\n", " display: none;\n", "}\n", "\n", "input.att:checked~ul {\n", " display: block;\n", "}\n", "\n", "table {\n", " width: auto;\n", " border-collapse: collapse;\n", " margin: 2%;\n", "}\n", "\n", "td,\n", "th {\n", " padding: 8px;\n", " height: 15px;\n", " font-size: small;\n", "}\n", "\n", "td {\n", " text-align: left !important;\n", " color: rgb(160, 160, 160)\n", "}\n", "\n", "th {\n", " text-align: center;\n", " color: black;\n", "}\n", "\n", "input~ul {\n", " position: relative;\n", " left: 25px;\n", "}\n", "\n", "input.att~table {\n", " display: none;\n", "}\n", "\n", "input.att:checked~table {\n", " display: block;\n", "} </style>\n", " <div class=\"enoslib\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.Host'>@0x7f39d8ed7990\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"address-38a81d7a-178f-478e-b1b6-19500294e288\" class=\"att\" disabled=\"\">\n", " <label for=\"address-38a81d7a-178f-478e-b1b6-19500294e288\">\n", " <span>address</span>\n", " </label>\n", " <span>192.168.0.1</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"alias-f086aab2-9959-48db-9e88-03d6b7ef9559\" class=\"att\" disabled=\"\">\n", " <label for=\"alias-f086aab2-9959-48db-9e88-03d6b7ef9559\">\n", " <span>alias</span>\n", " </label>\n", " <span>192.168.0.1</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"user-720c6c49-c830-49ef-913c-7eed2872e4e1\" class=\"att\" disabled=\"\">\n", " <label for=\"user-720c6c49-c830-49ef-913c-7eed2872e4e1\">\n", " <span>user</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"keyfile-23c0f121-a0b9-4b51-8f74-6535ad2ea7c6\" class=\"att\" disabled=\"\">\n", " <label for=\"keyfile-23c0f121-a0b9-4b51-8f74-6535ad2ea7c6\">\n", " <span>keyfile</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"port-c54836b2-400f-4e60-accf-6ef0a589636b\" class=\"att\" disabled=\"\">\n", " <label for=\"port-c54836b2-400f-4e60-accf-6ef0a589636b\">\n", " <span>port</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"extra-3f5f13be-e732-4a0d-ae95-a3756aa42b4e\" class=\"att\">\n", " <label for=\"extra-3f5f13be-e732-4a0d-ae95-a3756aa42b4e\">extra <span class=\"len\">(0)</span></label>\n", " <ul id=\"extra\">\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"net_devices-c84e96d4-9d4c-4c08-bbb8-c1e7e943fc2b\" class=\"att\">\n", " <label for=\"net_devices-c84e96d4-9d4c-4c08-bbb8-c1e7e943fc2b\">net_devices <span class=\"len\">(0)</span></label>\n", " <ul id=\"net_devices\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </div>\n", " " ], "text/plain": [ "Host(address='192.168.0.1', alias='192.168.0.1', user=None, keyfile=None, port=None, extra={}, net_devices=set())" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bare_host" ] }, { "cell_type": "code", "execution_count": 16, "id": "2fb3ec36-0b5d-4aa3-99bc-702f308e3e89", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " <style> .enoslib {\n", " width: auto;\n", "}\n", "\n", ".enoslib_object {\n", " width: auto;\n", " font-size: 1em;\n", " line-height: 1.5;\n", " background-color: rgb(250, 249, 249);\n", " font-family: 'Segoe UI';\n", " color: black;\n", "}\n", "\n", ".enoslib_object ul {\n", " padding: 0;\n", "}\n", "\n", ".enoslib_object input+label {\n", " margin-bottom: 0%;\n", "}\n", "\n", ".object_name {\n", " padding: 6px 0 6px 3px;\n", " border-bottom-width: 1px;\n", " border-bottom-style: solid;\n", " border-bottom-color: #777;\n", " color: #555;\n", "}\n", "\n", ".object_name>div,\n", ".object_name>ul {\n", " display: inline;\n", " margin-top: 0;\n", " margin-bottom: 0;\n", "}\n", "\n", "ul {\n", " list-style: none !important;\n", " padding: 3px !important;\n", " margin: 0 !important;\n", "}\n", "\n", "input.att+label {\n", " display: inline-block;\n", " /*width: 140px;*/\n", " color: rgb(36, 35, 35);\n", " font-weight: 500;\n", " padding: 4px 0 2px 0;\n", "}\n", "\n", "input.att:enabled+label {\n", " cursor: pointer;\n", " width: auto;\n", "}\n", "\n", "input.att {\n", " display: none;\n", "}\n", "\n", "input.att+label:before {\n", " display: inline-block;\n", " content: '►';\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", "}\n", "\n", "input.att:checked+label:before {\n", " content: '▼';\n", "}\n", "\n", "input.att:disabled+label:before {\n", " content: none;\n", "}\n", "\n", "input.att+label>span {\n", " display: inline-block;\n", " margin-left: 4px;\n", "}\n", "\n", "input.att+label>span.len {\n", " font-size: small;\n", "}\n", "\n", "input.att:checked+label>span.len {\n", " display: none;\n", "}\n", "\n", "label+span {\n", " color: rgb(70, 69, 69);\n", "}\n", "\n", "input.att~ul {\n", " display: none;\n", "}\n", "\n", "input.att:checked~ul {\n", " display: block;\n", "}\n", "\n", "table {\n", " width: auto;\n", " border-collapse: collapse;\n", " margin: 2%;\n", "}\n", "\n", "td,\n", "th {\n", " padding: 8px;\n", " height: 15px;\n", " font-size: small;\n", "}\n", "\n", "td {\n", " text-align: left !important;\n", " color: rgb(160, 160, 160)\n", "}\n", "\n", "th {\n", " text-align: center;\n", " color: black;\n", "}\n", "\n", "input~ul {\n", " position: relative;\n", " left: 25px;\n", "}\n", "\n", "input.att~table {\n", " display: none;\n", "}\n", "\n", "input.att:checked~table {\n", " display: block;\n", "} </style>\n", " <div class=\"enoslib\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.Host'>@0x7f39d8ed7950\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"address-915dcb3e-b945-42ee-8ad8-1d2de1912f32\" class=\"att\" disabled=\"\">\n", " <label for=\"address-915dcb3e-b945-42ee-8ad8-1d2de1912f32\">\n", " <span>address</span>\n", " </label>\n", " <span>192.168.0.2</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"alias-59c3c96f-5679-48ca-9a48-cbad0d883352\" class=\"att\" disabled=\"\">\n", " <label for=\"alias-59c3c96f-5679-48ca-9a48-cbad0d883352\">\n", " <span>alias</span>\n", " </label>\n", " <span>one_alias</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"user-14f4f8a7-590a-4321-9993-bc9da5860ba7\" class=\"att\" disabled=\"\">\n", " <label for=\"user-14f4f8a7-590a-4321-9993-bc9da5860ba7\">\n", " <span>user</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"keyfile-168ad5a8-3824-4671-b9dc-067c6f0a867e\" class=\"att\" disabled=\"\">\n", " <label for=\"keyfile-168ad5a8-3824-4671-b9dc-067c6f0a867e\">\n", " <span>keyfile</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"port-35bc1d48-e9be-473f-8edc-4550472d13ec\" class=\"att\" disabled=\"\">\n", " <label for=\"port-35bc1d48-e9be-473f-8edc-4550472d13ec\">\n", " <span>port</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"extra-c10f6085-e68d-4225-9604-f937da350fa6\" class=\"att\">\n", " <label for=\"extra-c10f6085-e68d-4225-9604-f937da350fa6\">extra <span class=\"len\">(0)</span></label>\n", " <ul id=\"extra\">\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"net_devices-c7fc30a7-3e90-44ce-b07c-7d977ab7ca6d\" class=\"att\">\n", " <label for=\"net_devices-c7fc30a7-3e90-44ce-b07c-7d977ab7ca6d\">net_devices <span class=\"len\">(0)</span></label>\n", " <ul id=\"net_devices\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </div>\n", " " ], "text/plain": [ "Host(address='192.168.0.2', alias='one_alias', user=None, keyfile=None, port=None, extra={}, net_devices=set())" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "host_with_alias" ] }, { "cell_type": "code", "execution_count": 17, "id": "10e17d3b-9888-486a-bb58-642151b9d42e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " <style> .enoslib {\n", " width: auto;\n", "}\n", "\n", ".enoslib_object {\n", " width: auto;\n", " font-size: 1em;\n", " line-height: 1.5;\n", " background-color: rgb(250, 249, 249);\n", " font-family: 'Segoe UI';\n", " color: black;\n", "}\n", "\n", ".enoslib_object ul {\n", " padding: 0;\n", "}\n", "\n", ".enoslib_object input+label {\n", " margin-bottom: 0%;\n", "}\n", "\n", ".object_name {\n", " padding: 6px 0 6px 3px;\n", " border-bottom-width: 1px;\n", " border-bottom-style: solid;\n", " border-bottom-color: #777;\n", " color: #555;\n", "}\n", "\n", ".object_name>div,\n", ".object_name>ul {\n", " display: inline;\n", " margin-top: 0;\n", " margin-bottom: 0;\n", "}\n", "\n", "ul {\n", " list-style: none !important;\n", " padding: 3px !important;\n", " margin: 0 !important;\n", "}\n", "\n", "input.att+label {\n", " display: inline-block;\n", " /*width: 140px;*/\n", " color: rgb(36, 35, 35);\n", " font-weight: 500;\n", " padding: 4px 0 2px 0;\n", "}\n", "\n", "input.att:enabled+label {\n", " cursor: pointer;\n", " width: auto;\n", "}\n", "\n", "input.att {\n", " display: none;\n", "}\n", "\n", "input.att+label:before {\n", " display: inline-block;\n", " content: '►';\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", "}\n", "\n", "input.att:checked+label:before {\n", " content: '▼';\n", "}\n", "\n", "input.att:disabled+label:before {\n", " content: none;\n", "}\n", "\n", "input.att+label>span {\n", " display: inline-block;\n", " margin-left: 4px;\n", "}\n", "\n", "input.att+label>span.len {\n", " font-size: small;\n", "}\n", "\n", "input.att:checked+label>span.len {\n", " display: none;\n", "}\n", "\n", "label+span {\n", " color: rgb(70, 69, 69);\n", "}\n", "\n", "input.att~ul {\n", " display: none;\n", "}\n", "\n", "input.att:checked~ul {\n", " display: block;\n", "}\n", "\n", "table {\n", " width: auto;\n", " border-collapse: collapse;\n", " margin: 2%;\n", "}\n", "\n", "td,\n", "th {\n", " padding: 8px;\n", " height: 15px;\n", " font-size: small;\n", "}\n", "\n", "td {\n", " text-align: left !important;\n", " color: rgb(160, 160, 160)\n", "}\n", "\n", "th {\n", " text-align: center;\n", " color: black;\n", "}\n", "\n", "input~ul {\n", " position: relative;\n", " left: 25px;\n", "}\n", "\n", "input.att~table {\n", " display: none;\n", "}\n", "\n", "input.att:checked~table {\n", " display: block;\n", "} </style>\n", " <div class=\"enoslib\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.Host'>@0x7f39d8ed79d0\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"address-c9cc4a31-92b6-4b69-aa7c-cd2a73f44d9c\" class=\"att\" disabled=\"\">\n", " <label for=\"address-c9cc4a31-92b6-4b69-aa7c-cd2a73f44d9c\">\n", " <span>address</span>\n", " </label>\n", " <span>192.168.0.3</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"alias-f4b11491-86b2-4913-9a9e-312a0a909f79\" class=\"att\" disabled=\"\">\n", " <label for=\"alias-f4b11491-86b2-4913-9a9e-312a0a909f79\">\n", " <span>alias</span>\n", " </label>\n", " <span>one_alias</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"user-b5f5348e-6c72-4836-84fd-ee7ef6c834ba\" class=\"att\" disabled=\"\">\n", " <label for=\"user-b5f5348e-6c72-4836-84fd-ee7ef6c834ba\">\n", " <span>user</span>\n", " </label>\n", " <span>foo</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"keyfile-b995609a-353e-427a-99cf-fdc1d96341a2\" class=\"att\" disabled=\"\">\n", " <label for=\"keyfile-b995609a-353e-427a-99cf-fdc1d96341a2\">\n", " <span>keyfile</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"port-3bbbee7c-0af0-43b3-8814-9d2e9a9f5f09\" class=\"att\" disabled=\"\">\n", " <label for=\"port-3bbbee7c-0af0-43b3-8814-9d2e9a9f5f09\">\n", " <span>port</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"extra-8de20c4d-8024-4a15-9ce4-d4627bb68de4\" class=\"att\">\n", " <label for=\"extra-8de20c4d-8024-4a15-9ce4-d4627bb68de4\">extra <span class=\"len\">(0)</span></label>\n", " <ul id=\"extra\">\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"net_devices-a088e074-d0a9-480b-b850-be131fff7cb1\" class=\"att\">\n", " <label for=\"net_devices-a088e074-d0a9-480b-b850-be131fff7cb1\">net_devices <span class=\"len\">(0)</span></label>\n", " <ul id=\"net_devices\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </div>\n", " " ], "text/plain": [ "Host(address='192.168.0.3', alias='one_alias', user='foo', keyfile=None, port=None, extra={}, net_devices=set())" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "host_with_alias_and_username" ] }, { "cell_type": "markdown", "id": "2436ad88-9b65-4c17-9c43-6ca33db0b5b7", "metadata": {}, "source": [ "The local machine can be represented by an instance of the `LocalHost` object. This is a specialization of an `Host`, the connection to this host will be made using sub-processes (instead of SSH). We can see it in the `extra` attribute of the `LocalHost` object. This `extra` attribute is actually interpreted when a \"remote\" action is triggered on our hosts." ] }, { "cell_type": "code", "execution_count": 6, "id": "1d7daa8d-605b-4940-bf9b-37e7d814b92f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " <style> .enoslib {\n", " width: auto;\n", "}\n", "\n", ".enoslib_object {\n", " width: auto;\n", " font-size: 1em;\n", " line-height: 1.5;\n", " background-color: rgb(250, 249, 249);\n", " font-family: 'Segoe UI';\n", " color: black;\n", "}\n", "\n", ".enoslib_object ul {\n", " padding: 0;\n", "}\n", "\n", ".enoslib_object input+label {\n", " margin-bottom: 0%;\n", "}\n", "\n", ".object_name {\n", " padding: 6px 0 6px 3px;\n", " border-bottom-width: 1px;\n", " border-bottom-style: solid;\n", " border-bottom-color: #777;\n", " color: #555;\n", "}\n", "\n", ".object_name>div,\n", ".object_name>ul {\n", " display: inline;\n", " margin-top: 0;\n", " margin-bottom: 0;\n", "}\n", "\n", "ul {\n", " list-style: none !important;\n", " padding: 3px !important;\n", " margin: 0 !important;\n", "}\n", "\n", "input.att+label {\n", " display: inline-block;\n", " /*width: 140px;*/\n", " color: rgb(36, 35, 35);\n", " font-weight: 500;\n", " padding: 4px 0 2px 0;\n", "}\n", "\n", "input.att:enabled+label {\n", " cursor: pointer;\n", " width: auto;\n", "}\n", "\n", "input.att {\n", " display: none;\n", "}\n", "\n", "input.att+label:before {\n", " display: inline-block;\n", " content: '►';\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", "}\n", "\n", "input.att:checked+label:before {\n", " content: '▼';\n", "}\n", "\n", "input.att:disabled+label:before {\n", " content: none;\n", "}\n", "\n", "input.att+label>span {\n", " display: inline-block;\n", " margin-left: 4px;\n", "}\n", "\n", "input.att+label>span.len {\n", " font-size: small;\n", "}\n", "\n", "input.att:checked+label>span.len {\n", " display: none;\n", "}\n", "\n", "label+span {\n", " color: rgb(70, 69, 69);\n", "}\n", "\n", "input.att~ul {\n", " display: none;\n", "}\n", "\n", "input.att:checked~ul {\n", " display: block;\n", "}\n", "\n", "table {\n", " width: auto;\n", " border-collapse: collapse;\n", " margin: 2%;\n", "}\n", "\n", "td,\n", "th {\n", " padding: 8px;\n", " height: 15px;\n", " font-size: small;\n", "}\n", "\n", "td {\n", " text-align: left !important;\n", " color: rgb(160, 160, 160)\n", "}\n", "\n", "th {\n", " text-align: center;\n", " color: black;\n", "}\n", "\n", "input~ul {\n", " position: relative;\n", " left: 25px;\n", "}\n", "\n", "input.att~table {\n", " display: none;\n", "}\n", "\n", "input.att:checked~table {\n", " display: block;\n", "} </style>\n", " <div class=\"enoslib\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.local.LocalHost'>@0x7f39d8f4f410\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"address-4848b99d-154e-447b-999c-202eb44cc048\" class=\"att\" disabled=\"\">\n", " <label for=\"address-4848b99d-154e-447b-999c-202eb44cc048\">\n", " <span>address</span>\n", " </label>\n", " <span>localhost</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"alias-bfccc590-5518-4ad7-9fbd-9e6aaf0f84f1\" class=\"att\" disabled=\"\">\n", " <label for=\"alias-bfccc590-5518-4ad7-9fbd-9e6aaf0f84f1\">\n", " <span>alias</span>\n", " </label>\n", " <span>localhost</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"user-f4c3a217-5e8e-4779-9d53-c165e96f2d1d\" class=\"att\" disabled=\"\">\n", " <label for=\"user-f4c3a217-5e8e-4779-9d53-c165e96f2d1d\">\n", " <span>user</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"keyfile-e449358b-6e6b-467b-ab37-7e162894fa73\" class=\"att\" disabled=\"\">\n", " <label for=\"keyfile-e449358b-6e6b-467b-ab37-7e162894fa73\">\n", " <span>keyfile</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"port-729f00b9-b33f-4bac-8ebf-1bd9ea47b772\" class=\"att\" disabled=\"\">\n", " <label for=\"port-729f00b9-b33f-4bac-8ebf-1bd9ea47b772\">\n", " <span>port</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"extra-0eca339b-1a2e-4246-b7ce-7d50c961cc78\" class=\"att\">\n", " <label for=\"extra-0eca339b-1a2e-4246-b7ce-7d50c961cc78\">extra <span class=\"len\">(1)</span></label>\n", " <ul id=\"extra\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"ansible_connection-b258c3c8-9df3-4267-b646-34d679d4a838\" class=\"att\" disabled=\"\">\n", " <label for=\"ansible_connection-b258c3c8-9df3-4267-b646-34d679d4a838\">\n", " <span>ansible_connection</span>\n", " </label>\n", " <span>local</span>\n", " </li>\n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"net_devices-1cf4b6b6-2ff6-423e-aea5-f38349576284\" class=\"att\">\n", " <label for=\"net_devices-1cf4b6b6-2ff6-423e-aea5-f38349576284\">net_devices <span class=\"len\">(0)</span></label>\n", " <ul id=\"net_devices\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </div>\n", " " ], "text/plain": [ "LocalHost(address='localhost', alias='localhost', user=None, keyfile=None, port=None, extra={'ansible_connection': 'local'}, net_devices=set())" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "localhost = en.LocalHost()\n", "localhost" ] }, { "cell_type": "markdown", "id": "a5a50353-9275-4a0e-bf0e-49fd1cd01ec4", "metadata": {}, "source": [ "Other types of Hosts are possible. The library has a `DockerHost` which represents a docker container we want to reach using the docker TCP protocol. One needs to specify where this container is running by passing an host instance." ] }, { "cell_type": "code", "execution_count": 7, "id": "06e734e9-4276-46a3-851e-04257ea22b68", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " <style> .enoslib {\n", " width: auto;\n", "}\n", "\n", ".enoslib_object {\n", " width: auto;\n", " font-size: 1em;\n", " line-height: 1.5;\n", " background-color: rgb(250, 249, 249);\n", " font-family: 'Segoe UI';\n", " color: black;\n", "}\n", "\n", ".enoslib_object ul {\n", " padding: 0;\n", "}\n", "\n", ".enoslib_object input+label {\n", " margin-bottom: 0%;\n", "}\n", "\n", ".object_name {\n", " padding: 6px 0 6px 3px;\n", " border-bottom-width: 1px;\n", " border-bottom-style: solid;\n", " border-bottom-color: #777;\n", " color: #555;\n", "}\n", "\n", ".object_name>div,\n", ".object_name>ul {\n", " display: inline;\n", " margin-top: 0;\n", " margin-bottom: 0;\n", "}\n", "\n", "ul {\n", " list-style: none !important;\n", " padding: 3px !important;\n", " margin: 0 !important;\n", "}\n", "\n", "input.att+label {\n", " display: inline-block;\n", " /*width: 140px;*/\n", " color: rgb(36, 35, 35);\n", " font-weight: 500;\n", " padding: 4px 0 2px 0;\n", "}\n", "\n", "input.att:enabled+label {\n", " cursor: pointer;\n", " width: auto;\n", "}\n", "\n", "input.att {\n", " display: none;\n", "}\n", "\n", "input.att+label:before {\n", " display: inline-block;\n", " content: '►';\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", "}\n", "\n", "input.att:checked+label:before {\n", " content: '▼';\n", "}\n", "\n", "input.att:disabled+label:before {\n", " content: none;\n", "}\n", "\n", "input.att+label>span {\n", " display: inline-block;\n", " margin-left: 4px;\n", "}\n", "\n", "input.att+label>span.len {\n", " font-size: small;\n", "}\n", "\n", "input.att:checked+label>span.len {\n", " display: none;\n", "}\n", "\n", "label+span {\n", " color: rgb(70, 69, 69);\n", "}\n", "\n", "input.att~ul {\n", " display: none;\n", "}\n", "\n", "input.att:checked~ul {\n", " display: block;\n", "}\n", "\n", "table {\n", " width: auto;\n", " border-collapse: collapse;\n", " margin: 2%;\n", "}\n", "\n", "td,\n", "th {\n", " padding: 8px;\n", " height: 15px;\n", " font-size: small;\n", "}\n", "\n", "td {\n", " text-align: left !important;\n", " color: rgb(160, 160, 160)\n", "}\n", "\n", "th {\n", " text-align: center;\n", " color: black;\n", "}\n", "\n", "input~ul {\n", " position: relative;\n", " left: 25px;\n", "}\n", "\n", "input.att~table {\n", " display: none;\n", "}\n", "\n", "input.att:checked~table {\n", " display: block;\n", "} </style>\n", " <div class=\"enoslib\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.docker.DockerHost'>@0x7f39d8f4f9d0\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"address-e4de7b51-1b18-4c46-afc9-91aadc3b9965\" class=\"att\" disabled=\"\">\n", " <label for=\"address-e4de7b51-1b18-4c46-afc9-91aadc3b9965\">\n", " <span>address</span>\n", " </label>\n", " <span>container_name</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"alias-48200498-ca13-400f-8288-d5a11692bd6e\" class=\"att\" disabled=\"\">\n", " <label for=\"alias-48200498-ca13-400f-8288-d5a11692bd6e\">\n", " <span>alias</span>\n", " </label>\n", " <span>alias</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"user-9ce06c87-3a48-4685-ad6f-614e056f5f67\" class=\"att\" disabled=\"\">\n", " <label for=\"user-9ce06c87-3a48-4685-ad6f-614e056f5f67\">\n", " <span>user</span>\n", " </label>\n", " <span>foo</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"keyfile-6c54bbe3-ab1e-4b90-86ce-760ebfacdf81\" class=\"att\" disabled=\"\">\n", " <label for=\"keyfile-6c54bbe3-ab1e-4b90-86ce-760ebfacdf81\">\n", " <span>keyfile</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"port-8fc3d1c7-36f8-400d-b152-c8221a6e2d7f\" class=\"att\" disabled=\"\">\n", " <label for=\"port-8fc3d1c7-36f8-400d-b152-c8221a6e2d7f\">\n", " <span>port</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"extra-1e5cad58-5a1f-4dce-8bfb-53fb674c5d69\" class=\"att\">\n", " <label for=\"extra-1e5cad58-5a1f-4dce-8bfb-53fb674c5d69\">extra <span class=\"len\">(3)</span></label>\n", " <ul id=\"extra\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"ansible_connection-1840ac59-03b8-4681-abd6-d6971deea380\" class=\"att\" disabled=\"\">\n", " <label for=\"ansible_connection-1840ac59-03b8-4681-abd6-d6971deea380\">\n", " <span>ansible_connection</span>\n", " </label>\n", " <span>docker</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"ansible_docker_extra_args-1c075107-6e06-46b3-a6a1-925629cd68fe\" class=\"att\" disabled=\"\">\n", " <label for=\"ansible_docker_extra_args-1c075107-6e06-46b3-a6a1-925629cd68fe\">\n", " <span>ansible_docker_extra_args</span>\n", " </label>\n", " <span>-H ssh://foo@192.168.0.3</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"mitogen_via-a4fcb365-0579-4cb1-9278-dc351311eb6d\" class=\"att\" disabled=\"\">\n", " <label for=\"mitogen_via-a4fcb365-0579-4cb1-9278-dc351311eb6d\">\n", " <span>mitogen_via</span>\n", " </label>\n", " <span>foo@192.168.0.3</span>\n", " </li>\n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"net_devices-b3b716d2-8fb1-42c0-938c-c3c8c3c71c3a\" class=\"att\">\n", " <label for=\"net_devices-b3b716d2-8fb1-42c0-938c-c3c8c3c71c3a\">net_devices <span class=\"len\">(0)</span></label>\n", " <ul id=\"net_devices\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </div>\n", " " ], "text/plain": [ "DockerHost(address='container_name', alias='alias', user='foo', keyfile=None, port=None, extra={'ansible_connection': 'docker', 'ansible_docker_extra_args': '-H ssh://foo@192.168.0.3', 'mitogen_via': 'foo@192.168.0.3'}, net_devices=set())" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "docker_host = en.DockerHost(\"alias\", \"container_name\", host_with_alias_and_username)\n", "docker_host" ] }, { "cell_type": "markdown", "id": "71371096-d367-463d-a82b-f1a861c4703b", "metadata": {}, "source": [ "The above `extra` field suggest that the connection to this docker container will be made through an ssh jump to the remote host hosting the container.\n", "This will be done transparently by the library anyway.\n", "\n", "---\n", "A common pratice when experimenting, especially with distributed applications, is to form logical group of machines." ] }, { "cell_type": "markdown", "id": "d62c0172-bea2-4d17-b414-6aa24dd7f070", "metadata": {}, "source": [ "### Roles" ] }, { "cell_type": "markdown", "id": "7cad7f3c-49ee-4a08-964f-4367b16d88a8", "metadata": {}, "source": [ "During an experiment your hosts will serve different purposes: some will host the system you are studying while other will install third party tools to inject some load, observe ...\n", "\n", "A natural way of configuring differently several sets of hosts is to tag them and group them according to their tags.\n", "\n", "The `Roles` datastructure serves this purpose: it lets you group your hosts based on tags. It follow a `dict-like` interface." ] }, { "cell_type": "code", "execution_count": 22, "id": "f0e99de3-5565-4203-b1e1-c767f850192b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " <style> .enoslib {\n", " width: auto;\n", "}\n", "\n", ".enoslib_object {\n", " width: auto;\n", " font-size: 1em;\n", " line-height: 1.5;\n", " background-color: rgb(250, 249, 249);\n", " font-family: 'Segoe UI';\n", " color: black;\n", "}\n", "\n", ".enoslib_object ul {\n", " padding: 0;\n", "}\n", "\n", ".enoslib_object input+label {\n", " margin-bottom: 0%;\n", "}\n", "\n", ".object_name {\n", " padding: 6px 0 6px 3px;\n", " border-bottom-width: 1px;\n", " border-bottom-style: solid;\n", " border-bottom-color: #777;\n", " color: #555;\n", "}\n", "\n", ".object_name>div,\n", ".object_name>ul {\n", " display: inline;\n", " margin-top: 0;\n", " margin-bottom: 0;\n", "}\n", "\n", "ul {\n", " list-style: none !important;\n", " padding: 3px !important;\n", " margin: 0 !important;\n", "}\n", "\n", "input.att+label {\n", " display: inline-block;\n", " /*width: 140px;*/\n", " color: rgb(36, 35, 35);\n", " font-weight: 500;\n", " padding: 4px 0 2px 0;\n", "}\n", "\n", "input.att:enabled+label {\n", " cursor: pointer;\n", " width: auto;\n", "}\n", "\n", "input.att {\n", " display: none;\n", "}\n", "\n", "input.att+label:before {\n", " display: inline-block;\n", " content: '►';\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", "}\n", "\n", "input.att:checked+label:before {\n", " content: '▼';\n", "}\n", "\n", "input.att:disabled+label:before {\n", " content: none;\n", "}\n", "\n", "input.att+label>span {\n", " display: inline-block;\n", " margin-left: 4px;\n", "}\n", "\n", "input.att+label>span.len {\n", " font-size: small;\n", "}\n", "\n", "input.att:checked+label>span.len {\n", " display: none;\n", "}\n", "\n", "label+span {\n", " color: rgb(70, 69, 69);\n", "}\n", "\n", "input.att~ul {\n", " display: none;\n", "}\n", "\n", "input.att:checked~ul {\n", " display: block;\n", "}\n", "\n", "table {\n", " width: auto;\n", " border-collapse: collapse;\n", " margin: 2%;\n", "}\n", "\n", "td,\n", "th {\n", " padding: 8px;\n", " height: 15px;\n", " font-size: small;\n", "}\n", "\n", "td {\n", " text-align: left !important;\n", " color: rgb(160, 160, 160)\n", "}\n", "\n", "th {\n", " text-align: center;\n", " color: black;\n", "}\n", "\n", "input~ul {\n", " position: relative;\n", " left: 25px;\n", "}\n", "\n", "input.att~table {\n", " display: none;\n", "}\n", "\n", "input.att:checked~table {\n", " display: block;\n", "} </style>\n", " <div class=\"enoslib\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.Roles'>@0x7f39d8067150\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"tag1-24cdf781-4ca8-4179-bbb9-7eb95c782d3b\" class=\"att\">\n", " <label for=\"tag1-24cdf781-4ca8-4179-bbb9-7eb95c782d3b\">tag1 <span class=\"len\">(2)</span></label>\n", " <ul id=\"tag1\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"10.0.0.1-1b89374b-737a-4753-8191-8202f8dae8d6\" class=\"att\">\n", " <label for=\"10.0.0.1-1b89374b-737a-4753-8191-8202f8dae8d6\">10.0.0.1 </label>\n", " <ul id=\"10.0.0.1\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.Host'>@0x7f39d7921f10\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"address-32880337-e108-48a2-b54c-d03d44b7b228\" class=\"att\" disabled=\"\">\n", " <label for=\"address-32880337-e108-48a2-b54c-d03d44b7b228\">\n", " <span>address</span>\n", " </label>\n", " <span>10.0.0.1</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"alias-88cad01a-f583-4158-8f9b-20c1ab93c22e\" class=\"att\" disabled=\"\">\n", " <label for=\"alias-88cad01a-f583-4158-8f9b-20c1ab93c22e\">\n", " <span>alias</span>\n", " </label>\n", " <span>10.0.0.1</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"user-a856a9ce-e53f-4080-9eab-ce3c7a156286\" class=\"att\" disabled=\"\">\n", " <label for=\"user-a856a9ce-e53f-4080-9eab-ce3c7a156286\">\n", " <span>user</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"keyfile-daabf88f-3d6b-43e1-8087-e544fcd98be9\" class=\"att\" disabled=\"\">\n", " <label for=\"keyfile-daabf88f-3d6b-43e1-8087-e544fcd98be9\">\n", " <span>keyfile</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"port-12d616fc-0260-4102-a11a-2027e136bf5d\" class=\"att\" disabled=\"\">\n", " <label for=\"port-12d616fc-0260-4102-a11a-2027e136bf5d\">\n", " <span>port</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"extra-e60b9c73-1c34-4644-8ccc-caab2b43aba0\" class=\"att\">\n", " <label for=\"extra-e60b9c73-1c34-4644-8ccc-caab2b43aba0\">extra <span class=\"len\">(0)</span></label>\n", " <ul id=\"extra\">\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"net_devices-95326507-b7ea-4ca4-882b-d68f871ce1c2\" class=\"att\">\n", " <label for=\"net_devices-95326507-b7ea-4ca4-882b-d68f871ce1c2\">net_devices <span class=\"len\">(0)</span></label>\n", " <ul id=\"net_devices\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"10.0.0.2-44be97c8-a1ca-4cf5-b2fc-e77e33e0e649\" class=\"att\">\n", " <label for=\"10.0.0.2-44be97c8-a1ca-4cf5-b2fc-e77e33e0e649\">10.0.0.2 </label>\n", " <ul id=\"10.0.0.2\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.Host'>@0x7f39d7921810\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"address-0265cc47-c361-46b4-a1a3-09ae9c789efe\" class=\"att\" disabled=\"\">\n", " <label for=\"address-0265cc47-c361-46b4-a1a3-09ae9c789efe\">\n", " <span>address</span>\n", " </label>\n", " <span>10.0.0.2</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"alias-109b6b7c-430f-46ad-80ee-c794a43e01bf\" class=\"att\" disabled=\"\">\n", " <label for=\"alias-109b6b7c-430f-46ad-80ee-c794a43e01bf\">\n", " <span>alias</span>\n", " </label>\n", " <span>10.0.0.2</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"user-d94a5c62-f409-4bfe-8f0b-088f8849c697\" class=\"att\" disabled=\"\">\n", " <label for=\"user-d94a5c62-f409-4bfe-8f0b-088f8849c697\">\n", " <span>user</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"keyfile-17c3480f-79f3-4119-b07f-31aa54785a40\" class=\"att\" disabled=\"\">\n", " <label for=\"keyfile-17c3480f-79f3-4119-b07f-31aa54785a40\">\n", " <span>keyfile</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"port-8e5d4272-fc81-415a-82e2-afc98413e2e8\" class=\"att\" disabled=\"\">\n", " <label for=\"port-8e5d4272-fc81-415a-82e2-afc98413e2e8\">\n", " <span>port</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"extra-478e3b49-d366-465e-a6ff-c2acd735becb\" class=\"att\">\n", " <label for=\"extra-478e3b49-d366-465e-a6ff-c2acd735becb\">extra <span class=\"len\">(0)</span></label>\n", " <ul id=\"extra\">\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"net_devices-178053e7-764e-40dd-8ba0-40de689498cf\" class=\"att\">\n", " <label for=\"net_devices-178053e7-764e-40dd-8ba0-40de689498cf\">net_devices <span class=\"len\">(0)</span></label>\n", " <ul id=\"net_devices\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"tag2-ed1489dd-8474-49c8-9811-a50d6ba57337\" class=\"att\">\n", " <label for=\"tag2-ed1489dd-8474-49c8-9811-a50d6ba57337\">tag2 <span class=\"len\">(1)</span></label>\n", " <ul id=\"tag2\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"10.0.0.3-f7a28556-37d7-4a12-a2ef-8aaded9ea289\" class=\"att\">\n", " <label for=\"10.0.0.3-f7a28556-37d7-4a12-a2ef-8aaded9ea289\">10.0.0.3 </label>\n", " <ul id=\"10.0.0.3\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.Host'>@0x7f39d7921550\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"address-e7f87fae-5c7b-4764-8676-89185e385418\" class=\"att\" disabled=\"\">\n", " <label for=\"address-e7f87fae-5c7b-4764-8676-89185e385418\">\n", " <span>address</span>\n", " </label>\n", " <span>10.0.0.3</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"alias-89a70540-9414-47a8-8a04-05761c38b7b7\" class=\"att\" disabled=\"\">\n", " <label for=\"alias-89a70540-9414-47a8-8a04-05761c38b7b7\">\n", " <span>alias</span>\n", " </label>\n", " <span>10.0.0.3</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"user-ab43f21c-82fb-4d3f-9d14-254a0699edb5\" class=\"att\" disabled=\"\">\n", " <label for=\"user-ab43f21c-82fb-4d3f-9d14-254a0699edb5\">\n", " <span>user</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"keyfile-3f5c6574-c6b6-44d4-8dc4-b69073bfcb9f\" class=\"att\" disabled=\"\">\n", " <label for=\"keyfile-3f5c6574-c6b6-44d4-8dc4-b69073bfcb9f\">\n", " <span>keyfile</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"port-97de30df-cd35-4a5b-a694-85934f4fab9d\" class=\"att\" disabled=\"\">\n", " <label for=\"port-97de30df-cd35-4a5b-a694-85934f4fab9d\">\n", " <span>port</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"extra-9d7c5b38-e2d4-451d-9dd6-bdeed41ceeaf\" class=\"att\">\n", " <label for=\"extra-9d7c5b38-e2d4-451d-9dd6-bdeed41ceeaf\">extra <span class=\"len\">(0)</span></label>\n", " <ul id=\"extra\">\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"net_devices-f456eb6b-373e-4a63-8f20-27141e26d223\" class=\"att\">\n", " <label for=\"net_devices-f456eb6b-373e-4a63-8f20-27141e26d223\">net_devices <span class=\"len\">(0)</span></label>\n", " <ul id=\"net_devices\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"tag3-68909a4e-ee83-4e6d-ae05-c235a57f7905\" class=\"att\">\n", " <label for=\"tag3-68909a4e-ee83-4e6d-ae05-c235a57f7905\">tag3 <span class=\"len\">(2)</span></label>\n", " <ul id=\"tag3\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"10.0.0.2-a19c0576-063d-4182-9b88-f2a05f307ae3\" class=\"att\">\n", " <label for=\"10.0.0.2-a19c0576-063d-4182-9b88-f2a05f307ae3\">10.0.0.2 </label>\n", " <ul id=\"10.0.0.2\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.Host'>@0x7f39d7921810\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"address-49bbc5f1-d300-462e-bb9d-3dc6409ca720\" class=\"att\" disabled=\"\">\n", " <label for=\"address-49bbc5f1-d300-462e-bb9d-3dc6409ca720\">\n", " <span>address</span>\n", " </label>\n", " <span>10.0.0.2</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"alias-80dbc9bd-4082-4db5-b085-b3d96e570df7\" class=\"att\" disabled=\"\">\n", " <label for=\"alias-80dbc9bd-4082-4db5-b085-b3d96e570df7\">\n", " <span>alias</span>\n", " </label>\n", " <span>10.0.0.2</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"user-82791230-b494-490d-836a-616595784e8a\" class=\"att\" disabled=\"\">\n", " <label for=\"user-82791230-b494-490d-836a-616595784e8a\">\n", " <span>user</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"keyfile-6130f6b1-42b8-43f3-879d-2080059acd12\" class=\"att\" disabled=\"\">\n", " <label for=\"keyfile-6130f6b1-42b8-43f3-879d-2080059acd12\">\n", " <span>keyfile</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"port-9ace59d3-47b7-450c-b056-bae82e81a862\" class=\"att\" disabled=\"\">\n", " <label for=\"port-9ace59d3-47b7-450c-b056-bae82e81a862\">\n", " <span>port</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"extra-0b08417b-d4e8-426c-b121-72af90e5d873\" class=\"att\">\n", " <label for=\"extra-0b08417b-d4e8-426c-b121-72af90e5d873\">extra <span class=\"len\">(0)</span></label>\n", " <ul id=\"extra\">\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"net_devices-ebc0d751-e6e9-4dc8-99f0-fc77f8e8b9d3\" class=\"att\">\n", " <label for=\"net_devices-ebc0d751-e6e9-4dc8-99f0-fc77f8e8b9d3\">net_devices <span class=\"len\">(0)</span></label>\n", " <ul id=\"net_devices\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"10.0.0.3-e7e2921a-51e5-433d-8cc5-8ae181ad7480\" class=\"att\">\n", " <label for=\"10.0.0.3-e7e2921a-51e5-433d-8cc5-8ae181ad7480\">10.0.0.3 </label>\n", " <ul id=\"10.0.0.3\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.Host'>@0x7f39d7921550\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"address-a9e626ba-f8c3-478d-9c88-d7c16363797f\" class=\"att\" disabled=\"\">\n", " <label for=\"address-a9e626ba-f8c3-478d-9c88-d7c16363797f\">\n", " <span>address</span>\n", " </label>\n", " <span>10.0.0.3</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"alias-efceffc6-dbf8-48f3-aa08-b8e9406488b3\" class=\"att\" disabled=\"\">\n", " <label for=\"alias-efceffc6-dbf8-48f3-aa08-b8e9406488b3\">\n", " <span>alias</span>\n", " </label>\n", " <span>10.0.0.3</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"user-3a4daf97-e5af-49a3-b4cd-1979c220939b\" class=\"att\" disabled=\"\">\n", " <label for=\"user-3a4daf97-e5af-49a3-b4cd-1979c220939b\">\n", " <span>user</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"keyfile-d0ca4980-aa41-43ec-bacc-63f972b8402d\" class=\"att\" disabled=\"\">\n", " <label for=\"keyfile-d0ca4980-aa41-43ec-bacc-63f972b8402d\">\n", " <span>keyfile</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"port-6257d1e3-a896-4022-8e35-86b341489dbc\" class=\"att\" disabled=\"\">\n", " <label for=\"port-6257d1e3-a896-4022-8e35-86b341489dbc\">\n", " <span>port</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"extra-fd0a578a-fd9d-4651-82df-a9bfb782b2d7\" class=\"att\">\n", " <label for=\"extra-fd0a578a-fd9d-4651-82df-a9bfb782b2d7\">extra <span class=\"len\">(0)</span></label>\n", " <ul id=\"extra\">\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"net_devices-06a729a6-8764-4ef7-99c2-3cde7d5278c3\" class=\"att\">\n", " <label for=\"net_devices-06a729a6-8764-4ef7-99c2-3cde7d5278c3\">net_devices <span class=\"len\">(0)</span></label>\n", " <ul id=\"net_devices\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </div>\n", " " ], "text/plain": [ "{'tag1': [Host(address='10.0.0.1', alias='10.0.0.1', user=None, keyfile=None, port=None, extra={}, net_devices=set()), Host(address='10.0.0.2', alias='10.0.0.2', user=None, keyfile=None, port=None, extra={}, net_devices=set())], 'tag2': [Host(address='10.0.0.3', alias='10.0.0.3', user=None, keyfile=None, port=None, extra={}, net_devices=set())], 'tag3': [Host(address='10.0.0.2', alias='10.0.0.2', user=None, keyfile=None, port=None, extra={}, net_devices=set()), Host(address='10.0.0.3', alias='10.0.0.3', user=None, keyfile=None, port=None, extra={}, net_devices=set())]}" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h1 = en.Host(\"10.0.0.1\")\n", "h2 = en.Host(\"10.0.0.2\")\n", "h3 = en.Host(\"10.0.0.3\")\n", "roles = en.Roles()\n", "roles[\"tag1\"] = [h1, h2]\n", "roles[\"tag2\"] = [h3]\n", "roles[\"tag3\"] = [h2, h3]\n", "\n", "roles" ] }, { "cell_type": "markdown", "id": "8549ef96-1e0c-4d9e-ab58-abb119355177", "metadata": {}, "source": [ "### Network and Networks\n", "\n", "`Network` and `Networks` are the same as `Host` and `Roles` but for networks:\n", "- `Network` represent a single Network\n", "- `Networks` represent a \"Roles\" of Network: networks indexed by their tags\n", ".\n", "\n", "Networks are usually given by an infrastructure and thus you won't really instantiate `Network` nor `Networks` by yourself.\n", "More precisely there exists a specific subclass of `Network` per infrastructure which will be returned automatically by EnOSlib when needed.\n", "\n", "Moreover `Network` datastructure isn't exposed in EnOSlib at the top level, let's see however how a `DefaultNetwork` can look like. A `DefaultNetwork` is a very common abstraction of a network that allows to represent a basic network with optionnally a pool of free ips/macs address. For instance a subnet or a vlan on Grid5000 are represented by a specific `DefaultNetwork`." ] }, { "cell_type": "code", "execution_count": 23, "id": "dbbd79c8-4440-44d4-a264-1aa71115cd1a", "metadata": {}, "outputs": [], "source": [ "from enoslib.objects import DefaultNetwork" ] }, { "cell_type": "code", "execution_count": 24, "id": "d7788d7c-245c-4069-ab06-bb66d022c5dd", "metadata": {}, "outputs": [], "source": [ "one_network = DefaultNetwork(\"192.168.1.0/24\")\n", "one_network_with_a_pool_of_ips = DefaultNetwork(\"192.168.1.0/24\", ip_start=\"192.168.1.10\", ip_end=\"192.168.1.100\") " ] }, { "cell_type": "code", "execution_count": 25, "id": "e7952082-7aab-4a3d-8ff7-1a6f6a102dc6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " <style> .enoslib {\n", " width: auto;\n", "}\n", "\n", ".enoslib_object {\n", " width: auto;\n", " font-size: 1em;\n", " line-height: 1.5;\n", " background-color: rgb(250, 249, 249);\n", " font-family: 'Segoe UI';\n", " color: black;\n", "}\n", "\n", ".enoslib_object ul {\n", " padding: 0;\n", "}\n", "\n", ".enoslib_object input+label {\n", " margin-bottom: 0%;\n", "}\n", "\n", ".object_name {\n", " padding: 6px 0 6px 3px;\n", " border-bottom-width: 1px;\n", " border-bottom-style: solid;\n", " border-bottom-color: #777;\n", " color: #555;\n", "}\n", "\n", ".object_name>div,\n", ".object_name>ul {\n", " display: inline;\n", " margin-top: 0;\n", " margin-bottom: 0;\n", "}\n", "\n", "ul {\n", " list-style: none !important;\n", " padding: 3px !important;\n", " margin: 0 !important;\n", "}\n", "\n", "input.att+label {\n", " display: inline-block;\n", " /*width: 140px;*/\n", " color: rgb(36, 35, 35);\n", " font-weight: 500;\n", " padding: 4px 0 2px 0;\n", "}\n", "\n", "input.att:enabled+label {\n", " cursor: pointer;\n", " width: auto;\n", "}\n", "\n", "input.att {\n", " display: none;\n", "}\n", "\n", "input.att+label:before {\n", " display: inline-block;\n", " content: '►';\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", "}\n", "\n", "input.att:checked+label:before {\n", " content: '▼';\n", "}\n", "\n", "input.att:disabled+label:before {\n", " content: none;\n", "}\n", "\n", "input.att+label>span {\n", " display: inline-block;\n", " margin-left: 4px;\n", "}\n", "\n", "input.att+label>span.len {\n", " font-size: small;\n", "}\n", "\n", "input.att:checked+label>span.len {\n", " display: none;\n", "}\n", "\n", "label+span {\n", " color: rgb(70, 69, 69);\n", "}\n", "\n", "input.att~ul {\n", " display: none;\n", "}\n", "\n", "input.att:checked~ul {\n", " display: block;\n", "}\n", "\n", "table {\n", " width: auto;\n", " border-collapse: collapse;\n", " margin: 2%;\n", "}\n", "\n", "td,\n", "th {\n", " padding: 8px;\n", " height: 15px;\n", " font-size: small;\n", "}\n", "\n", "td {\n", " text-align: left !important;\n", " color: rgb(160, 160, 160)\n", "}\n", "\n", "th {\n", " text-align: center;\n", " color: black;\n", "}\n", "\n", "input~ul {\n", " position: relative;\n", " left: 25px;\n", "}\n", "\n", "input.att~table {\n", " display: none;\n", "}\n", "\n", "input.att:checked~table {\n", " display: block;\n", "} </style>\n", " <div class=\"enoslib\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.DefaultNetwork'>@0x7f39d8067390\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"network-7bd760ce-f351-4400-bb1b-21373286d4f3\" class=\"att\" disabled=\"\">\n", " <label for=\"network-7bd760ce-f351-4400-bb1b-21373286d4f3\">\n", " <span>network</span>\n", " </label>\n", " <span>192.168.1.0/24</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"gateway-c8f79725-b853-4c51-ba12-0df60e9bd3cd\" class=\"att\" disabled=\"\">\n", " <label for=\"gateway-c8f79725-b853-4c51-ba12-0df60e9bd3cd\">\n", " <span>gateway</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"dns-f7a020e7-b04f-4478-b901-5f4da06511ed\" class=\"att\" disabled=\"\">\n", " <label for=\"dns-f7a020e7-b04f-4478-b901-5f4da06511ed\">\n", " <span>dns</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"free_ips-adbfc835-c450-4242-b2d9-8f39c72b1e68\" class=\"att\">\n", " <label for=\"free_ips-adbfc835-c450-4242-b2d9-8f39c72b1e68\">free_ips <span class=\"len\">(0)</span></label>\n", " <ul id=\"free_ips\">\n", " \n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"free_macs-54c6a27a-326e-42ac-bc71-efe2f99ebadf\" class=\"att\">\n", " <label for=\"free_macs-54c6a27a-326e-42ac-bc71-efe2f99ebadf\">free_macs <span class=\"len\">(0)</span></label>\n", " <ul id=\"free_macs\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </div>\n", " " ], "text/plain": [ "<enoslib.objects.DefaultNetwork at 0x7f39d8067390>" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "one_network" ] }, { "cell_type": "code", "execution_count": 26, "id": "a4aa289d-357f-4003-9a77-4cfa6284df72", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " <style> .enoslib {\n", " width: auto;\n", "}\n", "\n", ".enoslib_object {\n", " width: auto;\n", " font-size: 1em;\n", " line-height: 1.5;\n", " background-color: rgb(250, 249, 249);\n", " font-family: 'Segoe UI';\n", " color: black;\n", "}\n", "\n", ".enoslib_object ul {\n", " padding: 0;\n", "}\n", "\n", ".enoslib_object input+label {\n", " margin-bottom: 0%;\n", "}\n", "\n", ".object_name {\n", " padding: 6px 0 6px 3px;\n", " border-bottom-width: 1px;\n", " border-bottom-style: solid;\n", " border-bottom-color: #777;\n", " color: #555;\n", "}\n", "\n", ".object_name>div,\n", ".object_name>ul {\n", " display: inline;\n", " margin-top: 0;\n", " margin-bottom: 0;\n", "}\n", "\n", "ul {\n", " list-style: none !important;\n", " padding: 3px !important;\n", " margin: 0 !important;\n", "}\n", "\n", "input.att+label {\n", " display: inline-block;\n", " /*width: 140px;*/\n", " color: rgb(36, 35, 35);\n", " font-weight: 500;\n", " padding: 4px 0 2px 0;\n", "}\n", "\n", "input.att:enabled+label {\n", " cursor: pointer;\n", " width: auto;\n", "}\n", "\n", "input.att {\n", " display: none;\n", "}\n", "\n", "input.att+label:before {\n", " display: inline-block;\n", " content: '►';\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", "}\n", "\n", "input.att:checked+label:before {\n", " content: '▼';\n", "}\n", "\n", "input.att:disabled+label:before {\n", " content: none;\n", "}\n", "\n", "input.att+label>span {\n", " display: inline-block;\n", " margin-left: 4px;\n", "}\n", "\n", "input.att+label>span.len {\n", " font-size: small;\n", "}\n", "\n", "input.att:checked+label>span.len {\n", " display: none;\n", "}\n", "\n", "label+span {\n", " color: rgb(70, 69, 69);\n", "}\n", "\n", "input.att~ul {\n", " display: none;\n", "}\n", "\n", "input.att:checked~ul {\n", " display: block;\n", "}\n", "\n", "table {\n", " width: auto;\n", " border-collapse: collapse;\n", " margin: 2%;\n", "}\n", "\n", "td,\n", "th {\n", " padding: 8px;\n", " height: 15px;\n", " font-size: small;\n", "}\n", "\n", "td {\n", " text-align: left !important;\n", " color: rgb(160, 160, 160)\n", "}\n", "\n", "th {\n", " text-align: center;\n", " color: black;\n", "}\n", "\n", "input~ul {\n", " position: relative;\n", " left: 25px;\n", "}\n", "\n", "input.att~table {\n", " display: none;\n", "}\n", "\n", "input.att:checked~table {\n", " display: block;\n", "} </style>\n", " <div class=\"enoslib\">\n", " <div class=\"enoslib_object\">\n", " <div class=\"object_name\">\n", " <class 'enoslib.objects.DefaultNetwork'>@0x7f39d80b1410\n", " </div>\n", " <ul class=\"list\">\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"network-649876e3-6b48-45b3-895b-99c6917774a0\" class=\"att\" disabled=\"\">\n", " <label for=\"network-649876e3-6b48-45b3-895b-99c6917774a0\">\n", " <span>network</span>\n", " </label>\n", " <span>192.168.1.0/24</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"gateway-b7bfcceb-afd2-4099-a846-0f8e7e2e0a8c\" class=\"att\" disabled=\"\">\n", " <label for=\"gateway-b7bfcceb-afd2-4099-a846-0f8e7e2e0a8c\">\n", " <span>gateway</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"dns-fc0e8a48-c905-49b6-bc94-ffc835e3b3a5\" class=\"att\" disabled=\"\">\n", " <label for=\"dns-fc0e8a48-c905-49b6-bc94-ffc835e3b3a5\">\n", " <span>dns</span>\n", " </label>\n", " <span>None</span>\n", " </li>\n", " <li>\n", " <input type=\"checkbox\" id=\"free_ips-b0fb6b3e-66a8-43d2-8c33-eaba5ecf546c\" class=\"att\">\n", " <label for=\"free_ips-b0fb6b3e-66a8-43d2-8c33-eaba5ecf546c\">free_ips <span class=\"len\">(11)</span></label>\n", " <ul id=\"free_ips\">\n", " <ul><li>192.168.1.10</li><li>192.168.1.11</li><li>192.168.1.12</li><li>192.168.1.13</li><li>192.168.1.14</li><li>192.168.1.15</li><li>192.168.1.16</li><li>192.168.1.17</li><li>192.168.1.18</li><li>192.168.1.19</li><li>[truncated list]</li></ul>\n", " </ul>\n", " </li>\n", " \n", " <li>\n", " <input type=\"checkbox\" id=\"free_macs-e459cfe1-42d9-4763-84ba-88575bd907fc\" class=\"att\">\n", " <label for=\"free_macs-e459cfe1-42d9-4763-84ba-88575bd907fc\">free_macs <span class=\"len\">(0)</span></label>\n", " <ul id=\"free_macs\">\n", " \n", " </ul>\n", " </li>\n", " \n", " </ul>\n", " </div>\n", " </div>\n", " " ], "text/plain": [ "<enoslib.objects.DefaultNetwork at 0x7f39d80b1410>" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "one_network_with_a_pool_of_ips" ] }, { "cell_type": "code", "execution_count": 27, "id": "337d3e84-c08a-4846-8b64-93f70d491e51", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "IPv4Address('192.168.1.10')" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get one free ip\n", "ip_gen = one_network_with_a_pool_of_ips.free_ips\n", "next(ip_gen)" ] }, { "cell_type": "code", "execution_count": 28, "id": "467c109c-c402-4ff7-a375-4330541f3452", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "IPv4Address('192.168.1.11')" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get another one\n", "next(ip_gen)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.9" } }, "nbformat": 4, "nbformat_minor": 5 }