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, siteDomain string) string { return "Docker/" + siteDomain } func GetInstanceManager(config models.InstanceManagerConfig, siteDomain string) (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, siteDomain) 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, siteDomain) if err != nil { return nil, err } default: return nil, errors.New("unsupported database type") } instanceManagerHandlers[key] = handler return handler, nil }