cleaner now
This commit is contained in:
		
							parent
							
								
									a25851c25c
								
							
						
					
					
						commit
						99f44c5f38
					
				@ -8,10 +8,10 @@ import "github.com/gin-gonic/gin"
 | 
			
		||||
 | 
			
		||||
type hash map[string]interface{}
 | 
			
		||||
 | 
			
		||||
func (a *TootArchiverAPIServer) instances() []hash {
 | 
			
		||||
func (a *FetaAPIServer) instances() []hash {
 | 
			
		||||
	resp := make([]hash, 0)
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
	for _, v := range a.archiver.manager.listInstances() {
 | 
			
		||||
	for _, v := range a.feta.manager.listInstances() {
 | 
			
		||||
		i := make(hash)
 | 
			
		||||
		// FIXME figure out why a very short lock here deadlocks
 | 
			
		||||
		v.Lock()
 | 
			
		||||
@ -34,7 +34,7 @@ func (a *TootArchiverAPIServer) instances() []hash {
 | 
			
		||||
	return resp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *TootArchiverAPIServer) getIndexHandler() http.HandlerFunc {
 | 
			
		||||
func (a *FetaAPIServer) getIndexHandler() http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 | 
			
		||||
		index := &gin.H{
 | 
			
		||||
@ -42,7 +42,7 @@ func (a *TootArchiverAPIServer) getIndexHandler() http.HandlerFunc {
 | 
			
		||||
			"instances": a.instances(),
 | 
			
		||||
			"status":    "ok",
 | 
			
		||||
			"now":       time.Now().UTC().Format(time.RFC3339),
 | 
			
		||||
			"uptime":    a.archiver.Uptime().String(),
 | 
			
		||||
			"uptime":    a.feta.Uptime().String(),
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		json, err := json.Marshal(index)
 | 
			
		||||
@ -57,12 +57,12 @@ func (a *TootArchiverAPIServer) getIndexHandler() http.HandlerFunc {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *TootArchiverAPIServer) getHealthCheckHandler() http.HandlerFunc {
 | 
			
		||||
func (a *FetaAPIServer) getHealthCheckHandler() http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		resp := &gin.H{
 | 
			
		||||
			"status": "ok",
 | 
			
		||||
			"now":    time.Now().UTC().Format(time.RFC3339),
 | 
			
		||||
			"uptime": a.archiver.Uptime().String(),
 | 
			
		||||
			"uptime": a.feta.Uptime().String(),
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		json, err := json.Marshal(resp)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								apiserver.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								apiserver.go
									
									
									
									
									
								
							@ -9,17 +9,17 @@ import "github.com/rs/zerolog/log"
 | 
			
		||||
import "github.com/gin-gonic/gin"
 | 
			
		||||
import "github.com/dn365/gin-zerolog"
 | 
			
		||||
 | 
			
		||||
type TootArchiverAPIServer struct {
 | 
			
		||||
	archiver *TootArchiver
 | 
			
		||||
type FetaAPIServer struct {
 | 
			
		||||
	feta *FetaProcess
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (self *TootArchiverAPIServer) SetArchiver(archiver *TootArchiver) {
 | 
			
		||||
	self.archiver = archiver
 | 
			
		||||
func (self *FetaAPIServer) SetFeta(feta *FetaProcess) {
 | 
			
		||||
	self.feta = feta
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *TootArchiverAPIServer) Serve() {
 | 
			
		||||
	if a.archiver == nil {
 | 
			
		||||
		panic("must have archiver from which to serve stats")
 | 
			
		||||
func (a *FetaAPIServer) Serve() {
 | 
			
		||||
	if a.feta == nil {
 | 
			
		||||
		panic("must have feta app from which to serve stats")
 | 
			
		||||
	}
 | 
			
		||||
	s := a.getServer()
 | 
			
		||||
	err := s.ListenAndServe()
 | 
			
		||||
@ -29,7 +29,7 @@ func (a *TootArchiverAPIServer) Serve() {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *TootArchiverAPIServer) getRouter() *gin.Engine {
 | 
			
		||||
func (a *FetaAPIServer) getRouter() *gin.Engine {
 | 
			
		||||
	if os.Getenv("DEBUG") == "" {
 | 
			
		||||
		gin.SetMode(gin.ReleaseMode)
 | 
			
		||||
	}
 | 
			
		||||
@ -49,7 +49,7 @@ func (a *TootArchiverAPIServer) getRouter() *gin.Engine {
 | 
			
		||||
	return r
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *TootArchiverAPIServer) getServer() *http.Server {
 | 
			
		||||
func (a *FetaAPIServer) getServer() *http.Server {
 | 
			
		||||
	r := a.getRouter()
 | 
			
		||||
 | 
			
		||||
	port := "8080"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										45
									
								
								archiver.go
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								archiver.go
									
									
									
									
									
								
							@ -1,45 +0,0 @@
 | 
			
		||||
package feta
 | 
			
		||||
 | 
			
		||||
import "time"
 | 
			
		||||
 | 
			
		||||
type InstanceHostname string
 | 
			
		||||
 | 
			
		||||
type TootArchiver struct {
 | 
			
		||||
	locator *InstanceLocator
 | 
			
		||||
	manager *InstanceManager
 | 
			
		||||
	startup *time.Time
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewTootArchiver() *TootArchiver {
 | 
			
		||||
	a := new(TootArchiver)
 | 
			
		||||
	return a
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *TootArchiver) Uptime() time.Duration {
 | 
			
		||||
	return time.Since(*a.startup)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *TootArchiver) RunForever() {
 | 
			
		||||
	t := time.Now()
 | 
			
		||||
	a.startup = &t
 | 
			
		||||
 | 
			
		||||
	newInstanceHostnameNotifications := make(chan InstanceHostname)
 | 
			
		||||
 | 
			
		||||
	a.locator = NewInstanceLocator()
 | 
			
		||||
	a.manager = NewInstanceManager()
 | 
			
		||||
 | 
			
		||||
	a.locator.AddInstanceNotificationChannel(newInstanceHostnameNotifications)
 | 
			
		||||
	a.manager.AddInstanceNotificationChannel(newInstanceHostnameNotifications)
 | 
			
		||||
 | 
			
		||||
	// locator goroutine:
 | 
			
		||||
	go a.locator.Locate()
 | 
			
		||||
 | 
			
		||||
	// manager goroutine:
 | 
			
		||||
	go a.manager.Manage()
 | 
			
		||||
 | 
			
		||||
	// this goroutine (main) does nothing until we handle signals
 | 
			
		||||
	// FIXME(sneak)
 | 
			
		||||
	for {
 | 
			
		||||
		time.Sleep(1 * time.Second)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										85
									
								
								feta.go
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								feta.go
									
									
									
									
									
								
							@ -1,17 +1,17 @@
 | 
			
		||||
package feta
 | 
			
		||||
 | 
			
		||||
import "os"
 | 
			
		||||
 | 
			
		||||
//import "os/signal"
 | 
			
		||||
import "sync"
 | 
			
		||||
 | 
			
		||||
//import "syscall"
 | 
			
		||||
import "time"
 | 
			
		||||
 | 
			
		||||
import "github.com/jinzhu/gorm"
 | 
			
		||||
import _ "github.com/jinzhu/gorm/dialects/sqlite"
 | 
			
		||||
 | 
			
		||||
import "github.com/rs/zerolog"
 | 
			
		||||
import "github.com/rs/zerolog/log"
 | 
			
		||||
import "golang.org/x/crypto/ssh/terminal"
 | 
			
		||||
 | 
			
		||||
type InstanceHostname string
 | 
			
		||||
 | 
			
		||||
func CLIEntry(version string, buildtime string, buildarch string, builduser string) int {
 | 
			
		||||
	f := new(FetaProcess)
 | 
			
		||||
	f.version = version
 | 
			
		||||
@ -19,7 +19,7 @@ func CLIEntry(version string, buildtime string, buildarch string, builduser stri
 | 
			
		||||
	f.buildarch = buildarch
 | 
			
		||||
	f.builduser = builduser
 | 
			
		||||
	f.setupLogging()
 | 
			
		||||
	return f.runForever()
 | 
			
		||||
	return f.RunForever()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FetaProcess is the main structure/process of this app
 | 
			
		||||
@ -28,10 +28,11 @@ type FetaProcess struct {
 | 
			
		||||
	buildtime string
 | 
			
		||||
	buildarch string
 | 
			
		||||
	builduser string
 | 
			
		||||
	archiver  *TootArchiver
 | 
			
		||||
	api       *TootArchiverAPIServer
 | 
			
		||||
	wg        *sync.WaitGroup
 | 
			
		||||
	//quit      chan os.Signal
 | 
			
		||||
	locator   *InstanceLocator
 | 
			
		||||
	manager   *InstanceManager
 | 
			
		||||
	api       *FetaAPIServer
 | 
			
		||||
	db        *gorm.DB
 | 
			
		||||
	startup   *time.Time
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *FetaProcess) identify() {
 | 
			
		||||
@ -44,9 +45,17 @@ func (f *FetaProcess) identify() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *FetaProcess) setupLogging() {
 | 
			
		||||
 | 
			
		||||
	log.Logger = log.With().Caller().Logger()
 | 
			
		||||
 | 
			
		||||
	if terminal.IsTerminal(int(os.Stdout.Fd())) {
 | 
			
		||||
		log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
 | 
			
		||||
		out := zerolog.NewConsoleWriter(
 | 
			
		||||
			func(w *zerolog.ConsoleWriter) {
 | 
			
		||||
				// Customize time format
 | 
			
		||||
				w.TimeFormat = time.RFC3339
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		log.Logger = log.Output(out)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// always log in UTC
 | 
			
		||||
@ -62,30 +71,44 @@ func (f *FetaProcess) setupLogging() {
 | 
			
		||||
	f.identify()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *FetaProcess) runForever() int {
 | 
			
		||||
	f.archiver = NewTootArchiver()
 | 
			
		||||
func (f *FetaProcess) Uptime() time.Duration {
 | 
			
		||||
	return time.Since(*f.startup)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	f.api = new(TootArchiverAPIServer)
 | 
			
		||||
	f.api.SetArchiver(f.archiver)
 | 
			
		||||
func (f *FetaProcess) RunForever() int {
 | 
			
		||||
	t := time.Now()
 | 
			
		||||
	f.startup = &t
 | 
			
		||||
 | 
			
		||||
	//FIXME(sneak) get this channel into places that need to be shut down
 | 
			
		||||
	//f.quit = make(chan os.Signal)
 | 
			
		||||
	//signal.Notify(f.quit, syscall.SIGINT, syscall.SIGTERM)
 | 
			
		||||
	var err error
 | 
			
		||||
	f.db, err = gorm.Open("sqlite3", "/feta.sqlite")
 | 
			
		||||
	defer f.db.Close()
 | 
			
		||||
 | 
			
		||||
	f.wg = new(sync.WaitGroup)
 | 
			
		||||
	// start api webserver goroutine
 | 
			
		||||
	f.wg.Add(1)
 | 
			
		||||
	go func() {
 | 
			
		||||
		f.api.Serve()
 | 
			
		||||
		f.wg.Done()
 | 
			
		||||
	}()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Panic().Err(err)
 | 
			
		||||
	}
 | 
			
		||||
	newInstanceHostnameNotifications := make(chan InstanceHostname)
 | 
			
		||||
 | 
			
		||||
	f.wg.Add(1)
 | 
			
		||||
	go func() {
 | 
			
		||||
		f.archiver.RunForever()
 | 
			
		||||
		f.wg.Done()
 | 
			
		||||
	}()
 | 
			
		||||
	f.locator = NewInstanceLocator()
 | 
			
		||||
	f.manager = NewInstanceManager()
 | 
			
		||||
	f.api = new(FetaAPIServer)
 | 
			
		||||
	f.api.feta = f // api needs to get to us
 | 
			
		||||
 | 
			
		||||
	f.locator.AddInstanceNotificationChannel(newInstanceHostnameNotifications)
 | 
			
		||||
	f.manager.AddInstanceNotificationChannel(newInstanceHostnameNotifications)
 | 
			
		||||
 | 
			
		||||
	// locator goroutine:
 | 
			
		||||
	go f.locator.Locate()
 | 
			
		||||
 | 
			
		||||
	// manager goroutine:
 | 
			
		||||
	go f.manager.Manage()
 | 
			
		||||
 | 
			
		||||
	go f.api.Serve()
 | 
			
		||||
 | 
			
		||||
	// this goroutine (main) does nothing until we handle signals
 | 
			
		||||
	// FIXME(sneak)
 | 
			
		||||
	for {
 | 
			
		||||
		time.Sleep(1 * time.Second)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	f.wg.Wait()
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user