2020-05-01 15:30:50 +00:00
|
|
|
package overwatch
|
|
|
|
|
2020-06-05 14:26:06 +00:00
|
|
|
// ServiceCallback is a service notify it's runloop finished.
|
|
|
|
// the first parameter is the service type
|
|
|
|
// the second parameter is the service name
|
|
|
|
// the third parameter is an optional error if the service failed
|
|
|
|
type ServiceCallback func(string, string, error)
|
|
|
|
|
2020-05-01 15:30:50 +00:00
|
|
|
// AppManager is the default implementation of overwatch service management
|
|
|
|
type AppManager struct {
|
2020-06-05 14:26:06 +00:00
|
|
|
services map[string]Service
|
|
|
|
callback ServiceCallback
|
2020-05-01 15:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewAppManager creates a new overwatch manager
|
2020-06-05 14:26:06 +00:00
|
|
|
func NewAppManager(callback ServiceCallback) Manager {
|
|
|
|
return &AppManager{services: make(map[string]Service), callback: callback}
|
2020-05-01 15:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Add takes in a new service to manage.
|
|
|
|
// It stops the service if it already exist in the manager and is running
|
|
|
|
// It then starts the newly added service
|
|
|
|
func (m *AppManager) Add(service Service) {
|
|
|
|
// check for existing service
|
|
|
|
if currentService, ok := m.services[service.Name()]; ok {
|
|
|
|
if currentService.Hash() == service.Hash() {
|
|
|
|
return // the exact same service, no changes, so move along
|
|
|
|
}
|
|
|
|
currentService.Shutdown() //shutdown the listener since a new one is starting
|
|
|
|
}
|
|
|
|
m.services[service.Name()] = service
|
|
|
|
|
|
|
|
//start the service!
|
|
|
|
go m.serviceRun(service)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove shutdowns the service by name and removes it from its current management list
|
|
|
|
func (m *AppManager) Remove(name string) {
|
|
|
|
if currentService, ok := m.services[name]; ok {
|
|
|
|
currentService.Shutdown()
|
|
|
|
}
|
|
|
|
delete(m.services, name)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Services returns all the current Services being managed
|
|
|
|
func (m *AppManager) Services() []Service {
|
|
|
|
values := []Service{}
|
|
|
|
for _, value := range m.services {
|
|
|
|
values = append(values, value)
|
|
|
|
}
|
|
|
|
return values
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *AppManager) serviceRun(service Service) {
|
|
|
|
err := service.Run()
|
2020-06-05 14:26:06 +00:00
|
|
|
if m.callback != nil {
|
|
|
|
m.callback(service.Type(), service.Name(), err)
|
2020-05-01 15:30:50 +00:00
|
|
|
}
|
|
|
|
}
|