/* Create a VM record from the XML description */ int createVMRecordFromXml(virConnectPtr conn, virDomainDefPtr def, xen_vm_record **record, xen_vm *vm) { char uuidStr[VIR_UUID_STRING_BUFLEN]; xen_string_string_map *strings = NULL; int device_number = 0; size_t i; *record = xen_vm_record_alloc(); if (VIR_STRDUP((*record)->name_label, def->name) < 0) goto error; if (def->uuid) { virUUIDFormat(def->uuid, uuidStr); if (VIR_STRDUP((*record)->uuid, uuidStr) < 0) goto error; } if (STREQ(def->os.type, "hvm")) { char *boot_order = NULL; if (VIR_STRDUP((*record)->hvm_boot_policy, "BIOS order") < 0) goto error; if (def->os.nBootDevs != 0) boot_order = createXenAPIBootOrderString(def->os.nBootDevs, &def->os.bootDevs[0]); if (boot_order != NULL) { xen_string_string_map *hvm_boot_params = NULL; allocStringMap(&hvm_boot_params, (char *)"order", boot_order); (*record)->hvm_boot_params = hvm_boot_params; VIR_FREE(boot_order); } } else if (STREQ(def->os.type, "xen")) { if (VIR_STRDUP((*record)->pv_bootloader, "pygrub") < 0) goto error; if (def->os.kernel) { if (VIR_STRDUP((*record)->pv_kernel, def->os.kernel) < 0) goto error; } if (def->os.initrd) { if (VIR_STRDUP((*record)->pv_ramdisk, def->os.initrd) < 0) goto error; } if (def->os.cmdline) { if (VIR_STRDUP((*record)->pv_args, def->os.cmdline) < 0) goto error; } (*record)->hvm_boot_params = xen_string_string_map_alloc(0); } if (def->os.bootloaderArgs) if (VIR_STRDUP((*record)->pv_bootloader_args, def->os.bootloaderArgs) < 0) goto error; if (def->mem.cur_balloon) (*record)->memory_static_max = (int64_t) (def->mem.cur_balloon * 1024); if (def->mem.max_balloon) (*record)->memory_dynamic_max = (int64_t) (def->mem.max_balloon * 1024); else (*record)->memory_dynamic_max = (*record)->memory_static_max; if (def->maxvcpus) { (*record)->vcpus_max = (int64_t) def->maxvcpus; (*record)->vcpus_at_startup = (int64_t) def->vcpus; } if (def->onPoweroff) (*record)->actions_after_shutdown = actionShutdownLibvirt2XenapiEnum(def->onPoweroff); if (def->onReboot) (*record)->actions_after_reboot = actionShutdownLibvirt2XenapiEnum(def->onReboot); if (def->onCrash) (*record)->actions_after_crash = actionCrashLibvirt2XenapiEnum(def->onCrash); if (def->features[VIR_DOMAIN_FEATURE_ACPI] == VIR_DOMAIN_FEATURE_STATE_ON) allocStringMap(&strings, (char *)"acpi", (char *)"true"); if (def->features[VIR_DOMAIN_FEATURE_APIC] == VIR_DOMAIN_FEATURE_STATE_ON) allocStringMap(&strings, (char *)"apic", (char *)"true"); if (def->features[VIR_DOMAIN_FEATURE_PAE] == VIR_DOMAIN_FEATURE_STATE_ON) allocStringMap(&strings, (char *)"pae", (char *)"true"); if (def->features[VIR_DOMAIN_FEATURE_HAP] == VIR_DOMAIN_FEATURE_STATE_ON) allocStringMap(&strings, (char *)"hap", (char *)"true"); if (def->features[VIR_DOMAIN_FEATURE_VIRIDIAN] == VIR_DOMAIN_FEATURE_STATE_ON) allocStringMap(&strings, (char *)"viridian", (char *)"true"); if (strings != NULL) (*record)->platform = strings; (*record)->vcpus_params = xen_string_string_map_alloc(0); (*record)->other_config = xen_string_string_map_alloc(0); (*record)->last_boot_cpu_flags = xen_string_string_map_alloc(0); (*record)->xenstore_data = xen_string_string_map_alloc(0); (*record)->hvm_shadow_multiplier = 1.000; if (!xen_vm_create(((struct _xenapiPrivate *)(conn->privateData))->session, vm, *record)) { xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR, NULL); return -1; } for (i = 0; i < def->nnets; i++) { if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE && def->nets[i]->data.bridge.brname) { char *mac; if (VIR_ALLOC_N(mac, VIR_MAC_STRING_BUFLEN) < 0) goto error; virMacAddrFormat(&def->nets[i]->mac, mac); if (createVifNetwork(conn, *vm, device_number, def->nets[i]->data.bridge.brname, mac) < 0) { VIR_FREE(mac); virReportOOMError(); goto error; } device_number++; } } return 0; error: xen_vm_record_free(*record); return -1; }
/* Create a VM record from the XML description */ int createVMRecordFromXml (virConnectPtr conn, virDomainDefPtr def, xen_vm_record **record, xen_vm *vm) { char uuidStr[VIR_UUID_STRING_BUFLEN]; *record = xen_vm_record_alloc(); if (!((*record)->name_label = strdup(def->name))) goto error_cleanup; if (def->uuid) { virUUIDFormat(def->uuid, uuidStr); if (!((*record)->uuid = strdup(uuidStr))) goto error_cleanup; } if (STREQ(def->os.type, "hvm")) { char *boot_order = NULL; if (!((*record)->hvm_boot_policy = strdup("BIOS order"))) goto error_cleanup; if (def->os.nBootDevs != 0) boot_order = createXenAPIBootOrderString(def->os.nBootDevs, &def->os.bootDevs[0]); if (boot_order != NULL) { xen_string_string_map *hvm_boot_params = NULL; allocStringMap(&hvm_boot_params, (char *)"order", boot_order); (*record)->hvm_boot_params = hvm_boot_params; VIR_FREE(boot_order); } } else if (STREQ(def->os.type, "xen")) { if (!((*record)->pv_bootloader = strdup("pygrub"))) goto error_cleanup; if (def->os.kernel) { if (!((*record)->pv_kernel = strdup(def->os.kernel))) goto error_cleanup; } if (def->os.initrd) { if (!((*record)->pv_ramdisk = strdup(def->os.initrd))) goto error_cleanup; } if (def->os.cmdline) { if (!((*record)->pv_args = strdup(def->os.cmdline))) goto error_cleanup; } (*record)->hvm_boot_params = xen_string_string_map_alloc(0); } if (def->os.bootloaderArgs) if (!((*record)->pv_bootloader_args = strdup(def->os.bootloaderArgs))) goto error_cleanup; if (def->memory) (*record)->memory_static_max = (int64_t) (def->memory * 1024); if (def->maxmem) (*record)->memory_dynamic_max = (int64_t) (def->maxmem * 1024); else (*record)->memory_dynamic_max = (*record)->memory_static_max; if (def->vcpus) { (*record)->vcpus_max = (int64_t) def->vcpus; (*record)->vcpus_at_startup = (int64_t) def->vcpus; } if (def->onPoweroff) (*record)->actions_after_shutdown = actionShutdownLibvirt2XenapiEnum(def->onPoweroff); if (def->onReboot) (*record)->actions_after_reboot = actionShutdownLibvirt2XenapiEnum(def->onReboot); if (def->onCrash) (*record)->actions_after_crash = actionCrashLibvirt2XenapiEnum(def->onCrash); xen_string_string_map *strings = NULL; if (def->features) { if (def->features & (1 << VIR_DOMAIN_FEATURE_ACPI)) allocStringMap(&strings, (char *)"acpi", (char *)"true"); if (def->features & (1 << VIR_DOMAIN_FEATURE_APIC)) allocStringMap(&strings, (char *)"apic", (char *)"true"); if (def->features & (1 << VIR_DOMAIN_FEATURE_PAE)) allocStringMap(&strings, (char *)"pae", (char *)"true"); } if (strings != NULL) (*record)->platform = strings; (*record)->vcpus_params = xen_string_string_map_alloc(0); (*record)->other_config = xen_string_string_map_alloc(0); (*record)->last_boot_cpu_flags = xen_string_string_map_alloc(0); (*record)->xenstore_data = xen_string_string_map_alloc(0); (*record)->hvm_shadow_multiplier = 1.000; if (!xen_vm_create(((struct _xenapiPrivate *)(conn->privateData))->session, vm, *record)) { xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR, NULL); return -1; } int device_number = 0; char *bridge = NULL, *mac = NULL; int i; for (i = 0; i < def->nnets; i++) { if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE) { if (def->nets[i]->data.bridge.brname) if (!(bridge = strdup(def->nets[i]->data.bridge.brname))) goto error_cleanup; if (def->nets[i]->mac) { char macStr[VIR_MAC_STRING_BUFLEN]; virFormatMacAddr(def->nets[i]->mac, macStr); if (!(mac = strdup(macStr))) { VIR_FREE(bridge); goto error_cleanup; } } if (mac != NULL && bridge != NULL) { char device[NETWORK_DEVID_SIZE] = "\0"; sprintf(device, "%d", device_number); createVifNetwork(conn, *vm, device, bridge, mac); VIR_FREE(bridge); device_number++; } VIR_FREE(bridge); } } return 0; error_cleanup: virReportOOMError(); xen_vm_record_free(*record); return -1; }