| |
| package namespace |
|
|
| import ( |
| "context" |
| "errors" |
| "sync" |
| ) |
|
|
| |
| type Manager struct { |
| config ManagerConfig |
|
|
| mu sync.RWMutex |
| } |
|
|
| type ManagerConfig struct { |
| DefaultNamespace string |
| DisableManagement bool |
| Handlers []Handler |
| } |
|
|
| func NewManager(config ManagerConfig) (*Manager, error) { |
| if config.DefaultNamespace == "" { |
| return nil, errors.New("default namespace is required") |
| } |
|
|
| for _, handler := range config.Handlers { |
| if handler == nil { |
| return nil, errors.New("handler must not be nil") |
| } |
| } |
|
|
| manager := Manager{ |
| config: config, |
| mu: sync.RWMutex{}, |
| } |
|
|
| return &manager, nil |
| } |
|
|
| |
| |
| |
| |
| |
| |
| type Handler interface { |
| CreateNamespace(ctx context.Context, name string) error |
| DeleteNamespace(ctx context.Context, name string) error |
| } |
|
|
| |
| func (m *Manager) CreateNamespace(ctx context.Context, name string) error { |
| if name == "" { |
| return errors.New("cannot create empty namespace") |
| } |
|
|
| return m.createNamespace(ctx, name) |
| } |
|
|
| |
| func (m *Manager) DeleteNamespace(ctx context.Context, name string) error { |
| if name == "" { |
| return errors.New("cannot delete empty namespace") |
| } |
|
|
| if name == m.config.DefaultNamespace { |
| return errors.New("cannot delete default namespace") |
| } |
|
|
| return m.deleteNamespace(ctx, name) |
| } |
|
|
| |
| func (m *Manager) RegisterHandler(handler Handler) error { |
| if handler == nil { |
| return errors.New("cannot register nil handler") |
| } |
|
|
| m.mu.Lock() |
| defer m.mu.Unlock() |
|
|
| m.config.Handlers = append(m.config.Handlers, handler) |
|
|
| return nil |
| } |
|
|
| |
| |
| |
| func (m *Manager) CreateDefaultNamespace(ctx context.Context) error { |
| return m.createNamespace(ctx, m.config.DefaultNamespace) |
| } |
|
|
| func (m *Manager) GetDefaultNamespace() string { |
| return m.config.DefaultNamespace |
| } |
|
|
| func (m *Manager) IsManagementDisabled() bool { |
| return m.config.DisableManagement |
| } |
|
|
| |
| func (m *Manager) createNamespace(ctx context.Context, name string) error { |
| var errs []error |
|
|
| m.mu.RLock() |
| defer m.mu.RUnlock() |
|
|
| for _, handler := range m.config.Handlers { |
| err := handler.CreateNamespace(ctx, name) |
| if err != nil { |
| errs = append(errs, err) |
| } |
| } |
|
|
| return errors.Join(errs...) |
| } |
|
|
| |
| func (m *Manager) deleteNamespace(ctx context.Context, name string) error { |
| var errs []error |
|
|
| m.mu.RLock() |
| defer m.mu.RUnlock() |
|
|
| for _, handler := range m.config.Handlers { |
| err := handler.DeleteNamespace(ctx, name) |
| if err != nil { |
| errs = append(errs, err) |
| } |
| } |
|
|
| return errors.Join(errs...) |
| } |
|
|