This repository has been archived by the owner on Feb 27, 2020. It is now read-only.
/
resultset.go
66 lines (56 loc) · 1.57 KB
/
resultset.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package qemuengine
import (
"strings"
"github.com/taskcluster/taskcluster-worker/engines"
"github.com/taskcluster/taskcluster-worker/engines/qemu/metaservice"
"github.com/taskcluster/taskcluster-worker/engines/qemu/vm"
"github.com/taskcluster/taskcluster-worker/runtime/ioext"
)
type resultSet struct {
engines.ResultSetBase
success bool
vm *vm.VirtualMachine
metaService *metaservice.MetaService
}
func newResultSet(success bool, vm *vm.VirtualMachine, m *metaservice.MetaService) *resultSet {
// Set metaService as handler (this will make proxies unreachable)
vm.SetHTTPHandler(m)
return &resultSet{
success: success,
vm: vm,
metaService: m,
}
}
func (r *resultSet) Success() bool {
return r.success
}
func (r *resultSet) ExtractFile(path string) (ioext.ReadSeekCloser, error) {
return r.metaService.GetArtifact(path)
}
func (r *resultSet) ExtractFolder(path string, handler engines.FileHandler) error {
files, err := r.metaService.ListFolder(path)
if err != nil {
return err
}
// TODO: Consider some level of parallelism, but not too many files in parallel
for _, p := range files {
f, err := r.metaService.GetArtifact(p)
if err != nil {
return err
}
// If guest uses backslashes our input paths should have that, but the ones
// we return should be intepreted as names.
p = strings.Replace(p[len(path):], "\\", "/", -1)
if len(p) > 0 && p[0] == '\\' {
p = p[1:]
}
if handler(p, f) != nil {
return engines.ErrHandlerInterrupt
}
}
return nil
}
func (r *resultSet) Dispose() error {
r.vm.Kill()
return nil
}