mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-26 11:03:34 +00:00
merge ucind cluster configuration to the user’s uncloud config
This commit is contained in:
@@ -75,6 +75,13 @@ func (p *Provisioner) CreateCluster(ctx context.Context, name string, opts Creat
|
||||
return c, err
|
||||
}
|
||||
|
||||
if p.configUpdater != nil {
|
||||
if err = p.configUpdater.AddCluster(c); err != nil {
|
||||
return c, fmt.Errorf("add cluster to Uncloud config: %w", err)
|
||||
}
|
||||
fmt.Printf("Cluster '%s' added to Uncloud config.\n", c.Name)
|
||||
}
|
||||
|
||||
return c, nil
|
||||
}
|
||||
|
||||
@@ -210,5 +217,13 @@ func (p *Provisioner) RemoveCluster(ctx context.Context, name string) error {
|
||||
if err = p.dockerCli.NetworkRemove(ctx, name); err != nil {
|
||||
return fmt.Errorf("remove Docker network '%s': %w", name, err)
|
||||
}
|
||||
|
||||
if p.configUpdater != nil {
|
||||
if err = p.configUpdater.RemoveCluster(name); err != nil {
|
||||
return fmt.Errorf("remove cluster from Uncloud config: %w", err)
|
||||
}
|
||||
fmt.Printf("Cluster '%s' removed from Uncloud config.\n", name)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
package ucind
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"uncloud/internal/cli/config"
|
||||
)
|
||||
|
||||
type ConfigUpdater struct {
|
||||
path string
|
||||
}
|
||||
|
||||
func NewConfigUpdater(path string) *ConfigUpdater {
|
||||
return &ConfigUpdater{path: path}
|
||||
}
|
||||
|
||||
func (u *ConfigUpdater) AddCluster(c Cluster) error {
|
||||
cfg, err := config.NewFromFile(u.path)
|
||||
if err != nil {
|
||||
return fmt.Errorf("read Uncloud config: %w", err)
|
||||
}
|
||||
|
||||
if _, ok := cfg.Clusters[c.Name]; ok {
|
||||
return fmt.Errorf("cluster '%s' already exists", c.Name)
|
||||
}
|
||||
|
||||
clusterCfg := &config.Cluster{
|
||||
Name: c.Name,
|
||||
Connections: make([]config.MachineConnection, len(c.Machines)),
|
||||
}
|
||||
for i, m := range c.Machines {
|
||||
clusterCfg.Connections[i] = config.MachineConnection{
|
||||
TCP: m.APIAddress,
|
||||
}
|
||||
}
|
||||
|
||||
cfg.Clusters[c.Name] = clusterCfg
|
||||
cfg.CurrentCluster = c.Name
|
||||
|
||||
if err = cfg.Save(); err != nil {
|
||||
return fmt.Errorf("save config: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (u *ConfigUpdater) RemoveCluster(name string) error {
|
||||
cfg, err := config.NewFromFile(u.path)
|
||||
if err != nil {
|
||||
return fmt.Errorf("read Uncloud config: %w", err)
|
||||
}
|
||||
|
||||
if _, ok := cfg.Clusters[name]; !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
delete(cfg.Clusters, name)
|
||||
|
||||
if cfg.CurrentCluster == name {
|
||||
cfg.CurrentCluster = ""
|
||||
}
|
||||
if _, ok := cfg.Clusters["default"]; ok {
|
||||
cfg.CurrentCluster = "default"
|
||||
}
|
||||
|
||||
if err = cfg.Save(); err != nil {
|
||||
return fmt.Errorf("save config: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -8,11 +8,13 @@ import (
|
||||
var ErrNotFound = errors.New("not found")
|
||||
|
||||
type Provisioner struct {
|
||||
dockerCli *client.Client
|
||||
dockerCli *client.Client
|
||||
configUpdater *ConfigUpdater
|
||||
}
|
||||
|
||||
func NewProvisioner(cli *client.Client) *Provisioner {
|
||||
func NewProvisioner(cli *client.Client, configUpdater *ConfigUpdater) *Provisioner {
|
||||
return &Provisioner{
|
||||
dockerCli: cli,
|
||||
dockerCli: cli,
|
||||
configUpdater: configUpdater,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user