-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathlist_unit_files.go
More file actions
117 lines (106 loc) · 2.67 KB
/
list_unit_files.go
File metadata and controls
117 lines (106 loc) · 2.67 KB
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package fleet
import (
"fmt"
"os"
"sort"
"strconv"
"strings"
"github.com/coreos/fleet/job"
"github.com/coreos/fleet/machine"
"github.com/coreos/fleet/schema"
)
const (
defaultListUnitFilesFields = "unit,hash,dstate,state,tmachine"
)
var (
listUnitFilesFields = map[string]unitToField{
"unit": func(u schema.Unit, full bool) string {
return u.Name
},
"global": func(u schema.Unit, full bool) string {
return strconv.FormatBool(suToGlobal(u))
},
"dstate": func(u schema.Unit, full bool) string {
if u.DesiredState == "" {
return "-"
}
return u.DesiredState
},
"tmachine": func(u schema.Unit, full bool) string {
if suToGlobal(u) || u.MachineID == "" {
return "-"
}
ms := cachedMachineState(u.MachineID)
if ms == nil {
ms = &machine.MachineState{ID: u.MachineID}
}
return machineFullLegend(*ms, full)
},
"state": func(u schema.Unit, full bool) string {
if suToGlobal(u) || u.CurrentState == "" {
return "-"
}
return u.CurrentState
},
"hash": func(u schema.Unit, full bool) string {
uf := schema.MapSchemaUnitOptionsToUnitFile(u.Options)
if !full {
return uf.Hash().Short()
}
return uf.Hash().String()
},
"desc": func(u schema.Unit, full bool) string {
uf := schema.MapSchemaUnitOptionsToUnitFile(u.Options)
d := uf.Description()
if d == "" {
return "-"
}
return d
},
}
)
type unitToField func(u schema.Unit, full bool) string
// ListUnitFiles prints all Deis-related unit files to Stdout
func (c *FleetClient) ListUnitFiles() (err error) {
var sortable sort.StringSlice
units := make(map[string]*schema.Unit, 0)
us, err := cAPI.Units()
if err != nil {
return err
}
for _, u := range us {
if strings.HasPrefix(u.Name, "deis-") {
units[u.Name] = u
sortable = append(sortable, u.Name)
}
}
sortable.Sort()
printUnitFiles(units, sortable)
return
}
// printUnitFiles writes unit files to stdout using a tabwriter
func printUnitFiles(units map[string]*schema.Unit, sortable sort.StringSlice) {
cols := strings.Split(defaultListUnitFilesFields, ",")
for _, s := range cols {
if _, ok := listUnitsFields[s]; !ok {
fmt.Fprintf(os.Stderr, "Invalid key in output format: %q\n", s)
}
}
fmt.Fprintln(out, strings.ToUpper(strings.Join(cols, "\t")))
for _, name := range sortable {
var f []string
u := units[name]
for _, c := range cols {
f = append(f, listUnitFilesFields[c](*u, false))
}
fmt.Fprintln(out, strings.Join(f, "\t"))
}
out.Flush()
}
// suToGlobal returns whether or not a schema.Unit refers to a global unit
func suToGlobal(su schema.Unit) bool {
u := job.Unit{
Unit: *schema.MapSchemaUnitOptionsToUnitFile(su.Options),
}
return u.IsGlobal()
}