📄 test_bindings.c
字号:
xen_vm_free(new_vm); CLEANUP; return 0;}/** * Creation of a new VM, using the Named Parameters idiom. Allocate the * xen_vm_record here, but the sets through the library. Either * allocation patterns can be used, as long as the allocation and free are * paired correctly. */static xen_vm create_new_vm(xen_session *session, bool hvm){ xen_string_string_map *vcpus_params = xen_string_string_map_alloc(1); vcpus_params->contents[0].key = strdup("weight"); vcpus_params->contents[0].val = strdup("300"); xen_string_string_map *hvm_boot_params; if (hvm) { hvm_boot_params = xen_string_string_map_alloc(1); hvm_boot_params->contents[0].key = strdup("order"); hvm_boot_params->contents[0].val = strdup("cd"); } else { hvm_boot_params = NULL; } xen_vm_record vm_record = { .name_label = hvm ? "NewHVM" : "NewPV", .name_description = hvm ? "New HVM VM" : "New PV VM", .user_version = 1, .is_a_template = false, .memory_static_max = 256 * 1024 * 1024, .memory_dynamic_max = 256 * 1024 * 1024, .memory_dynamic_min = 128 * 1024 * 1024, .memory_static_min = 128 * 1024 * 1024, .vcpus_params = vcpus_params, .vcpus_max = 4, .vcpus_at_startup = 2, .actions_after_shutdown = XEN_ON_NORMAL_EXIT_DESTROY, .actions_after_reboot = XEN_ON_NORMAL_EXIT_RESTART, .actions_after_crash = XEN_ON_CRASH_BEHAVIOUR_RESTART, .hvm_boot_policy = hvm ? "BIOS order" : NULL, .hvm_boot_params = hvm ? hvm_boot_params : NULL, .pv_bootloader = hvm ? NULL : "pygrub", .pv_kernel = hvm ? NULL : "/boot/vmlinuz-2.6.16.33-xen", }; xen_vm vm; xen_vm_create(session, &vm, &vm_record); xen_string_string_map_free(vcpus_params); xen_string_string_map_free(hvm_boot_params); if (!session->ok) { fprintf(stderr, "VM creation failed.\n"); print_error(session); return NULL; } /* * Create a new disk for the new VM. */ xen_sr_set *srs; if (!xen_sr_get_by_name_label(session, &srs, "QCoW") || srs->size < 1) { fprintf(stderr, "SR lookup failed.\n"); print_error(session); xen_vm_free(vm); return NULL; } xen_sr_record_opt sr_record = { .u.handle = srs->contents[0] }; xen_vdi_record vdi0_record = { .name_label = "MyRootFS", .name_description = "MyRootFS description", .sr = &sr_record, .virtual_size = (INT64_C(1) << 30), // 1GiB .type = XEN_VDI_TYPE_SYSTEM, .sharable = false, .read_only = false }; xen_vdi vdi0; if (!xen_vdi_create(session, &vdi0, &vdi0_record)) { fprintf(stderr, "VDI creation failed.\n"); print_error(session); xen_sr_set_free(srs); xen_vm_free(vm); return NULL; } xen_vm_record_opt vm_record_opt = { .u.handle = vm }; xen_vdi_record_opt vdi0_record_opt = { .u.handle = vdi0 }; xen_vbd_record vbd0_record = { .vm = &vm_record_opt, .vdi = &vdi0_record_opt, .device = "xvda1", .mode = XEN_VBD_MODE_RW, .bootable = 1, }; xen_vbd vbd0; if (!xen_vbd_create(session, &vbd0, &vbd0_record)) { fprintf(stderr, "VBD creation failed.\n"); print_error(session); xen_vdi_free(vdi0); xen_sr_set_free(srs); xen_vm_free(vm); return NULL; } xen_console vnc_console = NULL; if (hvm) { xen_console_record vnc_console_record = { .protocol = XEN_CONSOLE_PROTOCOL_RFB, .vm = &vm_record_opt, }; if (!xen_console_create(session, &vnc_console, &vnc_console_record)) { fprintf(stderr, "VNC console creation failed.\n"); print_error(session); xen_vbd_free(vbd0); xen_vdi_free(vdi0); xen_sr_set_free(srs); xen_vm_free(vm); return NULL; } } char *vm_uuid; char *vdi0_uuid; char *vbd0_uuid; char *vnc_uuid = NULL; xen_vm_get_uuid(session, &vm_uuid, vm); xen_vdi_get_uuid(session, &vdi0_uuid, vdi0); xen_vbd_get_uuid(session, &vbd0_uuid, vbd0); if (hvm) { xen_console_get_uuid(session, &vnc_uuid, vnc_console); } if (!session->ok) { fprintf(stderr, "get_uuid call failed.\n"); print_error(session); xen_uuid_free(vm_uuid); xen_uuid_free(vdi0_uuid); xen_uuid_free(vbd0_uuid); xen_uuid_free(vnc_uuid); xen_vbd_free(vbd0); xen_vdi_free(vdi0); xen_console_free(vnc_console); xen_sr_set_free(srs); xen_vm_free(vm); return NULL; } if (hvm) { printf("Created a new HVM VM, with UUID %s, VDI UUID %s, VBD " "UUID %s, and VNC console UUID %s.\n", vm_uuid, vdi0_uuid, vbd0_uuid, vnc_uuid); } else { printf("Created a new PV VM, with UUID %s, VDI UUID %s, and VBD " "UUID %s.\n", vm_uuid, vdi0_uuid, vbd0_uuid); } xen_uuid_free(vm_uuid); xen_uuid_free(vdi0_uuid); xen_uuid_free(vbd0_uuid); xen_uuid_free(vnc_uuid); xen_vbd_free(vbd0); xen_vdi_free(vdi0); xen_console_free(vnc_console); xen_sr_set_free(srs); return vm;}/** * Print the power state for the given VM. */static void print_vm_power_state(xen_session *session, xen_vm vm){ char *vm_uuid; enum xen_vm_power_state power_state; if (!xen_vm_get_uuid(session, &vm_uuid, vm)) { print_error(session); return; } if (!xen_vm_get_power_state(session, &power_state, vm)) { xen_uuid_free(vm_uuid); print_error(session); return; } printf("VM %s power state is %s.\n", vm_uuid, xen_vm_power_state_to_string(power_state)); xen_uuid_free(vm_uuid); fflush(stdout);}/** * Workaround for whinging GCCs, as suggested by strftime(3). */static size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm){ return strftime(s, max, fmt, tm);}/** * Print some session details. */static void print_session_info(xen_session *session){ xen_session_record *record; if (!xen_session_get_record(session, &record, session)) { print_error(session); return; } printf("Session UUID: %s.\n", record->uuid); printf("Session user: %s.\n", record->this_user); char time[256]; struct tm *tm = localtime(&record->last_active); my_strftime(time, 256, "Session last active: %c, local time.\n", tm); printf(time); char *uuid = NULL; char *this_user = NULL; xen_session_get_uuid(session, &uuid, session); xen_session_get_this_user(session, &this_user, session); if (!session->ok) { free(uuid); free(this_user); xen_session_record_free(record); print_error(session); return; } assert(!strcmp(record->uuid, uuid)); assert(!strcmp(record->this_user, this_user)); free(uuid); free(this_user); xen_session_record_free(record); fflush(stdout);}static int pstrcmp(const void *p1, const void *p2){ return strcmp(*(char **)p1, *(char **)p2);}/** * Print the list of supported methods. */static void print_methods(xen_session *session){ xen_string_set *methods; if (!xen_host_list_methods(session, &methods)) { print_error(session); goto done; } printf("%zd.\n", methods->size); qsort(methods->contents, methods->size, sizeof(char *), pstrcmp); printf("Supported methods:\n"); for (size_t i = 0; i < methods->size; i++) { printf(" %s\n", methods->contents[i]); } fflush(stdout);done: xen_string_set_free(methods);}/** * Print the metrics for the given VM. */static void print_vm_metrics(xen_session *session, xen_vm vm){ xen_vm_metrics vm_metrics; if (!xen_vm_get_metrics(session, &vm_metrics, vm)) { print_error(session); return; } xen_vm_metrics_record *vm_metrics_record; if (!xen_vm_metrics_get_record(session, &vm_metrics_record, vm_metrics)) { xen_vm_metrics_free(vm_metrics); print_error(session); return; } char time[256]; struct tm *tm = localtime(&vm_metrics_record->last_updated); my_strftime(time, 256, "Metrics updated at %c, local time.\n", tm); printf(time); tm = localtime(&vm_metrics_record->start_time); my_strftime(time, 256, "VM running since %c, local time.\n", tm); printf(time); for (size_t i = 0; i < vm_metrics_record->vcpus_utilisation->size; i++) { printf("%"PRId64" -> %lf.\n", vm_metrics_record->vcpus_utilisation->contents[i].key, vm_metrics_record->vcpus_utilisation->contents[i].val); } printf("VCPU -> PCPU mapping:\n"); for (size_t i = 0; i < vm_metrics_record->vcpus_cpu->size; i++) { printf(" %"PRId64" -> %"PRId64".\n", vm_metrics_record->vcpus_cpu->contents[i].key, vm_metrics_record->vcpus_cpu->contents[i].val); } printf("Live scheduling parameters:\n"); for (size_t i = 0; i < vm_metrics_record->vcpus_params->size; i++) { printf(" %s -> %s.\n", vm_metrics_record->vcpus_params->contents[i].key, vm_metrics_record->vcpus_params->contents[i].val); } for (size_t i = 0; i < vm_metrics_record->vcpus_flags->size; i++) { printf("%"PRId64" -> ", vm_metrics_record->vcpus_flags->contents[i].key); xen_string_set *s = vm_metrics_record->vcpus_flags->contents[i].val; for (size_t j = 0; j < s->size; j++) { printf("%s", s->contents[j]); if (j + 1 != s->size) { printf(", "); } } printf("\n"); } xen_vm_metrics_record_free(vm_metrics_record); xen_vm_metrics_free(vm_metrics); fflush(stdout);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -