nodeAdd: do not copy ports from existing node (+ some cleanup)

This commit is contained in:
iwilltry42 2021-06-18 14:28:41 +02:00
parent 0fbf03a080
commit 92b7689f9d
No known key found for this signature in database
GPG Key ID: 7BA57AD1CFF16110

View File

@ -70,36 +70,75 @@ func NodeAddToCluster(ctx context.Context, runtime runtimes.Runtime, node *k3d.N
node.Env = []string{} node.Env = []string{}
// copy labels and env vars from a similar node in the selected cluster // copy labels and env vars from a similar node in the selected cluster
var chosenNode *k3d.Node var srcNode *k3d.Node
for _, existingNode := range cluster.Nodes { for _, existingNode := range cluster.Nodes {
if existingNode.Role == node.Role { if existingNode.Role == node.Role {
chosenNode = existingNode srcNode = existingNode
break break
} }
} }
// if we didn't find a node with the same role in the cluster, just choose any other node // if we didn't find a node with the same role in the cluster, just choose any other node
if chosenNode == nil { if srcNode == nil {
log.Debugf("Didn't find node with role '%s' in cluster '%s'. Choosing any other node (and using defaults)...", node.Role, cluster.Name) log.Debugf("Didn't find node with role '%s' in cluster '%s'. Choosing any other node (and using defaults)...", node.Role, cluster.Name)
node.Cmd = k3d.DefaultRoleCmds[node.Role] node.Cmd = k3d.DefaultRoleCmds[node.Role]
for _, existingNode := range cluster.Nodes { for _, existingNode := range cluster.Nodes {
if existingNode.Role != k3d.LoadBalancerRole { // any role except for the LoadBalancer role if existingNode.Role != k3d.LoadBalancerRole { // any role except for the LoadBalancer role
chosenNode = existingNode srcNode = existingNode
break break
} }
} }
} }
// get node details // get node details
chosenNode, err = NodeGet(ctx, runtime, chosenNode) srcNode, err = NodeGet(ctx, runtime, srcNode)
if err != nil { if err != nil {
return err return err
} }
log.Debugf("Adding node %+v \n>>> to cluster %+v\n>>> based on existing node %+v", node, cluster, chosenNode) /*
* Sanitize Source Node
* -> remove fields that are not safe to copy as they break something down the stream
*/
// TODO: I guess proper deduplication can be handled in a cleaner/better way or at the infofaker level at some point
for _, forbiddenMount := range util.DoNotCopyVolumeSuffices {
for i, mount := range node.Volumes {
if strings.Contains(mount, forbiddenMount) {
log.Tracef("Dropping copied volume mount %s to avoid issues...", mount)
node.Volumes = util.RemoveElementFromStringSlice(node.Volumes, i)
}
}
}
// drop port mappings as we cannot use the same port mapping for a two nodes (port collisions)
srcNode.Ports = nat.PortMap{}
// we cannot have two servers as init servers
if node.Role == k3d.ServerRole {
for _, forbiddenCmd := range k3d.DoNotCopyServerFlags {
for i, cmd := range srcNode.Cmd {
// cut out the '--cluster-init' flag as this should only be done by the initializing server node
if cmd == forbiddenCmd {
log.Tracef("Dropping '%s' from source node's cmd", forbiddenCmd)
srcNode.Cmd = append(srcNode.Cmd[:i], srcNode.Cmd[i+1:]...)
}
}
for i, arg := range node.Args {
// cut out the '--cluster-init' flag as this should only be done by the initializing server node
if arg == forbiddenCmd {
log.Tracef("Dropping '%s' from source node's args", forbiddenCmd)
srcNode.Args = append(srcNode.Args[:i], srcNode.Args[i+1:]...)
}
}
}
}
log.Debugf("Adding node %s to cluster %s based on existing (sanitized) node %s", node.Name, cluster.Name, srcNode.Name)
log.Tracef("Sanitized Source Node: %+v\nNew Node: %+v", srcNode, node)
// fetch registry config // fetch registry config
registryConfigBytes := []byte{} registryConfigBytes := []byte{}
registryConfigReader, err := runtime.ReadFromNode(ctx, k3d.DefaultRegistriesFilePath, chosenNode) registryConfigReader, err := runtime.ReadFromNode(ctx, k3d.DefaultRegistriesFilePath, srcNode)
if err != nil { if err != nil {
if !errors.Is(err, runtimeErrors.ErrRuntimeFileNotFound) { if !errors.Is(err, runtimeErrors.ErrRuntimeFileNotFound) {
log.Warnf("Failed to read registry config from node %s: %+v", node.Name, err) log.Warnf("Failed to read registry config from node %s: %+v", node.Name, err)
@ -117,22 +156,12 @@ func NodeAddToCluster(ctx context.Context, runtime runtimes.Runtime, node *k3d.N
} }
// merge node config of new node into existing node config // merge node config of new node into existing node config
if err := mergo.MergeWithOverwrite(chosenNode, *node); err != nil { if err := mergo.MergeWithOverwrite(srcNode, *node); err != nil {
log.Errorln("Failed to merge new node config into existing node config") log.Errorln("Failed to merge new node config into existing node config")
return err return err
} }
node = chosenNode node = srcNode
// TODO: I guess proper deduplication can be handled in a cleaner/better way or at the infofaker level at some point
for _, forbiddenMount := range util.DoNotCopyVolumeSuffices {
for i, mount := range node.Volumes {
if strings.Contains(mount, forbiddenMount) {
log.Tracef("Dropping copied volume mount %s to avoid issues...", mount)
node.Volumes = util.RemoveElementFromStringSlice(node.Volumes, i)
}
}
}
log.Debugf("Resulting node %+v", node) log.Debugf("Resulting node %+v", node)
@ -151,25 +180,6 @@ func NodeAddToCluster(ctx context.Context, runtime runtimes.Runtime, node *k3d.N
} }
} }
if node.Role == k3d.ServerRole {
for _, forbiddenCmd := range k3d.DoNotCopyServerFlags {
for i, cmd := range node.Cmd {
// cut out the '--cluster-init' flag as this should only be done by the initializing server node
if cmd == forbiddenCmd {
log.Debugf("Dropping '%s' from node's cmd", forbiddenCmd)
node.Cmd = append(node.Cmd[:i], node.Cmd[i+1:]...)
}
}
for i, arg := range node.Args {
// cut out the '--cluster-init' flag as this should only be done by the initializing server node
if arg == forbiddenCmd {
log.Debugf("Dropping '%s' from node's args", forbiddenCmd)
node.Args = append(node.Args[:i], node.Args[i+1:]...)
}
}
}
}
// add node actions // add node actions
if len(registryConfigBytes) != 0 { if len(registryConfigBytes) != 0 {
if createNodeOpts.NodeHooks == nil { if createNodeOpts.NodeHooks == nil {