Skip to content

Commit d12f998

Browse files
jpayne3506paulyufan2
authored andcommitted
ci: Improve TestValidateState calls from load package (#2484)
* ci: improve TestValidateState * chore: address comments
1 parent ea01ea8 commit d12f998

File tree

3 files changed

+72
-3
lines changed

3 files changed

+72
-3
lines changed

test/integration/load/load_test.go

+50-3
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,46 @@ func TestValidateState(t *testing.T) {
130130
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
131131
defer cancel()
132132

133+
if testConfig.ValidateStateFile {
134+
deployment := kubernetes.MustParseDeployment(noopDeploymentMap[testConfig.OSType])
135+
deploymentsClient := clientset.AppsV1().Deployments(namespace)
136+
137+
// Ensure pods exist on nodes to validate state files properly. Can obtain false positives without pods.
138+
nodes, err := kubernetes.GetNodeListByLabelSelector(ctx, clientset, "kubernetes.io/os="+testConfig.OSType)
139+
require.NoError(t, err)
140+
nodeCount := len(nodes.Items)
141+
replicas := int32(nodeCount) * 2
142+
143+
deploymentExists, err := kubernetes.DeploymentExists(ctx, deploymentsClient, deployment.Name)
144+
require.NoError(t, err)
145+
if !deploymentExists {
146+
t.Logf("Test deployment %s does not exist! Create %v pods in %s namespace", deployment.Name, replicas, namespace)
147+
// Create namespace if it doesn't exist
148+
namespaceExists, err := kubernetes.NamespaceExists(ctx, clientset, namespace)
149+
require.NoError(t, err)
150+
if !namespaceExists {
151+
kubernetes.MustCreateNamespace(ctx, clientset, namespace)
152+
}
153+
154+
kubernetes.MustCreateDeployment(ctx, deploymentsClient, deployment)
155+
kubernetes.MustScaleDeployment(ctx, deploymentsClient, deployment, clientset, namespace, podLabelSelector, int(replicas), false)
156+
} else {
157+
t.Log("Test deployment exists! Use existing setup")
158+
replicas, err = kubernetes.GetDeploymentAvailableReplicas(ctx, deploymentsClient, deployment.Name) // If test namespace exists then use existing Replicas
159+
if replicas != 0 && err != nil {
160+
require.NoError(t, err)
161+
}
162+
}
163+
if replicas < int32(nodeCount) {
164+
t.Logf("Warning - current replica count %v is below current %s node count of %d. Raising replicas to minimum required to ensure there is a pod on every node.", replicas, testConfig.OSType, nodeCount)
165+
replicas = int32(nodeCount * 2)
166+
kubernetes.MustScaleDeployment(ctx, deploymentsClient, deployment, clientset, namespace, podLabelSelector, int(replicas), false)
167+
}
168+
t.Log("Ensure deployment is in ready status")
169+
err = kubernetes.WaitForPodDeployment(ctx, clientset, namespace, deployment.Name, podLabelSelector, int(replicas))
170+
require.NoError(t, err)
171+
}
172+
133173
validator, err := validate.CreateValidator(ctx, clientset, config, namespace, testConfig.CNIType, testConfig.RestartCase, testConfig.OSType)
134174
require.NoError(t, err)
135175

@@ -182,10 +222,12 @@ func TestValidCNSStateDuringScaleAndCNSRestartToTriggerDropgzInstall(t *testing.
182222
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
183223
defer cancel()
184224

185-
validator, err := validate.CreateValidator(ctx, clientset, config, namespace, testConfig.CNIType, testConfig.RestartCase, testConfig.OSType)
186-
require.NoError(t, err)
225+
// Provide an option to validate state files with a proper environment before running test
226+
if testConfig.ValidateStateFile {
227+
t.Run("Validate state file", TestValidateState)
228+
}
187229

188-
err = validator.Validate(ctx)
230+
validator, err := validate.CreateValidator(ctx, clientset, config, namespace, testConfig.CNIType, testConfig.RestartCase, testConfig.OSType)
189231
require.NoError(t, err)
190232

191233
deployment := kubernetes.MustParseDeployment(noopDeploymentMap[testConfig.OSType])
@@ -238,6 +280,7 @@ func TestValidCNSStateDuringScaleAndCNSRestartToTriggerDropgzInstall(t *testing.
238280
kubernetes.MustDeleteDeployment(ctx, deploymentsClient, deployment)
239281
err = kubernetes.WaitForPodsDelete(ctx, clientset, namespace, podLabelSelector)
240282
require.NoError(t, err, "error waiting for pods to delete")
283+
validator.Cleanup(ctx)
241284
}
242285
}
243286

@@ -258,6 +301,10 @@ func TestV4OverlayProperties(t *testing.T) {
258301
t.Log("Validating v4Overlay node labels")
259302
err = validator.ValidateV4OverlayControlPlane(ctx)
260303
require.NoError(t, err)
304+
305+
if testConfig.Cleanup {
306+
validator.Cleanup(ctx)
307+
}
261308
}
262309

263310
func TestDualStackProperties(t *testing.T) {

test/internal/kubernetes/utils.go

+12
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,18 @@ func NamespaceExists(ctx context.Context, clientset *kubernetes.Clientset, names
418418
return true, nil
419419
}
420420

421+
func DeploymentExists(ctx context.Context, deploymentsClient typedappsv1.DeploymentInterface, deploymentName string) (bool, error) {
422+
_, err := deploymentsClient.Get(ctx, deploymentName, metav1.GetOptions{})
423+
if err != nil {
424+
if apierrors.IsNotFound(err) {
425+
return false, nil
426+
}
427+
return false, errors.Wrapf(err, "error in getting deployment %s", deploymentName)
428+
}
429+
430+
return true, nil
431+
}
432+
421433
// return a label selector
422434
func CreateLabelSelector(key string, selector *string) string {
423435
return fmt.Sprintf("%s=%s", key, *selector)

test/internal/kubernetes/utils_get.go

+10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
corev1 "k8s.io/api/core/v1"
88
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
99
"k8s.io/client-go/kubernetes"
10+
typedappsv1 "k8s.io/client-go/kubernetes/typed/apps/v1"
1011
)
1112

1213
func GetNodeList(ctx context.Context, clientset *kubernetes.Clientset) (*corev1.NodeList, error) {
@@ -51,3 +52,12 @@ func GetPodsIpsByNode(ctx context.Context, clientset *kubernetes.Clientset, name
5152
}
5253
return ips, nil
5354
}
55+
56+
func GetDeploymentAvailableReplicas(ctx context.Context, deploymentsClient typedappsv1.DeploymentInterface, deploymentName string) (int32, error) {
57+
deployment, err := deploymentsClient.Get(ctx, deploymentName, metav1.GetOptions{})
58+
if err != nil {
59+
return -1, errors.Wrapf(err, "could not get deployment %s", deploymentName)
60+
}
61+
62+
return deployment.Status.AvailableReplicas, nil
63+
}

0 commit comments

Comments
 (0)