github.com/Cloud-Foundations/Dominator@v0.3.4/dom/herd/api.go (about) 1 package herd 2 3 import ( 4 "io" 5 "sync" 6 "time" 7 8 "github.com/Cloud-Foundations/Dominator/dom/images" 9 "github.com/Cloud-Foundations/Dominator/lib/cpusharer" 10 filegenclient "github.com/Cloud-Foundations/Dominator/lib/filegen/client" 11 "github.com/Cloud-Foundations/Dominator/lib/filesystem" 12 "github.com/Cloud-Foundations/Dominator/lib/image" 13 "github.com/Cloud-Foundations/Dominator/lib/log" 14 "github.com/Cloud-Foundations/Dominator/lib/mdb" 15 "github.com/Cloud-Foundations/Dominator/lib/net" 16 "github.com/Cloud-Foundations/Dominator/lib/objectcache" 17 "github.com/Cloud-Foundations/Dominator/lib/objectserver" 18 "github.com/Cloud-Foundations/Dominator/lib/srpc" 19 domproto "github.com/Cloud-Foundations/Dominator/proto/dominator" 20 filegenproto "github.com/Cloud-Foundations/Dominator/proto/filegenerator" 21 subproto "github.com/Cloud-Foundations/Dominator/proto/sub" 22 "github.com/Cloud-Foundations/tricorder/go/tricorder" 23 ) 24 25 type subStatus uint 26 27 func (status subStatus) String() string { 28 return status.string() 29 } 30 31 const ( 32 statusUnknown = iota 33 statusConnecting 34 statusDNSError 35 statusConnectionRefused 36 statusNoRouteToHost 37 statusConnectTimeout 38 statusMissingCertificate 39 statusBadCertificate 40 statusFailedToConnect 41 statusWaitingToPoll 42 statusPolling 43 statusPollDenied 44 statusFailedToPoll 45 statusUnwritable 46 statusSubNotReady 47 statusImageUndefined 48 statusImageNotReady 49 statusNotEnoughFreeSpace 50 statusLocked 51 statusFetching 52 statusFetchDenied 53 statusFailedToFetch 54 statusPushing 55 statusPushDenied 56 statusFailedToPush 57 statusFailedToGetObject 58 statusComputingUpdate 59 statusSendingUpdate 60 statusMissingComputedFile 61 statusUpdatesDisabled 62 statusUnsafeUpdate 63 statusDisruptionRequested 64 statusDisruptionDenied 65 statusUpdating 66 statusUpdateDenied 67 statusFailedToUpdate 68 statusWaitingForNextFullPoll 69 statusSynced 70 ) 71 72 type HtmlWriter interface { 73 WriteHtml(writer io.Writer) 74 } 75 76 type Sub struct { 77 herd *Herd 78 mdb mdb.Machine 79 requiredImageName string // Updated only by sub goroutine. 80 requiredImage *image.Image // Updated only by sub goroutine. 81 plannedImageName string // Updated only by sub goroutine. 82 plannedImage *image.Image // Updated only by sub goroutine. 83 clientResource *srpc.ClientResource 84 computedInodes map[string]*filesystem.RegularInode 85 fileUpdateChannel <-chan []filegenproto.FileInfo 86 busyFlagMutex sync.Mutex 87 busy bool 88 deletingFlagMutex sync.Mutex 89 deleting bool 90 busyStartTime time.Time 91 busyStopTime time.Time 92 cancelChannel chan struct{} 93 havePlannedImage bool 94 startTime time.Time 95 pollTime time.Time 96 fileSystem *filesystem.FileSystem 97 objectCache objectcache.ObjectCache 98 generationCount uint64 99 freeSpaceThreshold *uint64 100 computedFilesChangeTime time.Time 101 scanCountAtLastUpdateEnd uint64 102 isInsecure bool 103 status subStatus 104 publishedStatus subStatus 105 pendingForceDisruptiveUpdate bool 106 pendingSafetyClear bool 107 lastConnectionStartTime time.Time 108 lastReachableTime time.Time 109 lastConnectionSucceededTime time.Time 110 lastConnectDuration time.Duration 111 lastDisruptionState subproto.DisruptionState 112 lastPollStartTime time.Time 113 lastPollSucceededTime time.Time 114 lastShortPollDuration time.Duration 115 lastFullPollDuration time.Duration 116 lastPollWasFull bool 117 lastScanDuration time.Duration 118 lastComputeUpdateCpuDuration time.Duration 119 lastUpdateTime time.Time 120 lastSyncTime time.Time 121 lastSuccessfulImageName string 122 lastNote string 123 lastWriteError string 124 systemUptime *time.Duration 125 } 126 127 func (sub *Sub) String() string { 128 return sub.string() 129 } 130 131 type Herd struct { 132 sync.RWMutex // Protect map and slice mutations. 133 imageManager *images.Manager 134 objectServer objectserver.ObjectServer 135 computedFilesManager *filegenclient.Manager 136 logger log.DebugLogger 137 htmlWriters []HtmlWriter 138 updatesDisabledReason string 139 updatesDisabledBy string 140 updatesDisabledTime time.Time 141 defaultImageName string 142 nextDefaultImageName string 143 configurationForSubs subproto.Configuration 144 nextSubToPoll uint 145 subsByName map[string]*Sub 146 subsByIndex []*Sub // Sorted by Sub.hostname. 147 pollSemaphore chan struct{} 148 pushSemaphore chan struct{} 149 cpuSharer *cpusharer.FifoCpuSharer 150 dialer net.Dialer 151 currentScanStartTime time.Time 152 previousScanDuration time.Duration 153 scanCounter uint64 154 subdInstallerQueueAdd chan<- string 155 subdInstallerQueueDelete chan<- string 156 subdInstallerQueueErase chan<- string 157 totalScanDuration time.Duration 158 } 159 160 type subCounter struct { 161 counter *uint64 162 selectFunc func(*Sub) bool 163 } 164 165 func NewHerd(imageServerAddress string, objectServer objectserver.ObjectServer, 166 metricsDir *tricorder.DirectorySpec, logger log.DebugLogger) *Herd { 167 return newHerd(imageServerAddress, objectServer, metricsDir, logger) 168 } 169 170 func (herd *Herd) AddHtmlWriter(htmlWriter HtmlWriter) { 171 herd.addHtmlWriter(htmlWriter) 172 } 173 174 func (herd *Herd) ClearSafetyShutoff(hostname string, 175 authInfo *srpc.AuthInformation) error { 176 return herd.clearSafetyShutoff(hostname, authInfo) 177 } 178 179 func (herd *Herd) ConfigureSubs(configuration subproto.Configuration) error { 180 return herd.configureSubs(configuration) 181 } 182 183 func (herd *Herd) DisableUpdates(username, reason string) error { 184 return herd.disableUpdates(username, reason) 185 } 186 187 func (herd *Herd) EnableUpdates() error { 188 return herd.enableUpdates() 189 } 190 191 func (herd *Herd) ForceDisruptiveUpdate(hostname string, 192 authInfo *srpc.AuthInformation) error { 193 return herd.forceDisruptiveUpdate(hostname, authInfo) 194 } 195 196 func (herd *Herd) GetDefaultImage() string { 197 return herd.defaultImageName 198 } 199 200 func (herd *Herd) GetSubsConfiguration() subproto.Configuration { 201 return herd.getSubsConfiguration() 202 } 203 204 func (herd *Herd) GetInfoForSubs(request domproto.GetInfoForSubsRequest) ( 205 []domproto.SubInfo, error) { 206 return herd.getInfoForSubs(request) 207 } 208 209 func (herd *Herd) ListSubs(request domproto.ListSubsRequest) ([]string, error) { 210 return herd.listSubs(request) 211 } 212 213 func (herd *Herd) LockWithTimeout(timeout time.Duration) { 214 herd.lockWithTimeout(timeout) 215 } 216 217 func (herd *Herd) MdbUpdate(mdb *mdb.Mdb) { 218 herd.mdbUpdate(mdb) 219 } 220 221 func (herd *Herd) PollNextSub() bool { 222 return herd.pollNextSub() 223 } 224 225 func (herd *Herd) RLockWithTimeout(timeout time.Duration) { 226 herd.rLockWithTimeout(timeout) 227 } 228 229 func (herd *Herd) SetDefaultImage(imageName string) error { 230 return herd.setDefaultImage(imageName) 231 } 232 233 func (herd *Herd) StartServer(portNum uint, daemon bool) error { 234 return herd.startServer(portNum, daemon) 235 }