Skip to content

Commit 830b982

Browse files
authored
Merge pull request #34 from alicefr/fix-32
Fix node addition failure when the control plan has a custom name
2 parents 2299e05 + 079bb84 commit 830b982

3 files changed

Lines changed: 54 additions & 15 deletions

File tree

internal/cli/node/add.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -108,21 +108,6 @@ func runAdd(ctx context.Context, nodeName, controlPlane, nodeImage, role string,
108108
return fmt.Errorf("ensuring cluster image: %w", err)
109109
}
110110

111-
// Ensure images volume exists for this node image version
112-
logger.Infof("Step 0: Ensuring cluster images volume...")
113-
clusterMgr := cluster.New(cluster.Config{
114-
Name: clusterName,
115-
ControlPlane: controlPlane,
116-
HostNetworkPopulator: hostNetworkPopulator,
117-
Logger: logger,
118-
})
119-
120-
clusterImagesVolume, err := clusterMgr.EnsureImagesVolume(ctx, nodeImage)
121-
if err != nil {
122-
return fmt.Errorf("ensuring images volume: %w", err)
123-
}
124-
logger.Info("")
125-
126111
// Step 1: Create the new node
127112
logger.Infof("Step 1: Creating %s node...", role)
128113
logger.Infof("Node image: %s", nodeImage)
@@ -140,6 +125,27 @@ func runAdd(ctx context.Context, nodeName, controlPlane, nodeImage, role string,
140125
}
141126
}
142127

128+
// Auto-detect the control-plane node name from container labels
129+
discovered, err := findControlPlaneNode(ctx, podmanClient, clusterName, "")
130+
if err == nil {
131+
controlPlane = discovered
132+
}
133+
134+
// Ensure images volume exists for this node image version
135+
logger.Infof("Step 0: Ensuring cluster images volume...")
136+
clusterMgr := cluster.New(cluster.Config{
137+
Name: clusterName,
138+
ControlPlane: controlPlane,
139+
HostNetworkPopulator: hostNetworkPopulator,
140+
Logger: logger,
141+
})
142+
143+
clusterImagesVolume, err := clusterMgr.EnsureImagesVolume(ctx, nodeImage)
144+
if err != nil {
145+
return fmt.Errorf("ensuring images volume: %w", err)
146+
}
147+
logger.Info("")
148+
143149
// Discover DNS container IP for cloud-init config
144150
dnsMgr, err := dns.NewManager(clusterName)
145151
if err != nil {

test/integration/helpers/cluster.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ func CreateCluster(name string) {
5050
Expect(session.ExitCode()).To(Equal(0), "Failed to create cluster: %s", string(session.Err.Contents()))
5151
}
5252

53+
// CreateClusterWithNodeName creates a cluster with a custom control-plane node name
54+
func CreateClusterWithNodeName(name, nodeName string) {
55+
GinkgoWriter.Printf("Creating cluster: %s with node name: %s (with auto-assigned API port)\n", name, nodeName)
56+
cmd := BinkCmd("cluster", "start", "--cluster-name", name, "--node-name", nodeName, "--api-port", "0", "--memory", "1900", "--max-memory", "4096")
57+
session := RunCommand(cmd, 10*time.Minute)
58+
Expect(session.ExitCode()).To(Equal(0), "Failed to create cluster: %s", string(session.Err.Contents()))
59+
}
60+
5361
// AddNode adds a node to the cluster
5462
func AddNode(clusterName, nodeName string, extraArgs ...string) {
5563
GinkgoWriter.Printf("Adding node %s to cluster %s\n", nodeName, clusterName)

test/integration/multinode_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,31 @@ var _ = Describe("Multi-Node Clusters", func() {
134134
}
135135
})
136136

137+
It("should add worker node when cluster uses custom node name", func() {
138+
const customNodeName = "cp-custom"
139+
140+
By("Creating a cluster with a custom control-plane node name")
141+
helpers.CreateClusterWithNodeName(clusterName, customNodeName)
142+
143+
By("Verifying control-plane container has the custom name")
144+
containerName := helpers.NodeContainerName(clusterName, customNodeName)
145+
container := helpers.GetContainer(containerName)
146+
Expect(container).ToNot(BeNil(), "Container %s should exist", containerName)
147+
Expect(container.State).To(Equal("running"))
148+
149+
By("Adding a worker node without specifying --control-plane")
150+
helpers.AddNode(clusterName, node2, "--role", "worker")
151+
152+
By("Exposing API and creating Kubernetes client")
153+
kubeClient, kubeconfigPath := helpers.SetupKubeClient(clusterName)
154+
defer helpers.CleanupKubeconfig(kubeconfigPath)
155+
156+
By("Verifying both nodes are Ready in Kubernetes")
157+
helpers.WaitForNodeReady(kubeClient, customNodeName, 5*time.Minute)
158+
helpers.WaitForNodeReady(kubeClient, node2, 5*time.Minute)
159+
Expect(helpers.GetNodeCount(kubeClient)).To(Equal(2))
160+
})
161+
137162
It("should add control-plane nodes for HA configuration", Serial, func() {
138163
By("Creating a single-node cluster")
139164
helpers.CreateCluster(clusterName)

0 commit comments

Comments
 (0)