
    VhE                        d dl mZmZmZ eZdZdZdZd dl	Z	dZ
	 d dlZdZ
d dlmZ d d	lmZ d d
lmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!  G d de      Z"d Z#e$dk(  r e#        yy# e$ r Y Uw xY w)    )absolute_importdivisionprint_functiona.0  
module: xenserver_guest
short_description: Manages virtual machines running on Citrix Hypervisor/XenServer host or pool
description: >-
  This module can be used to create new virtual machines from templates or other virtual machines, modify various virtual
  machine components like network and disk, rename a virtual machine and remove a virtual machine with associated components.
author:
  - Bojan Vitnik (@bvitnik) <bvitnik@mainstream.rs>
notes:
  - Minimal supported version of XenServer is 5.6.
  - Module was tested with XenServer 6.5, 7.1, 7.2, 7.6, Citrix Hypervisor 8.0, XCP-ng 7.6 and 8.0.
  - 'To acquire XenAPI Python library, just run C(pip install XenAPI) on your Ansible Control Node. The library can also be
    found inside Citrix Hypervisor/XenServer SDK (downloadable from Citrix website). Copy the C(XenAPI.py) file from the SDK
    to your Python site-packages on your Ansible Control Node to use it. Latest version of the library can also be acquired
    from GitHub: U(https://raw.githubusercontent.com/xapi-project/xen-api/master/scripts/examples/python/XenAPI/XenAPI.py).'
  - If no scheme is specified in O(hostname), module defaults to C(http://) because C(https://) is problematic in most setups.
    Make sure you are accessing XenServer host in trusted environment or use C(https://) scheme explicitly.
  - To use C(https://) scheme for O(hostname) you have to either import host certificate to your OS certificate store or use
    O(validate_certs=false) which requires XenAPI library from XenServer 7.2 SDK or newer and Python 2.7.9 or newer.
  - 'Network configuration inside a guest OS, by using parameters O(networks[].type), O(networks[].ip), O(networks[].gateway)
    and so on, is supported on XenServer 7.0 or newer for Windows guests by using official XenServer Guest agent support for
    network configuration. The module tries to detect if such support is available and utilize it, else it uses a custom method
    of configuration using xenstore. Since XenServer Guest agent only support None and Static types of network configuration,
    where None means DHCP configured interface, O(networks[].type) and O(networks[].type6) values V(none) and V(dhcp) have
    same effect. More info here:
    U(https://web.archive.org/web/20180218110151/https://xenserver.org/blog/entry/set-windows-guest-vm-static-ip-address-in-xenserver.html).'
  - 'On platforms without official support for network configuration inside a guest OS, network parameters are written to
    xenstore C(vm-data/networks/<vif_device>) key. Parameters can be inspected by using C(xenstore ls) and C(xenstore read)
    tools on \*nix guests or through WMI interface on Windows guests. They can also be found in VM facts C(instance.xenstore_data)
    key as returned by the module. It is up to the user to implement a boot time scripts or custom agent that reads the parameters
    from xenstore and configure network with given parameters. Take note that for xenstore data to become available inside
    a guest, a VM restart is needed hence module requires VM restart if any parameter is changed. This is a limitation of
    XenAPI and xenstore. Considering these limitations, network configuration through xenstore is most useful for bootstrapping
    newly deployed VMs, much less for reconfiguring existing ones. More info here: U(https://support.citrix.com/article/CTX226713).'
requirements:
  - XenAPI
attributes:
  check_mode:
    support: full
  diff_mode:
    support: none
options:
  state:
    description:
      - Specify the state VM should be in.
      - If O(state) is set to V(present) and VM exists, ensure the VM configuration conforms to given parameters.
      - If O(state) is set to V(present) and VM does not exist, then VM is deployed with given parameters.
      - If O(state) is set to V(absent) and VM exists, then VM is removed with its associated components.
      - If O(state) is set to V(poweredon) and VM does not exist, then VM is deployed with given parameters and powered on
        automatically.
    type: str
    default: present
    choices: [present, absent, poweredon]
  name:
    description:
      - Name of the VM to work with.
      - VMs running on XenServer do not necessarily have unique names. The module fails if multiple VMs with same name are
        found.
      - In case of multiple VMs with same name, use O(uuid) to uniquely specify VM to manage.
      - This parameter is case sensitive.
    type: str
    aliases: [name_label]
  name_desc:
    description:
      - VM description.
    type: str
  uuid:
    description:
      - UUID of the VM to manage if known. This is XenServer's unique identifier.
      - It is required if name is not unique.
      - Please note that a supplied UUID is ignored on VM creation, as XenServer creates the UUID internally.
    type: str
  template:
    description:
      - Name of a template, an existing VM (must be shut down) or a snapshot that should be used to create VM.
      - Templates/VMs/snapshots on XenServer do not necessarily have unique names. The module fails if multiple templates
        with same name are found.
      - In case of multiple templates/VMs/snapshots with same name, use O(template_uuid) to uniquely specify source template.
      - If VM already exists, this setting is ignored.
      - This parameter is case sensitive.
    type: str
    aliases: [template_src]
  template_uuid:
    description:
      - UUID of a template, an existing VM or a snapshot that should be used to create VM.
      - It is required if template name is not unique.
    type: str
  is_template:
    description:
      - Convert VM to template.
    type: bool
    default: false
  folder:
    description:
      - Destination folder for VM.
      - This parameter is case sensitive.
      - 'Example: O(folder=/folder1/folder2).'
    type: str
  hardware:
    description:
      - Manage VM's hardware parameters. VM needs to be shut down to reconfigure these parameters.
    type: dict
    suboptions:
      num_cpus:
        description:
          - Number of CPUs.
        type: int
      num_cpu_cores_per_socket:
        description:
          - Number of Cores Per Socket. O(hardware.num_cpus) has to be a multiple of O(hardware.num_cpu_cores_per_socket).
        type: int
      memory_mb:
        description:
          - Amount of memory in MB.
        type: int
  disks:
    description:
      - A list of disks to add to VM.
      - All parameters are case sensitive.
      - Removing or detaching existing disks of VM is not supported.
      - New disks are required to have either a O(disks[].size) or one of O(ignore:disks[].size_[tb,gb,mb,kb,b]) parameters
        specified.
      - VM needs to be shut down to reconfigure disk size.
    type: list
    elements: dict
    aliases: [disk]
    suboptions:
      size:
        description:
          - 'Disk size with unit. Unit must be: V(b), V(kb), V(mb), V(gb), V(tb). VM needs to be shut down to reconfigure
            this parameter.'
          - If no unit is specified, size is assumed to be in bytes.
        type: str
      size_b:
        description:
          - Disk size in bytes.
        type: str
      size_kb:
        description:
          - Disk size in kilobytes.
        type: str
      size_mb:
        description:
          - Disk size in megabytes.
        type: str
      size_gb:
        description:
          - Disk size in gigabytes.
        type: str
      size_tb:
        description:
          - Disk size in terabytes.
        type: str
      name:
        description:
          - Disk name.
        type: str
        aliases: [name_label]
      name_desc:
        description:
          - Disk description.
        type: str
      sr:
        description:
          - Storage Repository to create disk on. If not specified, it uses default SR. Cannot be used for moving disk to
            other SR.
        type: str
      sr_uuid:
        description:
          - UUID of a SR to create disk on. Use if SR name is not unique.
        type: str
  cdrom:
    description:
      - A CD-ROM configuration for the VM.
      - All parameters are case sensitive.
    type: dict
    suboptions:
      type:
        description:
          - The type of CD-ROM. When V(none) the CD-ROM device is present but empty.
        type: str
        choices: [none, iso]
      iso_name:
        description:
          - The file name of an ISO image from one of the XenServer ISO Libraries (implies O(cdrom.type=iso)).
          - Required if O(cdrom.type) is set to V(iso).
        type: str
  networks:
    description:
      - A list of networks (in the order of the NICs).
      - All parameters are case sensitive.
      - Name is required for new NICs. Other parameters are optional in all cases.
    type: list
    elements: dict
    aliases: [network]
    suboptions:
      name:
        description:
          - Name of a XenServer network to attach the network interface to.
        type: str
        aliases: [name_label]
      mac:
        description:
          - Customize MAC address of the interface.
        type: str
      type:
        description:
          - Type of IPv4 assignment. Value V(none) means whatever is default for OS.
          - On some operating systems it could be DHCP configured (for example Windows) or unconfigured interface (for example
            Linux).
        type: str
        choices: [none, dhcp, static]
      ip:
        description:
          - Static IPv4 address (implies O(networks[].type=static)). Can include prefix in format C(<IPv4 address>/<prefix>)
            instead of using C(netmask).
        type: str
      netmask:
        description:
          - Static IPv4 netmask required for O(networks[].ip) if prefix is not specified.
        type: str
      gateway:
        description:
          - Static IPv4 gateway.
        type: str
      type6:
        description:
          - Type of IPv6 assignment. Value V(none) means whatever is default for OS.
        type: str
        choices: [none, dhcp, static]
      ip6:
        description:
          - Static IPv6 address (implies O(networks[].type6=static)) with prefix in format C(<IPv6 address>/<prefix>).
        type: str
      gateway6:
        description:
          - Static IPv6 gateway.
        type: str
  home_server:
    description:
      - Name of a XenServer host that is a Home Server for the VM.
      - This parameter is case sensitive.
    type: str
  custom_params:
    description:
      - Define a list of custom VM params to set on VM.
      - Useful for advanced users familiar with managing VM params through C(xe) CLI.
      - A custom value object takes two fields O(custom_params[].key) and O(custom_params[].value) (see example below).
    type: list
    elements: dict
    suboptions:
      key:
        description:
          - VM param name.
        type: str
        required: true
      value:
        description:
          - VM param value.
        type: raw
        required: true
  wait_for_ip_address:
    description:
      - Wait until XenServer detects an IP address for the VM. If O(state) is set to V(absent), this parameter is ignored.
      - This requires XenServer Tools to be preinstalled on the VM to work properly.
    type: bool
    default: false
  state_change_timeout:
    description:
      - By default, the module waits indefinitely for VM to acquire an IP address if O(wait_for_ip_address=true).
      - If this parameter is set to a positive value, the module instead waits the specified number of seconds for the state
        change.
      - In case of timeout, module generates an error message.
    type: int
    default: 0
  linked_clone:
    description:
      - Whether to create a Linked Clone from the template, existing VM or snapshot. If V(false), it creates a full copy.
      - This is equivalent to C(Use storage-level fast disk clone) option in XenCenter.
    type: bool
    default: false
  force:
    description:
      - Ignore warnings and complete the actions.
      - This parameter is useful for removing VM in running state or reconfiguring VM params that require VM to be shut down.
    type: bool
    default: false
extends_documentation_fragment:
  - community.general.xenserver.documentation
  - community.general.attributes
a	  
- name: Create a VM from a template
  community.general.xenserver_guest:
    hostname: "{{ xenserver_hostname }}"
    username: "{{ xenserver_username }}"
    password: "{{ xenserver_password }}"
    folder: /testvms
    name: testvm_2
    state: poweredon
    template: CentOS 7
    disks:
      - size_gb: 10
        sr: my_sr
    hardware:
      num_cpus: 6
      num_cpu_cores_per_socket: 3
      memory_mb: 512
    cdrom:
      type: iso
      iso_name: guest-tools.iso
    networks:
      - name: VM Network
        mac: aa:bb:dd:aa:00:14
    wait_for_ip_address: true
  delegate_to: localhost
  register: deploy

- name: Create a VM template
  community.general.xenserver_guest:
    hostname: "{{ xenserver_hostname }}"
    username: "{{ xenserver_username }}"
    password: "{{ xenserver_password }}"
    folder: /testvms
    name: testvm_6
    is_template: true
    disk:
      - size_gb: 10
        sr: my_sr
    hardware:
      memory_mb: 512
      num_cpus: 1
  delegate_to: localhost
  register: deploy

- name: Rename a VM (requires the VM's UUID)
  community.general.xenserver_guest:
    hostname: "{{ xenserver_hostname }}"
    username: "{{ xenserver_username }}"
    password: "{{ xenserver_password }}"
    uuid: 421e4592-c069-924d-ce20-7e7533fab926
    name: new_name
    state: present
  delegate_to: localhost

- name: Remove a VM by UUID
  community.general.xenserver_guest:
    hostname: "{{ xenserver_hostname }}"
    username: "{{ xenserver_username }}"
    password: "{{ xenserver_password }}"
    uuid: 421e4592-c069-924d-ce20-7e7533fab926
    state: absent
  delegate_to: localhost

- name: Modify custom params (boot order)
  community.general.xenserver_guest:
    hostname: "{{ xenserver_hostname }}"
    username: "{{ xenserver_username }}"
    password: "{{ xenserver_password }}"
    name: testvm_8
    state: present
    custom_params:
      - key: HVM_boot_params
        value: {"order": "ndc"}
  delegate_to: localhost

- name: Customize network parameters
  community.general.xenserver_guest:
    hostname: "{{ xenserver_hostname }}"
    username: "{{ xenserver_username }}"
    password: "{{ xenserver_password }}"
    name: testvm_10
    networks:
      - name: VM Network
        ip: 192.168.1.100/24
        gateway: 192.168.1.1
      - type: dhcp
  delegate_to: localhost
a  
instance:
  description: Metadata about the VM.
  returned: always
  type: dict
  sample: {
    "cdrom": {
      "type": "none"
    },
    "customization_agent": "native",
    "disks": [
      {
        "name": "testvm_11-0",
        "name_desc": "",
        "os_device": "xvda",
        "size": 42949672960,
        "sr": "Local storage",
        "sr_uuid": "0af1245e-bdb0-ba33-1446-57a962ec4075",
        "vbd_userdevice": "0"
      },
      {
        "name": "testvm_11-1",
        "name_desc": "",
        "os_device": "xvdb",
        "size": 42949672960,
        "sr": "Local storage",
        "sr_uuid": "0af1245e-bdb0-ba33-1446-57a962ec4075",
        "vbd_userdevice": "1"
      }
    ],
    "domid": "56",
    "folder": "",
    "hardware": {
      "memory_mb": 8192,
      "num_cpu_cores_per_socket": 2,
      "num_cpus": 4
    },
    "home_server": "",
    "is_template": false,
    "name": "testvm_11",
    "name_desc": "",
    "networks": [
      {
        "gateway": "192.168.0.254",
        "gateway6": "fc00::fffe",
        "ip": "192.168.0.200",
        "ip6": [
          "fe80:0000:0000:0000:e9cb:625a:32c5:c291",
          "fc00:0000:0000:0000:0000:0000:0000:0001"
        ],
        "mac": "ba:91:3a:48:20:76",
        "mtu": "1500",
        "name": "Pool-wide network associated with eth1",
        "netmask": "255.255.255.128",
        "prefix": "25",
        "prefix6": "64",
        "vif_device": "0"
      }
    ],
    "other_config": {
      "base_template_name": "Windows Server 2016 (64-bit)",
      "import_task": "OpaqueRef:e43eb71c-45d6-5351-09ff-96e4fb7d0fa5",
      "install-methods": "cdrom",
      "instant": "true",
      "mac_seed": "f83e8d8a-cfdc-b105-b054-ef5cb416b77e"
    },
    "platform": {
      "acpi": "1",
      "apic": "true",
      "cores-per-socket": "2",
      "device_id": "0002",
      "hpet": "true",
      "nx": "true",
      "pae": "true",
      "timeoffset": "-25200",
      "vga": "std",
      "videoram": "8",
      "viridian": "true",
      "viridian_reference_tsc": "true",
      "viridian_time_ref_count": "true"
    },
    "state": "poweredon",
    "uuid": "e3c0b2d5-5f05-424e-479c-d3df8b3e7cda",
    "xenstore_data": {
      "vm-data": ""
    }
  }
changes:
  description: Detected or made changes to VM.
  returned: always
  type: list
  sample: [
    {
      "hardware": [
        "num_cpus"
      ]
    },
    {
      "disks_changed": [
        [],
        [
          "size"
        ]
      ]
    },
    {
      "disks_new": [
        {
          "name": "new-disk",
          "name_desc": "",
          "position": 2,
          "size_gb": "4",
          "vbd_userdevice": "2"
        }
      ]
    },
    {
      "cdrom": [
        "type",
        "iso_name"
      ]
    },
    {
      "networks_changed": [
        [
          "mac"
        ],
      ]
    },
    {
      "networks_new": [
        {
          "name": "Pool-wide network associated with eth2",
          "position": 1,
          "vif_device": "1"
        }
      ]
    },
    "need_poweredoff"
  ]
NFT)AnsibleModule)is_mac)six)xenserver_common_argument_specXenServerObjectget_object_refgather_vm_paramsgather_vm_factsset_vm_power_statewait_for_vm_ip_addressis_valid_ip_addris_valid_ip_netmaskis_valid_ip_prefixip_prefix_to_netmaskip_netmask_to_prefixis_valid_ip6_addris_valid_ip6_prefixc                   p     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZddZed        Z xZS )XenServerVMzClass for managing XenServer VM.

    Attributes:
        vm_ref (str): XAPI reference to VM.
        vm_params (dict): A dictionary with VM parameters as returned
            by gather_vm_params() function.
    c                     t         t        |   |       t        | j                  | j                  j
                  d   | j                  j
                  d   ddd      | _        | j                          y)zzInits XenServerVM using module parameters.

        Args:
            module: Reference to Ansible module object.
        nameuuidVMFzVM search: obj_typefail
msg_prefixN)superr   __init__r   moduleparamsvm_refgather_params)selfr#   	__class__s     u/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/xenserver_guest.pyr"   zXenServerVM.__init__3  sg     	k4)&1$T[[$++2D2DV2LdkkN`N`agNhsw  D  Q^  _    c                 "    | j                   dS dS )z&Returns True if VM exists, else False.TF)r%   r'   s    r)   existszXenServerVM.exists>  s    {{.t9E9r*   c                 N    t        | j                  | j                        | _        y)z5Gathers all VM parameters available in XAPI database.N)r   r#   r%   	vm_paramsr,   s    r)   r&   zXenServerVM.gather_paramsB  s    )$++t{{Cr*   c                 B    t        | j                  | j                        S )zGathers and returns VM facts.)r   r#   r/   r,   s    r)   gather_factszXenServerVM.gather_factsF  s    t{{DNN;;r*   c                     t        | j                  | j                  || j                  j                  d         \  }}|r|j	                         | j
                  d<   |S )zControls VM power state.state_change_timeoutpower_state)r   r#   r%   r$   
