57 lines
1.3 KiB
Go
57 lines
1.3 KiB
Go
package factories
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
|
|
instancemanager "git.acooldomain.co/server-manager/backend/instancemanager"
|
|
"git.acooldomain.co/server-manager/backend/instancemanager/docker"
|
|
"git.acooldomain.co/server-manager/backend/models"
|
|
)
|
|
|
|
var (
|
|
instanceManagerHandlers = make(map[string]instancemanager.InstanceManager)
|
|
instanceManagerMutex sync.Mutex
|
|
)
|
|
|
|
func getDockerCacheKey(config *models.DockerInstanceManagerConfig) string {
|
|
return "Docker"
|
|
}
|
|
|
|
func GetInstanceManager(config models.InstanceManagerConfig) (instancemanager.InstanceManager, error) {
|
|
var key string
|
|
var handler instancemanager.InstanceManager
|
|
var err error
|
|
var exists bool
|
|
|
|
switch config.Type {
|
|
case models.DOCKER:
|
|
if config.Docker == nil {
|
|
return nil, errors.New("missing Docker configuration")
|
|
}
|
|
key = getDockerCacheKey(config.Docker)
|
|
default:
|
|
return nil, errors.New("unsupported database type")
|
|
}
|
|
|
|
instanceManagerMutex.Lock()
|
|
defer instanceManagerMutex.Unlock()
|
|
|
|
if handler, exists = instanceManagerHandlers[key]; exists {
|
|
return handler, nil
|
|
}
|
|
|
|
switch config.Type {
|
|
case models.DOCKER:
|
|
handler, err = docker.NewInstanceManager(*config.Docker)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
default:
|
|
return nil, errors.New("unsupported database type")
|
|
}
|
|
|
|
instanceManagerHandlers[key] = handler
|
|
return handler, nil
|
|
}
|