2 * This file is part of the libvirt-go project
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * Copyright (c) 2013 Alex Zorin
23 * Copyright (C) 2016 Red Hat, Inc.
35 #cgo pkg-config: libvirt
36 #include "domain_events_wrapper.h"
40 type DomainEventGenericCallback func(c *Connect, d *Domain)
42 type DomainEventLifecycle struct {
44 // TODO: we can make Detail typesafe somehow ?
48 type DomainEventLifecycleCallback func(c *Connect, d *Domain, event *DomainEventLifecycle)
50 type DomainEventRTCChange struct {
54 type DomainEventRTCChangeCallback func(c *Connect, d *Domain, event *DomainEventRTCChange)
56 type DomainEventWatchdog struct {
57 Action DomainEventWatchdogAction
60 type DomainEventWatchdogCallback func(c *Connect, d *Domain, event *DomainEventWatchdog)
62 type DomainEventIOError struct {
65 Action DomainEventIOErrorAction
68 type DomainEventIOErrorCallback func(c *Connect, d *Domain, event *DomainEventIOError)
70 type DomainEventGraphicsAddress struct {
71 Family DomainEventGraphicsAddressType
76 type DomainEventGraphicsSubjectIdentity struct {
81 type DomainEventGraphics struct {
82 Phase DomainEventGraphicsPhase
83 Local DomainEventGraphicsAddress
84 Remote DomainEventGraphicsAddress
86 Subject []DomainEventGraphicsSubjectIdentity
89 type DomainEventGraphicsCallback func(c *Connect, d *Domain, event *DomainEventGraphics)
91 type DomainEventIOErrorReason struct {
94 Action DomainEventIOErrorAction
98 type DomainEventIOErrorReasonCallback func(c *Connect, d *Domain, event *DomainEventIOErrorReason)
100 type DomainEventBlockJob struct {
102 Type DomainBlockJobType
103 Status ConnectDomainEventBlockJobStatus
106 type DomainEventBlockJobCallback func(c *Connect, d *Domain, event *DomainEventBlockJob)
108 type DomainEventDiskChange struct {
112 Reason ConnectDomainEventDiskChangeReason
115 type DomainEventDiskChangeCallback func(c *Connect, d *Domain, event *DomainEventDiskChange)
117 type DomainEventTrayChange struct {
119 Reason ConnectDomainEventTrayChangeReason
122 type DomainEventTrayChangeCallback func(c *Connect, d *Domain, event *DomainEventTrayChange)
124 type DomainEventPMSuspend struct {
128 type DomainEventPMSuspendCallback func(c *Connect, d *Domain, event *DomainEventPMSuspend)
130 type DomainEventPMWakeup struct {
134 type DomainEventPMWakeupCallback func(c *Connect, d *Domain, event *DomainEventPMWakeup)
136 type DomainEventPMSuspendDisk struct {
140 type DomainEventPMSuspendDiskCallback func(c *Connect, d *Domain, event *DomainEventPMSuspendDisk)
142 type DomainEventBalloonChange struct {
146 type DomainEventBalloonChangeCallback func(c *Connect, d *Domain, event *DomainEventBalloonChange)
148 type DomainEventDeviceRemoved struct {
152 type DomainEventDeviceRemovedCallback func(c *Connect, d *Domain, event *DomainEventDeviceRemoved)
154 type DomainEventTunableCpuPin struct {
163 type DomainEventTunable struct {
164 CpuSched *DomainSchedulerParameters
165 CpuPin *DomainEventTunableCpuPin
168 BlkdevTune *DomainBlockIoTuneParameters
171 type DomainEventTunableCallback func(c *Connect, d *Domain, event *DomainEventTunable)
173 type DomainEventAgentLifecycle struct {
174 State ConnectDomainEventAgentLifecycleState
175 Reason ConnectDomainEventAgentLifecycleReason
178 type DomainEventAgentLifecycleCallback func(c *Connect, d *Domain, event *DomainEventAgentLifecycle)
180 type DomainEventDeviceAdded struct {
184 type DomainEventDeviceAddedCallback func(c *Connect, d *Domain, event *DomainEventDeviceAdded)
186 type DomainEventMigrationIteration struct {
190 type DomainEventMigrationIterationCallback func(c *Connect, d *Domain, event *DomainEventMigrationIteration)
192 type DomainEventJobCompleted struct {
196 type DomainEventJobCompletedCallback func(c *Connect, d *Domain, event *DomainEventJobCompleted)
198 type DomainEventDeviceRemovalFailed struct {
202 type DomainEventDeviceRemovalFailedCallback func(c *Connect, d *Domain, event *DomainEventDeviceRemovalFailed)
204 type DomainEventMetadataChange struct {
209 type DomainEventMetadataChangeCallback func(c *Connect, d *Domain, event *DomainEventMetadataChange)
211 type DomainEventBlockThreshold struct {
218 type DomainEventBlockThresholdCallback func(c *Connect, d *Domain, event *DomainEventBlockThreshold)
220 //export domainEventLifecycleCallback
221 func domainEventLifecycleCallback(c C.virConnectPtr, d C.virDomainPtr,
222 event int, detail int,
225 domain := &Domain{ptr: d}
226 connection := &Connect{ptr: c}
228 eventDetails := &DomainEventLifecycle{
229 Event: DomainEventType(event),
233 callbackFunc := getCallbackId(goCallbackId)
234 callback, ok := callbackFunc.(DomainEventLifecycleCallback)
236 panic("Inappropriate callback type called")
238 callback(connection, domain, eventDetails)
241 //export domainEventGenericCallback
242 func domainEventGenericCallback(c C.virConnectPtr, d C.virDomainPtr,
245 domain := &Domain{ptr: d}
246 connection := &Connect{ptr: c}
248 callbackFunc := getCallbackId(goCallbackId)
249 callback, ok := callbackFunc.(DomainEventGenericCallback)
251 panic("Inappropriate callback type called")
253 callback(connection, domain)
256 //export domainEventRTCChangeCallback
257 func domainEventRTCChangeCallback(c C.virConnectPtr, d C.virDomainPtr,
258 utcoffset int64, goCallbackId int) {
260 domain := &Domain{ptr: d}
261 connection := &Connect{ptr: c}
263 eventDetails := &DomainEventRTCChange{
264 Utcoffset: utcoffset,
267 callbackFunc := getCallbackId(goCallbackId)
268 callback, ok := callbackFunc.(DomainEventRTCChangeCallback)
270 panic("Inappropriate callback type called")
272 callback(connection, domain, eventDetails)
276 //export domainEventWatchdogCallback
277 func domainEventWatchdogCallback(c C.virConnectPtr, d C.virDomainPtr,
278 action int, goCallbackId int) {
280 domain := &Domain{ptr: d}
281 connection := &Connect{ptr: c}
283 eventDetails := &DomainEventWatchdog{
284 Action: DomainEventWatchdogAction(action),
287 callbackFunc := getCallbackId(goCallbackId)
288 callback, ok := callbackFunc.(DomainEventWatchdogCallback)
290 panic("Inappropriate callback type called")
292 callback(connection, domain, eventDetails)
296 //export domainEventIOErrorCallback
297 func domainEventIOErrorCallback(c C.virConnectPtr, d C.virDomainPtr,
298 srcPath *C.char, devAlias *C.char, action int, goCallbackId int) {
300 domain := &Domain{ptr: d}
301 connection := &Connect{ptr: c}
303 eventDetails := &DomainEventIOError{
304 SrcPath: C.GoString(srcPath),
305 DevAlias: C.GoString(devAlias),
306 Action: DomainEventIOErrorAction(action),
309 callbackFunc := getCallbackId(goCallbackId)
310 callback, ok := callbackFunc.(DomainEventIOErrorCallback)
312 panic("Inappropriate callback type called")
314 callback(connection, domain, eventDetails)
318 //export domainEventGraphicsCallback
319 func domainEventGraphicsCallback(c C.virConnectPtr, d C.virDomainPtr,
321 local C.virDomainEventGraphicsAddressPtr,
322 remote C.virDomainEventGraphicsAddressPtr,
324 subject C.virDomainEventGraphicsSubjectPtr,
327 domain := &Domain{ptr: d}
328 connection := &Connect{ptr: c}
330 subjectGo := make([]DomainEventGraphicsSubjectIdentity, 0)
331 nidentities := int(subject.nidentity)
332 identities := (*[1 << 30]C.virDomainEventGraphicsSubjectIdentity)(unsafe.Pointer(&subject.identities))[:nidentities:nidentities]
333 for _, identity := range identities {
334 subjectGo = append(subjectGo,
335 DomainEventGraphicsSubjectIdentity{
336 Type: C.GoString(identity._type),
337 Name: C.GoString(identity.name),
342 eventDetails := &DomainEventGraphics{
343 Phase: DomainEventGraphicsPhase(phase),
344 Local: DomainEventGraphicsAddress{
345 Family: DomainEventGraphicsAddressType(local.family),
346 Node: C.GoString(local.node),
347 Service: C.GoString(local.service),
349 Remote: DomainEventGraphicsAddress{
350 Family: DomainEventGraphicsAddressType(remote.family),
351 Node: C.GoString(remote.node),
352 Service: C.GoString(remote.service),
354 AuthScheme: C.GoString(authScheme),
358 callbackFunc := getCallbackId(goCallbackId)
359 callback, ok := callbackFunc.(DomainEventGraphicsCallback)
361 panic("Inappropriate callback type called")
363 callback(connection, domain, eventDetails)
367 //export domainEventIOErrorReasonCallback
368 func domainEventIOErrorReasonCallback(c C.virConnectPtr, d C.virDomainPtr,
369 srcPath *C.char, devAlias *C.char, action int, reason *C.char,
372 domain := &Domain{ptr: d}
373 connection := &Connect{ptr: c}
375 eventDetails := &DomainEventIOErrorReason{
376 SrcPath: C.GoString(srcPath),
377 DevAlias: C.GoString(devAlias),
378 Action: DomainEventIOErrorAction(action),
379 Reason: C.GoString(reason),
382 callbackFunc := getCallbackId(goCallbackId)
383 callback, ok := callbackFunc.(DomainEventIOErrorReasonCallback)
385 panic("Inappropriate callback type called")
387 callback(connection, domain, eventDetails)
391 //export domainEventBlockJobCallback
392 func domainEventBlockJobCallback(c C.virConnectPtr, d C.virDomainPtr,
393 disk *C.char, _type int, status int, goCallbackId int) {
395 domain := &Domain{ptr: d}
396 connection := &Connect{ptr: c}
398 eventDetails := &DomainEventBlockJob{
399 Disk: C.GoString(disk),
400 Type: DomainBlockJobType(_type),
401 Status: ConnectDomainEventBlockJobStatus(status),
404 callbackFunc := getCallbackId(goCallbackId)
405 callback, ok := callbackFunc.(DomainEventBlockJobCallback)
407 panic("Inappropriate callback type called")
409 callback(connection, domain, eventDetails)
413 //export domainEventDiskChangeCallback
414 func domainEventDiskChangeCallback(c C.virConnectPtr, d C.virDomainPtr,
415 oldSrcPath *C.char, newSrcPath *C.char, devAlias *C.char,
416 reason int, goCallbackId int) {
418 domain := &Domain{ptr: d}
419 connection := &Connect{ptr: c}
421 eventDetails := &DomainEventDiskChange{
422 OldSrcPath: C.GoString(oldSrcPath),
423 NewSrcPath: C.GoString(newSrcPath),
424 DevAlias: C.GoString(devAlias),
425 Reason: ConnectDomainEventDiskChangeReason(reason),
428 callbackFunc := getCallbackId(goCallbackId)
429 callback, ok := callbackFunc.(DomainEventDiskChangeCallback)
431 panic("Inappropriate callback type called")
433 callback(connection, domain, eventDetails)
437 //export domainEventTrayChangeCallback
438 func domainEventTrayChangeCallback(c C.virConnectPtr, d C.virDomainPtr,
439 devAlias *C.char, reason int, goCallbackId int) {
441 domain := &Domain{ptr: d}
442 connection := &Connect{ptr: c}
444 eventDetails := &DomainEventTrayChange{
445 DevAlias: C.GoString(devAlias),
446 Reason: ConnectDomainEventTrayChangeReason(reason),
449 callbackFunc := getCallbackId(goCallbackId)
450 callback, ok := callbackFunc.(DomainEventTrayChangeCallback)
452 panic("Inappropriate callback type called")
454 callback(connection, domain, eventDetails)
458 //export domainEventPMSuspendCallback
459 func domainEventPMSuspendCallback(c C.virConnectPtr, d C.virDomainPtr,
460 reason int, goCallbackId int) {
462 domain := &Domain{ptr: d}
463 connection := &Connect{ptr: c}
465 eventDetails := &DomainEventPMSuspend{
469 callbackFunc := getCallbackId(goCallbackId)
470 callback, ok := callbackFunc.(DomainEventPMSuspendCallback)
472 panic("Inappropriate callback type called")
474 callback(connection, domain, eventDetails)
478 //export domainEventPMWakeupCallback
479 func domainEventPMWakeupCallback(c C.virConnectPtr, d C.virDomainPtr,
480 reason int, goCallbackId int) {
482 domain := &Domain{ptr: d}
483 connection := &Connect{ptr: c}
485 eventDetails := &DomainEventPMWakeup{
489 callbackFunc := getCallbackId(goCallbackId)
490 callback, ok := callbackFunc.(DomainEventPMWakeupCallback)
492 panic("Inappropriate callback type called")
494 callback(connection, domain, eventDetails)
498 //export domainEventPMSuspendDiskCallback
499 func domainEventPMSuspendDiskCallback(c C.virConnectPtr, d C.virDomainPtr,
500 reason int, goCallbackId int) {
502 domain := &Domain{ptr: d}
503 connection := &Connect{ptr: c}
505 eventDetails := &DomainEventPMSuspendDisk{
509 callbackFunc := getCallbackId(goCallbackId)
510 callback, ok := callbackFunc.(DomainEventPMSuspendDiskCallback)
512 panic("Inappropriate callback type called")
514 callback(connection, domain, eventDetails)
518 //export domainEventBalloonChangeCallback
519 func domainEventBalloonChangeCallback(c C.virConnectPtr, d C.virDomainPtr,
520 actual uint64, goCallbackId int) {
522 domain := &Domain{ptr: d}
523 connection := &Connect{ptr: c}
525 eventDetails := &DomainEventBalloonChange{
529 callbackFunc := getCallbackId(goCallbackId)
530 callback, ok := callbackFunc.(DomainEventBalloonChangeCallback)
532 panic("Inappropriate callback type called")
534 callback(connection, domain, eventDetails)
538 //export domainEventDeviceRemovedCallback
539 func domainEventDeviceRemovedCallback(c C.virConnectPtr, d C.virDomainPtr,
540 devAlias *C.char, goCallbackId int) {
542 domain := &Domain{ptr: d}
543 connection := &Connect{ptr: c}
545 eventDetails := &DomainEventDeviceRemoved{
546 DevAlias: C.GoString(devAlias),
548 callbackFunc := getCallbackId(goCallbackId)
549 callback, ok := callbackFunc.(DomainEventDeviceRemovedCallback)
551 panic("Inappropriate callback type called")
553 callback(connection, domain, eventDetails)
557 //export domainEventMetadataChangeCallback
558 func domainEventMetadataChangeCallback(c C.virConnectPtr, d C.virDomainPtr,
559 mtype int, nsuri *C.char, goCallbackId int) {
561 domain := &Domain{ptr: d}
562 connection := &Connect{ptr: c}
564 eventDetails := &DomainEventMetadataChange{
566 NSURI: C.GoString(nsuri),
568 callbackFunc := getCallbackId(goCallbackId)
569 callback, ok := callbackFunc.(DomainEventMetadataChangeCallback)
571 panic("Inappropriate callback type called")
573 callback(connection, domain, eventDetails)
577 func getDomainTuneSchedulerParametersFieldInfo(params *DomainSchedulerParameters) map[string]typedParamsFieldInfo {
578 return map[string]typedParamsFieldInfo{
579 C.VIR_DOMAIN_TUNABLE_CPU_CPU_SHARES: typedParamsFieldInfo{
580 set: ¶ms.CpuSharesSet,
581 ul: ¶ms.CpuShares,
583 C.VIR_DOMAIN_TUNABLE_CPU_GLOBAL_PERIOD: typedParamsFieldInfo{
584 set: ¶ms.GlobalPeriodSet,
585 ul: ¶ms.GlobalPeriod,
587 C.VIR_DOMAIN_TUNABLE_CPU_GLOBAL_QUOTA: typedParamsFieldInfo{
588 set: ¶ms.GlobalQuotaSet,
589 l: ¶ms.GlobalQuota,
591 C.VIR_DOMAIN_TUNABLE_CPU_EMULATOR_PERIOD: typedParamsFieldInfo{
592 set: ¶ms.EmulatorPeriodSet,
593 ul: ¶ms.EmulatorPeriod,
595 C.VIR_DOMAIN_TUNABLE_CPU_EMULATOR_QUOTA: typedParamsFieldInfo{
596 set: ¶ms.EmulatorQuotaSet,
597 l: ¶ms.EmulatorQuota,
599 C.VIR_DOMAIN_TUNABLE_CPU_VCPU_PERIOD: typedParamsFieldInfo{
600 set: ¶ms.VcpuPeriodSet,
601 ul: ¶ms.VcpuPeriod,
603 C.VIR_DOMAIN_TUNABLE_CPU_VCPU_QUOTA: typedParamsFieldInfo{
604 set: ¶ms.VcpuQuotaSet,
605 l: ¶ms.VcpuQuota,
607 C.VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_PERIOD: typedParamsFieldInfo{
608 set: ¶ms.IothreadPeriodSet,
609 ul: ¶ms.IothreadPeriod,
611 C.VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_QUOTA: typedParamsFieldInfo{
612 set: ¶ms.IothreadQuotaSet,
613 l: ¶ms.IothreadQuota,
618 func getTuneBlockIoTuneParametersFieldInfo(params *DomainBlockIoTuneParameters) map[string]typedParamsFieldInfo {
619 return map[string]typedParamsFieldInfo{
620 C.VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_BYTES_SEC: typedParamsFieldInfo{
621 set: ¶ms.TotalBytesSecSet,
622 ul: ¶ms.TotalBytesSec,
624 C.VIR_DOMAIN_TUNABLE_BLKDEV_READ_BYTES_SEC: typedParamsFieldInfo{
625 set: ¶ms.ReadBytesSecSet,
626 ul: ¶ms.ReadBytesSec,
628 C.VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_BYTES_SEC: typedParamsFieldInfo{
629 set: ¶ms.WriteBytesSecSet,
630 ul: ¶ms.WriteBytesSec,
632 C.VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_IOPS_SEC: typedParamsFieldInfo{
633 set: ¶ms.TotalIopsSecSet,
634 ul: ¶ms.TotalIopsSec,
636 C.VIR_DOMAIN_TUNABLE_BLKDEV_READ_IOPS_SEC: typedParamsFieldInfo{
637 set: ¶ms.ReadIopsSecSet,
638 ul: ¶ms.ReadIopsSec,
640 C.VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_IOPS_SEC: typedParamsFieldInfo{
641 set: ¶ms.WriteIopsSecSet,
642 ul: ¶ms.WriteIopsSec,
644 C.VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_BYTES_SEC_MAX: typedParamsFieldInfo{
645 set: ¶ms.TotalBytesSecMaxSet,
646 ul: ¶ms.TotalBytesSecMax,
648 C.VIR_DOMAIN_TUNABLE_BLKDEV_READ_BYTES_SEC_MAX: typedParamsFieldInfo{
649 set: ¶ms.ReadBytesSecMaxSet,
650 ul: ¶ms.ReadBytesSecMax,
652 C.VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_BYTES_SEC_MAX: typedParamsFieldInfo{
653 set: ¶ms.WriteBytesSecMaxSet,
654 ul: ¶ms.WriteBytesSecMax,
656 C.VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_IOPS_SEC_MAX: typedParamsFieldInfo{
657 set: ¶ms.TotalIopsSecMaxSet,
658 ul: ¶ms.TotalIopsSecMax,
660 C.VIR_DOMAIN_TUNABLE_BLKDEV_READ_IOPS_SEC_MAX: typedParamsFieldInfo{
661 set: ¶ms.ReadIopsSecMaxSet,
662 ul: ¶ms.ReadIopsSecMax,
664 C.VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_IOPS_SEC_MAX: typedParamsFieldInfo{
665 set: ¶ms.WriteIopsSecMaxSet,
666 ul: ¶ms.WriteIopsSecMax,
668 C.VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_BYTES_SEC_MAX_LENGTH: typedParamsFieldInfo{
669 set: ¶ms.TotalBytesSecMaxLengthSet,
670 ul: ¶ms.TotalBytesSecMaxLength,
672 C.VIR_DOMAIN_TUNABLE_BLKDEV_READ_BYTES_SEC_MAX_LENGTH: typedParamsFieldInfo{
673 set: ¶ms.ReadBytesSecMaxLengthSet,
674 ul: ¶ms.ReadBytesSecMaxLength,
676 C.VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_BYTES_SEC_MAX_LENGTH: typedParamsFieldInfo{
677 set: ¶ms.WriteBytesSecMaxLengthSet,
678 ul: ¶ms.WriteBytesSecMaxLength,
680 C.VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_IOPS_SEC_MAX_LENGTH: typedParamsFieldInfo{
681 set: ¶ms.TotalIopsSecMaxLengthSet,
682 ul: ¶ms.TotalIopsSecMaxLength,
684 C.VIR_DOMAIN_TUNABLE_BLKDEV_READ_IOPS_SEC_MAX_LENGTH: typedParamsFieldInfo{
685 set: ¶ms.ReadIopsSecMaxLengthSet,
686 ul: ¶ms.ReadIopsSecMaxLength,
688 C.VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_IOPS_SEC_MAX_LENGTH: typedParamsFieldInfo{
689 set: ¶ms.WriteIopsSecMaxLengthSet,
690 ul: ¶ms.WriteIopsSecMaxLength,
692 C.VIR_DOMAIN_TUNABLE_BLKDEV_SIZE_IOPS_SEC: typedParamsFieldInfo{
693 set: ¶ms.SizeIopsSecSet,
694 ul: ¶ms.SizeIopsSec,
696 C.VIR_DOMAIN_TUNABLE_BLKDEV_GROUP_NAME: typedParamsFieldInfo{
697 set: ¶ms.GroupNameSet,
698 s: ¶ms.GroupName,
703 type domainEventTunablePinTemp struct {
712 func getDomainPinTempFieldInfo(numvcpu int, numiothread int, params *domainEventTunablePinTemp) map[string]typedParamsFieldInfo {
713 ret := map[string]typedParamsFieldInfo{
714 C.VIR_DOMAIN_TUNABLE_CPU_EMULATORPIN: typedParamsFieldInfo{
715 set: ¶ms.EmulatorPinSet,
716 s: ¶ms.EmulatorPin,
719 for i := 0; i < numvcpu; i++ {
720 ret[fmt.Sprintf("cputune.vcpupin%d", i)] = typedParamsFieldInfo{
721 s: ¶ms.VcpuPin[i],
724 for i := 0; i < numiothread; i++ {
725 ret[fmt.Sprintf("cputune.iothreadpin%d", i)] = typedParamsFieldInfo{
726 s: ¶ms.IOThreadPin[i],
733 func countPinInfo(cparams C.virTypedParameterPtr, nparams C.int) (int, int) {
736 for i := 0; i < int(nparams); i++ {
737 var cparam *C.virTypedParameter
738 cparam = (*C.virTypedParameter)(unsafe.Pointer(uintptr(unsafe.Pointer(cparams)) + unsafe.Sizeof(*cparam)*uintptr(i)))
739 name := C.GoString((*C.char)(unsafe.Pointer(&cparam.field)))
742 _, err := fmt.Scanf(name, "cputune.vcpupin%d", &vcpu)
750 _, err = fmt.Scanf(name, "cputune.iothreadpin%d", &iothread)
752 if iothread > maxiothreads {
753 maxiothreads = iothread
758 return maxvcpus + 1, maxiothreads + 1
761 func domainEventTunableGetPin(params C.virTypedParameterPtr, nparams C.int) *DomainEventTunableCpuPin {
762 var pin domainEventTunablePinTemp
763 numvcpus, numiothreads := countPinInfo(params, nparams)
764 pinInfo := getDomainPinTempFieldInfo(numvcpus, numiothreads, &pin)
766 num, err := typedParamsUnpackLen(params, int(nparams), pinInfo)
767 if num == 0 || err != nil {
771 info := &DomainEventTunableCpuPin{}
774 info.VcpuPinSet = true
775 info.VcpuPin = make([][]bool, len(pin.VcpuPin))
777 for i := 0; i < len(pin.VcpuPin); i++ {
778 bits, err := parseCPUString(pin.VcpuPin[i])
780 info.VcpuPin[i] = bits
785 if pin.EmulatorPinSet {
786 bits, err := parseCPUString(pin.EmulatorPin)
788 info.EmulatorPinSet = true
789 info.EmulatorPin = bits
793 if pin.IOThreadPinSet {
794 info.IOThreadPinSet = true
795 info.IOThreadPin = make([][]bool, len(pin.IOThreadPin))
797 for i := 0; i < len(pin.IOThreadPin); i++ {
798 bits, err := parseCPUString(pin.IOThreadPin[i])
800 info.IOThreadPin[i] = bits
808 //export domainEventTunableCallback
809 func domainEventTunableCallback(c C.virConnectPtr, d C.virDomainPtr, params C.virTypedParameterPtr, nparams C.int, goCallbackId int) {
810 domain := &Domain{ptr: d}
811 connection := &Connect{ptr: c}
813 eventDetails := &DomainEventTunable{}
815 pin := domainEventTunableGetPin(params, nparams)
817 eventDetails.CpuPin = pin
820 var sched DomainSchedulerParameters
821 schedInfo := getDomainTuneSchedulerParametersFieldInfo(&sched)
823 num, _ := typedParamsUnpackLen(params, int(nparams), schedInfo)
825 eventDetails.CpuSched = &sched
828 blknameInfo := map[string]typedParamsFieldInfo{
829 C.VIR_DOMAIN_TUNABLE_BLKDEV_DISK: typedParamsFieldInfo{
830 set: &eventDetails.BlkdevDiskSet,
831 s: &eventDetails.BlkdevDisk,
834 typedParamsUnpackLen(params, int(nparams), blknameInfo)
836 var blktune DomainBlockIoTuneParameters
837 blktuneInfo := getTuneBlockIoTuneParametersFieldInfo(&blktune)
839 num, _ = typedParamsUnpackLen(params, int(nparams), blktuneInfo)
841 eventDetails.BlkdevTune = &blktune
844 callbackFunc := getCallbackId(goCallbackId)
845 callback, ok := callbackFunc.(DomainEventTunableCallback)
847 panic("Inappropriate callback type called")
849 callback(connection, domain, eventDetails)
853 //export domainEventAgentLifecycleCallback
854 func domainEventAgentLifecycleCallback(c C.virConnectPtr, d C.virDomainPtr, state C.int, reason C.int, goCallbackId int) {
855 domain := &Domain{ptr: d}
856 connection := &Connect{ptr: c}
858 eventDetails := &DomainEventAgentLifecycle{
859 State: ConnectDomainEventAgentLifecycleState(state),
860 Reason: ConnectDomainEventAgentLifecycleReason(reason),
862 callbackFunc := getCallbackId(goCallbackId)
863 callback, ok := callbackFunc.(DomainEventAgentLifecycleCallback)
865 panic("Inappropriate callback type called")
867 callback(connection, domain, eventDetails)
871 //export domainEventDeviceAddedCallback
872 func domainEventDeviceAddedCallback(c C.virConnectPtr, d C.virDomainPtr, devalias *C.char, goCallbackId int) {
873 domain := &Domain{ptr: d}
874 connection := &Connect{ptr: c}
876 eventDetails := &DomainEventDeviceAdded{
877 DevAlias: C.GoString(devalias),
879 callbackFunc := getCallbackId(goCallbackId)
880 callback, ok := callbackFunc.(DomainEventDeviceAddedCallback)
882 panic("Inappropriate callback type called")
884 callback(connection, domain, eventDetails)
888 //export domainEventMigrationIterationCallback
889 func domainEventMigrationIterationCallback(c C.virConnectPtr, d C.virDomainPtr, iteration C.int, goCallbackId int) {
890 domain := &Domain{ptr: d}
891 connection := &Connect{ptr: c}
893 eventDetails := &DomainEventMigrationIteration{
894 Iteration: int(iteration),
896 callbackFunc := getCallbackId(goCallbackId)
897 callback, ok := callbackFunc.(DomainEventMigrationIterationCallback)
899 panic("Inappropriate callback type called")
901 callback(connection, domain, eventDetails)
905 //export domainEventJobCompletedCallback
906 func domainEventJobCompletedCallback(c C.virConnectPtr, d C.virDomainPtr, params C.virTypedParameterPtr, nparams C.int, goCallbackId int) {
907 domain := &Domain{ptr: d}
908 connection := &Connect{ptr: c}
910 eventDetails := &DomainEventJobCompleted{}
911 info := getDomainJobInfoFieldInfo(&eventDetails.Info)
913 typedParamsUnpackLen(params, int(nparams), info)
915 callbackFunc := getCallbackId(goCallbackId)
916 callback, ok := callbackFunc.(DomainEventJobCompletedCallback)
918 panic("Inappropriate callback type called")
920 callback(connection, domain, eventDetails)
924 //export domainEventDeviceRemovalFailedCallback
925 func domainEventDeviceRemovalFailedCallback(c C.virConnectPtr, d C.virDomainPtr, devalias *C.char, goCallbackId int) {
926 domain := &Domain{ptr: d}
927 connection := &Connect{ptr: c}
929 eventDetails := &DomainEventDeviceRemovalFailed{
930 DevAlias: C.GoString(devalias),
932 callbackFunc := getCallbackId(goCallbackId)
933 callback, ok := callbackFunc.(DomainEventDeviceRemovalFailedCallback)
935 panic("Inappropriate callback type called")
937 callback(connection, domain, eventDetails)
941 //export domainEventBlockThresholdCallback
942 func domainEventBlockThresholdCallback(c C.virConnectPtr, d C.virDomainPtr, dev *C.char, path *C.char, threshold C.ulonglong, excess C.ulonglong, goCallbackId int) {
943 domain := &Domain{ptr: d}
944 connection := &Connect{ptr: c}
946 eventDetails := &DomainEventBlockThreshold{
947 Dev: C.GoString(dev),
948 Path: C.GoString(path),
949 Threshold: uint64(threshold),
950 Excess: uint64(excess),
952 callbackFunc := getCallbackId(goCallbackId)
953 callback, ok := callbackFunc.(DomainEventBlockThresholdCallback)
955 panic("Inappropriate callback type called")
957 callback(connection, domain, eventDetails)
961 func (c *Connect) DomainEventLifecycleRegister(dom *Domain, callback DomainEventLifecycleCallback) (int, error) {
962 goCallBackId := registerCallbackId(callback)
964 callbackPtr := unsafe.Pointer(C.domainEventLifecycleCallbackHelper)
965 var cdom C.virDomainPtr
970 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
971 C.VIR_DOMAIN_EVENT_ID_LIFECYCLE,
972 C.virConnectDomainEventGenericCallback(callbackPtr),
973 C.long(goCallBackId), &err)
975 freeCallbackId(goCallBackId)
976 return 0, makeError(&err)
981 func (c *Connect) DomainEventRebootRegister(dom *Domain, callback DomainEventGenericCallback) (int, error) {
982 goCallBackId := registerCallbackId(callback)
984 callbackPtr := unsafe.Pointer(C.domainEventGenericCallbackHelper)
985 var cdom C.virDomainPtr
990 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
991 C.VIR_DOMAIN_EVENT_ID_REBOOT,
992 C.virConnectDomainEventGenericCallback(callbackPtr),
993 C.long(goCallBackId), &err)
995 freeCallbackId(goCallBackId)
996 return 0, makeError(&err)
1001 func (c *Connect) DomainEventRTCChangeRegister(dom *Domain, callback DomainEventRTCChangeCallback) (int, error) {
1002 goCallBackId := registerCallbackId(callback)
1004 callbackPtr := unsafe.Pointer(C.domainEventRTCChangeCallbackHelper)
1005 var cdom C.virDomainPtr
1010 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1011 C.VIR_DOMAIN_EVENT_ID_RTC_CHANGE,
1012 C.virConnectDomainEventGenericCallback(callbackPtr),
1013 C.long(goCallBackId), &err)
1015 freeCallbackId(goCallBackId)
1016 return 0, makeError(&err)
1018 return int(ret), nil
1021 func (c *Connect) DomainEventWatchdogRegister(dom *Domain, callback DomainEventWatchdogCallback) (int, error) {
1022 goCallBackId := registerCallbackId(callback)
1024 callbackPtr := unsafe.Pointer(C.domainEventWatchdogCallbackHelper)
1025 var cdom C.virDomainPtr
1030 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1031 C.VIR_DOMAIN_EVENT_ID_WATCHDOG,
1032 C.virConnectDomainEventGenericCallback(callbackPtr),
1033 C.long(goCallBackId), &err)
1035 freeCallbackId(goCallBackId)
1036 return 0, makeError(&err)
1038 return int(ret), nil
1041 func (c *Connect) DomainEventIOErrorRegister(dom *Domain, callback DomainEventIOErrorCallback) (int, error) {
1042 goCallBackId := registerCallbackId(callback)
1044 callbackPtr := unsafe.Pointer(C.domainEventIOErrorCallbackHelper)
1045 var cdom C.virDomainPtr
1050 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1051 C.VIR_DOMAIN_EVENT_ID_IO_ERROR,
1052 C.virConnectDomainEventGenericCallback(callbackPtr),
1053 C.long(goCallBackId), &err)
1055 freeCallbackId(goCallBackId)
1056 return 0, makeError(&err)
1058 return int(ret), nil
1061 func (c *Connect) DomainEventGraphicsRegister(dom *Domain, callback DomainEventGraphicsCallback) (int, error) {
1062 goCallBackId := registerCallbackId(callback)
1064 callbackPtr := unsafe.Pointer(C.domainEventGraphicsCallbackHelper)
1065 var cdom C.virDomainPtr
1070 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1071 C.VIR_DOMAIN_EVENT_ID_GRAPHICS,
1072 C.virConnectDomainEventGenericCallback(callbackPtr),
1073 C.long(goCallBackId), &err)
1075 freeCallbackId(goCallBackId)
1076 return 0, makeError(&err)
1078 return int(ret), nil
1081 func (c *Connect) DomainEventIOErrorReasonRegister(dom *Domain, callback DomainEventIOErrorReasonCallback) (int, error) {
1082 goCallBackId := registerCallbackId(callback)
1084 callbackPtr := unsafe.Pointer(C.domainEventIOErrorReasonCallbackHelper)
1085 var cdom C.virDomainPtr
1090 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1091 C.VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON,
1092 C.virConnectDomainEventGenericCallback(callbackPtr),
1093 C.long(goCallBackId), &err)
1095 freeCallbackId(goCallBackId)
1096 return 0, makeError(&err)
1098 return int(ret), nil
1101 func (c *Connect) DomainEventControlErrorRegister(dom *Domain, callback DomainEventGenericCallback) (int, error) {
1102 goCallBackId := registerCallbackId(callback)
1104 callbackPtr := unsafe.Pointer(C.domainEventGenericCallbackHelper)
1105 var cdom C.virDomainPtr
1110 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1111 C.VIR_DOMAIN_EVENT_ID_CONTROL_ERROR,
1112 C.virConnectDomainEventGenericCallback(callbackPtr),
1113 C.long(goCallBackId), &err)
1115 freeCallbackId(goCallBackId)
1116 return 0, makeError(&err)
1118 return int(ret), nil
1121 func (c *Connect) DomainEventBlockJobRegister(dom *Domain, callback DomainEventBlockJobCallback) (int, error) {
1122 goCallBackId := registerCallbackId(callback)
1124 callbackPtr := unsafe.Pointer(C.domainEventBlockJobCallbackHelper)
1125 var cdom C.virDomainPtr
1130 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1131 C.VIR_DOMAIN_EVENT_ID_BLOCK_JOB,
1132 C.virConnectDomainEventGenericCallback(callbackPtr),
1133 C.long(goCallBackId), &err)
1135 freeCallbackId(goCallBackId)
1136 return 0, makeError(&err)
1138 return int(ret), nil
1141 func (c *Connect) DomainEventDiskChangeRegister(dom *Domain, callback DomainEventDiskChangeCallback) (int, error) {
1142 goCallBackId := registerCallbackId(callback)
1144 callbackPtr := unsafe.Pointer(C.domainEventDiskChangeCallbackHelper)
1145 var cdom C.virDomainPtr
1150 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1151 C.VIR_DOMAIN_EVENT_ID_DISK_CHANGE,
1152 C.virConnectDomainEventGenericCallback(callbackPtr),
1153 C.long(goCallBackId), &err)
1155 freeCallbackId(goCallBackId)
1156 return 0, makeError(&err)
1158 return int(ret), nil
1161 func (c *Connect) DomainEventTrayChangeRegister(dom *Domain, callback DomainEventTrayChangeCallback) (int, error) {
1162 goCallBackId := registerCallbackId(callback)
1164 callbackPtr := unsafe.Pointer(C.domainEventTrayChangeCallbackHelper)
1165 var cdom C.virDomainPtr
1170 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1171 C.VIR_DOMAIN_EVENT_ID_TRAY_CHANGE,
1172 C.virConnectDomainEventGenericCallback(callbackPtr),
1173 C.long(goCallBackId), &err)
1175 freeCallbackId(goCallBackId)
1176 return 0, makeError(&err)
1178 return int(ret), nil
1181 func (c *Connect) DomainEventPMWakeupRegister(dom *Domain, callback DomainEventPMWakeupCallback) (int, error) {
1182 goCallBackId := registerCallbackId(callback)
1184 callbackPtr := unsafe.Pointer(C.domainEventPMWakeupCallbackHelper)
1185 var cdom C.virDomainPtr
1190 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1191 C.VIR_DOMAIN_EVENT_ID_PMWAKEUP,
1192 C.virConnectDomainEventGenericCallback(callbackPtr),
1193 C.long(goCallBackId), &err)
1195 freeCallbackId(goCallBackId)
1196 return 0, makeError(&err)
1198 return int(ret), nil
1201 func (c *Connect) DomainEventPMSuspendRegister(dom *Domain, callback DomainEventPMSuspendCallback) (int, error) {
1202 goCallBackId := registerCallbackId(callback)
1204 callbackPtr := unsafe.Pointer(C.domainEventPMSuspendCallbackHelper)
1205 var cdom C.virDomainPtr
1210 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1211 C.VIR_DOMAIN_EVENT_ID_PMSUSPEND,
1212 C.virConnectDomainEventGenericCallback(callbackPtr),
1213 C.long(goCallBackId), &err)
1215 freeCallbackId(goCallBackId)
1216 return 0, makeError(&err)
1218 return int(ret), nil
1221 func (c *Connect) DomainEventBalloonChangeRegister(dom *Domain, callback DomainEventBalloonChangeCallback) (int, error) {
1222 goCallBackId := registerCallbackId(callback)
1224 callbackPtr := unsafe.Pointer(C.domainEventBalloonChangeCallbackHelper)
1225 var cdom C.virDomainPtr
1230 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1231 C.VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE,
1232 C.virConnectDomainEventGenericCallback(callbackPtr),
1233 C.long(goCallBackId), &err)
1235 freeCallbackId(goCallBackId)
1236 return 0, makeError(&err)
1238 return int(ret), nil
1241 func (c *Connect) DomainEventPMSuspendDiskRegister(dom *Domain, callback DomainEventPMSuspendDiskCallback) (int, error) {
1242 goCallBackId := registerCallbackId(callback)
1244 callbackPtr := unsafe.Pointer(C.domainEventPMSuspendDiskCallbackHelper)
1245 var cdom C.virDomainPtr
1250 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1251 C.VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK,
1252 C.virConnectDomainEventGenericCallback(callbackPtr),
1253 C.long(goCallBackId), &err)
1255 freeCallbackId(goCallBackId)
1256 return 0, makeError(&err)
1258 return int(ret), nil
1261 func (c *Connect) DomainEventDeviceRemovedRegister(dom *Domain, callback DomainEventDeviceRemovedCallback) (int, error) {
1262 goCallBackId := registerCallbackId(callback)
1264 callbackPtr := unsafe.Pointer(C.domainEventDeviceRemovedCallbackHelper)
1265 var cdom C.virDomainPtr
1270 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1271 C.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED,
1272 C.virConnectDomainEventGenericCallback(callbackPtr),
1273 C.long(goCallBackId), &err)
1275 freeCallbackId(goCallBackId)
1276 return 0, makeError(&err)
1278 return int(ret), nil
1281 func (c *Connect) DomainEventBlockJob2Register(dom *Domain, callback DomainEventBlockJobCallback) (int, error) {
1282 goCallBackId := registerCallbackId(callback)
1284 callbackPtr := unsafe.Pointer(C.domainEventBlockJobCallbackHelper)
1285 var cdom C.virDomainPtr
1290 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1291 C.VIR_DOMAIN_EVENT_ID_BLOCK_JOB_2,
1292 C.virConnectDomainEventGenericCallback(callbackPtr),
1293 C.long(goCallBackId), &err)
1295 freeCallbackId(goCallBackId)
1296 return 0, makeError(&err)
1298 return int(ret), nil
1301 func (c *Connect) DomainEventTunableRegister(dom *Domain, callback DomainEventTunableCallback) (int, error) {
1302 goCallBackId := registerCallbackId(callback)
1304 callbackPtr := unsafe.Pointer(C.domainEventTunableCallbackHelper)
1305 var cdom C.virDomainPtr
1310 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1311 C.VIR_DOMAIN_EVENT_ID_TUNABLE,
1312 C.virConnectDomainEventGenericCallback(callbackPtr),
1313 C.long(goCallBackId), &err)
1315 freeCallbackId(goCallBackId)
1316 return 0, makeError(&err)
1318 return int(ret), nil
1321 func (c *Connect) DomainEventAgentLifecycleRegister(dom *Domain, callback DomainEventAgentLifecycleCallback) (int, error) {
1322 goCallBackId := registerCallbackId(callback)
1324 callbackPtr := unsafe.Pointer(C.domainEventAgentLifecycleCallbackHelper)
1325 var cdom C.virDomainPtr
1330 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1331 C.VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLE,
1332 C.virConnectDomainEventGenericCallback(callbackPtr),
1333 C.long(goCallBackId), &err)
1335 freeCallbackId(goCallBackId)
1336 return 0, makeError(&err)
1338 return int(ret), nil
1341 func (c *Connect) DomainEventDeviceAddedRegister(dom *Domain, callback DomainEventDeviceAddedCallback) (int, error) {
1342 goCallBackId := registerCallbackId(callback)
1344 callbackPtr := unsafe.Pointer(C.domainEventDeviceAddedCallbackHelper)
1345 var cdom C.virDomainPtr
1350 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1351 C.VIR_DOMAIN_EVENT_ID_DEVICE_ADDED,
1352 C.virConnectDomainEventGenericCallback(callbackPtr),
1353 C.long(goCallBackId), &err)
1355 freeCallbackId(goCallBackId)
1356 return 0, makeError(&err)
1358 return int(ret), nil
1361 func (c *Connect) DomainEventMigrationIterationRegister(dom *Domain, callback DomainEventMigrationIterationCallback) (int, error) {
1362 goCallBackId := registerCallbackId(callback)
1364 callbackPtr := unsafe.Pointer(C.domainEventMigrationIterationCallbackHelper)
1365 var cdom C.virDomainPtr
1370 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1371 C.VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION,
1372 C.virConnectDomainEventGenericCallback(callbackPtr),
1373 C.long(goCallBackId), &err)
1375 freeCallbackId(goCallBackId)
1376 return 0, makeError(&err)
1378 return int(ret), nil
1381 func (c *Connect) DomainEventJobCompletedRegister(dom *Domain, callback DomainEventJobCompletedCallback) (int, error) {
1382 goCallBackId := registerCallbackId(callback)
1384 callbackPtr := unsafe.Pointer(C.domainEventJobCompletedCallbackHelper)
1385 var cdom C.virDomainPtr
1390 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1391 C.VIR_DOMAIN_EVENT_ID_JOB_COMPLETED,
1392 C.virConnectDomainEventGenericCallback(callbackPtr),
1393 C.long(goCallBackId), &err)
1395 freeCallbackId(goCallBackId)
1396 return 0, makeError(&err)
1398 return int(ret), nil
1401 func (c *Connect) DomainEventDeviceRemovalFailedRegister(dom *Domain, callback DomainEventDeviceRemovalFailedCallback) (int, error) {
1402 goCallBackId := registerCallbackId(callback)
1404 callbackPtr := unsafe.Pointer(C.domainEventDeviceRemovalFailedCallbackHelper)
1405 var cdom C.virDomainPtr
1410 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1411 C.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED,
1412 C.virConnectDomainEventGenericCallback(callbackPtr),
1413 C.long(goCallBackId), &err)
1415 freeCallbackId(goCallBackId)
1416 return 0, makeError(&err)
1418 return int(ret), nil
1421 func (c *Connect) DomainEventMetadataChangeRegister(dom *Domain, callback DomainEventMetadataChangeCallback) (int, error) {
1422 goCallBackId := registerCallbackId(callback)
1424 callbackPtr := unsafe.Pointer(C.domainEventMetadataChangeCallbackHelper)
1425 var cdom C.virDomainPtr
1430 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1431 C.VIR_DOMAIN_EVENT_ID_METADATA_CHANGE,
1432 C.virConnectDomainEventGenericCallback(callbackPtr),
1433 C.long(goCallBackId), &err)
1435 freeCallbackId(goCallBackId)
1436 return 0, makeError(&err)
1438 return int(ret), nil
1441 func (c *Connect) DomainEventBlockThresholdRegister(dom *Domain, callback DomainEventBlockThresholdCallback) (int, error) {
1442 goCallBackId := registerCallbackId(callback)
1444 callbackPtr := unsafe.Pointer(C.domainEventBlockThresholdCallbackHelper)
1445 var cdom C.virDomainPtr
1450 ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom,
1451 C.VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD,
1452 C.virConnectDomainEventGenericCallback(callbackPtr),
1453 C.long(goCallBackId), &err)
1455 freeCallbackId(goCallBackId)
1456 return 0, makeError(&err)
1458 return int(ret), nil
1461 func (c *Connect) DomainEventDeregister(callbackId int) error {
1462 // Deregister the callback
1464 ret := int(C.virConnectDomainEventDeregisterAnyWrapper(c.ptr, C.int(callbackId), &err))
1466 return makeError(&err)
1471 func (e DomainEventLifecycle) String() string {
1472 var detail, event string
1474 case DOMAIN_EVENT_DEFINED:
1476 switch DomainEventDefinedDetailType(e.Detail) {
1477 case DOMAIN_EVENT_DEFINED_ADDED:
1479 case DOMAIN_EVENT_DEFINED_UPDATED:
1485 case DOMAIN_EVENT_UNDEFINED:
1487 switch DomainEventUndefinedDetailType(e.Detail) {
1488 case DOMAIN_EVENT_UNDEFINED_REMOVED:
1494 case DOMAIN_EVENT_STARTED:
1496 switch DomainEventStartedDetailType(e.Detail) {
1497 case DOMAIN_EVENT_STARTED_BOOTED:
1499 case DOMAIN_EVENT_STARTED_MIGRATED:
1501 case DOMAIN_EVENT_STARTED_RESTORED:
1503 case DOMAIN_EVENT_STARTED_FROM_SNAPSHOT:
1509 case DOMAIN_EVENT_SUSPENDED:
1511 switch DomainEventSuspendedDetailType(e.Detail) {
1512 case DOMAIN_EVENT_SUSPENDED_PAUSED:
1514 case DOMAIN_EVENT_SUSPENDED_MIGRATED:
1516 case DOMAIN_EVENT_SUSPENDED_IOERROR:
1517 detail = "I/O error"
1518 case DOMAIN_EVENT_SUSPENDED_WATCHDOG:
1520 case DOMAIN_EVENT_SUSPENDED_RESTORED:
1522 case DOMAIN_EVENT_SUSPENDED_FROM_SNAPSHOT:
1528 case DOMAIN_EVENT_RESUMED:
1530 switch DomainEventResumedDetailType(e.Detail) {
1531 case DOMAIN_EVENT_RESUMED_UNPAUSED:
1533 case DOMAIN_EVENT_RESUMED_MIGRATED:
1535 case DOMAIN_EVENT_RESUMED_FROM_SNAPSHOT:
1541 case DOMAIN_EVENT_STOPPED:
1543 switch DomainEventStoppedDetailType(e.Detail) {
1544 case DOMAIN_EVENT_STOPPED_SHUTDOWN:
1546 case DOMAIN_EVENT_STOPPED_DESTROYED:
1547 detail = "destroyed"
1548 case DOMAIN_EVENT_STOPPED_CRASHED:
1550 case DOMAIN_EVENT_STOPPED_MIGRATED:
1552 case DOMAIN_EVENT_STOPPED_SAVED:
1554 case DOMAIN_EVENT_STOPPED_FAILED:
1556 case DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT:
1562 case DOMAIN_EVENT_SHUTDOWN:
1564 switch DomainEventShutdownDetailType(e.Detail) {
1565 case DOMAIN_EVENT_SHUTDOWN_FINISHED:
1575 return fmt.Sprintf("Domain event=%q detail=%q", event, detail)
1578 func (e DomainEventRTCChange) String() string {
1579 return fmt.Sprintf("RTC change offset=%d", e.Utcoffset)
1582 func (e DomainEventWatchdog) String() string {
1583 return fmt.Sprintf("Watchdog action=%d", e.Action)
1586 func (e DomainEventIOError) String() string {
1587 return fmt.Sprintf("I/O error path=%q alias=%q action=%d",
1588 e.SrcPath, e.DevAlias, e.Action)
1591 func (e DomainEventGraphics) String() string {
1594 case DOMAIN_EVENT_GRAPHICS_CONNECT:
1596 case DOMAIN_EVENT_GRAPHICS_INITIALIZE:
1597 phase = "initialized"
1598 case DOMAIN_EVENT_GRAPHICS_DISCONNECT:
1599 phase = "disconnected"
1604 return fmt.Sprintf("Graphics phase=%q", phase)
1607 func (e DomainEventIOErrorReason) String() string {
1608 return fmt.Sprintf("IO error path=%q alias=%q action=%d reason=%q",
1609 e.SrcPath, e.DevAlias, e.Action, e.Reason)
1612 func (e DomainEventBlockJob) String() string {
1613 return fmt.Sprintf("Block job disk=%q status=%d type=%d",
1614 e.Disk, e.Status, e.Type)
1617 func (e DomainEventDiskChange) String() string {
1618 return fmt.Sprintf("Disk change old=%q new=%q alias=%q reason=%d",
1619 e.OldSrcPath, e.NewSrcPath, e.DevAlias, e.Reason)
1622 func (e DomainEventTrayChange) String() string {
1623 return fmt.Sprintf("Tray change dev=%q reason=%d",
1624 e.DevAlias, e.Reason)
1627 func (e DomainEventBalloonChange) String() string {
1628 return fmt.Sprintf("Ballon change %d", e.Actual)
1631 func (e DomainEventDeviceRemoved) String() string {
1632 return fmt.Sprintf("Device %q removed ", e.DevAlias)