capitalizer/   )r'   r4   state_changedcurrent_states       r)   set_power_statezXenServerVM.set_power_stateJ  s`    '9$++t{{T_aealalasas  uK  bL  (M$} ,9,D,D,FDNN=)r*   c                     t        | j                  | j                  | j                  j                  d         | j                  d<   y)z&Waits for VM to acquire an IP address.r3   guest_metricsN)r   r#   r%   r$   r/   r,   s    r)   wait_for_ip_addresszXenServerVM.wait_for_ip_addressT  s?    *@dkk[_[f[f[m[m  oE  \F  +G'r*   c                    | j                         r| j                  j                  d       	 t        | j                  | j                  j                  d   | j                  j                  d   ddd      }| j
                  j                  j                  j                  |      j                         dk7  r| j                  j                  d	       | j                  j                  d
   }d}|rF|d   }|j                  d      }|j                  d      }||t        | j                  ||ddd      }|s8| j                  dk7  r| j                  }n| j                  j                  d       | j                  j                  d   5| j                  j                  d   s| j                  j                  d       | j                  j                  ry| j                  j                  d   rM| j
                  j                  j                  j                  || j                  j                  d         | _        nM| j
                  j                  j                  j                  || j                  j                  d   |      | _        | j
                  j                  j                  j!                  | j                  d       | j
                  j                  j                  j#                  |      }d|v r|d   rz| j
                  j                  j                  j#                  | j                        }d
