e2e: retry kubectl commands in case deploying Vault fails

Sometimes it happens that the deployment of Hashicorp Vault fails.
Deployment is one of the 1st steps that are done when starting the e2e
suite, and the Kubernetes cluster may still be a little overloaded while
it is settling down. It should be possible to retry and succeed after a
while.

Fixes: #2288
Signed-off-by: Niels de Vos <ndevos@redhat.com>
This commit is contained in:
Niels de Vos 2021-07-16 15:40:48 +02:00 committed by mergify[bot]
parent d5ea89e603
commit 841a53bc3d

View File

@ -35,7 +35,7 @@ func deployVault(c kubernetes.Interface, deployTimeout int) {
"--ignore-not-found=true") "--ignore-not-found=true")
Expect(err).Should(BeNil()) Expect(err).Should(BeNil())
createORDeleteVault("create") createORDeleteVault(kubectlCreate)
opt := metav1.ListOptions{ opt := metav1.ListOptions{
LabelSelector: "app=vault", LabelSelector: "app=vault",
} }
@ -49,10 +49,10 @@ func deployVault(c kubernetes.Interface, deployTimeout int) {
} }
func deleteVault() { func deleteVault() {
createORDeleteVault("delete") createORDeleteVault(kubectlDelete)
} }
func createORDeleteVault(action string) { func createORDeleteVault(action kubectlAction) {
data, err := replaceNamespaceInTemplate(vaultExamplePath + vaultServicePath) data, err := replaceNamespaceInTemplate(vaultExamplePath + vaultServicePath)
if err != nil { if err != nil {
e2elog.Failf("failed to read content from %s %v", vaultExamplePath+vaultServicePath, err) e2elog.Failf("failed to read content from %s %v", vaultExamplePath+vaultServicePath, err)
@ -61,7 +61,7 @@ func createORDeleteVault(action string) {
data = strings.ReplaceAll(data, "vault.default", "vault."+cephCSINamespace) data = strings.ReplaceAll(data, "vault.default", "vault."+cephCSINamespace)
data = strings.ReplaceAll(data, "value: default", "value: "+cephCSINamespace) data = strings.ReplaceAll(data, "value: default", "value: "+cephCSINamespace)
_, err = framework.RunKubectlInput(cephCSINamespace, data, action, ns, "-f", "-") err = retryKubectlInput(cephCSINamespace, action, data, deployTimeout)
if err != nil { if err != nil {
e2elog.Failf("failed to %s vault statefulset %v", action, err) e2elog.Failf("failed to %s vault statefulset %v", action, err)
} }
@ -70,7 +70,7 @@ func createORDeleteVault(action string) {
if err != nil { if err != nil {
e2elog.Failf("failed to read content from %s %v", vaultExamplePath+vaultRBACPath, err) e2elog.Failf("failed to read content from %s %v", vaultExamplePath+vaultRBACPath, err)
} }
_, err = framework.RunKubectlInput(cephCSINamespace, data, action, ns, "-f", "-") err = retryKubectlInput(cephCSINamespace, action, data, deployTimeout)
if err != nil { if err != nil {
e2elog.Failf("failed to %s vault statefulset %v", action, err) e2elog.Failf("failed to %s vault statefulset %v", action, err)
} }
@ -80,7 +80,7 @@ func createORDeleteVault(action string) {
e2elog.Failf("failed to read content from %s %v", vaultExamplePath+vaultConfigPath, err) e2elog.Failf("failed to read content from %s %v", vaultExamplePath+vaultConfigPath, err)
} }
data = strings.ReplaceAll(data, "default", cephCSINamespace) data = strings.ReplaceAll(data, "default", cephCSINamespace)
_, err = framework.RunKubectlInput(cephCSINamespace, data, action, ns, "-f", "-") err = retryKubectlInput(cephCSINamespace, action, data, deployTimeout)
if err != nil { if err != nil {
e2elog.Failf("failed to %s vault configmap %v", action, err) e2elog.Failf("failed to %s vault configmap %v", action, err)
} }
@ -89,7 +89,7 @@ func createORDeleteVault(action string) {
if err != nil { if err != nil {
e2elog.Failf("failed to read content from %s %v", vaultExamplePath+vaultPSPPath, err) e2elog.Failf("failed to read content from %s %v", vaultExamplePath+vaultPSPPath, err)
} }
_, err = framework.RunKubectlInput(cephCSINamespace, data, action, ns, "-f", "-") err = retryKubectlInput(cephCSINamespace, action, data, deployTimeout)
if err != nil { if err != nil {
e2elog.Failf("failed to %s vault psp %v", action, err) e2elog.Failf("failed to %s vault psp %v", action, err)
} }
@ -99,7 +99,7 @@ func createORDeleteVault(action string) {
// the ServiceAccount for the tenant and configured Hashicorp Vault with a // the ServiceAccount for the tenant and configured Hashicorp Vault with a
// kv-store that the ServiceAccount has access to. // kv-store that the ServiceAccount has access to.
func createTenantServiceAccount(c kubernetes.Interface, ns string) error { func createTenantServiceAccount(c kubernetes.Interface, ns string) error {
err := createORDeleteTenantServiceAccount("create", ns) err := createORDeleteTenantServiceAccount(kubectlCreate, ns)
if err != nil { if err != nil {
return fmt.Errorf("failed to create ServiceAccount: %w", err) return fmt.Errorf("failed to create ServiceAccount: %w", err)
} }
@ -117,15 +117,15 @@ func createTenantServiceAccount(c kubernetes.Interface, ns string) error {
// deleteTenantServiceAccount removed the ServiceAccount and other objects that // deleteTenantServiceAccount removed the ServiceAccount and other objects that
// were created with createTenantServiceAccount. // were created with createTenantServiceAccount.
func deleteTenantServiceAccount(ns string) { func deleteTenantServiceAccount(ns string) {
err := createORDeleteTenantServiceAccount("delete", ns) err := createORDeleteTenantServiceAccount(kubectlDelete, ns)
Expect(err).Should(BeNil()) Expect(err).Should(BeNil())
} }
// createORDeleteTenantServiceAccount is a helper that reads the tenant-sa.yaml // createORDeleteTenantServiceAccount is a helper that reads the tenant-sa.yaml
// example file and replaces the default namespaces with the current deployment // example file and replaces the default namespaces with the current deployment
// configuration. // configuration.
func createORDeleteTenantServiceAccount(action, ns string) error { func createORDeleteTenantServiceAccount(action kubectlAction, ns string) error {
_, err := framework.RunKubectl(ns, action, "-f", vaultExamplePath+vaultTenantPath) err := retryKubectlFile(ns, action, vaultExamplePath+vaultTenantPath, deployTimeout)
if err != nil { if err != nil {
return fmt.Errorf("failed to %s tenant ServiceAccount: %w", action, err) return fmt.Errorf("failed to %s tenant ServiceAccount: %w", action, err)
} }
@ -142,7 +142,7 @@ func createORDeleteTenantServiceAccount(action, ns string) error {
// replace "default" in the URL to the Vault service // replace "default" in the URL to the Vault service
data = strings.ReplaceAll(data, "vault.default", "vault."+cephCSINamespace) data = strings.ReplaceAll(data, "vault.default", "vault."+cephCSINamespace)
_, err = framework.RunKubectlInput(cephCSINamespace, data, action, "-f", "-") err = retryKubectlInput(cephCSINamespace, action, data, deployTimeout)
if err != nil { if err != nil {
return fmt.Errorf("failed to %s ServiceAccount: %w", action, err) return fmt.Errorf("failed to %s ServiceAccount: %w", action, err)
} }