/
api.go
235 lines (208 loc) · 7.01 KB
/
api.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
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
package herd
import (
"io"
"sync"
"time"
"github.com/Cloud-Foundations/Dominator/dom/images"
"github.com/Cloud-Foundations/Dominator/lib/cpusharer"
filegenclient "github.com/Cloud-Foundations/Dominator/lib/filegen/client"
"github.com/Cloud-Foundations/Dominator/lib/filesystem"
"github.com/Cloud-Foundations/Dominator/lib/image"
"github.com/Cloud-Foundations/Dominator/lib/log"
"github.com/Cloud-Foundations/Dominator/lib/mdb"
"github.com/Cloud-Foundations/Dominator/lib/net"
"github.com/Cloud-Foundations/Dominator/lib/objectcache"
"github.com/Cloud-Foundations/Dominator/lib/objectserver"
"github.com/Cloud-Foundations/Dominator/lib/srpc"
domproto "github.com/Cloud-Foundations/Dominator/proto/dominator"
filegenproto "github.com/Cloud-Foundations/Dominator/proto/filegenerator"
subproto "github.com/Cloud-Foundations/Dominator/proto/sub"
"github.com/Cloud-Foundations/tricorder/go/tricorder"
)
type subStatus uint
func (status subStatus) String() string {
return status.string()
}
const (
statusUnknown = iota
statusConnecting
statusDNSError
statusConnectionRefused
statusNoRouteToHost
statusConnectTimeout
statusMissingCertificate
statusBadCertificate
statusFailedToConnect
statusWaitingToPoll
statusPolling
statusPollDenied
statusFailedToPoll
statusUnwritable
statusSubNotReady
statusImageUndefined
statusImageNotReady
statusNotEnoughFreeSpace
statusLocked
statusFetching
statusFetchDenied
statusFailedToFetch
statusPushing
statusPushDenied
statusFailedToPush
statusFailedToGetObject
statusComputingUpdate
statusSendingUpdate
statusMissingComputedFile
statusUpdatesDisabled
statusUnsafeUpdate
statusDisruptionRequested
statusDisruptionDenied
statusUpdating
statusUpdateDenied
statusFailedToUpdate
statusWaitingForNextFullPoll
statusSynced
)
type HtmlWriter interface {
WriteHtml(writer io.Writer)
}
type Sub struct {
herd *Herd
mdb mdb.Machine
requiredImageName string // Updated only by sub goroutine.
requiredImage *image.Image // Updated only by sub goroutine.
plannedImageName string // Updated only by sub goroutine.
plannedImage *image.Image // Updated only by sub goroutine.
clientResource *srpc.ClientResource
computedInodes map[string]*filesystem.RegularInode
fileUpdateChannel <-chan []filegenproto.FileInfo
busyFlagMutex sync.Mutex
busy bool
deletingFlagMutex sync.Mutex
deleting bool
busyStartTime time.Time
busyStopTime time.Time
cancelChannel chan struct{}
havePlannedImage bool
startTime time.Time
pollTime time.Time
fileSystem *filesystem.FileSystem
objectCache objectcache.ObjectCache
generationCount uint64
freeSpaceThreshold *uint64
computedFilesChangeTime time.Time
scanCountAtLastUpdateEnd uint64
isInsecure bool
status subStatus
publishedStatus subStatus
pendingForceDisruptiveUpdate bool
pendingSafetyClear bool
lastConnectionStartTime time.Time
lastReachableTime time.Time
lastConnectionSucceededTime time.Time
lastConnectDuration time.Duration
lastDisruptionState subproto.DisruptionState
lastPollStartTime time.Time
lastPollSucceededTime time.Time
lastShortPollDuration time.Duration
lastFullPollDuration time.Duration
lastPollWasFull bool
lastScanDuration time.Duration
lastComputeUpdateCpuDuration time.Duration
lastUpdateTime time.Time
lastSyncTime time.Time
lastSuccessfulImageName string
lastNote string
lastWriteError string
systemUptime *time.Duration
}
func (sub *Sub) String() string {
return sub.string()
}
type Herd struct {
sync.RWMutex // Protect map and slice mutations.
imageManager *images.Manager
objectServer objectserver.ObjectServer
computedFilesManager *filegenclient.Manager
logger log.DebugLogger
htmlWriters []HtmlWriter
updatesDisabledReason string
updatesDisabledBy string
updatesDisabledTime time.Time
defaultImageName string
nextDefaultImageName string
configurationForSubs subproto.Configuration
nextSubToPoll uint
subsByName map[string]*Sub
subsByIndex []*Sub // Sorted by Sub.hostname.
pollSemaphore chan struct{}
pushSemaphore chan struct{}
cpuSharer *cpusharer.FifoCpuSharer
dialer net.Dialer
currentScanStartTime time.Time
previousScanDuration time.Duration
scanCounter uint64
subdInstallerQueueAdd chan<- string
subdInstallerQueueDelete chan<- string
subdInstallerQueueErase chan<- string
totalScanDuration time.Duration
}
type subCounter struct {
counter *uint64
selectFunc func(*Sub) bool
}
func NewHerd(imageServerAddress string, objectServer objectserver.ObjectServer,
metricsDir *tricorder.DirectorySpec, logger log.DebugLogger) *Herd {
return newHerd(imageServerAddress, objectServer, metricsDir, logger)
}
func (herd *Herd) AddHtmlWriter(htmlWriter HtmlWriter) {
herd.addHtmlWriter(htmlWriter)
}
func (herd *Herd) ClearSafetyShutoff(hostname string,
authInfo *srpc.AuthInformation) error {
return herd.clearSafetyShutoff(hostname, authInfo)
}
func (herd *Herd) ConfigureSubs(configuration subproto.Configuration) error {
return herd.configureSubs(configuration)
}
func (herd *Herd) DisableUpdates(username, reason string) error {
return herd.disableUpdates(username, reason)
}
func (herd *Herd) EnableUpdates() error {
return herd.enableUpdates()
}
func (herd *Herd) ForceDisruptiveUpdate(hostname string,
authInfo *srpc.AuthInformation) error {
return herd.forceDisruptiveUpdate(hostname, authInfo)
}
func (herd *Herd) GetDefaultImage() string {
return herd.defaultImageName
}
func (herd *Herd) GetSubsConfiguration() subproto.Configuration {
return herd.getSubsConfiguration()
}
func (herd *Herd) GetInfoForSubs(request domproto.GetInfoForSubsRequest) (
[]domproto.SubInfo, error) {
return herd.getInfoForSubs(request)
}
func (herd *Herd) ListSubs(request domproto.ListSubsRequest) ([]string, error) {
return herd.listSubs(request)
}
func (herd *Herd) LockWithTimeout(timeout time.Duration) {
herd.lockWithTimeout(timeout)
}
func (herd *Herd) MdbUpdate(mdb *mdb.Mdb) {
herd.mdbUpdate(mdb)
}
func (herd *Herd) PollNextSub() bool {
return herd.pollNextSub()
}
func (herd *Herd) RLockWithTimeout(timeout time.Duration) {
herd.rLockWithTimeout(timeout)
}
func (herd *Herd) SetDefaultImage(imageName string) error {
return herd.setDefaultImage(imageName)
}
func (herd *Herd) StartServer(portNum uint, daemon bool) error {
return herd.startServer(portNum, daemon)
}