141 lines
3.6 KiB
Go
141 lines
3.6 KiB
Go
package context
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/wild-cloud/wild-central/daemon/internal/storage"
|
|
)
|
|
|
|
// Manager handles current instance context tracking
|
|
type Manager struct {
|
|
dataDir string
|
|
}
|
|
|
|
// NewManager creates a new context manager
|
|
func NewManager(dataDir string) *Manager {
|
|
return &Manager{
|
|
dataDir: dataDir,
|
|
}
|
|
}
|
|
|
|
// GetContextFilePath returns the path to the context file
|
|
func (m *Manager) GetContextFilePath() string {
|
|
return filepath.Join(m.dataDir, "current-context")
|
|
}
|
|
|
|
// GetCurrentContext retrieves the name of the current instance context
|
|
func (m *Manager) GetCurrentContext() (string, error) {
|
|
contextFile := m.GetContextFilePath()
|
|
|
|
if !storage.FileExists(contextFile) {
|
|
return "", fmt.Errorf("no current context set")
|
|
}
|
|
|
|
content, err := storage.ReadFile(contextFile)
|
|
if err != nil {
|
|
return "", fmt.Errorf("reading context file: %w", err)
|
|
}
|
|
|
|
contextName := strings.TrimSpace(string(content))
|
|
if contextName == "" {
|
|
return "", fmt.Errorf("context file is empty")
|
|
}
|
|
|
|
return contextName, nil
|
|
}
|
|
|
|
// SetCurrentContext sets the current instance context
|
|
func (m *Manager) SetCurrentContext(instanceName string) error {
|
|
if instanceName == "" {
|
|
return fmt.Errorf("instance name cannot be empty")
|
|
}
|
|
|
|
// Verify instance exists
|
|
instancePath := filepath.Join(m.dataDir, "instances", instanceName)
|
|
if !storage.FileExists(instancePath) {
|
|
return fmt.Errorf("instance %s does not exist", instanceName)
|
|
}
|
|
|
|
contextFile := m.GetContextFilePath()
|
|
|
|
// Ensure data directory exists
|
|
if err := storage.EnsureDir(m.dataDir, 0755); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Acquire lock before writing
|
|
lockPath := contextFile + ".lock"
|
|
return storage.WithLock(lockPath, func() error {
|
|
return storage.WriteFile(contextFile, []byte(instanceName), 0644)
|
|
})
|
|
}
|
|
|
|
// ClearCurrentContext removes the current context
|
|
func (m *Manager) ClearCurrentContext() error {
|
|
contextFile := m.GetContextFilePath()
|
|
|
|
if !storage.FileExists(contextFile) {
|
|
// Already cleared
|
|
return nil
|
|
}
|
|
|
|
// Acquire lock before deleting
|
|
lockPath := contextFile + ".lock"
|
|
return storage.WithLock(lockPath, func() error {
|
|
return storage.WriteFile(contextFile, []byte(""), 0644)
|
|
})
|
|
}
|
|
|
|
// HasCurrentContext checks if a current context is set
|
|
func (m *Manager) HasCurrentContext() bool {
|
|
_, err := m.GetCurrentContext()
|
|
return err == nil
|
|
}
|
|
|
|
// ValidateContext checks if the current context is valid (instance exists)
|
|
func (m *Manager) ValidateContext() error {
|
|
contextName, err := m.GetCurrentContext()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
instancePath := filepath.Join(m.dataDir, "instances", contextName)
|
|
if !storage.FileExists(instancePath) {
|
|
return fmt.Errorf("current context %s points to non-existent instance", contextName)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetCurrentInstancePath returns the path to the current instance directory
|
|
func (m *Manager) GetCurrentInstancePath() (string, error) {
|
|
contextName, err := m.GetCurrentContext()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return filepath.Join(m.dataDir, "instances", contextName), nil
|
|
}
|
|
|
|
// GetCurrentInstanceConfigPath returns the path to the current instance's config file
|
|
func (m *Manager) GetCurrentInstanceConfigPath() (string, error) {
|
|
instancePath, err := m.GetCurrentInstancePath()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return filepath.Join(instancePath, "config.yaml"), nil
|
|
}
|
|
|
|
// GetCurrentInstanceSecretsPath returns the path to the current instance's secrets file
|
|
func (m *Manager) GetCurrentInstanceSecretsPath() (string, error) {
|
|
instancePath, err := m.GetCurrentInstancePath()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return filepath.Join(instancePath, "secrets.yaml"), nil
|
|
}
|