package context
import (
"fmt"
"sync"
"time"
"github.com/sirupsen/logrus"
)
// Manager handles Kubernetes context management
type Manager struct {
currentContext string
contexts []string
lastUpdated time.Time
mutex sync.RWMutex
}
// NewManager creates a new context manager
func NewManager() *Manager {
return &Manager{
currentContext: "",
contexts: []string{},
lastUpdated: time.Now(),
}
}
// SetCurrentContext sets the current context
func (cm *Manager) SetCurrentContext(context string) error {
if cm == nil {
return fmt.Errorf("context manager is nil")
}
cm.mutex.Lock()
defer cm.mutex.Unlock()
// Validate context exists in available contexts
if !cm.isValidContext(context) {
return fmt.Errorf("context '%s' is not available", context)
}
cm.currentContext = context
cm.lastUpdated = time.Now()
logrus.Infof("Switched to context: %s", context)
return nil
}
// GetCurrentContext returns the current context
func (cm *Manager) GetCurrentContext() string {
if cm == nil {
return ""
}
cm.mutex.RLock()
defer cm.mutex.RUnlock()
return cm.currentContext
}
// SetAvailableContexts sets the list of available contexts
func (cm *Manager) SetAvailableContexts(contexts []string) {
cm.mutex.Lock()
defer cm.mutex.Unlock()
cm.contexts = contexts
cm.lastUpdated = time.Now()
}
// GetAvailableContexts returns the list of available contexts
func (cm *Manager) GetAvailableContexts() []string {
cm.mutex.RLock()
defer cm.mutex.RUnlock()
return cm.contexts
}
// isValidContext checks if a context is valid
func (cm *Manager) isValidContext(context string) bool {
for _, ctx := range cm.contexts {
if ctx == context {
return true
}
}
return false
}
// GetContextInfo returns information about the current context
func (cm *Manager) GetContextInfo() map[string]interface{} {
cm.mutex.RLock()
defer cm.mutex.RUnlock()
return map[string]interface{}{
"current": cm.currentContext,
"available": cm.contexts,
"lastUpdated": cm.lastUpdated,
"total": len(cm.contexts),
}
}
// IsContextSet returns true if a context is currently set
func (cm *Manager) IsContextSet() bool {
cm.mutex.RLock()
defer cm.mutex.RUnlock()
return cm.currentContext != ""
}
// ClearContext clears the current context
func (cm *Manager) ClearContext() {
cm.mutex.Lock()
defer cm.mutex.Unlock()
cm.currentContext = ""
logrus.Info("Cleared current context")
}