|v r|d
= | j
                  j                  j                  j%                  | j                  |       | j
                  j                  j                  j'                  | j                         | j)                          | j+                          | j                  j                  d   dk(  r| j-                  d       yy# t.        j0                  $ r3}	| j                  j                  d|	j2                  z         Y d}	~	yd}	~	ww xY w)zDeploys new VM from template.zCalled deploy on existing VM!msgtemplatetemplate_uuidTzVM deploy: r   haltedz3VM deploy: running VM cannot be used as a template!disksNr   sr_uuidsrSRzVM deploy disks[0]: OpaqueRef:NULLzHVM deploy disks[0]: no default SR found! You must specify SR explicitly.r   z/VM deploy: VM name must not be an empty string!linked_clone default_templatestate	poweredonXAPI ERROR: %s)r-   r#   	fail_jsonr   r$   xapi_sessionxenapir   get_power_statelowergetdefault_sr_ref
check_modecloner%   copyset_name_descriptionget_other_configset_other_config	provisionr&   reconfigurer8   XenAPIFailuredetails)
r'   	templ_refdisk_params_listsr_refdisk_paramsdisk_sr_uuiddisk_srtempl_other_configvm_other_configfs
             r)   deployzXenServerVM.deployX  s    ;;=KK!!&E!FS	D&t{{DKK4F4Fz4RTXT_T_TfTfgvTw  CM  TX2?AI   ''**::9EKKMQYY%%*_%`  ${{11':F.q1*y9%//$/+w/B+DKK,Y]dh7MOF &&*::!00FKK)).x)y {{!!&)5dkk>P>PQW>X%%*[%\ {{%% {{!!.1"//6699??	4;;K]K]^dKef"//6699>>y$++J\J\]cJdflm $$''<<T[["M "&!2!2!9!9!<!<!M!Mi!X!%77<NOa<b #'"3"3":":"="="N"Nt{{"[o-'0!!((++<<T[[/Z $$''11$++>    {{!!'*k9$$[1 : ~~ 	DKK!!&6&B!CC	Ds   F&O< H%O< <Q)P==Qc                 2   | j                         s| j                  j                  d       | j                         }| j                  d   j                         }d|v r:|dk7  r5| j                  j                  d   s| j                  j                  d       | j                  j                  r|S d|v r/|dk7  r*| j                  j                  d   r| j                  d       	 |D ]i  }t        |t        j                        r|d	k(  rR| j                  j                  j                  j                  | j                   | j                  j                  d	          v|d
k(  rR| j                  j                  j                  j#                  | j                   | j                  j                  d
          |dk(  r| j                  j                  j                  j%                  | j                   d       | j                  j                  d   s'| j                  j                  j                  j'                  | j                   d| j                  j                  d          {|dk(  s| j                  j                  d   rJ| j                  j                  j(                  j+                  | j                  j                  d         d   }nd}| j                  j                  j                  j-                  | j                   |       #t        |t.              s5|j1                  d      r|d   D ]  }|dk(  rOt3        | j                  j                  d   d         }|t3        | j                  d         k  r| j                  j                  j                  j5                  | j                   t7        |             | j                  j                  j                  j9                  | j                   t7        |             | j                  j                  j                  j9                  | j                   t7        |             | j                  j                  j                  j5                  | j                   t7        |             Y|dk(  r| j                  j                  j                  j;                  | j                   d       t3        | j                  j                  d   d         }|dkD  s| j                  j                  j                  j=                  | j                   dt7        |             
|dk(  st7        t3        | j                  j                  d   d         dz        }t7        t?        t3        |      t3        | j                  d                     }	| j                  j                  j                  jA                  | j                   |	|||        |j1                  d      r| j                  d   D 
cg c]  }
|
d   dk(  s|
 }}
d}|d   D ][  }|D ]M  }| j                  j                  jB                  jE                  ||   d   d         }|d	k(  rN| j                  j                  jB                  j                  || j                  j                  d   |   d	          |d
k(  rN| j                  j                  jB                  j#                  || j                  j                  d   |   d
          |dk(  s| j                  j                  jB                  jG                  |t7        | jI                  | j                  j                  d   |   d |z                     P |dz  }^ |j1                  d!      r|d!   D ]  \  }}| j                  j                  d   |   }
|
j1                  d	      r|
d	   n| j                  d"   d#|}|
j1                  d
      r|
d
   nd$}|
j1                  d%      r3| j                  j                  jJ                  jE                  |
d%         }nS|
j1                  d&      r6| j                  j                  jJ                  j+                  |
d&         d   }n| jL                  }t7        | jI                  | j                  j                  d   |   d |z              }||||d'd(d(i d)}| j                   d*|d(d+dd(i d$i d,
}| j                  j                  jB                  jO                  |      |d<   | j                  j                  jP                  jO                  |      }| j                  d   j                         d-k(  s| j                  j                  jP                  jS                  |       
 |j1                  d.      r7| j                  d   D cg c]  }|d   d/k(  s| }}|s| j                  j                  j                  jU                  | j                         }d0|v rd0}n|d   }| j                   d|d(d1d/d2i d$i d,
}| j                  j                  jP                  jO                  |      }n5| j                  j                  jP                  jE                  |d   d         }| j                  j                  jP                  jW                  |      }|d.   D ]  }|dk(  rZ| j                  j                  d.   d   } | d3k(  r2|s0| j                  j                  jP                  jY                  |       \| d4k(  sbc|d5k(  si|s/| j                  j                  jP                  jY                  |       | j                  j                  jB                  j+                  | j                  j                  d.   d5         d   }!| j                  j                  jP                  j[                  ||!        |j1                  d6      rd}|d6   D ]  }"|"r| j                  d7   |   }#| j                  j                  d8   |   }$| j                  j                  j\                  jE                  |#d         }%| j                  j                  j^                  jE                  |#d9   d         }&d(}'d	|"v sd:|"v r|#d;   |&|#d<   |#d=   |#d>   |#d?   |#d@   |#dA   |#dB   |#dC   |#dD   dE}(d	|"v rl| j                  j                  j^                  j+                  |$d	         d   })|)|(d9<   | j                  j                  j^                  ja                  |)      |(d><   d:|"v r|$d:   j                         |(d=<   | j                  d   j                         d-k(  r/| j                  j                  j\                  jc                  |%       | j                  j                  j\                  je                  |%       | j                  j                  j\                  jO                  |(      }*| j                  d   j                         d-k(  r/| j                  j                  j\                  jS                  |*       |*}%d2}'| j                  dF   dGk(  rd(}+d|"v r|$d   jg                         },d2}+n|#dH   },dI|"v r|$dI   }-d2}+n"|#dJ   r|#dJ   d   ji                  dK      d   }-nd$}-dL|"v rdM|$dL   z  }.d2}+n-|#dJ   r&|#dJ   d   rdM|#dJ   d   ji                  dK      d   z  }.nd$}.dN|"v r|$dN   }/d2}+n|#dO   }/|'s|+r6| j                  j                  j\                  jk                  |%|,|-|.|/       d(}+dP|"v r|$dP   jg                         }0d2}+n|#dQ   }0dR|"v r|$dR   }1d2}+n"|#dS   r|#dS   d   ji                  dK      d   }1nd$}1dT|"v rdM|$dT   z  }2d2}+n-|#dS   r&|#dS   d   rdM|#dS   d   ji                  dK      d   z  }2nd$}2dU|"v r|$dU   }3d2}+n|#dV   }3|'s|+r| j                  j                  j\                  jm                  |%|0|1|2|3       n| j                  dF   dWk(  r|#d;   }4|"D 5cg c]	  }5|5dXvs|5 }6}5|6d	d:gz   D ]B  }7| j                  j                  j                  jo                  | j                   dY|4dK|7       D |$j1                  d	      r|$d	   }8n|#d9   d"   }8| j                  j                  j                  jq                  | j                   dY|4dKd	|8       |$j1                  d:      r|$d:   j                         }9n|#d=   j                         }9| j                  j                  j                  jq                  | j                   dY|4dKd:|9       |6D ]F  }7| j                  j                  j                  jq                  | j                   dY|4dK|7|$|7          H |dz  } |j1                  dZ      r|dZ   D ]  \  }}4| j                  j                  d8   |   }$| j                  j                  j^                  j+                  |$d	         d   }&|$d	   }8|$j1                  d:      r|$d:   nd$}9|$j1                  d      },|$j1                  dI      r|$dI   nd$}-|$j1                  dL      r|$dL   nd$}.|$j1                  d[      r|$d[   nd$}:|$j1                  dN      r|$dN   nd$}/|$j1                  dP      }0|$j1                  dR      r|$dR   nd$}1|$j1                  dT      r|$dT   nd$}2|$j1                  dU      r|$dU   nd$}3|4|&| j                   |9| j                  j                  j^                  ja                  |&      i d$i d\}(| j                  j                  j\                  jO                  |(      }*| j                  d   j                         d-k(  r/| j                  j                  j\                  jS                  |*       | j                  dF   dGk(  r|,r<|,d]k(  r7| j                  j                  j\                  jk                  |*d^|-dK|.|/       |0sS|0d]k(  sZ| j                  j                  j\                  jm                  |*d^|1dK|2|3       | j                  dF   dWk(  sd_D ]B  };| j                  j                  j                  jo                  | j                   dY|4dK|;       D | j                  j                  j                  jq                  | j                   d`|4z  |8       | j                  j                  j\                  js                  |*      }<| j                  j                  j                  jq                  | j                   da|4z  |<       |,r;| j                  j                  j                  jq                  | j                   db|4z  |,       |,d]k(  r| j                  j                  j                  jq                  | j                   dc|4z  |-       | j                  j                  j                  jq                  | j                   dd|4z  |.       | j                  j                  j                  jq                  | j                   de|4z  |:       | j                  j                  j                  jq                  | j                   df|4z  |/       |0s| j                  j                  j                  jq                  | j                   dg|4z  |0       |0d]k(  s | j                  j                  j                  jq                  | j                   dh|4z  |1       | j                  j                  j                  jq                  | j                   di|4z  |2       | j                  j                  j                  jq                  | j                   dj|4z  |3        |j1                  dk      s|dk   D ]k  }| j                  j                  dk   |   dl   }=| j                  j                  dk   |   dm   }>| j                  ju                  dn|=z  | j                   |>f       m l | j                  j                  do   r;| j                  j                  j                  jw                  | j                   d2       n3d|v r/| j                  j                  d   r|dk7  r| j                  dp       | jy                          |S c c}
w c c}w c c}5w # tz        j|                  $ r4}?| j                  j                  dq|?j~                  z         Y d*}?~?|S d*}?~?ww xY w)rzlReconfigures an existing VM.

        Returns:
            list: parameters that were reconfigured.
        z&Called reconfigure on non existing VM!r=   r4   need_poweredoffrA   forcez]VM reconfigure: VM has to be in powered off state to reconfigure but force was not specified!shutdownguestr   	name_descfolderhome_serverr   rF   hardwarenum_cpusVCPUs_at_startupnum_cpu_cores_per_socketcores-per-socket   	memory_mb   memory_static_mindisks_changedVBDstypeDiskVDIr   rB   sizezVM reconfigure disks[%s]: 	disks_new
