Merge pull request #13 from digitalocean/undefine-domain
Add support for undefining a domain
This commit is contained in:
		| @@ -42,6 +42,7 @@ const ( | ||||
| 	ProcAuthList                 = 66 | ||||
| 	ProcConnectGetLibVersion     = 157 | ||||
| 	ProcDomainMigrateSetMaxSpeed = 207 | ||||
| 	ProcDomainUndefineFlags      = 231 | ||||
| 	ProcConnectListAllDomains    = 273 | ||||
| 	ProcMigratePerformParams     = 305 | ||||
| ) | ||||
|   | ||||
							
								
								
									
										50
									
								
								libvirt.go
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								libvirt.go
									
									
									
									
									
								
							| @@ -128,6 +128,20 @@ const ( | ||||
| 	MigrateFlagRDMAPinAll | ||||
| ) | ||||
|  | ||||
| // UndefineFlags specifies options available when undefining a domain. | ||||
| type UndefineFlags uint32 | ||||
|  | ||||
| const ( | ||||
| 	// UndefineFlagManagedSave removes all domain managed save data. | ||||
| 	UndefineFlagManagedSave UndefineFlags = 1 << iota | ||||
|  | ||||
| 	// UndefineFlagSnapshotsMetadata removes all domain snapshot metadata. | ||||
| 	UndefineFlagSnapshotsMetadata | ||||
|  | ||||
| 	// UndefineFlagNVRAM removes all domain NVRAM files. | ||||
| 	UndefineFlagNVRAM | ||||
| ) | ||||
|  | ||||
| // Connect establishes communication with the libvirt server. | ||||
| // The underlying libvirt socket connection must be previously established. | ||||
| func (l *Libvirt) Connect() error { | ||||
| @@ -399,6 +413,42 @@ func (l *Libvirt) Run(dom string, cmd []byte) ([]byte, error) { | ||||
| 	return bytes.TrimRight(data[4:], "\x00"), nil | ||||
| } | ||||
|  | ||||
| // Undefine undefines the domain specified by dom, e.g., 'prod-lb-01'. | ||||
| // The flags argument allows additional options to be specified such as | ||||
| // cleaning up snapshot metadata. For more information on available | ||||
| // flags, see UndefineFlag*. | ||||
| func (l *Libvirt) Undefine(dom string, flags UndefineFlags) error { | ||||
| 	d, err := l.lookup(dom) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	payload := struct { | ||||
| 		Domain Domain | ||||
| 		Flags  UndefineFlags | ||||
| 	}{ | ||||
| 		Domain: *d, | ||||
| 		Flags:  flags, | ||||
| 	} | ||||
|  | ||||
| 	buf, err := encode(&payload) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	resp, err := l.request(constants.ProcDomainUndefineFlags, 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. | ||||
| func (l *Libvirt) Version() (string, error) { | ||||
| 	resp, err := l.request(constants.ProcConnectGetLibVersion, constants.ProgramRemote, nil) | ||||
|   | ||||
| @@ -205,6 +205,16 @@ func TestRunFail(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestUndefine(t *testing.T) { | ||||
| 	conn := libvirttest.New() | ||||
| 	l := New(conn) | ||||
|  | ||||
| 	var flags UndefineFlags | ||||
| 	if err := l.Undefine("test", flags); err != nil { | ||||
| 		t.Fatalf("unexpected undefine error: %v", err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestVersion(t *testing.T) { | ||||
| 	conn := libvirttest.New() | ||||
| 	l := New(conn) | ||||
|   | ||||
| @@ -205,6 +205,16 @@ var testDomainsReply = []byte{ | ||||
| 	0x00, 0x00, 0x02, | ||||
| } | ||||
|  | ||||
| var testUndefineReply = []byte{ | ||||
| 	0x00, 0x00, 0x00, 0x1c, // length | ||||
| 	0x20, 0x00, 0x80, 0x86, // program | ||||
| 	0x00, 0x00, 0x00, 0x01, // version | ||||
| 	0x00, 0x00, 0x00, 0xe7, // procedure | ||||
| 	0x00, 0x00, 0x00, 0x01, // type | ||||
| 	0x00, 0x00, 0x00, 0x00, // serial | ||||
| 	0x00, 0x00, 0x00, 0x00, // status | ||||
| } | ||||
|  | ||||
| var testVersionReply = []byte{ | ||||
| 	0x00, 0x00, 0x00, 0x24, // length | ||||
| 	0x20, 0x00, 0x80, 0x86, // program | ||||
| @@ -277,6 +287,8 @@ func (m *MockLibvirt) handleRemote(procedure uint32, conn net.Conn) { | ||||
| 		conn.Write(m.reply(testSetSpeedReply)) | ||||
| 	case constants.ProcMigratePerformParams: | ||||
| 		conn.Write(m.reply(testMigrateReply)) | ||||
| 	case constants.ProcDomainUndefineFlags: | ||||
| 		conn.Write(m.reply(testUndefineReply)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user