From a37b01c5b9850be1b09a15cd026321d1d54031a6 Mon Sep 17 00:00:00 2001 From: iwilltry42 Date: Tue, 19 Jan 2021 14:47:19 +0100 Subject: [PATCH] NodeDelete: add NodeDeleteOpts --- CHANGELOG.md | 1 + cmd/node/nodeDelete.go | 2 +- cmd/registry/registryDelete.go | 2 +- pkg/client/cluster.go | 2 +- pkg/client/node.go | 11 +++++++++-- pkg/client/registry.go | 1 + pkg/config/transform.go | 1 + pkg/types/types.go | 6 ++++++ 8 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10350f85..e2bfbb7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - `pkg/cluster` is now `pkg/client` - `ClusterCreate` and `NodeCreate` don't start the entities (containers) anymore - `ClusterRun` and `NodeRun` orchestrate the new Create and Start functionality +- `NodeDelete` now takes an additional `NodeDeleteOpts` struct to toggle specific steps - New config flow: CLIConfig (SimpleConfig) -> ClusterConfig -> Cluster + Opts #### CLI diff --git a/cmd/node/nodeDelete.go b/cmd/node/nodeDelete.go index cdc909b4..e722ec95 100644 --- a/cmd/node/nodeDelete.go +++ b/cmd/node/nodeDelete.go @@ -48,7 +48,7 @@ func NewCmdNodeDelete() *cobra.Command { log.Infoln("No nodes found") } else { for _, node := range nodes { - if err := client.NodeDelete(cmd.Context(), runtimes.SelectedRuntime, node); err != nil { + if err := client.NodeDelete(cmd.Context(), runtimes.SelectedRuntime, node, k3d.NodeDeleteOpts{SkipRegistryCheck: true}); err != nil { log.Fatalln(err) } } diff --git a/cmd/registry/registryDelete.go b/cmd/registry/registryDelete.go index 450f78ce..6b259d60 100644 --- a/cmd/registry/registryDelete.go +++ b/cmd/registry/registryDelete.go @@ -48,7 +48,7 @@ func NewCmdRegistryDelete() *cobra.Command { log.Infoln("No nodes found") } else { for _, node := range nodes { - if err := client.NodeDelete(cmd.Context(), runtimes.SelectedRuntime, node); err != nil { + if err := client.NodeDelete(cmd.Context(), runtimes.SelectedRuntime, node, k3d.NodeDeleteOpts{SkipLBUpdate: true}); err != nil { log.Fatalln(err) } } diff --git a/pkg/client/cluster.go b/pkg/client/cluster.go index eb8ec7c7..9aae94ce 100644 --- a/pkg/client/cluster.go +++ b/pkg/client/cluster.go @@ -539,7 +539,7 @@ func ClusterDelete(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Clus failed := 0 for _, node := range cluster.Nodes { - if err := runtime.DeleteNode(ctx, node); err != nil { + if err := NodeDelete(ctx, runtime, node, k3d.NodeDeleteOpts{SkipLBUpdate: true}); err != nil { log.Warningf("Failed to delete node '%s': Try to delete it manually", node.Name) failed++ continue diff --git a/pkg/client/node.go b/pkg/client/node.go index 101a3d45..ac5676b6 100644 --- a/pkg/client/node.go +++ b/pkg/client/node.go @@ -287,13 +287,20 @@ func NodeCreate(ctx context.Context, runtime runtimes.Runtime, node *k3d.Node, c } // NodeDelete deletes an existing node -func NodeDelete(ctx context.Context, runtime runtimes.Runtime, node *k3d.Node) error { +func NodeDelete(ctx context.Context, runtime runtimes.Runtime, node *k3d.Node, opts k3d.NodeDeleteOpts) error { + // registry: only delete, if not connected to other networks + if !opts.SkipRegistryCheck && node.Role == k3d.RegistryRole { + log.Debugln("NodeDelete special case: registry -> not yet implemented") + } + + // delete node if err := runtime.DeleteNode(ctx, node); err != nil { log.Error(err) } - if node.Role == k3d.ServerRole || node.Role == k3d.AgentRole { + // update the server loadbalancer + if !opts.SkipLBUpdate && (node.Role == k3d.ServerRole || node.Role == k3d.AgentRole) { cluster, err := ClusterGet(ctx, runtime, &k3d.Cluster{Name: node.Labels[k3d.LabelClusterName]}) if err != nil { log.Errorf("Failed to find cluster for node '%s'", node.Name) diff --git a/pkg/client/registry.go b/pkg/client/registry.go index 6e2686cf..3f69195a 100644 --- a/pkg/client/registry.go +++ b/pkg/client/registry.go @@ -78,6 +78,7 @@ func RegistryCreate(ctx context.Context, runtime runtimes.Runtime, reg *k3d.Regi // setup the node labels registryNode.Labels = map[string]string{ + k3d.LabelClusterName: reg.ClusterRef, k3d.LabelRole: string(k3d.RegistryRole), k3d.LabelRegistryHost: reg.ExposureOpts.Host, // TODO: docker machine host? k3d.LabelRegistryHostIP: reg.ExposureOpts.Binding.HostIP, diff --git a/pkg/config/transform.go b/pkg/config/transform.go index 095ff5e0..1af751d3 100644 --- a/pkg/config/transform.go +++ b/pkg/config/transform.go @@ -241,6 +241,7 @@ func TransformSimpleToClusterConfig(ctx context.Context, runtime runtimes.Runtim return nil, fmt.Errorf("Failed to get port for registry: %+v", err) } clusterCreateOpts.Registries.Create = &k3d.Registry{ + ClusterRef: newCluster.Name, Host: fmt.Sprintf("%s-%s-registry", k3d.DefaultObjectNamePrefix, newCluster.Name), Image: fmt.Sprintf("%s:%s", k3d.DefaultRegistryImageRepo, k3d.DefaultRegistryImageTag), ExposureOpts: *regPort, diff --git a/pkg/types/types.go b/pkg/types/types.go index bb5a125b..71591a95 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -222,6 +222,12 @@ type NodeStartOpts struct { NodeHooks []NodeHook `yaml:"nodeHooks,omitempty" json:"nodeHooks,omitempty"` } +// NodeDeleteOpts describes a set of options one can set when deleting a node +type NodeDeleteOpts struct { + SkipLBUpdate bool // skip updating the loadbalancer + SkipRegistryCheck bool // skip checking if this is a registry (and act accordingly) +} + // NodeHookAction is an interface to implement actions that should trigger at specific points of the node lifecycle type NodeHookAction interface { Run(ctx context.Context, node *Node) error