name_label-rH   rC   rD   userF)r   name_descriptionrE   virtual_sizer{   sharable	read_onlyother_configNRW)
r   r}   
userdevicebootablemoder{   emptyr   qos_algorithm_typeqos_algorithm_paramsrunningcdromCD3ROTnonehostiso_namenetworks_changedVIFsnetworksnetworkmacdevicer   MACMTUr   r   r   locking_modeipv4_allowedipv6_allowed)r   r   r   r   r   r   r   r   r   r   r   customization_agentnativeipv4_configuration_modeipipv4_addresses/prefixz/%sgatewayipv4_gatewaytype6ipv6_configuration_modeip6ipv6_addressesprefix6gateway6ipv6_gatewaycustom)r   r   zvm-data/networks/networks_newnetmask)r   r   r   r   r   r   r   r   staticStatic)r   r   r{   r   r   r   r   r   r   r   r   zvm-data/networks/%s/namezvm-data/networks/%s/macvm-data/networks/%s/typevm-data/networks/%s/ipvm-data/networks/%s/prefixzvm-data/networks/%s/netmaskvm-data/networks/%s/gatewayvm-data/networks/%s/type6vm-data/networks/%s/ip6vm-data/networks/%s/prefix6vm-data/networks/%s/gateway6custom_paramskeyvaluez	VM.set_%sis_templaterK   rL   )@r-   r#   rM   get_changesr/   rQ   r$   rT   r8   
isinstancer   string_typesrN   rO   r   set_name_labelr%   rW   remove_from_other_configadd_to_other_configr   get_by_name_labelset_affinitydictrR   intset_VCPUs_at_startupstrset_VCPUs_maxremove_from_platformadd_to_platformminset_memory_limitsr}   get_by_uuidresizeget_normalized_disk_sizerE   rS   createVBDplugget_allowed_VBD_devices	get_emptyejectinsertVIFr   get_MTUunplugdestroyr5   splitconfigure_ipv4configure_ipv6remove_from_xenstore_dataadd_to_xenstore_dataget_MACxenapi_requestset_is_a_templater&   r\   r]   r^   )@r'   config_changesvm_power_state_savechangehost_refhardware_changerq   rs   memory_bvm_memory_static_min_brb   vm_disk_params_listpositiondisk_change_listdisk_changevdi_refdisk_userdevice	disk_namedisk_name_descra   	disk_sizenew_disk_vdinew_disk_vbdvbd_ref_newcdrom_paramsvm_cdrom_params_listcdrom_userdevices_allowedcdrom_userdevice	cdrom_vbdcdrom_vbd_refcdrom_is_emptycdrom_change
cdrom_typecdrom_vdi_refnetwork_change_listvm_vif_paramsnetwork_paramsvif_refnetwork_refvif_recreatedvifnetwork_ref_newvif_ref_newvif_reconfigure_needednetwork_type
network_ipnetwork_prefixnetwork_gatewaynetwork_type6network_ip6network_prefix6network_gateway6
vif_devicenet_chgnetwork_change_list_tmpnetwork_changenetwork_namenetwork_macnetwork_netmasknetwork_param
vm_vif_maccustom_param_keycustom_param_valuerg   s@                                                                   r)   r[   zXenServerVM.reconfigure  s    {{}KK!!&N!O))+"nn];AAC.3F(3R[_[f[f[m[mnu[vKK!!  'F!  G ;;!!!!.3F(3RW[WbWbWiWijqWr  1a	D( U@fc&6&67'))0033BB4;;PTP[P[PbPbciPjk;.))0033HHVZVaVaVhVhitVuv8+))0033LLT[[Zbc;;--h7 --4477KKDKKYacgcncncucuv~c  A=0;;--m<'+'8'8'?'?'D'D'V'VW[WbWbWiWijwWx'yz{'|H'7H))0033@@hW-zz*-/5j/A QO.*<+.t{{/A/A*/Mj/Y+Z#+c$..AS2T.U#U$($5$5$<$<$?$?$T$TUYU`U`befnbo$p$($5$5$<$<$?$?$M$Mdkk[^_g[h$i$($5$5$<$<$?$?$M$Mdkk[^_g[h$i$($5$5$<$<$?$?$T$TUYU`U`befnbo$p!04N!N $ 1 1 8 8 ; ; P PQUQ\Q\^p q;>t{{?Q?QR\?]^x?y;z 8#;a#?$($5$5$<$<$?$?$O$OPTP[P[]oqt  vN  rO  %P!0K!?+.s4;;3E3Ej3QR]3^/_bi/i+j9<SXPSTXTbTbcvTwPx=y9z 6 $ 1 1 8 8 ; ; M Mdkk[qs{  ~F  HP  !Q)Q*  O4NRnn]cNd  /G{hstzh{  @F  iF{  /G+  /G#$060G *,/? 	^*.*;*;*B*B*F*F*R*RSfgoSpqvSwx~S  +A#.&#8$($5$5$<$<$@$@$O$OPWY]YdYdYkYklsYtu}Y~  @F  ZG  %H%0K%?$($5$5$<$<$@$@$U$UV]_c_j_j_q_qry_z  |D  `E  FQ  `R  %S%0F%:$($5$5$<$<$@$@$G$GQTUYUrUrsws~s~  tF  tF  GN  tO  PX  tY tP  S[  t[V\ R] %^	^ %MH*  K09?9L +O5Ho*.++*<*<W*Eh*OK?Jv?VF(;gkgugu  wC  hD  FN  ]OIITYdIe[-EkmN*y9)-):):)A)A)D)D)P)PQ\]fQg)h!,!6)-):):)A)A)D)D)V)VWbcgWh)ijk)l)-)<)<(+D,I,I$++J\J\]dJefnJo  rN  QY  rY  -Z  )[I /84B&,09(.,1-202	,L '+kk'+.=,1(,(.).02688:,L 372C2C2J2J2N2N2U2UVb2cL/*.*;*;*B*B*F*F*M*Ml*[K#~~m<BBD	Q $ 1 1 8 8 < < A A+ NW+OZ  G,QUQ_Q_`fQg  0Ikwx~k  DH  lH  0I,  0I  4 9=8I8I8P8P8S8S8k8klplwlw8x5"&??36 03LQ3O 0 '+kk'7.>,1(,(,)-02688:)I -1,=,=,D,D,H,H,O,OPY,ZM,0,=,=,D,D,H,H,T,TUijkUlmsUt,uM)-):):)A)A)E)E)O)OP])^,27O bL+v5-1[[-?-?-H-P
#-#7$($5$5$<$<$@$@$F$F}$U%/6%9$(!-!;'5$($5$5$<$<$@$@$F$F}$U040A0A0H0H0L0L0^0^_c_j_j_q_qry_z  |F  `G  1H  IJ  1K $ 1 1 8 8 < < C CMS` ab   $67#$39:L3M `*/204v0Fx0P151C1CJ1OPX1Y*.*;*;*B*B*F*F*R*RS`agSh*i.2.?.?.F.F.N.N.Z.Z[hir[stz[{.|05#)-@#@EM`D` 3@2I3>.;D.A/<U/C/<U/C8En8U>KL`>a@MNd@e8En8U8En8U8En8U+&C (.1D'D:>:K:K:R:R:Z:Z:l:lm{  }C  nD  ;E  FG  ;H9HI595F5F5M5M5U5U5]5]^m5nE
',0C'C5CE5J5P5P5RE
'+~~m'D'J'J'LPY'Y(,(9(9(@(@(D(D(K(KG(T$($5$5$<$<$@$@$H$H$Q262C2C2J2J2N2N2U2UVY2ZK'+~~m'D'J'J'LPY'Y(,(9(9(@(@(D(D(I(I+(V.9G48M#'>>2G#HH#T=B$:'-1D'D7Ef7M7X7X7ZAE(>7DE^7_'+/B'B5CD5I
AE(>)67G)H5BCS5TUV5W5]5]^a5bcd5e
57
'/3F'F9>PXAY9YAE(>)67G)H][kMlmnMo9>O_A`abAcAiAijmAnopAq9q9;'04G'G:H:SAE(>:G:W'48N(,(9(9(@(@(D(D(S(ST[]i^hjxTy  |K)L >C$:'.2E'E8Fw8O8Z8Z8\AE(>8EF_8`',0C'C6DU6KAE(>)67G)H6CDT6UVW6X6^6^_b6cde6f68'04G'G:?.QZB[:[AE(>)67G)H][kMlmnMo:?-P`BabcBdBjBjknBopqBr:r:<'15H'H;I*;U(8AE(>;H;X(8'48N(,(9(9(@(@(D(D(S(ST[]j^ikzT{  ~N)O &*^^4I%Jh%V1>x1HJ Wj  ?M7mt  }L  nLw  ?M$;  ?M:QU[]bTc:c %W(,(9(9(@(@(C(C(](]^b^i^i {E  GU  _V)W%W (6'9'9&'A7Ef7M7DY7OP\7]$($5$5$<$<$?$?$T$TUYU`U`q{  ~D  VE  GS%T (6'9'9%'@6DU6K6Q6Q6S6CE6J6P6P6R$($5$5$<$<$?$?$T$TUYU`U`q{  ~C  VD  FQ%R ;R %y(,(9(9(@(@(C(C(X(XY]YdYdu  BP  ZQYghvYw)y%y
 %MHA`*B  N34:>4J PX0Hj-1[[-?-?
-KH-UN*.*;*;*B*B*J*J*\*\]klr]s*tuv*wK+9&+ALCQCUCUV[C\.*?bdK+9+=+=f+ELAOASASTXAY)=_aJIWI[I[\dIe^H-EkmNKYK]K]^gKhnY.GnpOKYK]K]^gKhnY.GnpO,:,>,>w,GMCQCUCUV[C\.*?bdKKYK]K]^gKhnY.GnpOM[M_M_`jMk~j/Iqs, +5+6&*kk'2'+'8'8'?'?'G'G'O'OP['\02688:	#C +/*;*;*B*B*F*F*M*Mc*RK#~~m<BBD	Q $ 1 1 8 8 < < A A+ N#~~.CDP#/LH4L$($5$5$<$<$@$@$O$OP[]e[eguPv  yH%I $1]h5N$($5$5$<$<$@$@$O$OP[]e[fhwPx  {K%L!%0E!F(!R 6Z !_M$($5$5$<$<$?$?$Y$YZ^ZeZe  DN  P]  h^  %_!_ !% 1 1 8 8 ; ; P PQUQ\Q\^x  |F  _F  HT  !U
 .2->->-E-E-I-I-Q-QR]-^
 $ 1 1 8 8 ; ; P PQUQ\Q\^w  {E  _E  GQ  !R#/$($5$5$<$<$?$?$T$TUYU`U`b|  @J  cJ  LX  %Y'3x'?(,(9(9(@(@(C(C(X(XY]YdYdYqt~Y~  AK)L(,(9(9(@(@(C(C(X(XY]YdYdYu  yC  ZC  ES)T(,(9(9(@(@(C(C(X(XY]YdYdYv  zD  ZD  FU)V(,(9(9(@(@(C(C(X(XY]YdYdYv  zD  ZD  FU)V $1$($5$5$<$<$?$?$T$TUYU`U`b}  AK  cK  MZ  %['4'@(,(9(9(@(@(C(C(X(XY]YdYdYruY  BM)N(,(9(9(@(@(C(C(X(XY]YdYdYv  zD  ZD  FU)V(,(9(9(@(@(C(C(X(XY]YdYdYw  {E  ZE  GW)X_PXd  O4(.(? @H/3{{/A/A//RS[/\]b/c,151C1CO1TU]1^_f1g. --<<[K[=[^b^i^ik}]~@eU@n {{!!-0!!((++==dkk4P"n49K9KG9TYlpxYx$$[1  
 q /G~ 0Ir ?Mz ~~ 	DKK!!&6&B!CC	Ds   $D'Ac; AAc; (B1Ac; GAc; 6AAc; C
Ac; Ac,Ac,C6Ac; I!Ac; 9AAc; Ac1Ac1"EAc; =Ac; TAc; A
	Ac6AAc6AO$Ac; P>Ac; QAAc; RH2Ac; [AAc; \CAc; _DAc; c,Ac; c;Aed)Ad=d=Aec                    | j                         s| j                  j                  d       | j                  d   j	                         dk7  r5| j                  j
                  d   s| j                  j                  d       | j                  j                  ry| j                  d       	 | j                  j                  j                  j                  | j                         | j                  d	   D cg c]  }|d
   dk(  s| }}|D ]f  }| j                  j                  j                  j                  |d   d         }| j                  j                  j                  j                  |       h yc c}w # t        j                   $ r3}| j                  j                  d|j"                  z         Y d}~yd}~ww xY w)z,Removes an existing VM with associated disksz"Called destroy on non existing VM!r=   r4   rA   rk   zUVM destroy: VM has to be in powered off state to destroy but force was not specified!N
poweredoffrz   r{   r|   r}   r   rL   )r-   r#   rM   r/   rQ   r$   rT   r8   rN   rO   r   r   r%   r}   r   r\   r]   r^   )r'   rb   r   vm_disk_paramsr   rg   s         r)   r   zXenServerVM.destroyp  s}    {{}KK!!&J!K>>-(..0H<T[[EWEWX_E`KK!!&}!~ ;;!! 	\*	D$$''//<BF..QWBX"z;\ghn\osy\y;"z"z #6 >++2266BB>RWCXY_C`a!!((,,44W=> #{ ~~ 	DKK!!&6&B!CC	Ds2   +A
E: 5E5E5A-E: 5E: :G )F;;G c           
       -   | j                         s| j                  j                  d       d}| j                  j                  d   rd}	 | j                  d   r+| j                  d   s| j                  j                  d       | j                  d   r| j                  j                  d	       g }| j                  j                  d
   p| j                  j                  d
   | j                  d   k7  rG| j                  j                  d
   r|j                  d
       n| j                  j                  d       | j                  j                  d   :| j                  j                  d   | j                  d   k7  r|j                  d       | j                  d   }|j                  dd      }| j                  j                  d   -| j                  j                  d   |k7  r|j                  d       | j                  j                  d   | j                  j                  d   r| j                  d   r,| j                  j                  d   | j                  d   d   k7  rDt        | j                  | j                  j                  d   dddd       |j                  d       n9| j                  j                  d   s | j                  d   r|j                  d       g }| j                  j                  d   r| j                  j                  d   j                  d      }|[	 t        |      }|dk  r| j                  j                  d       |t        | j                  d         k7  r|j                  d       d}| j                  j                  d   j                  d      }|	 t        |      }|dk  r| j                  j                  d        |r$||z  d!k7  r| j                  j                  d"       | j                  d#   }	t        |	j                  d$d            }
||
k7  r|j                  d       d}| j                  j                  d   j                  d%      }|	 t        |      }|dk  r| j                  j                  d'       |t        t        t        | j                  d(         t        | j                  d)               d*z        k7  r|j                  d%       d}|r|j                  d|i       g }g }| j                  j                  j                  j                  | j                        }| j                  j                  d+   r| j                  d,   D cg c]  }|d-   d.k(  s| }}t!        | j                  j                  d+         t!        |      k  rJ| j                  j                  d/t!        | j                  j                  d+         t!        |      fz         |sd0}n|d1   d2   }t#        t!        | j                  j                  d+               D ]  }|t!        |      k  r||   }nd}| j                  j                  d+   |   }| j%                  | j                  j                  d+   |   d3|z        }|j                  d
      }|!|s| j                  j                  d4|z         |r|d5   rg }|r||d5   d   k7  r|j                  d
       |j                  d      }|||d5   d   k7  r|j                  d       |rd|t        |d5   d6         kD  r|j                  d7       d}n<|t        |d5   d6         k  r(| j                  j                  d8|||d5   d6   fz         |j                  |       h|s| j                  j                  d9|z         |j                  d:      }|j                  d;      }||t        | j                  ||d<dd3|z  =       n.| j&                  d>k(  r| j                  j                  d?|z         |s| j                  j                  d@|z         d}|D ]0  }t        |      t        |      kD  s|}|j)                  |       |} n |Mt+        t        | j                  d,   d1   d2         dz         }| j                  j                  dA|dB|dC       |j                  ||f        |D ]  }|s|j                  dD|i        n |r|j                  dE|i       g }| j                  j                  dF   r3| j                  d,   D cg c]  }|d-   dGk(  s| }}|s|s| j                  j                  dH       | j                  j                  dF   j                  d-      } | j                  j                  dF   j                  dI      }!| s%|!rdJ} n|!dK} | | j                  j                  dF   d-<   | r*|r| | j-                  |d!         k7  r|j                  d-       | dJk(  rFt        | j                  |!ddLddM       |!r)|r|d!   d5   r|!|d!   d5   d   k7  r|j                  dI       |r|j                  dF|i       g }"g }#| j                  j                  j                  j/                  | j                        }$| j                  j                  dN   	rt!        | j                  j                  dN         t!        | j                  dO         k  rW| j                  j                  dPt!        | j                  j                  dN         t!        | j                  dO         fz         | j                  dO   sd0}%n| j                  dO   d1   dQ   }%t#        t!        | j                  j                  dN               D ]  }|t!        | j                  dO         k  r| j                  dO   |   }&nd}&| j                  j                  dN   |   }'|'j                  d
      }(|(!|(s| j                  j                  dR|z         |(rt        | j                  |(ddSddT|z         |'j                  dU      })|)>|)j1                         })t3        |)      s#| j                  j                  dV|dW|)dX       |'j                  d-      }*|'j                  dY      }+|'j                  dZ      },d}-|*s|+rd[}*| j                  d\   d]k(  r	|*r|*d^k(  rdK}*|*r|*d[k(  r|+|+j5                  d_      }.|.d!   }+|+r.t7        |+      s#| j                  j                  dV|d`|+dX       t!        |.      dkD  r3|.d   }-t9        |-      s#| j                  j                  dV|da|-dX       |,<t;        |,      s#| j                  j                  dV|db|,dX       t=        |,dc      }-n|-t?        |-dc      },|*r|*|'d-<   |+r|+|'dY<   |,r|,|'dZ<   |-r|-|'dd<   |'j                  de      }/|/r.t7        |/      s#| j                  j                  dV|df|/dX       |'j                  dg      }0|'j                  dh      }1d}2|0s|1rd[}0| j                  d\   d]k(  r	|0r|0d^k(  rdK}0|0r|0d[k(  r|1|1j5                  d_      }3|3d!   }1|1r.tA        |1      s#| j                  j                  dV|di|1dX       t!        |3      dkD  r3|3d   }2tC        |2      s#| j                  j                  dV|dj|2dX       |0r|0|'dg<   |1r|1|'dh<   |2r|2|'dk<   |'j                  dl      }4|4r.tA        |4      s#| j                  j                  dV|dm|4dX       |&r|&dS   rg }5|(r|(|&dS   d   k7  r|5j                  d
       |)r'|)|&dn   j1                         k7  r|5j                  dU       | j                  d\   d]k(  r|*r'|*|&do   j1                         k7  r|5j                  d-       |*r|*d[k(  r|+r;|&dp   r%|&dp   d!   r|+|&dp   d!   j5                  d_      d!   k7  r|5j                  dY       |-rL|&dp   r%|&dp   d!   r|-|&dp   d!   j5                  d_      d   k7  r"|5j                  dd       |5j                  dZ       |/|/|&dq   k7  r|5j                  de       |0r'|0|&dr   j1                         k7  r|5j                  dg       |0r`|0d[k(  rZ|1r;|&ds   r%|&ds   d!   r|1|&ds   d!   j5                  d_      d!   k7  r|5j                  dh       |2r;|&ds   r%|&ds   d!   r|2|&ds   d!   j5                  d_      d   k7  r|5j                  dk       |4|4|&dt   k7  r|5j                  dl       n| j                  d\   duk(  r| j                  dv   }6|*r.|*|6j                  dw|&dQ   z  dK      k7  r|5j                  d-       d}|*r|*d[k(  r|+r.|+|6j                  dx|&dQ   z  d      k7  r|5j                  dY       d}|-r?|-|6j                  dy|&dQ   z  d      k7  r$|5j                  dd       |5j                  dZ       d}|/.|/|6j                  dz|&dQ   z  d      k7  r|5j                  de       d}|0r.|0|6j                  d{|&dQ   z  dK      k7  r|5j                  dg       d}|0r|0d[k(  r|1r.|1|6j                  d||&dQ   z  d      k7  r|5j                  dh       d}|2r.|2|6j                  d}|&dQ   z  d      k7  r|5j                  dk       d}|4.|4|6j                  d~|&dQ   z  d      k7  r|5j                  dl       d}|"j                  |5       |(s| j                  j                  d|z         |*r(|*d[k(  r#|+r!|,s| j                  j                  d|z         |0r(|0d[k(  r#|1r!|2s| j                  j                  d|z         | j                  d\   duk(  rdD ]  }7|'j                  |7      sd} n |$s| j                  j                  d|z         t+        t        |%      dz         }8|8|$vr#| j                  j                  dV|d|8dC       |$j)                  |8       |8}%|#j                  ||8f        |"D ]  }9|9s|j                  d|"i        n |#r|j                  d|#i       g }:| j                  j                  d   rt#        t!        | j                  j                  d               D ]}  }| j                  j                  d   |   };|;d   }<|;d   }=|<| j                  vr#| j                  j                  d|d|<d       |=| j                  |<   k7  sm|:j                  |        |:r|j                  d|:i       |r|j                  d       |S # t        $ r'}| j                  j                  d       Y d}~d}~ww xY w# t        $ r'}| j                  j                  d       Y d}~<d}~ww xY w# t        $ r'}| j                  j                  d&       Y d}~d}~ww xY wc c}w c c}w # tD        jF                  $ r3}>| j                  j                  d|>jH                  z         Y d}>~>yd}>~>ww xY w)a:  Finds VM parameters that differ from specified ones.

        This method builds a dictionary with hierarchy of VM parameters
        that differ from those specified in module parameters.

        Returns:
            list: VM parameters that differ from those specified in
            module parameters.
        z&Called get_changes on non existing VM!r=   Fr   Tis_a_templateis_a_snapshotzOVM check: targeted VM is a template! Template reconfiguration is not supported.zOVM check: targeted VM is a snapshot! Snapshot reconfiguration is not supported.r   Nr   z1VM check name: VM name cannot be an empty string!rm   r   r   rn   rH   ro   affinityzhome serverzVM check home_server: )r   r   r   r    rp   rq   zAVM check hardware.num_cpus: parameter should be an integer value!ru   zBVM check hardware.num_cpus: parameter should be greater than zero!rr   rs   zQVM check hardware.num_cpu_cores_per_socket: parameter should be an integer value!zRVM check hardware.num_cpu_cores_per_socket: parameter should be greater than zero!r   z`VM check hardware.num_cpus: parameter should be a multiple of hardware.num_cpu_cores_per_socket!platformrt   rv   zBVM check hardware.memory_mb: parameter should be an integer value!zCVM check hardware.memory_mb: parameter should be greater than zero!memory_dynamic_maxmemory_static_maxrw   rB   rz   r{   r|   zYVM check disks: provided disks configuration has less disks than the target VM (%d < %d)!z-1r   zVM check disks[%s]: z8VM check disks[%s]: disk name cannot be an empty string!r}   r   r~   zpVM check disks[%s]: disk size is smaller than existing (%d bytes < %s bytes). Reducing disk size is not allowed!z;VM check disks[%s]: no valid disk size specification found!rC   rD   rE   r   rF   zHVM check disks[%s]: no default SR found! You must specify SR explicitly.z6VM check disks[%s]: maximum number of devices reached!zVM check disks[z]: new disk position z is out of bounds!ry   r   r   r   z2VM check cdrom: maximum number of devices reached!r   isor   z	ISO imagezVM check cdrom.iso_name: r   r   zdVM check networks: provided networks configuration has less interfaces than the target VM (%d < %d)!r   z>VM check networks[%s]: network name cannot be an empty string!r   zVM check networks[%s]: r   zVM check networks[z]: specified MAC address 'z' is not valid!r   r   r   r   r   dhcpr   z]: specified IPv4 address 'z]: specified IPv4 prefix 'z]: specified IPv4 netmask ')
skip_checkr   r   z]: specified IPv4 gateway 'r   r   z]: specified IPv6 address 'z]: specified IPv6 prefix 'r   r   z]: specified IPv6 gateway 'r   r   r   r   r   r   r   r   xenstore_datar   r   r   r   r   r   r   r   zJVM check networks[%s]: network name is required for new network interface!zTVM check networks[%s]: IPv4 netmask or prefix is required for new network interface!zIVM check networks[%s]: IPv6 prefix is required for new network interface!)r{   r   r   r   r   r   r   r   zDVM check networks[%s]: maximum number of network interfaces reached!z"]: new network interface position r   r   r   r   r   zVM check custom_params[z]: unknown VM param 'z'!rj   rL   )%r-   r#   rM   r$   r/   appendrR   r   r   
ValueErrormaxrN   rO   r   r   r%   lenranger   rS   remover   get_cdrom_typeget_allowed_VIF_devicesrQ   r   r   r   r   r   r   r   r   r   r\   r]   r^   )?r'   rj   r   rf   	vm_folderconfig_changes_hardwarerq   ers   vm_platformvm_cores_per_socketrv   config_changes_disksconfig_new_disksvbd_userdevices_allowedrb   r   vm_disk_userdevice_highestr   r&  r   r   disk_changesr   rc   rd   r   r   r   config_changes_cdromr   r   r  cdrom_iso_nameconfig_changes_networksconfig_new_networksvif_devices_allowedvif_device_highestr  r	  r  r  r  r  r  r  network_ip_splitr  r  r  r  network_ip6_splitr  network_changesvm_xenstore_data	parameterr  r  config_changes_custom_paramscustom_paramr"  r#  rg   s?                                                                  r)   r   zXenServerVM.get_changes  s    {{}KK!!&N!O;;m,"OW		D ~~o.t~~o7V%%*{%|~~o.%%*{%|  N {{!!&)5$++:L:LV:TX\XfXfgsXt:t;;%%f-"))&1KK)).a)b{{!!+.:t{{?Q?QR]?^bfbpbp  rD  cE  @E%%k2 #nn^<O'++Hb9I{{!!(+7DKK<N<Nx<X\e<e%%h/{{!!-0<KK&&}5!^^J74;;;M;Mm;\`d`n`noy`z  |H  aI  <I #4;;0B0B=0QX\gt{.FH #))-8++M:t~~j?Y"))-8&(#{{!!*-;;--j9==jI'w#&x=  !|--2v-w
  3t~~6H'I#JJ/66zB +/+/;;+=+=j+I+M+MNh+i(+7G367O3P0 0!3--  3G-  HH/G$G1$L--  3U-  V"&.."<K*-koo>PRS.T*U'/3FF/667QR +/ KK..z:>>{K	(x$'	N	 !1}--2w-x$ !CC?S0T,UWZ[_[i[ij}[~W  )A  DK  )K  %L  L/66{C +/&%%z3J&KL#% ! '+&7&7&>&>&A&A&Y&YZ^ZeZe&f#{{!!'*FJnnU[F\&~{`klr`sw}`}{&~#&~
 t{{))'23c:M6NNKK))  /J+.t{{/A/A'/J+KSQdMe*f/g) h +15.1DR1H1V. %c$++*<*<W*E&F G MMH#&9"::)<X)F)-"&++"4"4W"=h"GK $ = =dkk>P>PQX>YZb>ce{  G  fG  !HI + 7I ,Y--2low2w-x &.*?')$nU6KL6Y)Y(//7)4)E)5.N[`LabtLu:u(//<$(3~e/D^/T+UU , 3 3F ;26!*S1F~1V-W!W $ 5 5 ;[^fhq  tB  CH  tI  JX  tY  ^Z;Z 5 ![ -33LA  ) KK116sv~6~1'2y'A"-//$"7'3w7J*4;;X\cg6Lx6WY!004DD KK11  7A  DL  7L1  M6 KK116nqy6y1z*. +B &J":5O1PP2< 7 > >z J=G : %& +2 /2#dnnV6LR6PQ]6^2_bc2c.dO KK11v~  AP  7Q1  R )//?0KL[MMb  4 "))?<P*QR
  %%{4D&EF#% {{!!'* JNX^I_  (Acopvcw{c  (A$  (A ,4KKK)).b)c![[//8<<VD
!%!3!3G!<!@!@!L
 "%%*
'3%+
:DDKK&&w/7 ';zTM`M`auvwaxMy?y(//7& #4;;TT_fj.IK '!5!5a!8!?+/CA/Fu/Ml/[[,33J?#%%w0D&EF&(#"$ #'"3"3":":"="="U"UVZVaVa"b{{!!*- t{{))*56T^^F=S9TTKK))  /U+.t{{/A/A*/M+NPSTXTbTbciTjPk*l/m) n ~~f-)-&)-)?)CH)M& %c$++*<*<Z*H&I J }KH#dnnV&<"==(,v(>x(H(,%)[[%7%7
%CH%MN#1#5#5f#=L#/--2ru}2}-~#&t{{LtV_fj2Kh2VX #1"4"4U";K".&1&7&7&9%k2 KK11  |D  FQ  7R1  S $2#5#5f#=L!/!3!3D!9J&4&8&8&CO%)N (J'/ ~~&;<H\^jnt^t'-#(@%1/9/?/?/D,)9!)<J)2B:2N $ 5 5  AI  KU  ;V 5  !W"#34q81A!1D'9.'I$(KK$9$9  DL  N\  ?]$9  %^*6#6#G $ 5 5  AI  KZ  ;[ 5  !\-A/^b-cN+7.B>^b.cO $1=v.!/9t,&4Cy1%3Ax0&4&8&8&CO '/?/P--  yA  CR  3S-  T %3$6$6w$?M"0"4"4U";K&*O )[(0 ~~&;<H]_lpv_v(.$()B&20;0A0A#0F-*;A*>K*3D[3Q $ 5 5  AI  KV  ;W 5  !X"#4592CA2F':?'K$(KK$9$9  DL  N]  ?^$9  %_ %2?w/"0;u-&4Cy1'5'9'9*'E$ (0ABR0S--  yA  CS  3T-  U %y)A*,'LM)<TUa<b,b+226:&;-:N:T:T:V+V+2259>>*?@HL+Ng@h@n@n@p0p / 6 6v >+0H#-}EU7V7DEU7VWX7Y3=O_A`abAcAiAijmAnopAq3q$3$:$:4$@#1=IY;Z;HIY;Z[\;]7EWgIhijIkIqIqruIvwxIy7y$3$:$:8$D$3$:$:9$E#2#>?VcdrVsCs$3$:$:9$E,-PiBjBpBpBr1r / 6 6w ?,(1J#.FV8W8EFV8WXY8Z4?=QaCbcdCeCkCkloCpqrCs4s$3$:$:5$A#2MJZ<[<IJZ<[\]<^8G=YiKjklKmKsKstwKxyzK{8{$3$:$:9$E#3#?DTXeftXuDu$3$:$::$F!^^,ABhN/3~~o/N,+@P@T@TUor  AI  sJ  VJ  LR  AS  1S / 6 6v >26+0H#-*@P@T@TUmp}  G  qH  VH  JL  AM  3M$3$:$:4$@6:O#1nHXH\H\]y  }J  KS  }T  ^T  VX  IY  7Y$3$:$:8$D$3$:$:9$E6:O#2#>?VfVjVj  lIkx  zB  lClC EGWH DH$3$:$:9$E6:O,BRBVBVWr  vC  DL  vM  XM  OU  CV  2V / 6 6w ?26,(1J#.;BRBVBVWp  tA  BJ  tK  XK  MO  CP  4P$3$:$:5$A6:O#2JZJ^J^_|  @M  NV  @W  `W  Y[  K\  8\$3$:$:9$E6:O#3#?DTXhXlXl  nLmz  |D  nEnE GIYJ EJ$3$:$::$F6:O/66G  , KK11  7C  FN  7N1  O'LH,D\k KK11  7M  PX  7X1  Y(]h-F;_n KK11  7B  EM  7M1  N
  >>*?@HL-w *	#1#5#5i#@6:O$)*
  3 KK116|  @H  7H1  I &)-?)@1)D%E
%-@@ KK11  GO  Q[  7\1  ]+22:>-7* ,22Hj3IJ{}KB #: !"))+=?V*WX
 #%%~7J&KL+-({{!!/2 %c$++*<*<_*M&N O FH#';;#5#5o#Fx#PL'3E':$)5g)>&'t~~=--jr  uE  3F-  G)T^^<L-MM4;;HEF ,%%8T&UV%%&78!!A & w--2u-vvw, & G--  3F-  G  GG2 & x--2v-wwxN '\ (A|
 ~~ 	DKK!!&6&B!CC	Ds  KAX7 &AV 1A9AX7 +AW 6B3AX7 *AW: 5C8AX7 -AX-;AX-?K-AX7 -BAX7 2AAX7 
AX2AX2jAX7 O$BAX7 Q9CAX7 U<AX7 V	AWVAV?V9AX7 V?AWWAX7 W	AW7WAW2W,AX7 W2AW7W7AX7 W:	AX*XAX%XAX7 X%AX*X*AX7 X7AY=Y
)AY8Y8AY=c                   	 |j                         D cg c]!  }||   	|j                  d      s|dk(  s |# }}|r[	 d|v rTt        j                  d      }|j	                  |d         }|r#|j                  d      }|j                  d      }n%t        ||d      }|d   j                  d      d	   }|sd
}n|j                         }t        j                  d|      r&|d
k(  rt        t        |            }nt        |      }nt        |      }|r|dk  rt        	 t        ddddd      		v rt        d	|   z  z        S | j                  j                  |d|ddj!                  t#        	j                         	fd            d       yyc c}w # t        t        t        f$ r" | j                  j                  d|z         Y w xY w)a  Parses disk size parameters and returns disk size in bytes.

        This method tries to parse disk size module parameters. It fails
        with an error message if size cannot be parsed.

        Args:
            disk_params (dist): A dictionary with disk parameters.
            msg_prefix (str): A string error messages should be prefixed
                with (default: "").

        Returns:
            int: disk size in bytes if disk size is successfully parsed or
            None if no disk size parameters were found.
        Nsize_r~   z(\d+(?:\.\d+)?)\s*(.*)ru      r   _r.  bz\d+\.\d+zN%sfailed to parse disk size! Please review value provided using documentation.r=         )tbgbmbkbrV  i   'z?' is not a supported unit for disk size! Supported units are ['z', 'c                     |    S )N )r   
disk_unitss    r)   <lambda>z6XenServerVM.get_normalized_disk_size.<locals>.<lambda>>  s    oyz}o~ r*   )r   z'].)keys
startswithrecompilematchgroupr4  r   rQ   r   float	TypeError	NameErrorr#   rM   r   joinsorted)
r'   rb   r    xdisk_size_spec
size_regexdisk_size_mr~   unitr`  s
            @r)   r   z$XenServerVM.get_normalized_disk_size  s   & &1%5%5%7  B;q>;U[\[g[gho[ptuyt!  B  B%I^+!#,E!FJ","2"2;v3F"GK"*003*003(( '~a'89D)!,2237;DD::<D88K.s{"5;/$T{ t9Dtax$$  ( qQ1:Jz!44:d+;#;<==%%'14VJOOL]c~E  :A+B% C e BL z95 I%%*z  ~H  +H%  IIs"   
FFF C F   3GGc                     | d   ryy)zReturns VM CD-ROM type.r   r   r/  r_  )vm_cdrom_paramss    r)   r9  zXenServerVM.get_cdrom_typeB  s    
 7#r*   )rH   )__name__
__module____qualname____doc__r"   r-   r&   r1   r8   r;   rh   r[   r   r   r   staticmethodr9  __classcell__)r(   s   @r)   r   r   *  s`    	:D<GYDv{zD>j	DXEN  r*   r   c                  	   t               } | j                  t        ddg d      t        ddg      t        d      t        d      t        ddg      t        d      t        d	d
      t        d      t        dt        t        d      t        d      t        d                  t        ddt        t        d      t        d      t        d      t        d      t        d      t        d      t        ddg      t        d      t        d      t        d      
      dgg dddgg      t        dt        t        dddg      t        d            dddggg      t        ddt        t        ddg      t        d      t        dg d      t        d      t        d      t        d      t        dg d      t        d      t        d      	      d gdd!d"ggd#d!d$ggg%      t        d      t        ddt        t        dd&d
