committed by
					
						
						Ben LeMasurier
					
				
			
			
				
	
			
			
			
						parent
						
							953e83ac30
						
					
				
				
					commit
					fe0f99a7c1
				
			@@ -44,6 +44,7 @@ const (
 | 
				
			|||||||
	ProcAuthList                 = 66
 | 
						ProcAuthList                 = 66
 | 
				
			||||||
	ProcConnectGetLibVersion     = 157
 | 
						ProcConnectGetLibVersion     = 157
 | 
				
			||||||
	ProcDomainMigrateSetMaxSpeed = 207
 | 
						ProcDomainMigrateSetMaxSpeed = 207
 | 
				
			||||||
 | 
						ProcDomainGetState           = 212
 | 
				
			||||||
	ProcDomainUndefineFlags      = 231
 | 
						ProcDomainUndefineFlags      = 231
 | 
				
			||||||
	ProcDomainDestroyFlags       = 234
 | 
						ProcDomainDestroyFlags       = 234
 | 
				
			||||||
	ProcConnectListAllDomains    = 273
 | 
						ProcConnectListAllDomains    = 273
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										69
									
								
								libvirt.go
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								libvirt.go
									
									
									
									
									
								
							@@ -170,6 +170,31 @@ const (
 | 
				
			|||||||
	DestroyFlagGraceful
 | 
						DestroyFlagGraceful
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DomainState specifies state of the domain
 | 
				
			||||||
 | 
					type DomainState uint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// DomainStateNoState No state
 | 
				
			||||||
 | 
						DomainStateNoState = iota
 | 
				
			||||||
 | 
						// DomainStateRunning The domain is running
 | 
				
			||||||
 | 
						DomainStateRunning
 | 
				
			||||||
 | 
						// DomainStateBlocked The domain is blocked on resource
 | 
				
			||||||
 | 
						DomainStateBlocked
 | 
				
			||||||
 | 
						// DomainStatePaused The domain is paused by user
 | 
				
			||||||
 | 
						DomainStatePaused
 | 
				
			||||||
 | 
						// DomainStateShutdown The domain is being shut down
 | 
				
			||||||
 | 
						DomainStateShutdown
 | 
				
			||||||
 | 
						// DomainStateShutoff The domain is shut off
 | 
				
			||||||
 | 
						DomainStateShutoff
 | 
				
			||||||
 | 
						// DomainStateCrashed The domain is crashed
 | 
				
			||||||
 | 
						DomainStateCrashed
 | 
				
			||||||
 | 
						// DomainStatePMSuspended The domain is suspended by guest power management
 | 
				
			||||||
 | 
						DomainStatePMSuspended
 | 
				
			||||||
 | 
						// DomainStateLast This value will increase over time as new events are added to the libvirt
 | 
				
			||||||
 | 
						// API. It reflects the last state supported by this version of the libvirt API.
 | 
				
			||||||
 | 
						DomainStateLast
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Capabilities returns an XML document describing the host's capabilties.
 | 
					// Capabilities returns an XML document describing the host's capabilties.
 | 
				
			||||||
func (l *Libvirt) Capabilities() ([]byte, error) {
 | 
					func (l *Libvirt) Capabilities() ([]byte, error) {
 | 
				
			||||||
	resp, err := l.request(constants.ProcConnectGetCapabilties, constants.ProgramRemote, nil)
 | 
						resp, err := l.request(constants.ProcConnectGetCapabilties, constants.ProgramRemote, nil)
 | 
				
			||||||
@@ -253,6 +278,50 @@ func (l *Libvirt) Domains() ([]Domain, error) {
 | 
				
			|||||||
	return result.Domains, nil
 | 
						return result.Domains, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DomainState returns state of the domain managed by libvirt.
 | 
				
			||||||
 | 
					func (l *Libvirt) DomainState(dom string) (DomainState, error) {
 | 
				
			||||||
 | 
						d, err := l.lookup(dom)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return DomainStateNoState, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req := struct {
 | 
				
			||||||
 | 
							Domain Domain
 | 
				
			||||||
 | 
							Flags  uint32
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							Domain: *d,
 | 
				
			||||||
 | 
							Flags:  0,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buf, err := encode(&req)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return DomainStateNoState, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resp, err := l.request(constants.ProcDomainGetState, constants.ProgramRemote, &buf)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return DomainStateNoState, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r := <-resp
 | 
				
			||||||
 | 
						if r.Status != StatusOK {
 | 
				
			||||||
 | 
							return DomainStateNoState, decodeError(r.Payload)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result := struct {
 | 
				
			||||||
 | 
							State  uint32
 | 
				
			||||||
 | 
							Reason uint32
 | 
				
			||||||
 | 
						}{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dec := xdr.NewDecoder(bytes.NewReader(r.Payload))
 | 
				
			||||||
 | 
						_, err = dec.Decode(&result)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return DomainStateNoState, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return DomainState(result.State), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Events streams domain events.
 | 
					// Events streams domain events.
 | 
				
			||||||
// If a problem is encountered setting up the event monitor connection
 | 
					// If a problem is encountered setting up the event monitor connection
 | 
				
			||||||
// an error will be returned. Errors encountered during streaming will
 | 
					// an error will be returned. Errors encountered during streaming will
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -117,6 +117,21 @@ func TestDomains(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestDomainState(t *testing.T) {
 | 
				
			||||||
 | 
						conn := libvirttest.New()
 | 
				
			||||||
 | 
						l := New(conn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wantState := DomainState(DomainStateRunning)
 | 
				
			||||||
 | 
						gotState, err := l.DomainState("test")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if gotState != wantState {
 | 
				
			||||||
 | 
							t.Errorf("expected domain state %d, got %d", wantState, gotState)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestEvents(t *testing.T) {
 | 
					func TestEvents(t *testing.T) {
 | 
				
			||||||
	conn := libvirttest.New()
 | 
						conn := libvirttest.New()
 | 
				
			||||||
	l := New(conn)
 | 
						l := New(conn)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -205,6 +205,18 @@ var testDomainsReply = []byte{
 | 
				
			|||||||
	0x00, 0x00, 0x02,
 | 
						0x00, 0x00, 0x02,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var testDomainStateReply = []byte{
 | 
				
			||||||
 | 
						0x00, 0x00, 0x00, 0x24, // length
 | 
				
			||||||
 | 
						0x20, 0x00, 0x80, 0x86, // program
 | 
				
			||||||
 | 
						0x00, 0x00, 0x00, 0x01, // version
 | 
				
			||||||
 | 
						0x00, 0x00, 0x00, 0xd4, // procedure
 | 
				
			||||||
 | 
						0x00, 0x00, 0x00, 0x01, // type
 | 
				
			||||||
 | 
						0x00, 0x00, 0x00, 0x00, // serial
 | 
				
			||||||
 | 
						0x00, 0x00, 0x00, 0x00, // status
 | 
				
			||||||
 | 
						0x00, 0x00, 0x00, 0x01, // state
 | 
				
			||||||
 | 
						0x00, 0x00, 0x00, 0x01, // reason
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var testUndefineReply = []byte{
 | 
					var testUndefineReply = []byte{
 | 
				
			||||||
	0x00, 0x00, 0x00, 0x1c, // length
 | 
						0x00, 0x00, 0x00, 0x1c, // length
 | 
				
			||||||
	0x20, 0x00, 0x80, 0x86, // program
 | 
						0x20, 0x00, 0x80, 0x86, // program
 | 
				
			||||||
@@ -293,6 +305,8 @@ func (m *MockLibvirt) handleRemote(procedure uint32, conn net.Conn) {
 | 
				
			|||||||
		conn.Write(m.reply(testDomainResponse))
 | 
							conn.Write(m.reply(testDomainResponse))
 | 
				
			||||||
	case constants.ProcConnectListAllDomains:
 | 
						case constants.ProcConnectListAllDomains:
 | 
				
			||||||
		conn.Write(m.reply(testDomainsReply))
 | 
							conn.Write(m.reply(testDomainsReply))
 | 
				
			||||||
 | 
						case constants.ProcDomainGetState:
 | 
				
			||||||
 | 
							conn.Write(m.reply(testDomainStateReply))
 | 
				
			||||||
	case constants.ProcDomainMigrateSetMaxSpeed:
 | 
						case constants.ProcDomainMigrateSetMaxSpeed:
 | 
				
			||||||
		conn.Write(m.reply(testSetSpeedReply))
 | 
							conn.Write(m.reply(testSetSpeedReply))
 | 
				
			||||||
	case constants.ProcMigratePerformParams:
 | 
						case constants.ProcMigratePerformParams:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user