{"id":8596,"date":"2020-04-30T12:59:12","date_gmt":"2020-04-30T19:59:12","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=8596"},"modified":"2025-11-26T06:09:35","modified_gmt":"2025-11-26T14:09:35","slug":"creating-dynamic-vms-infrastructure-with-xen-hosts","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/creating-dynamic-vms-infrastructure-with-xen-hosts\/","title":{"rendered":"Creaci\u00f3n de una infraestructura de m\u00e1quinas virtuales din\u00e1micas con hosts Xen"},"content":{"rendered":"<h2><span style=\"font-weight: 400\">Introducci\u00f3n<\/span><\/h2>\n<p><span style=\"font-weight: 400\">En el mundo actual, las m\u00e1quinas de la infraestructura de servidores se encuentran en centros de datos locales, centros de datos privados o centros de datos en nubes p\u00fablicas. Estas m\u00e1quinas pueden ser m\u00e1quinas f\u00edsicas de metal desnudo, m\u00e1quinas virtuales (VM) con hipervisores o peque\u00f1os contenedores como contenedores Docker sobre m\u00e1quinas f\u00edsicas o virtuales. Estas m\u00e1quinas pueden estar f\u00edsicamente en el laboratorio local. En un escenario de centro de datos privado, donde sus propios hosts adquiridos se colocan en un espacio f\u00edsico compartido en un centro de datos de terceros y se conectan de forma remota. Mientras que en los centros de datos p\u00fablicos como AWS, GCP, Azure, OCI las m\u00e1quinas se reservan o se crean bajo demanda para las necesidades altamente escalables que se conectan de forma remota. Cada uno de ellos tiene sus propias ventajas en cuanto a escalabilidad, seguridad, fiabilidad, gesti\u00f3n y costes asociados a estas infraestructuras.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Los equipos del entorno de desarrollo de productos pueden necesitar muchos servidores durante el proceso SDLC. Digamos que uno ha elegido el centro de datos privado con sus propias m\u00e1quinas f\u00edsicas junto con servidores Xen. Ahora, el reto es c\u00f3mo se gestiona el ciclo de vida de las m\u00e1quinas virtuales para el suministro o la terminaci\u00f3n en entornos similares a la nube con procesos \u00e1giles y sencillos.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><b>El objetivo de este documento es proporcionar el modelo b\u00e1sico de infraestructura, la arquitectura, las API m\u00ednimas y fragmentos de c\u00f3digo de ejemplo para que se puedan crear f\u00e1cilmente entornos de infraestructura din\u00e1micos.<\/b><\/p>\n<p>&nbsp;<\/p>\n<h2><b>Beneficios<\/b><\/h2>\n<p><span style=\"font-weight: 400\">Comprendamos primero la secuencia t\u00edpica de los pasos seguidos en el proceso de infraestructura de este servidor. Puede recordarlo como se indica a continuaci\u00f3n.<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none\">\n<ol>\n<li><span style=\"font-weight: 400\">Adquisici\u00f3n de las nuevas m\u00e1quinas por IT<\/span><\/li>\n<li><span style=\"font-weight: 400\">Virtualizaci\u00f3n de host - Instalar servidor Xen y crear plantillas VM por TI<\/span><\/li>\n<li><span style=\"font-weight: 400\">Solicitud de m\u00e1quinas virtuales est\u00e1ticas por parte de los equipos de desarrollo y pruebas a trav\u00e9s de tickets (por ejemplo, JIRA) a TI.<\/span><\/li>\n<li><span style=\"font-weight: 400\">Mantener las IPs de las m\u00e1quinas virtuales recibidas en una base de datos o un archivo est\u00e1tico o codificadas en archivos de configuraci\u00f3n o herramientas CI como en Jenkins config.xml.<\/span><\/li>\n<li><span style=\"font-weight: 400\">Supervisar las m\u00e1quinas virtuales para comprobar que est\u00e1n en buen estado antes de utilizarlas para instalar los productos.<\/span><\/li>\n<li><span style=\"font-weight: 400\">Limpieza o desinstalaci\u00f3n antes o despu\u00e9s de la instalaci\u00f3n de servidores<\/span><\/li>\n<li><span style=\"font-weight: 400\">Es posible que sea necesario limpiar el registro de Windows antes de instalar el producto.<\/span><\/li>\n<li><span style=\"font-weight: 400\">Se podr\u00eda haber hecho una asignaci\u00f3n fija de m\u00e1quinas virtuales a un \u00e1rea o a un equipo o dedicarlas a un ingeniero<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">Ahora bien, \u00bfc\u00f3mo puede hacer que este proceso sea m\u00e1s \u00e1gil? \u00bfPuedes eliminar la mayor\u00eda de los pasos anteriores con una simple automatizaci\u00f3n?<\/span><\/p>\n<p><span style=\"font-weight: 400\">S\u00ed. En nuestro entorno, tuvimos m\u00e1s de 1000 VMs y trat\u00f3 de lograr y sobre todo lo siguiente.\u00a0<\/span><\/p>\n<p><strong>\"VMs desechables bajo demanda seg\u00fan sea necesario durante la ejecuci\u00f3n de las pruebas. Resuelva los problemas de limpieza de Windows con ciclos de pruebas regulares\".<\/strong><\/p>\n<p><span style=\"font-weight: 400\">Como se puede ver a continuaci\u00f3n, utilizando el servicio API de gesti\u00f3n din\u00e1mica de servidores VM, se pueden eliminar 6 de los 8 pasos y ofrece una visi\u00f3n ilimitada de la infraestructura para todo el equipo de producto. S\u00f3lo son necesarios los 2 primeros pasos: adquisici\u00f3n y virtualizaci\u00f3n del host. En efecto, esto ahorra tiempo y costes.<\/span><\/p>\n<img loading=\"lazy\" decoding=\"async\" width=\"3218\" height=\"1340\" class=\"wp-image-8597 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/04\/Dyncmic_VMs_Flow.png\" alt=\"Typical flow to get infrastructure\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dyncmic_VMs_Flow.png 3218w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dyncmic_VMs_Flow-300x125.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dyncmic_VMs_Flow-1024x426.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dyncmic_VMs_Flow-768x320.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dyncmic_VMs_Flow-1536x640.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dyncmic_VMs_Flow-2048x853.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dyncmic_VMs_Flow-20x8.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dyncmic_VMs_Flow-1320x550.png 1320w\" sizes=\"auto, (max-width: 3218px) 100vw, 3218px\" \/>\n<h2><b>Modelo de infraestructura din\u00e1mica<\/b><\/h2>\n<p><span style=\"font-weight: 400\">La siguiente imagen muestra nuestra infraestructura propuesta para un entorno t\u00edpico de productos de servidor donde 80% de contenedores Docker, 15% como VMs din\u00e1micas y 5% como VMs est\u00e1ticas agrupadas para casos especiales. Esta distribuci\u00f3n se puede ajustar en funci\u00f3n de lo que funcione mejor para su entorno.<\/span><\/p>\n<img loading=\"lazy\" decoding=\"async\" width=\"3078\" height=\"1382\" class=\"wp-image-8598 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/04\/Dynamic_VMs_Server_Infra_Model.png\" alt=\"Infrastructure model\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_Server_Infra_Model.png 3078w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_Server_Infra_Model-300x135.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_Server_Infra_Model-1024x460.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_Server_Infra_Model-768x345.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_Server_Infra_Model-1536x690.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_Server_Infra_Model-2048x920.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_Server_Infra_Model-20x9.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_Server_Infra_Model-1320x593.png 1320w\" sizes=\"auto, (max-width: 3078px) 100vw, 3078px\" \/>\n<p>A partir de aqu\u00ed, hablaremos m\u00e1s sobre la parte del gestor de servidores Dynamic VM.<\/p>\n<p>&nbsp;<\/p>\n<h2><b>Arquitectura del Gestor Din\u00e1mico de Servidores<\/b><\/h2>\n<p><span style=\"font-weight: 400\">En el gestor de servidores de m\u00e1quinas virtuales din\u00e1micas, un sencillo servicio de API en el que se pueden exponer las siguientes API REST y que se pueden utilizar en cualquier parte del proceso automatizado. Como muestra la pila de tecnolog\u00eda, python 3 y Python basado en Xen APIs se utilizan para la creaci\u00f3n real de VMs con XenServer host. Flask se utiliza para la creaci\u00f3n de la capa de servicio REST. El sistema operativo puede ser cualquiera de las plataformas soportadas por su producto como windows2016, centos7, centos8, debian10, ubuntu18, oel8, suse15.<\/span><\/p>\n<img loading=\"lazy\" decoding=\"async\" width=\"3056\" height=\"1494\" class=\"wp-image-8599 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/04\/Dynamic_VMs_architecture.png\" alt=\"Dynamic VMs server manager architecture\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_architecture.png 3056w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_architecture-300x147.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_architecture-1024x501.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_architecture-768x375.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_architecture-1536x751.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_architecture-2048x1001.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_architecture-20x10.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dynamic_VMs_architecture-1320x645.png 1320w\" sizes=\"auto, (max-width: 3056px) 100vw, 3056px\" \/>\n<p><span style=\"font-weight: 400\">Guardar el historial de las m\u00e1quinas virtuales para realizar un seguimiento del uso y el tiempo de aprovisionamiento o terminaci\u00f3n puede ser analizado m\u00e1s a fondo. Para almacenar el documento json, se puede utilizar Couchbase enterprise server, que es una base de datos de documentos nosql.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><b>API REST sencillas<\/b><\/h2>\n<p>&nbsp;<\/p>\n<table>\n<tbody>\n<tr>\n<td><b><i>M\u00e9todo<\/i><\/b><\/td>\n<td><b><i>URI(s)<\/i><\/b><\/td>\n<td><b><i>Prop\u00f3sito<\/i><\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">GET<\/span><\/td>\n<td><span style=\"font-weight: 400\">\/showall<\/span><\/td>\n<td><span style=\"font-weight: 400\">Lista todas las m\u00e1quinas virtuales en formato json<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">GET<\/span><\/td>\n<td><span style=\"font-weight: 400\">\/getavailablecount\/<\/span><\/td>\n<td><span style=\"font-weight: 400\">Obtiene la lista de m\u00e1quinas virtuales disponibles para el  dado<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">GET<\/span><\/td>\n<td><span style=\"font-weight: 400\">\/getservers\/?os=<\/span><\/p>\n<p><span style=\"font-weight: 400\">\/getservers\/?os=&amp;count=<\/span><\/p>\n<p><span style=\"font-weight: 400\">\/getservers\/?os=&amp;count=&amp;cpus=&amp;mem=<\/span><\/p>\n<p><span style=\"font-weight: 400\">\/getservers\/?os=&amp;expiresin=<\/span><\/td>\n<td><span style=\"font-weight: 400\">Disposiciones dadas  VMs de .<\/span><\/p>\n<p><span style=\"font-weight: 400\">Tambi\u00e9n se puede admitir el recuento de cpus y el tama\u00f1o de mem.<\/span><\/p>\n<p><span style=\"font-weight: 400\">par\u00e1metro expiresin en minutos para obtener la expiraci\u00f3n (auto terminaci\u00f3n) de las VMs.<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">GET<\/span><\/td>\n<td><span style=\"font-weight: 400\">\/releaseservers\/?os=<\/span><\/p>\n<p><span style=\"font-weight: 400\">\/releaseservers\/?os=&amp;count=<\/span><\/td>\n<td><span style=\"font-weight: 400\">Termina dado  VMs de<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><span style=\"font-weight: 400\">Requisitos previos para hosts Xen dirigidos a m\u00e1quinas virtuales din\u00e1micas<\/span><\/h2>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Identificar hosts Xen VM din\u00e1micos espec\u00edficos<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Copiar\/crear las plantillas VM\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Mueva estos Hosts Xen a una VLAN\/Subred separada (trabaje con IT) para el reciclaje de IPs.<\/span><\/li>\n<\/ul>\n<h2>Aplicaci\u00f3n<\/h2>\n<p>A alto nivel -<\/p>\n<ol>\n<li>Crear funciones cada API REST<\/li>\n<li>Llame a un servicio com\u00fan para realizar diferentes acciones REST.<\/li>\n<li>Comprender la creaci\u00f3n de Sesi\u00f3n Xen, obtener los registros, clonar VM desde plantilla, adjuntar el disco correcto, esperar la creaci\u00f3n de VM e IP recibida; borrado de VMs, borrado de discos.<\/li>\n<li>Iniciar autom\u00e1ticamente un hilo para la expiraci\u00f3n de las m\u00e1quinas virtuales<\/li>\n<li>Leer la configuraci\u00f3n com\u00fan como el formato .ini<\/li>\n<li>Comprender el trabajo con la base de datos Couchbase y guardar documentos<\/li>\n<li>Pruebe todas las API con los sistemas operativos y par\u00e1metros necesarios.<\/li>\n<li>Solucionar problemas, si los hay<\/li>\n<li>Realice un POC con pocos hosts Xen<\/li>\n<\/ol>\n<p>Los siguientes fragmentos de c\u00f3digo pueden ayudarle a comprenderlo mejor.<\/p>\n<p>Creaci\u00f3n de API<\/p>\n<pre class=\"lang:default decode:true\" title=\"Creaci\u00f3n de servicios \">@app.route('\/showall\/&lt;string:os&gt;')\r\n@app.route(\"\/showall\")\r\ndef showall_service(os=None):\r\n    count, _ = get_all_xen_hosts_count(os)\r\n    log.info(\"--&gt; count: {}\".format(count))\r\n    all_vms = {}\r\n    for xen_host_ref in range(1, count + 1):\r\n        log.info(\"Getting xen_host_ref=\" + str(xen_host_ref))\r\n        all_vms[xen_host_ref] = perform_service(xen_host_ref, service_name='listvms', os=os)\r\n    return json.dumps(all_vms, indent=2, sort_keys=True)\r\n\r\n\r\n@app.route('\/getavailablecount\/&lt;string:os&gt;')\r\n@app.route('\/getavailablecount')\r\ndef getavailable_count_service(os='centos'):\r\n    \"\"\"\r\n    Calculate the available count:\r\n        Get Total CPUs, Total Memory\r\n        Get Free CPUs, Free Memory\r\n        Get all the VMs - CPUs and Memory allocated\r\n        Get each OS template - CPUs and Memory\r\n        Available count1 = (Free CPUs - VMs CPUs)\/OS_Template_CPUs\r\n        Available count2 = (Free Memory - VMs Memory)\/OS_Template_Memory\r\n        Return min(count1,count2)\r\n    \"\"\"\r\n    count, available_counts, xen_hosts = get_all_available_count(os)\r\n    log.info(\"{},{},{},{}\".format(count, available_counts, xen_hosts, reserved_count))\r\n    if count &gt; reserved_count:\r\n        count -= reserved_count\r\n    log.info(\"Less reserved count: {},{},{},{}\".format(count, available_counts, xen_hosts,\r\n                                                 reserved_count))\r\n    return str(count)\r\n\r\n\r\n# \/getservers\/username?count=number&amp;os=centos&amp;ver=6&amp;expiresin=30\r\n@app.route('\/getservers\/&lt;string:username&gt;')\r\ndef getservers_service(username):\r\n    global reserved_count\r\n    if request.args.get('count'):\r\n        vm_count = int(request.args.get('count'))\r\n    else:\r\n        vm_count = 1\r\n    os_name = request.args.get('os')\r\n    if request.args.get('cpus'):\r\n        cpus_count = request.args.get('cpus')\r\n    else:\r\n        cpus_count = \"default\"\r\n\r\n    if request.args.get('mem'):\r\n        mem = request.args.get('mem')\r\n    else:\r\n        mem = \"default\"\r\n\r\n    if request.args.get('expiresin'):\r\n        exp = int(request.args.get('expiresin'))\r\n    else:\r\n        exp = MAX_EXPIRY_MINUTES\r\n\r\n    if request.args.get('format'):\r\n        output_format = request.args.get('format')\r\n    else:\r\n        output_format = \"servermanager\"\r\n\r\n    xhostref = None\r\n    if request.args.get('xhostref'):\r\n        xhostref = request.args.get('xhostref')\r\n    reserved_count += vm_count\r\n    if xhostref:\r\n        log.info(\"--&gt;  VMs on given xenhost\" + xhostref)\r\n        vms_ips_list = perform_service(xhostref, 'createvm', os_name, username, vm_count,\r\n                                       cpus=cpus_count, maxmemory=mem, expiry_minutes=exp,\r\n                                       output_format=output_format)\r\n        return json.dumps(vms_ips_list)\r\n\r\n ...\r\n\r\n\r\n# \/releaseservers\/{username}\r\n@app.route('\/releaseservers\/&lt;string:username&gt;\/&lt;string:available&gt;')\r\n@app.route('\/releaseservers\/&lt;string:username&gt;')\r\ndef releaseservers_service(username):\r\n    if request.args.get('count'):\r\n        vm_count = int(request.args.get('count'))\r\n    else:\r\n        vm_count = 1\r\n    os_name = request.args.get('os')\r\n    delete_vms_res = []\r\n    for vm_index in range(vm_count):\r\n        if vm_count &gt; 1:\r\n            vm_name = username + str(vm_index + 1)\r\n        else:\r\n            vm_name = username\r\n        xen_host_ref = get_vm_existed_xenhost_ref(vm_name, 1, None)\r\n        log.info(\"VM to be deleted from xhost_ref=\" + str(xen_host_ref))\r\n        if xen_host_ref != 0:\r\n            delete_per_xen_res = perform_service(xen_host_ref, 'deletevm', os_name, vm_name, 1)\r\n            for deleted_vm_res in delete_per_xen_res:\r\n                delete_vms_res.append(deleted_vm_res)\r\n    if len(delete_vms_res) &lt; 1:\r\n        return \"Error: VM \" + username + \" doesn't exist\"\r\n    else:\r\n        return json.dumps(delete_vms_res, indent=2, sort_keys=True)\r\n\r\n\r\ndef perform_service(xen_host_ref=1, service_name='list_vms', os=\"centos\", vm_prefix_names=\"\",\r\n                    number_of_vms=1, cpus=\"default\", maxmemory=\"default\",\r\n                    expiry_minutes=MAX_EXPIRY_MINUTES, output_format=\"servermanager\",\r\n                    start_suffix=0):\r\n    xen_host = get_xen_host(xen_host_ref, os)\r\n...\r\n\r\ndef main():\r\n    # options = parse_arguments()\r\n    set_log_level()\r\n    app.run(host='0.0.0.0', debug=True)\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Creaci\u00f3n sesi\u00f3n Xen<\/p>\n<pre class=\"lang:python decode:true\" title=\"Obtener sesi\u00f3n xenhost\">def get_xen_session(xen_host_ref=1, os=\"centos\"):\r\n    xen_host = get_xen_host(xen_host_ref, os)\r\n    if not xen_host:\r\n        return None\r\n    url = \"https:\/\/\" + xen_host['host.name']\r\n    log.info(\"\\nXen Server host: \" + xen_host['host.name'] + \"\\n\")\r\n    try:\r\n        session = XenAPI.Session(url)\r\n        session.xenapi.login_with_password(xen_host['host.user'], xen_host['host.password'])\r\n    except XenAPI.Failure as f:\r\n        error = \"Failed to acquire a session: {}\".format(f.details)\r\n        log.error(error)\r\n        return error\r\n    return session<\/pre>\n<p>&nbsp;<\/p>\n<p>Lista de m\u00e1quinas virtuales<\/p>\n<pre class=\"lang:default decode:true\" title=\"Listado de m\u00e1quinas virtuales\">def list_vms(session):\r\n    vm_count = 0\r\n    vms = session.xenapi.VM.get_all()\r\n    log.info(\"Server has {} VM objects (this includes templates):\".format(len(vms)))\r\n    log.info(\"-----------------------------------------------------------\")\r\n    log.info(\"S.No.,VMname,PowerState,Vcpus,MaxMemory,Networkinfo,Description\")\r\n    log.info(\"-----------------------------------------------------------\")\r\n\r\n    vm_details = []\r\n\r\n    for vm in vms:\r\n        network_info = 'N\/A'\r\n        record = session.xenapi.VM.get_record(vm)\r\n        if not (record[\"is_a_template\"]) and not (record[\"is_control_domain\"]):\r\n            log.debug(record)\r\n            vm_count = vm_count + 1\r\n            name = record[\"name_label\"]\r\n            name_description = record[\"name_description\"]\r\n            power_state = record[\"power_state\"]\r\n            vcpus = record[\"VCPUs_max\"]\r\n            memory_static_max = record[\"memory_static_max\"]\r\n            if record[\"power_state\"] != 'Halted':\r\n                ip_ref = session.xenapi.VM_guest_metrics.get_record(record['guest_metrics'])\r\n                network_info = ','.join([str(elem) for elem in ip_ref['networks'].values()])\r\n            else:\r\n                continue  # Listing only Running VMs\r\n\r\n            vm_info = {'name': name, 'power_state': power_state, 'vcpus': vcpus,\r\n                       'memory_static_max': memory_static_max, 'networkinfo': network_info,\r\n                       'name_description': name_description}\r\n            vm_details.append(vm_info)\r\n            log.info(vm_info)\r\n\r\n    log.info(\"Server has {} VM objects and {} templates.\".format(vm_count, len(vms) - vm_count))\r\n    log.debug(vm_details)\r\n    return vm_details<\/pre>\n<p>&nbsp;<\/p>\n<p>Crear VM<\/p>\n<pre class=\"lang:python decode:true\" title=\"Creaci\u00f3n de VM\">def create_vm(session, os_name, template, new_vm_name, cpus=\"default\", maxmemory=\"default\",\r\n              expiry_minutes=MAX_EXPIRY_MINUTES):\r\n    error = ''\r\n    vm_os_name = ''\r\n    vm_ip_addr = ''\r\n    prov_start_time = time.time()\r\n    try:\r\n        log.info(\"\\n--- Creating VM: \" + new_vm_name + \" using \" + template)\r\n        pifs = session.xenapi.PIF.get_all_records()\r\n        lowest = None\r\n        for pifRef in pifs.keys():\r\n            if (lowest is None) or (pifs[pifRef]['device'] &lt; pifs[lowest]['device']):\r\n                lowest = pifRef\r\n        log.debug(\"Choosing PIF with device: {}\".format(pifs[lowest]['device']))\r\n        ref = lowest\r\n        mac = pifs[ref]['MAC']\r\n        device = pifs[ref]['device']\r\n        mode = pifs[ref]['ip_configuration_mode']\r\n        ip_addr = pifs[ref]['IP']\r\n        net_mask = pifs[ref]['IP']\r\n        gateway = pifs[ref]['gateway']\r\n        dns_server = pifs[ref]['DNS']\r\n        log.debug(\"{},{},{},{},{},{},{}\".format(mac, device, mode, ip_addr, net_mask, gateway,\r\n                                                dns_server))\r\n        # List all the VM objects\r\n        vms = session.xenapi.VM.get_all_records()\r\n        log.debug(\"Server has {} VM objects (this includes templates)\".format(len(vms)))\r\n\r\n        templates = []\r\n        all_templates = []\r\n        for vm in vms:\r\n            record = vms[vm]\r\n            res_type = \"VM\"\r\n            if record[\"is_a_template\"]:\r\n                res_type = \"Template\"\r\n                all_templates.append(vm)\r\n                # Look for a given template\r\n                if record[\"name_label\"].startswith(template):\r\n                    templates.append(vm)\r\n                    log.debug(\" Found %8s with name_label = %s\" % (res_type, record[\"name_label\"]))\r\n\r\n        log.debug(\"Server has {} Templates and {} VM objects.\".format(len(all_templates),\r\n                                                                      len(vms) - len(\r\n                                                                          all_templates)))\r\n\r\n        log.debug(\"Choosing a {} template to clone\".format(template))\r\n        if not templates:\r\n            log.error(\"Could not find any {} templates. Exiting.\".format(template))\r\n            sys.exit(1)\r\n\r\n        template_ref = templates[0]\r\n        log.debug(\"  Selected template: {}\".format(session.xenapi.VM.get_name_label(template_ref)))\r\n\r\n        # Retries when 169.x address received\r\n        ipaddr_max_retries = 3\r\n        retry_count = 1\r\n        is_local_ip = True\r\n        vm_ip_addr = \"\"\r\n        while is_local_ip and retry_count != ipaddr_max_retries:\r\n            log.info(\"Installing new VM from the template - attempt #{}\".format(retry_count))\r\n            vm = session.xenapi.VM.clone(template_ref, new_vm_name)\r\n\r\n            network = session.xenapi.PIF.get_network(lowest)\r\n            log.debug(\"Chosen PIF is connected to network: {}\".format(\r\n                session.xenapi.network.get_name_label(network)))\r\n            vifs = session.xenapi.VIF.get_all()\r\n            log.debug((\"Number of VIFs=\" + str(len(vifs))))\r\n            for i in range(len(vifs)):\r\n                vmref = session.xenapi.VIF.get_VM(vifs[i])\r\n                a_vm_name = session.xenapi.VM.get_name_label(vmref)\r\n                log.debug(str(i) + \".\" + session.xenapi.network.get_name_label(\r\n                    session.xenapi.VIF.get_network(vifs[i])) + \" \" + a_vm_name)\r\n                if a_vm_name == new_vm_name:\r\n                    session.xenapi.VIF.move(vifs[i], network)\r\n\r\n            log.debug(\"Adding non-interactive to the kernel commandline\")\r\n            session.xenapi.VM.set_PV_args(vm, \"non-interactive\")\r\n            log.debug(\"Choosing an SR to instantiate the VM's disks\")\r\n            pool = session.xenapi.pool.get_all()[0]\r\n            default_sr = session.xenapi.pool.get_default_SR(pool)\r\n            default_sr = session.xenapi.SR.get_record(default_sr)\r\n            log.debug(\"Choosing SR: {} (uuid {})\".format(default_sr['name_label'], default_sr['uuid']))\r\n            log.debug(\"Asking server to provision storage from the template specification\")\r\n            description = new_vm_name + \" from \" + template + \" on \" + str(datetime.datetime.utcnow())\r\n            session.xenapi.VM.set_name_description(vm, description)\r\n            if cpus != \"default\":\r\n                log.info(\"Setting cpus to \" + cpus)\r\n                session.xenapi.VM.set_VCPUs_max(vm, int(cpus))\r\n                session.xenapi.VM.set_VCPUs_at_startup(vm, int(cpus))\r\n            if maxmemory != \"default\":\r\n                log.info(\"Setting memory to \" + maxmemory)\r\n                session.xenapi.VM.set_memory(vm, maxmemory)  # 8GB=\"8589934592\" or 4GB=\"4294967296\"\r\n            session.xenapi.VM.provision(vm)\r\n            log.info(\"Starting VM\")\r\n            session.xenapi.VM.start(vm, False, True)\r\n            log.debug(\"  VM is booting\")\r\n\r\n            log.debug(\"Waiting for the installation to complete\")\r\n\r\n            # Get the OS Name and IPs\r\n            log.info(\"Getting the OS Name and IP...\")\r\n            config = read_config()\r\n            vm_network_timeout_secs = int(config.get(\"common\", \"vm.network.timeout.secs\"))\r\n            if vm_network_timeout_secs &gt; 0:\r\n                TIMEOUT_SECS = vm_network_timeout_secs\r\n\r\n            log.info(\"Max wait time in secs for VM OS address is {0}\".format(str(TIMEOUT_SECS)))\r\n            if \"win\" not in template:\r\n                maxtime = time.time() + TIMEOUT_SECS\r\n                while read_os_name(session, vm) is None and time.time() &lt; maxtime:\r\n                    time.sleep(1)\r\n                vm_os_name = read_os_name(session, vm)\r\n                log.info(\"VM OS name: {}\".format(vm_os_name))\r\n            else:\r\n                # TBD: Wait for network to refresh on Windows VM\r\n                time.sleep(60)\r\n\r\n            log.info(\"Max wait time in secs for IP address is \" + str(TIMEOUT_SECS))\r\n            maxtime = time.time() + TIMEOUT_SECS\r\n            # Wait until IP is not None or 169.xx (when no IPs available, this is default) and timeout\r\n            # is not reached.\r\n            while (read_ip_address(session, vm) is None or read_ip_address(session, vm).startswith(\r\n                    '169')) and \\\r\n                    time.time() &lt; maxtime:\r\n                time.sleep(1)\r\n            vm_ip_addr = read_ip_address(session, vm)\r\n            log.info(\"VM IP: {}\".format(vm_ip_addr))\r\n\r\n            if vm_ip_addr.startswith('169'):\r\n                log.info(\"No Network IP available. Deleting this VM ... \")\r\n                record = session.xenapi.VM.get_record(vm)\r\n                power_state = record[\"power_state\"]\r\n                if power_state != 'Halted':\r\n                    session.xenapi.VM.hard_shutdown(vm)\r\n                delete_all_disks(session, vm)\r\n                session.xenapi.VM.destroy(vm)\r\n                time.sleep(5)\r\n                is_local_ip = True\r\n                retry_count += 1\r\n            else:\r\n                is_local_ip = False\r\n\r\n        log.info(\"Final VM IP: {}\".format(vm_ip_addr))<\/pre>\n<p>Borrar VM<\/p>\n<pre class=\"lang:python decode:true\" title=\"borrar vm\">def delete_vm(session, vm_name):\r\n    log.info(\"Deleting VM: \" + vm_name)\r\n    delete_start_time = time.time()\r\n    vm = session.xenapi.VM.get_by_name_label(vm_name)\r\n    log.info(\"Number of VMs found with name - \" + vm_name + \" : \" + str(len(vm)))\r\n    for j in range(len(vm)):\r\n        record = session.xenapi.VM.get_record(vm[j])\r\n        power_state = record[\"power_state\"]\r\n        if power_state != 'Halted':\r\n            # session.xenapi.VM.shutdown(vm[j])\r\n            session.xenapi.VM.hard_shutdown(vm[j])\r\n\r\n        # print_all_disks(session, vm[j])\r\n        delete_all_disks(session, vm[j])\r\n\r\n        session.xenapi.VM.destroy(vm[j])\r\n\r\n        delete_end_time = time.time()\r\n        delete_duration = round(delete_end_time - delete_start_time)\r\n\r\n        # delete from CB\r\n        uuid = record[\"uuid\"]\r\n        doc_key = uuid\r\n        cbdoc = CBDoc()\r\n        doc_result = cbdoc.get_doc(doc_key)\r\n        if doc_result:\r\n            doc_value = doc_result.value\r\n            doc_value[\"state\"] = 'deleted'\r\n            current_time = time.time()\r\n            doc_value[\"deleted_time\"] = current_time\r\n            if doc_value[\"created_time\"]:\r\n                doc_value[\"live_duration_secs\"] = round(current_time - doc_value[\"created_time\"])\r\n            doc_value[\"delete_duration_secs\"] = delete_duration\r\n            cbdoc.save_dynvm_doc(doc_key, doc_value)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400\">Uso hist\u00f3rico de m\u00e1quinas virtuales<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Es mejor mantener el historial de todas las VMs creadas y terminadas junto con otros datos \u00fatiles. Aqu\u00ed est\u00e1 el ejemplo de documento json almacenado en el Couchbase, un <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">base de datos Nosql gratuita<\/a> servidor. Inserte un nuevo documento utilizando la clave como el uuid de referencia de xen opac cada vez que se aprovisione una nueva VM y actualice el mismo cada vez que se termine la VM. Rastrea el tiempo de uso de la VM y tambi\u00e9n c\u00f3mo se ha realizado el aprovisionamiento\/desaprovisionamiento por cada usuario.<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><\/p>\n<pre class=\"lang:python decode:true\" title=\"Almacenamiento del documento json en CB durante el aprovisionamiento\">       record = session.xenapi.VM.get_record(vm)\r\n       uuid = record[\"uuid\"]\r\n\r\n       # Save as doc in CB\r\n        state = \"available\"\r\n        username = new_vm_name\r\n        pool = \"dynamicpool\"\r\n        doc_value = {\"ipaddr\": vm_ip_addr, \"origin\": xen_host_description, \"os\": os_name,\r\n                     \"state\": state, \"poolId\": pool, \"prevUser\": \"\", \"username\": username,\r\n                     \"ver\": \"12\", \"memory\": memory_static_max, \"os_version\": vm_os_name,\r\n                     \"name\": new_vm_name, \"created_time\": prov_end_time,\r\n                     \"create_duration_secs\": create_duration, \"cpu\": vcpus, \"disk\": disks_info}\r\n        # doc_value[\"mac_address\"] = mac_address\r\n        doc_key = uuid\r\n\r\n        cb_doc = CBDoc()\r\n        cb_doc.save_dynvm_doc(doc_key, doc_value)<\/pre>\n<pre class=\"lang:python decode:true\" title=\"C\u00f3digo CB\">class CBDoc:\r\n    def __init__(self):\r\n        config = read_config()\r\n        self.cb_server = config.get(\"couchbase\", \"couchbase.server\")\r\n        self.cb_bucket = config.get(\"couchbase\", \"couchbase.bucket\")\r\n        self.cb_username = config.get(\"couchbase\", \"couchbase.username\")\r\n        self.cb_userpassword = config.get(\"couchbase\", \"couchbase.userpassword\")\r\n        try:\r\n            self.cb_cluster = Cluster('couchbase:\/\/' + self.cb_server)\r\n            self.cb_auth = PasswordAuthenticator(self.cb_username, self.cb_userpassword)\r\n            self.cb_cluster.authenticate(self.cb_auth)\r\n            self.cb = self.cb_cluster.open_bucket(self.cb_bucket)\r\n        except Exception as e:\r\n            log.error('Connection Failed: %s ' % self.cb_server)\r\n            log.error(e)\r\n\r\n    def get_doc(self, doc_key):\r\n        try:\r\n            return self.cb.get(doc_key)\r\n        except Exception as e:\r\n            log.error('Error while getting doc %s !' % doc_key)\r\n            log.error(e)\r\n\r\n    def save_dynvm_doc(self, doc_key, doc_value):\r\n        try:\r\n            log.info(doc_value)\r\n            self.cb.upsert(doc_key, doc_value)\r\n            log.info(\"%s added\/updated successfully\" % doc_key)\r\n        except Exception as e:\r\n            log.error('Document with key: %s saving error' % doc_key)\r\n            log.error(e)<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"lang:js decode:true\" title=\"Ejemplo de documento json para almacenar en couchbase\" style=\"padding-left: 120px\">\"dynserver-pool\": {\r\n  \"cpu\": \"6\",\r\n  \"create_duration_secs\": 65,\r\n  \"created_time\": 1583518463.8943903,\r\n  \"delete_duration_secs\": 5,\r\n  \"deleted_time\": 1583520211.8498628,\r\n  \"disk\": \"75161927680\",\r\n  \"ipaddr\": \"x.x.x.x\",\r\n  \"live_duration_secs\": 1748,\r\n  \"memory\": \"6442450944\",\r\n  \"name\": \"Win2019-Server-1node-DynVM\",\r\n  \"origin\": \"s827\",\r\n  \"os\": \"win16\",\r\n  \"os_version\": \"\",\r\n  \"poolId\": \"dynamicpool\",\r\n  \"prevUser\": \"\",\r\n  \"state\": \"deleted\",\r\n  \"username\": \"Win2019-Server-1node-DynVM\",\r\n  \"ver\": \"12\"\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400\">Configuraci\u00f3n<\/span><\/h2>\n<p>La configuraci\u00f3n del servicio Dynamic VM server manager, como el servidor couchbase, los servidores xenhost, los detalles de la plantilla, la caducidad por defecto y los valores de tiempo de espera de red se pueden mantener en un simple formato .ini. La configuraci\u00f3n se carga din\u00e1micamente sin necesidad de reiniciar el servicio Dynamic VM SM.<\/p>\n<p><span style=\"font-weight: 400\">Archivo de configuraci\u00f3n de ejemplo: .dynvmservice.ini<\/span><\/p>\n<pre class=\"lang:default decode:true\" title=\"archivo de configuraci\u00f3n\">[couchbase]\r\ncouchbase.server=&lt;couchbase-hostIp&gt;\r\ncouchbase.bucket=&lt;bucket-name&gt;\r\ncouchbase.username=&lt;username&gt;\r\ncouchbase.userpassword=&lt;password&gt;\r\n\r\n[common]\r\nvm.expiry.minutes=720\r\nvm.network.timeout.secs=400\r\n\r\n[xenhost1]\r\nhost.name=&lt;xenhostip1&gt;\r\nhost.user=root\r\nhost.password=xxxx\r\nhost.storage.name=Local Storage 01\r\ncentos.template=tmpl-cnt7.7\r\ncentos7.template=tmpl-cnt7.7\r\nwindows.template=tmpl-win16dc - PATCHED (1)\r\ncentos8.template=tmpl-cnt8.0\r\noel8.template=tmpl-oel8\r\ndeb10.template=tmpl-deb10-too\r\ndebian10.template=tmpl-deb10-too\r\nubuntu18.template=tmpl-ubu18-4cgb\r\nsuse15.template=tmpl-suse15\r\n\r\n[xenhost2]\r\nhost.name=&lt;xenhostip2&gt;\r\nhost.user=root\r\nhost.password=xxxx\r\nhost.storage.name=ssd\r\ncentos.template=tmpl-cnt7.7\r\nwindows.template=tmpl-win16dc - PATCHED (1)\r\ncentos8.template=tmpl-cnt8.0\r\noel8.template=tmpl-oel8\r\ndeb10.template=tmpl-deb10-too\r\ndebian10.template=tmpl-deb10-too\r\nubuntu18.template=tmpl-ubu18-4cgb\r\nsuse15.template=tmpl-suse15\r\n\r\n[xenhost3]\r\n...\r\n\r\n\r\n[xenhost4]\r\n...\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>Ejemplos<\/h2>\n<h3>Ejemplo de llamadas a la API REST mediante curl<\/h3>\n<pre class=\"lang:default decode:true\" title=\"Ejemplo de llamadas REST\">$ curl 'https:\/\/127.0.0.1:5000\/showall'\r\n{\r\n  \"1\": [\r\n    {\r\n      \"memory_static_max\": \"6442450944\",\r\n      \"name\": \"tunable-rebalance-out-Apr-29-13:43:59-7.0.0-19021\",\r\n      \"name_description\": \"tunable-rebalance-out-Apr-29-13:43:59-7.0.0-19021 from tmpl-win16dc - PATCHED (1) on 2020-04-29 20:43:33.785778\",\r\n      \"networkinfo\": \"172.23.137.20,172.23.137.20,fe80:0000:0000:0000:0585:c6e8:52f9:91d1\",\r\n      \"power_state\": \"Running\",\r\n      \"vcpus\": \"6\"\r\n    },\r\n    {\r\n      \"memory_static_max\": \"6442450944\",\r\n      \"name\": \"nserv-nserv-rebalanceinout_P0_Set1_compression-Apr-29-06:36:12-7.0.0-19022\",\r\n      \"name_description\": \"nserv-nserv-rebalanceinout_P0_Set1_compression-Apr-29-06:36:12-7.0.0-19022 from tmpl-win16dc - PATCHED (1) on 2020-04-29 13:36:53.717776\",\r\n      \"networkinfo\": \"172.23.136.142,172.23.136.142,fe80:0000:0000:0000:744d:fd63:1a88:2fa8\",\r\n      \"power_state\": \"Running\",\r\n      \"vcpus\": \"6\"\r\n    }\r\n  ],\r\n  \"2\": [\r\n    ..\r\n  ]\r\n  \"3\": [\r\n    ..\r\n  ]\r\n  \"4\": [\r\n    ..\r\n  ]\r\n  \"5\": [\r\n    ..\r\n  ]\r\n  \"6\": [\r\n    ..\r\n  ]\r\n}\r\n\r\n$ curl 'https:\/\/127.0.0.1:5000\/getavailablecount\/windows'\r\n2\r\n$ curl 'https:\/\/127.0.0.1:5000\/getavailablecount\/centos'\r\n10 \r\n$ curl 'https:\/\/127.0.0.1:5000\/getservers\/demoserver?os=centos&amp;count=3'\r\n[\"172.23.137.73\", \"172.23.137.74\", \"172.23.137.75\"]\r\n$ curl 'https:\/\/127.0.0.1:5000\/getavailablecount\/centos'\r\n7\r\n$ curl 'https:\/\/127.0.0.1:5000\/releaseservers\/demoserver?os=centos&amp;count=3'\r\n[\r\n  \"demoserver1\",\r\n  \"demoserver2\",\r\n  \"demoserver3\"\r\n]\r\n$ curl 'https:\/\/127.0.0.1:5000\/getavailablecount\/centos'\r\n10 \r\n$<\/pre>\n<p>&nbsp;<\/p>\n<h3>Trabajos Jenkins con una \u00fanica VM<\/h3>\n<pre class=\"lang:default decode:true\" title=\"Ejemplo de configuraci\u00f3n de un trabajo jenkins donde antes se usaba una \u00fanica IP est\u00e1tica y ahora se va a usar una VM din\u00e1mica\">curl -s -o ${BUILD_TAG}_vm.json \"https:\/\/&lt;host:port&gt;\/getservers\/${BUILD_TAG}?os=windows&amp;format=detailed\"\r\nVM_IP_ADDRESS=\"`cat ${BUILD_TAG}_vm.json |egrep ${BUILD_TAG}|cut -f2 -d':'|xargs`\"\r\nif [[ $VM_IP_ADDRESS =~ ^([0-9]{1,3}\\.){3}[0-9]{1,3}$ ]]; then\r\n\u00a0\u00a0echo Valid IP received\r\nelse\r\n\u00a0\u00a0echo NOT a valid IP received\r\n\u00a0\u00a0exit 1\r\nfi<\/pre>\n<p>&nbsp;<\/p>\n<h3>Se necesitan trabajos Jenkins con varias m\u00e1quinas virtuales<\/h3>\n<pre class=\"lang:default decode:true\" title=\"Ejemplo de configuraci\u00f3n de trabajo jenkins si antes se usaban IPs y ahora se usan las VMs din\u00e1micas.\">curl -s -o ${BUILD_TAG}.json \"${SERVER_API_URL}\/getservers\/${BUILD_TAG}?os=${OS}&amp;count=${COUNT}&amp;format=detailed\"\r\ncat ${BUILD_TAG}.json\r\nVM_IP_ADDRESS=\"`cat ${BUILD_TAG}.json |egrep ${BUILD_TAG}|cut -f2 -d':'|xargs|sed 's\/,\/\/g'`\"\r\necho $VM_IP_ADDRESS\r\nADDR=()\r\nINDEX=1\r\nfor IP in `echo $VM_IP_ADDRESS`\r\ndo\r\n\u00a0\u00a0if [[ $IP =~ ^([0-9]{1,3}\\.){3}[0-9]{1,3}$ ]]; then\r\n\u00a0\u00a0\u00a0\u00a0echo Valid IP=$IP received\r\n\u00a0\u00a0\u00a0\u00a0ADDR[$INDEX]=${IP}\r\n\u00a0\u00a0\u00a0\u00a0INDEX=`expr ${INDEX} + 1`\r\n\u00a0\u00a0else\r\n\u00a0\u00a0\u00a0\u00a0echo NOT a valid IP=$IP received\r\n\u00a0\u00a0\u00a0\u00a0exit 1\r\n\u00a0\u00a0fi\r\ndone\r\n\r\necho ${ADDR[1]}\r\necho ${ADDR[2]}\r\necho ${ADDR[3]}\r\necho ${ADDR[4]}<\/pre>\n<p>&nbsp;<\/p>\n<h3>Consideraciones clave<\/h3>\n<p>He aqu\u00ed algunas de mis observaciones anotadas durante el proceso y que es mejor manejar para hacerlo m\u00e1s fiable.<\/p>\n<ol>\n<li>Manejar el nombre\/ID de Almacenamiento diferente entre diferentes Hosts Xen\n<ul>\n<li>Mantenga un registro del nombre del dispositivo de almacenamiento VM en el archivo de configuraci\u00f3n de entrada de servicio.<\/li>\n<\/ul>\n<\/li>\n<li>Manejar plantillas parciales s\u00f3lo disponibles en algunos hosts Xen durante el aprovisionamiento.<\/li>\n<li>Cuando las IP de red no est\u00e1n disponibles y las API de Xen obtienen la direcci\u00f3n por defecto 169.254.xx.yy en Windows. Espere hasta obtener una direcci\u00f3n que no sea 169 o hasta que se agote el tiempo de espera.<\/li>\n<li>Los servidores de lanzamiento deben ignorar la plantilla os ya que algunas de las plantillas podr\u00edan no estar all\u00ed Xen Hosts<\/li>\n<li>Provisi\u00f3n en una referencia espec\u00edfica de host Xen determinada<\/li>\n<li>Manejar No hay IPs disponibles o n<span class=\"jira-issue resolved\" data-jira-key=\"CBIT-20372\"><span class=\"summary\">ot obtener IPs de red para algunas de las VMs creadas.<\/span><\/span>\n<ul>\n<li><span class=\"jira-issue resolved\" data-jira-key=\"CBIT-20372\"><span class=\"summary\">P<\/span><\/span>lan para tener una subred diferente para VMs din\u00e1micas dirigidas a Hosts Xen. La red por defecto DHCP IP arrendamiento expiraci\u00f3n podr\u00eda ser en d\u00edas (digamos 7 d\u00edas) y no se proporcionan nuevas IPs.<\/li>\n<\/ul>\n<\/li>\n<li>Maneje la comprobaci\u00f3n de capacidad para contar las IPs en progreso como IPs reservadas y deber\u00eda mostrar un recuento menor que lleno en este momento. De lo contrario, tanto las peticiones en curso como las entrantes podr\u00edan tener problemas. Una o dos VMs (cpus\/memoria\/tama\u00f1o de disco) pueden estar en el buffer mientras se crea y comprueba si hay peticiones paralelas.<\/li>\n<\/ol>\n<h2><span style=\"font-weight: 400\">Referencias<\/span><\/h2>\n<p>Algunas de las referencias clave que ayudan mientras se crea el servicio de gestor din\u00e1mico de servidores VM.<\/p>\n<ol>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">https:\/\/www.couchbase.com\/downloads<\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/wiki.xenproject.org\/wiki\/XAPI_Command_Line_Interface\"><span style=\"font-weight: 400\">https:\/\/wiki.xenproject.org\/wiki\/XAPI_Command_Line_Interface<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/xapi-project.github.io\/xen-api\/\"><span style=\"font-weight: 400\">https:\/\/xapi-project.github.io\/xen-api\/<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/docs.citrix.com\/en-us\/citrix-hypervisor\/command-line-interface.html\"><span style=\"font-weight: 400\">https:\/\/docs.citrix.com\/en-us\/citrix-hypervisor\/command-line-interface.html<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/github.com\/xapi-project\/xen-api-sdk\/tree\/master\/python\/samples\"><span style=\"font-weight: 400\">https:\/\/github.com\/xapi-project\/xen-api-sdk\/tree\/master\/python\/samples<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/www.citrix.com\/community\/citrix-developer\/citrix-hypervisor-developer\/citrix-hypervisor-developing-products\/citrix-hypervisor-staticip.html\"><span style=\"font-weight: 400\">https:\/\/www.citrix.com\/community\/citrix-developer\/citrix-hypervisor-developer\/citrix-hypervisor-developing-products\/citrix-hypervisor-staticip.html<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/modules\/xenserver_guest_module.html\"><span style=\"font-weight: 400\">https:\/\/docs.ansible.com\/ansible\/latest\/modules\/xenserver_guest_module.html<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/github.com\/terra-farm\/terraform-provider-xenserver\"><span style=\"font-weight: 400\">https:\/\/github.com\/terra-farm\/terraform-provider-xenserver<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/github.com\/xapi-project\/xen-api\/blob\/master\/scripts\/examples\/python\/renameif.py\"><span style=\"font-weight: 400\">https:\/\/github.com\/xapi-project\/xen-api\/blob\/master\/scripts\/examples\/python\/renameif.py<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/xen-orchestra.com\/forum\/topic\/191\/single-device-not-reporting-ip-on-dashboard\/14\"><span style=\"font-weight: 400\">https:\/\/xen-orchestra.com\/forum\/topic\/191\/single-device-not-reporting-ip-on-dashboard\/14<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/xen-orchestra.com\/blog\/xen-orchestra-from-the-cli\/\"><span style=\"font-weight: 400\">https:\/\/xen-orchestra.com\/blog\/xen-orchestra-from-the-cli\/<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/support.citrix.com\/article\/CTX235403\"><span style=\"font-weight: 400\">https:\/\/support.citrix.com\/article\/CTX235403<\/span><\/a><\/li>\n<\/ol>\n<p>Espero que hayan pasado un buen rato de lectura.<\/p>\n<p><strong>Descargo de responsabilidad:<\/strong> Por favor, vea esto como una referencia si usted est\u00e1 tratando con Xen Hosts. Si\u00e9ntase libre de compartir si ha aprendido algo nuevo que nos pueda ayudar. Agradecemos sus comentarios positivos.<\/p>\n<hr \/>\n<p>Gracias a Raju Suravarjjala, Ritam Sharma, Wayne Siu, Tom Thrush y James Lee por su ayuda durante el proceso.<\/p>","protected":false},"excerpt":{"rendered":"<p>Introduction In today&#8217;s world, the server infrastructure machines are either in on-premise data centers, private data centers or public cloud data centers. These machines are either physical bare metal machines, virtual machines (VMs) with hypervisors\u00a0 or small containers like docker [&hellip;]<\/p>","protected":false},"author":46261,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,2225,1816],"tags":[],"ppma_author":[9096],"class_list":["post-8596","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-cloud","category-couchbase-server"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.4 (Yoast SEO v26.4) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Creating Dynamic VMs Infrastructure With Xen Hosts<\/title>\n<meta name=\"description\" content=\"Learn the basic infrastructure model, architecture, minimum APIs, and sample code snippets to build dynamic infrastructure environments.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/creating-dynamic-vms-infrastructure-with-xen-hosts\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Creating Dynamic VMs Infrastructure With Xen Hosts\" \/>\n<meta property=\"og:description\" content=\"Learn the basic infrastructure model, architecture, minimum APIs, and sample code snippets to build dynamic infrastructure environments.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/creating-dynamic-vms-infrastructure-with-xen-hosts\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-30T19:59:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-26T14:09:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dyncmic_VMs_Flow.png\" \/>\n\t<meta property=\"og:image:width\" content=\"3218\" \/>\n\t<meta property=\"og:image:height\" content=\"1340\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jagadesh Munta, Principal Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jagadesh Munta, Principal Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/\"},\"author\":{\"name\":\"Jagadesh Munta, Principal Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5efab7fca2a650b389d487e721997306\"},\"headline\":\"Creating Dynamic VMs Infrastructure With Xen Hosts\",\"datePublished\":\"2020-04-30T19:59:12+00:00\",\"dateModified\":\"2025-11-26T14:09:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/\"},\"wordCount\":1514,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Capella\",\"Couchbase Server\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/\",\"name\":\"Creating Dynamic VMs Infrastructure With Xen Hosts\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2020-04-30T19:59:12+00:00\",\"dateModified\":\"2025-11-26T14:09:35+00:00\",\"description\":\"Learn the basic infrastructure model, architecture, minimum APIs, and sample code snippets to build dynamic infrastructure environments.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Creating Dynamic VMs Infrastructure With Xen Hosts\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5efab7fca2a650b389d487e721997306\",\"name\":\"Jagadesh Munta, Principal Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/2b547f1e03e58f24f78d6318913302d1\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6d1189147482e8a4e1c0d2a3db919014c2cfe816b6d11357c3fd740f9deadd31?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6d1189147482e8a4e1c0d2a3db919014c2cfe816b6d11357c3fd740f9deadd31?s=96&d=mm&r=g\",\"caption\":\"Jagadesh Munta, Principal Software Engineer, Couchbase\"},\"description\":\"Jagadesh Munta is a Principal Software Engineer at Couchbase Inc. USA. Prior to this, he was a veteran in Sun Microsystems and Oracle together for 19 years. Jagadesh is holding Masters in Software Engineering at San Jose State University,USA and B.Tech. Computer Science and Engineering at JNTU,India. He is an author of \\\"Software Quality and Java Automation Engineer Survival Guide\u201d to help Software developers and Quality automation engineers.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/jagadesh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Creaci\u00f3n de una infraestructura de m\u00e1quinas virtuales din\u00e1micas con hosts Xen","description":"Conozca el modelo b\u00e1sico de infraestructura, la arquitectura, las API m\u00ednimas y fragmentos de c\u00f3digo de ejemplo para crear entornos de infraestructura din\u00e1micos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/creating-dynamic-vms-infrastructure-with-xen-hosts\/","og_locale":"es_MX","og_type":"article","og_title":"Creating Dynamic VMs Infrastructure With Xen Hosts","og_description":"Learn the basic infrastructure model, architecture, minimum APIs, and sample code snippets to build dynamic infrastructure environments.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/creating-dynamic-vms-infrastructure-with-xen-hosts\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-04-30T19:59:12+00:00","article_modified_time":"2025-11-26T14:09:35+00:00","og_image":[{"width":3218,"height":1340,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Dyncmic_VMs_Flow.png","type":"image\/png"}],"author":"Jagadesh Munta, Principal Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jagadesh Munta, Principal Software Engineer, Couchbase","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/"},"author":{"name":"Jagadesh Munta, Principal Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5efab7fca2a650b389d487e721997306"},"headline":"Creating Dynamic VMs Infrastructure With Xen Hosts","datePublished":"2020-04-30T19:59:12+00:00","dateModified":"2025-11-26T14:09:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/"},"wordCount":1514,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Best Practices and Tutorials","Couchbase Capella","Couchbase Server"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/","url":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/","name":"Creaci\u00f3n de una infraestructura de m\u00e1quinas virtuales din\u00e1micas con hosts Xen","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2020-04-30T19:59:12+00:00","dateModified":"2025-11-26T14:09:35+00:00","description":"Conozca el modelo b\u00e1sico de infraestructura, la arquitectura, las API m\u00ednimas y fragmentos de c\u00f3digo de ejemplo para crear entornos de infraestructura din\u00e1micos.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/creating-dynamic-vms-infrastructure-with-xen-hosts\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Creating Dynamic VMs Infrastructure With Xen Hosts"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5efab7fca2a650b389d487e721997306","name":"Jagadesh Munta, Ingeniero Principal de Software, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/2b547f1e03e58f24f78d6318913302d1","url":"https:\/\/secure.gravatar.com\/avatar\/6d1189147482e8a4e1c0d2a3db919014c2cfe816b6d11357c3fd740f9deadd31?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6d1189147482e8a4e1c0d2a3db919014c2cfe816b6d11357c3fd740f9deadd31?s=96&d=mm&r=g","caption":"Jagadesh Munta, Principal Software Engineer, Couchbase"},"description":"Jagadesh Munta es Ingeniero Principal de Software en Couchbase Inc. EE.UU. Anteriormente, trabaj\u00f3 en Sun Microsystems y Oracle durante 19 a\u00f1os. Jagadesh tiene un m\u00e1ster en Ingenier\u00eda de Software por la Universidad Estatal de San Jos\u00e9 (EE.UU.) y un B.Tech. Computer Science and Engineering en JNTU, India. Es autor de \"Software Quality and Java Automation Engineer Survival Guide\" para ayudar a los desarrolladores de software y a los ingenieros de automatizaci\u00f3n de la calidad.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/jagadesh\/"}]}},"authors":[{"term_id":9096,"user_id":46261,"is_guest":0,"slug":"jagadesh","display_name":"Jagadesh Munta, Principal Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/6d1189147482e8a4e1c0d2a3db919014c2cfe816b6d11357c3fd740f9deadd31?s=96&d=mm&r=g","author_category":"","last_name":"Munta, Principal Software Engineer, Couchbase","first_name":"Jagadesh","job_title":"","user_url":"","description":"Jagadesh Munta es Ingeniero Principal de Software en Couchbase Inc. EE.UU. Anteriormente, trabaj\u00f3 en Sun Microsystems y Oracle durante 19 a\u00f1os. Jagadesh tiene un m\u00e1ster en Ingenier\u00eda de Software por la Universidad Estatal de San Jos\u00e9 (EE.UU.) y un B.Tech. Computer Science and Engineering en JNTU, India. Es autor de \"Software Quality and Java Automation Engineer Survival Guide\" para ayudar a los desarrolladores de software y a los ingenieros de automatizaci\u00f3n de la calidad."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/8596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/46261"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=8596"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/8596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=8596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=8596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=8596"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=8596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}