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  }