{
 "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",
       "                &lt;class &#x27;enoslib.objects.Host&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.objects.Host&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.objects.Host&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.local.LocalHost&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.docker.DockerHost&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.objects.Roles&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.objects.Host&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.objects.Host&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.objects.Host&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.objects.Host&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.objects.Host&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.objects.DefaultNetwork&#x27;&gt;@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",
       "                &lt;class &#x27;enoslib.objects.DefaultNetwork&#x27;&gt;@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
}