WIP: allow update processes in cluster

This commit is contained in:
Ingo Oppermann
2023-05-12 12:59:01 +02:00
parent f3e410f4f5
commit 7d2b7b4836
18 changed files with 990 additions and 311 deletions

View File

@@ -23,67 +23,19 @@ type Proxy interface {
ProxyReader
Reader() ProxyReader
ProxyProcessor
Processor() ProxyProcessor
}
type ProxyProcessor interface {
Resources() map[string]NodeResources
ProcessList() []ProcessConfig
ProcessAdd(nodeid string, config *app.Config) error
ProcessDelete(nodeid string, id string) error
ProcessStart(nodeid string, id string) error
}
type proxyProcessor struct {
proxy *proxy
}
func (p *proxyProcessor) Resources() map[string]NodeResources {
if p.proxy == nil {
return nil
}
return p.proxy.Resources()
}
func (p *proxyProcessor) ProcessList() []ProcessConfig {
if p.proxy == nil {
return nil
}
return p.proxy.ProcessList()
}
func (p *proxyProcessor) ProcessAdd(nodeid string, config *app.Config) error {
if p.proxy == nil {
return fmt.Errorf("no proxy provided")
}
return p.proxy.ProcessAdd(nodeid, config)
}
func (p *proxyProcessor) ProcessDelete(nodeid string, id string) error {
if p.proxy == nil {
return fmt.Errorf("no proxy provided")
}
return p.proxy.ProcessDelete(nodeid, id)
}
func (p *proxyProcessor) ProcessStart(nodeid string, id string) error {
if p.proxy == nil {
return fmt.Errorf("no proxy provided")
}
return p.proxy.ProcessStart(nodeid, id)
ProcessUpdate(nodeid string, id string, config *app.Config) error
}
type ProxyReader interface {
ListNodes() []NodeReader
GetNode(id string) (NodeReader, error)
Resources() map[string]NodeResources
ListProcesses() []Process
GetURL(path string) (string, error)
GetFile(path string) (io.ReadCloser, error)
}
@@ -112,6 +64,22 @@ func (p *proxyReader) GetNode(id string) (NodeReader, error) {
return p.proxy.GetNode(id)
}
func (p *proxyReader) Resources() map[string]NodeResources {
if p.proxy == nil {
return nil
}
return p.proxy.Resources()
}
func (p *proxyReader) ListProcesses() []Process {
if p.proxy == nil {
return nil
}
return p.proxy.ListProcesses()
}
func (p *proxyReader) GetURL(path string) (string, error) {
if p.proxy == nil {
return "", fmt.Errorf("no proxy provided")
@@ -264,12 +232,6 @@ func (p *proxy) Reader() ProxyReader {
}
}
func (p *proxy) Processor() ProxyProcessor {
return &proxyProcessor{
proxy: p,
}
}
func (p *proxy) Resources() map[string]NodeResources {
resources := map[string]NodeResources{}
@@ -277,15 +239,18 @@ func (p *proxy) Resources() map[string]NodeResources {
defer p.lock.RUnlock()
for _, node := range p.nodes {
resources[node.ID()] = node.State().Resources
about := node.About()
resources[about.ID] = about.Resources
}
return resources
}
func (p *proxy) AddNode(id string, node Node) (string, error) {
if id != node.ID() {
return "", fmt.Errorf("the provided (%s) and retrieved (%s) ID's don't match", id, node.ID())
about := node.About()
if id != about.ID {
return "", fmt.Errorf("the provided (%s) and retrieved (%s) ID's don't match", id, about.ID)
}
p.lock.Lock()
@@ -315,7 +280,8 @@ func (p *proxy) AddNode(id string, node Node) (string, error) {
node.StartFiles(p.updates)
p.logger.Info().WithFields(log.Fields{
"address": node.Address(),
"address": about.Address,
"name": about.Name,
"id": id,
}).Log("Added node")
@@ -449,19 +415,20 @@ func (p *proxy) GetFile(path string) (io.ReadCloser, error) {
return data, nil
}
type ProcessConfig struct {
NodeID string
Order string
State string
CPU float64 // Current CPU load of this process, 0-100*ncpu
Mem uint64 // Currently consumed memory of this process in bytes
Runtime time.Duration
Config *app.Config
type Process struct {
NodeID string
Order string
State string
CPU float64 // Current CPU load of this process, 0-100*ncpu
Mem uint64 // Currently consumed memory of this process in bytes
Runtime time.Duration
UpdatedAt time.Time
Config *app.Config
}
func (p *proxy) ProcessList() []ProcessConfig {
processChan := make(chan ProcessConfig, 64)
processList := []ProcessConfig{}
func (p *proxy) ListProcesses() []Process {
processChan := make(chan Process, 64)
processList := []Process{}
wgList := sync.WaitGroup{}
wgList.Add(1)
@@ -469,8 +436,8 @@ func (p *proxy) ProcessList() []ProcessConfig {
go func() {
defer wgList.Done()
for file := range processChan {
processList = append(processList, file)
for process := range processChan {
processList = append(processList, process)
}
}()
@@ -480,7 +447,7 @@ func (p *proxy) ProcessList() []ProcessConfig {
for _, node := range p.nodes {
wg.Add(1)
go func(node Node, p chan<- ProcessConfig) {
go func(node Node, p chan<- Process) {
defer wg.Done()
processes, err := node.ProcessList()
@@ -559,3 +526,15 @@ func (p *proxy) ProcessStart(nodeid string, id string) error {
return nil
}
func (p *proxy) ProcessUpdate(nodeid string, id string, config *app.Config) error {
p.lock.RLock()
defer p.lock.RUnlock()
_, ok := p.nodes[nodeid]
if !ok {
return fmt.Errorf("node not found")
}
return fmt.Errorf("not implemented")
}