operational.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*
  2. Copyright © The ESO Authors
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. https://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package v2
  14. import (
  15. "context"
  16. "fmt"
  17. "time"
  18. appsv1 "k8s.io/api/apps/v1"
  19. corev1 "k8s.io/api/core/v1"
  20. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  21. "k8s.io/apimachinery/pkg/labels"
  22. "k8s.io/apimachinery/pkg/types"
  23. "k8s.io/client-go/util/retry"
  24. "sigs.k8s.io/controller-runtime/pkg/client"
  25. "github.com/external-secrets/external-secrets-e2e/framework"
  26. esv2alpha1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v2alpha1"
  27. . "github.com/onsi/gomega"
  28. )
  29. type BackendTarget struct {
  30. Namespace string
  31. DeploymentName string
  32. PodLabelSelector string
  33. }
  34. func ScaleDeploymentBySelector(f *framework.Framework, target BackendTarget, replicas int32) {
  35. deploymentName := target.DeploymentName
  36. if deploymentName == "" {
  37. deploymentName = findDeploymentNameBySelector(f, target)
  38. }
  39. scaleDeployment(f, target.Namespace, deploymentName, replicas)
  40. }
  41. func ScaleDeploymentBySelectorAndWait(f *framework.Framework, target BackendTarget, replicas int32, timeout time.Duration) {
  42. ScaleDeploymentBySelector(f, target, replicas)
  43. WaitForBackendTargetRunningReplicas(f, target, int(replicas), timeout)
  44. }
  45. func DeleteOneProviderPodBySelector(f *framework.Framework, target BackendTarget) {
  46. Expect(target.Namespace).NotTo(BeEmpty(), "backend target namespace must be set")
  47. Expect(target.PodLabelSelector).NotTo(BeEmpty(), "backend target pod label selector must be set")
  48. selector, err := labels.Parse(target.PodLabelSelector)
  49. Expect(err).NotTo(HaveOccurred())
  50. var podList corev1.PodList
  51. Expect(f.CRClient.List(context.Background(), &podList, &client.ListOptions{
  52. Namespace: target.Namespace,
  53. LabelSelector: selector,
  54. })).To(Succeed())
  55. foundRunningPod := false
  56. for i := range podList.Items {
  57. pod := &podList.Items[i]
  58. if pod.Status.Phase == corev1.PodRunning {
  59. foundRunningPod = true
  60. Expect(f.CRClient.Delete(context.Background(), pod)).To(Succeed())
  61. return
  62. }
  63. }
  64. Expect(foundRunningPod).To(BeTrue(), fmt.Sprintf("no running pod found for selector %s in namespace %s", target.PodLabelSelector, target.Namespace))
  65. }
  66. func findDeploymentNameBySelector(f *framework.Framework, target BackendTarget) string {
  67. Expect(target.Namespace).NotTo(BeEmpty(), "backend target namespace must be set")
  68. Expect(target.PodLabelSelector).NotTo(BeEmpty(), "backend target pod label selector must be set")
  69. selector, err := labels.Parse(target.PodLabelSelector)
  70. Expect(err).NotTo(HaveOccurred())
  71. var deploymentList appsv1.DeploymentList
  72. Expect(f.CRClient.List(context.Background(), &deploymentList, &client.ListOptions{
  73. Namespace: target.Namespace,
  74. })).To(Succeed())
  75. matches := make([]appsv1.Deployment, 0, len(deploymentList.Items))
  76. for _, deployment := range deploymentList.Items {
  77. if selector.Matches(labels.Set(deployment.Spec.Template.GetLabels())) {
  78. matches = append(matches, deployment)
  79. }
  80. }
  81. Expect(matches).NotTo(BeEmpty(), "no deployment found for selector %s", target.PodLabelSelector)
  82. Expect(matches).To(HaveLen(1), "expected one deployment for selector %s", target.PodLabelSelector)
  83. return matches[0].Name
  84. }
  85. func WaitForBackendTargetRunningReplicas(f *framework.Framework, target BackendTarget, expectedReplicas int, timeout time.Duration) {
  86. Expect(target.Namespace).NotTo(BeEmpty(), "backend target namespace must be set")
  87. Expect(target.PodLabelSelector).NotTo(BeEmpty(), "backend target pod label selector must be set")
  88. selector, err := labels.Parse(target.PodLabelSelector)
  89. Expect(err).NotTo(HaveOccurred())
  90. Eventually(func(g Gomega) {
  91. var podList corev1.PodList
  92. g.Expect(f.CRClient.List(context.Background(), &podList, &client.ListOptions{
  93. Namespace: target.Namespace,
  94. LabelSelector: selector,
  95. })).To(Succeed())
  96. running := 0
  97. for i := range podList.Items {
  98. if podList.Items[i].Status.Phase == corev1.PodRunning {
  99. running++
  100. }
  101. }
  102. g.Expect(running).To(Equal(expectedReplicas))
  103. }, timeout, time.Second).Should(Succeed())
  104. }
  105. func scaleDeployment(f *framework.Framework, namespace, name string, replicas int32) {
  106. Expect(namespace).NotTo(BeEmpty(), "deployment namespace must be set")
  107. Expect(name).NotTo(BeEmpty(), "deployment name must be set")
  108. Expect(retry.RetryOnConflict(retry.DefaultRetry, func() error {
  109. var deployment appsv1.Deployment
  110. if err := f.CRClient.Get(context.Background(), types.NamespacedName{Namespace: namespace, Name: name}, &deployment); err != nil {
  111. return err
  112. }
  113. deployment.Spec.Replicas = &replicas
  114. return f.CRClient.Update(context.Background(), &deployment)
  115. })).To(Succeed())
  116. }
  117. func WaitForClusterProviderNotReady(f *framework.Framework, name string, timeout time.Duration) *esv2alpha1.ClusterProviderStore {
  118. return WaitForClusterProviderCondition(f, name, metav1.ConditionFalse, timeout)
  119. }