'      t        d(d&)      *      +      t        d	d
      t        dd,      t        d	d
      t        d	d
      -       t        | d&d.d/ggd0d1gg2      }d
d
d3}t	        |      }|j                         r|j                  d4   d5k(  r|j                          d&|d6<   n|j                  d4   dk(  r|j                         }|rd&|d6<   |D ]  }t        |t              s|j                  d7      rcg }|d7   D ]P  \  }}||d8}	|j                  d9   |   }
|
j                         D ]  }|
|   	|
|   |	|<    |j                  |	       R |s||d7<   |j                  d:      sg }|d:   D ]P  \  }}||d;}|j                  d<   |   }|j                         D ]  }||   	||   ||<    |j                  |       R |s||d:<    ||d=<   nZ|j                  d4   d>v rI|j                  |j                  d4         |d6<   n'|j                  d4   d5k7  r|j                          d&|d6<   |j                  d?   r"|j                  d4   d5k7  r|j                          |j!                         |d@<   |dA   r |j"                  dBi | y  |j$                  dBi | y )CNr   present)r{  absentrK   )r{   defaultchoicesr   )r{   aliases)r{   template_srcboolF)r{   r}  r   r   )rq   rs   rv   )r{   optionslist)
r~   size_tbsize_gbsize_mbsize_kbsize_br   rm   rD   rC   disk)r~   r  r  r  r  r  rD   rC   )r{   elementsr  r  mutually_exclusiver   r/  )r{   r~  )r{   r   r{   r   )r{   r  required_if)r   r0  r   )	r   r   r{   r   r   r   r   r   r   r   r   r   r   r   )r{   r  r  r  r  T)r{   requiredno_lograw)r{   r  )r   r   )r{   r  r  r   )rJ   r   rm   r   r?   r@   r   rn   rp   rB   r   r   ro   r   r;   r3   rG   rk   r   r   r?   r@   )argument_specsupports_check_moderequired_one_ofr  )failedchangedrJ   r|  r  r   )r   vbd_userdevicerB   r   )r   r  r   changes)rK   r%  	restartedrl   rebootguest	suspendedr;   instancer  r_  )r	   updater   r   r   r-   r$   r   r[   r   rR   rb  r3  r8   rh   r;   r1   rM   	exit_json)r  r#   resultvmr   r   r   r   r   disk_new_paramsrb   kr   r   network_new_paramsr	  s                   r)   mainr  M  s
   24My=?u|n5E"u5>*:;&fe45))-5)9E*
 u%%(%(%(%('u|n=E*U#%( HNy! !
* uvuo>5)
 -	
 u|n=e$u.HIU#%(%(/IJe$5)
 KD6*(UG,
( e$ed5A5
 !fe<!ua8vu5.c  Rh /3 &/, !+O</F %0F	V	B 
yy{==!X-JJL $F9]]7#y0^^-N$(y! -  FF!&$/!::k2(*I8>{8K B 4*?G[e2f.4mmG.DX.N)4)9)9); !LA'21~'A=H^(:!L !* 0 0 AB  )6?{ 3#ZZ7+-L4:>4J H 0&BJZ`5a 217z1J81T)7)<)<)> !RA'5a'8'D@Nq@Q(:1(=!R !- 3 34F GH  ,9E~ 6A FD !/F9]]7#'|| " 2 26==3I JF9	w	8	+
		 y}}*+g0F(0R
 *F:h"6""6"r*   __main__)%
__future__r   r   r   r{   __metaclass__DOCUMENTATIONEXAMPLESRETURNrd  
HAS_XENAPIr\   ImportErroransible.module_utils.basicr   #ansible.module_utils.common.networkr   ansible.module_utilsr   Dansible_collections.community.general.plugins.module_utils.xenserverr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rt  r_  r*   r)   <module>r     s    C BbH	WrL
\ 

	J 5 6 $, , , ,`/ `F)c#L zF o.  		s   A. .A65A6