Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions test/extended/machine_config/pinnedimages.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (

mcfgv1 "github.com/openshift/api/machineconfiguration/v1"
mcClient "github.com/openshift/client-go/machineconfiguration/clientset/versioned"
nodeutil "github.com/openshift/origin/test/extended/node"
exutil "github.com/openshift/origin/test/extended/util"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand Down Expand Up @@ -353,24 +354,25 @@ func applyPIS(oc *exutil.CLI, pisFixture string, pis *mcfgv1.PinnedImageSet, pis
// `addWorkerNodesToCustomPool` labels the desired number of worker nodes with the MCP role
// selector so that the nodes become part of the desired custom MCP
func addWorkerNodesToCustomPool(oc *exutil.CLI, kubeClient *kubernetes.Clientset, numberOfNodes int, customMCP string) ([]string, error) {
// Get the worker nodes
nodes, err := kubeClient.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{LabelSelector: labels.SelectorFromSet(labels.Set{"node-role.kubernetes.io/worker": ""}).String()})
// Get ready schedulable worker nodes (excludes nodes with NoSchedule/NoExecute taints)
workerNodes, err := nodeutil.GetReadySchedulableWorkerNodes(context.TODO(), kubeClient)
if err != nil {
return nil, err
}
// Return an error if there are less worker nodes in the cluster than the desired number of nodes to add to the custom MCP
if len(nodes.Items) < numberOfNodes {
return nil, fmt.Errorf("Node in Worker MCP %d < Number of nodes needed in %d MCP", len(nodes.Items), numberOfNodes)

// Return an error if there are less schedulable worker nodes than the desired number of nodes to add to the custom MCP
if len(workerNodes) < numberOfNodes {
return nil, fmt.Errorf("Schedulable nodes in Worker MCP %d < Number of nodes needed in %s MCP %d", len(workerNodes), customMCP, numberOfNodes)
}

// Label the nodes with the custom MCP role selector
var optedNodes []string
for node_i := 0; node_i < numberOfNodes; node_i++ {
err = oc.AsAdmin().Run("label").Args("node", nodes.Items[node_i].Name, fmt.Sprintf("node-role.kubernetes.io/%s=", customMCP)).Execute()
err = oc.AsAdmin().Run("label").Args("node", workerNodes[node_i].Name, fmt.Sprintf("node-role.kubernetes.io/%s=", customMCP)).Execute()
if err != nil {
return nil, err
}
optedNodes = append(optedNodes, nodes.Items[node_i].Name)
optedNodes = append(optedNodes, workerNodes[node_i].Name)
}
return optedNodes, nil
}
Expand Down
23 changes: 23 additions & 0 deletions test/extended/node/node_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/kubernetes"
kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1"
"k8s.io/kubernetes/test/e2e/framework"
e2enode "k8s.io/kubernetes/test/e2e/framework/node"

o "github.com/onsi/gomega"

Expand Down Expand Up @@ -656,3 +658,24 @@ func ensureDropInDirectoryExists(ctx context.Context, oc *exutil.CLI, dirPath st

return nil
}

// GetReadySchedulableWorkerNodes returns ready schedulable worker nodes.
// This function filters out nodes with NoSchedule/NoExecute taints and non-worker nodes,
// making it suitable for tests that need to select worker nodes for workload placement.
func GetReadySchedulableWorkerNodes(ctx context.Context, client kubernetes.Interface) ([]v1.Node, error) {
// Get ready schedulable nodes (excludes nodes with NoSchedule/NoExecute taints)
nodes, err := e2enode.GetReadySchedulableNodes(ctx, client)
if err != nil {
return nil, err
}

// Filter for worker nodes only
var workerNodes []v1.Node
for _, node := range nodes.Items {
if _, hasWorkerLabel := node.Labels["node-role.kubernetes.io/worker"]; hasWorkerLabel {
workerNodes = append(workerNodes, node)
}
}

return workerNodes, nil
}