Add DefineXML() (#26)
This commit is contained in:
		
				
					committed by
					
						 Ben LeMasurier
						Ben LeMasurier
					
				
			
			
				
	
			
			
			
						parent
						
							fe0f99a7c1
						
					
				
				
					commit
					85674d25f7
				
			| @@ -49,6 +49,7 @@ const ( | |||||||
| 	ProcDomainDestroyFlags       = 234 | 	ProcDomainDestroyFlags       = 234 | ||||||
| 	ProcConnectListAllDomains    = 273 | 	ProcConnectListAllDomains    = 273 | ||||||
| 	ProcMigratePerformParams     = 305 | 	ProcMigratePerformParams     = 305 | ||||||
|  | 	ProcDomainDefineXMLFlags     = 350 | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // qemu procedure identifiers | // qemu procedure identifiers | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								libvirt.go
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								libvirt.go
									
									
									
									
									
								
							| @@ -159,6 +159,14 @@ const ( | |||||||
| 	UndefineFlagNVRAM | 	UndefineFlagNVRAM | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | // DomainDefineXMLFlags specifies options available when defining a domain. | ||||||
|  | type DomainDefineXMLFlags uint32 | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	// DefineValidate validates the XML document against schema | ||||||
|  | 	DefineValidate DomainDefineXMLFlags = 1 | ||||||
|  | ) | ||||||
|  |  | ||||||
| // DestroyFlags specifies options available when destroying a domain. | // DestroyFlags specifies options available when destroying a domain. | ||||||
| type DestroyFlags uint32 | type DestroyFlags uint32 | ||||||
|  |  | ||||||
| @@ -641,6 +649,34 @@ func (l *Libvirt) XML(dom string, flags DomainXMLFlags) ([]byte, error) { | |||||||
| 	return []byte(s), nil | 	return []byte(s), nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // DefineXML defines a domain, but does not start it. | ||||||
|  | func (l *Libvirt) DefineXML(x []byte, flags DomainDefineXMLFlags) error { | ||||||
|  | 	payload := struct { | ||||||
|  | 		Domain []byte | ||||||
|  | 		Flags  DomainDefineXMLFlags | ||||||
|  | 	}{ | ||||||
|  | 		Domain: x, | ||||||
|  | 		Flags:  flags, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	buf, err := encode(&payload) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	resp, err := l.request(constants.ProcDomainDefineXMLFlags, constants.ProgramRemote, &buf) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	r := <-resp | ||||||
|  | 	if r.Status != StatusOK { | ||||||
|  | 		return decodeError(r.Payload) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // Version returns the version of the libvirt daemon. | // Version returns the version of the libvirt daemon. | ||||||
| func (l *Libvirt) Version() (string, error) { | func (l *Libvirt) Version() (string, error) { | ||||||
| 	resp, err := l.request(constants.ProcConnectGetLibVersion, constants.ProgramRemote, nil) | 	resp, err := l.request(constants.ProcConnectGetLibVersion, constants.ProgramRemote, nil) | ||||||
|   | |||||||
| @@ -254,3 +254,14 @@ func TestVersion(t *testing.T) { | |||||||
| 		t.Errorf("expected version %q, got %q", expected, version) | 		t.Errorf("expected version %q, got %q", expected, version) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestDefineXML(t *testing.T) { | ||||||
|  | 	conn := libvirttest.New() | ||||||
|  | 	l := New(conn) | ||||||
|  |  | ||||||
|  | 	var flags DomainDefineXMLFlags | ||||||
|  | 	var buf []byte | ||||||
|  | 	if err := l.DefineXML(buf, flags); err != nil { | ||||||
|  | 		t.Fatalf("unexpected define error: %v", err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
| @@ -248,6 +248,22 @@ var testVersionReply = []byte{ | |||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x4d, 0xfc, // version (1003004) | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x4d, 0xfc, // version (1003004) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | var testDefineXML = []byte{ | ||||||
|  | 	0x00, 0x00, 0x00, 0x38, // length | ||||||
|  | 	0x20, 0x00, 0x80, 0x86, // program | ||||||
|  | 	0x00, 0x00, 0x00, 0x01, // version | ||||||
|  | 	0x00, 0x00, 0x01, 0x5e, // procedure | ||||||
|  | 	0x00, 0x00, 0x00, 0x01, // type | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, // serial | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, // status | ||||||
|  | 	0x00, 0x00, 0x00, 0x04, // dom | ||||||
|  | 	0x74, 0x65, 0x73, 0x74, // name | ||||||
|  | 	// uuid | ||||||
|  | 	0xaf, 0xc2, 0xef, 0x71, 0x66, 0xe0, 0x45, 0xa7, | ||||||
|  | 	0xa5, 0xec, 0xd8, 0xba, 0x1e, 0xa8, 0x17, 0x7d, | ||||||
|  | 	0xff, 0xff, 0xff, 0xff, // id | ||||||
|  | } | ||||||
|  |  | ||||||
| // MockLibvirt provides a mock libvirt server for testing. | // MockLibvirt provides a mock libvirt server for testing. | ||||||
| type MockLibvirt struct { | type MockLibvirt struct { | ||||||
| 	net.Conn | 	net.Conn | ||||||
| @@ -315,6 +331,8 @@ func (m *MockLibvirt) handleRemote(procedure uint32, conn net.Conn) { | |||||||
| 		conn.Write(m.reply(testUndefineReply)) | 		conn.Write(m.reply(testUndefineReply)) | ||||||
| 	case constants.ProcDomainDestroyFlags: | 	case constants.ProcDomainDestroyFlags: | ||||||
| 		conn.Write(m.reply(testDestroyReply)) | 		conn.Write(m.reply(testDestroyReply)) | ||||||
|  | 	case constants.ProcDomainDefineXMLFlags: | ||||||
|  | 		conn.Write(m.reply(testDefineXML)) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user