operational.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. "k8s.io/apimachinery/pkg/labels"
  21. "k8s.io/apimachinery/pkg/types"
  22. "k8s.io/client-go/util/retry"
  23. "sigs.k8s.io/controller-runtime/pkg/client"
  24. "github.com/external-secrets/external-secrets-e2e/framework"
  25. . "github.com/onsi/gomega"
  26. )
  27. type BackendTarget struct {
  28. Namespace string
  29. DeploymentName string
  30. PodLabelSelector string
  31. }
  32. func ScaleDeploymentBySelector(f *framework.Framework, target BackendTarget, replicas int32) {
  33. deploymentName := target.DeploymentName
  34. if deploymentName == "" {
  35. deploymentName = findDeploymentNameBySelector(f, target)
  36. }
  37. scaleDeployment(f, target.Namespace, deploymentName, replicas)
  38. }
  39. func ScaleDeploymentBySelectorAndWait(f *framework.Framework, target BackendTarget, replicas int32, timeout time.Duration) {
  40. ScaleDeploymentBySelector(f, target, replicas)
  41. WaitForBackendTargetRunningReplicas(f, target, int(replicas), timeout)
  42. }
  43. func DeleteOneProviderPodBySelector(f *framework.Framework, target BackendTarget) {
  44. Expect(target.Namespace).NotTo(BeEmpty(), "backend target namespace must be set")
  45. Expect(target.PodLabelSelector).NotTo(BeEmpty(), "backend target pod label selector must be set")
  46. selector, err := labels.Parse(target.PodLabelSelector)
  47. Expect(err).NotTo(HaveOccurred())
  48. var podList corev1.PodList
  49. Expect(f.CRClient.List(context.Background(), &podList, &client.ListOptions{
  50. Namespace: target.Namespace,
  51. LabelSelector: selector,
  52. })).To(Succeed())
  53. foundRunningPod := false
  54. for i := range podList.Items {
  55. pod := &podList.Items[i]
  56. if pod.Status.Phase == corev1.PodRunning {
  57. foundRunningPod = true
  58. Expect(f.CRClient.Delete(context.Background(), pod)).To(Succeed())
  59. return
  60. }
  61. }
  62. Expect(foundRunningPod).To(BeTrue(), fmt.Sprintf("no running pod found for selector %s in namespace %s", target.PodLabelSelector, target.Namespace))
  63. }
  64. func findDeploymentNameBySelector(f *framework.Framework, target BackendTarget) string {
  65. Expect(target.Namespace).NotTo(BeEmpty(), "backend target namespace must be set")
  66. Expect(target.PodLabelSelector).NotTo(BeEmpty(), "backend target pod label selector must be set")
  67. selector, err := labels.Parse(target.PodLabelSelector)
  68. Expect(err).NotTo(HaveOccurred())
  69. var deploymentList appsv1.DeploymentList
  70. Expect(f.CRClient.List(context.Background(), &deploymentList, &client.ListOptions{
  71. Namespace: target.Namespace,
  72. })).To(Succeed())
  73. matches := make([]appsv1.Deployment, 0, len(deploymentList.Items))
  74. for _, deployment := range deploymentList.Items {
  75. if selector.Matches(labels.Set(deployment.Spec.Template.GetLabels())) {
  76. matches = append(matches, deployment)
  77. }
  78. }
  79. Expect(matches).NotTo(BeEmpty(), "no deployment found for selector %s", target.PodLabelSelector)
  80. Expect(matches).To(HaveLen(1), "expected one deployment for selector %s", target.PodLabelSelector)
  81. return matches[0].Name
  82. }
  83. func WaitForBackendTargetRunningReplicas(f *framework.Framework, target BackendTarget, expectedReplicas int, timeout time.Duration) {
  84. Expect(target.Namespace).NotTo(BeEmpty(), "backend target namespace must be set")
  85. Expect(target.PodLabelSelector).NotTo(BeEmpty(), "backend target pod label selector must be set")
  86. selector, err := labels.Parse(target.PodLabelSelector)
  87. Expect(err).NotTo(HaveOccurred())
  88. Eventually(func(g Gomega) {
  89. var podList corev1.PodList
  90. g.Expect(f.CRClient.List(context.Background(), &podList, &client.ListOptions{
  91. Namespace: target.Namespace,
  92. LabelSelector: selector,
  93. })).To(Succeed())
  94. running := 0
  95. for i := range podList.Items {
  96. if podList.Items[i].Status.Phase == corev1.PodRunning {
  97. running++
  98. }
  99. }
  100. g.Expect(running).To(Equal(expectedReplicas))
  101. }, timeout, time.Second).Should(Succeed())
  102. }
  103. func scaleDeployment(f *framework.Framework, namespace, name string, replicas int32) {
  104. Expect(namespace).NotTo(BeEmpty(), "deployment namespace must be set")
  105. Expect(name).NotTo(BeEmpty(), "deployment name must be set")
  106. Expect(retry.RetryOnConflict(retry.DefaultRetry, func() error {
  107. var deployment appsv1.Deployment
  108. if err := f.CRClient.Get(context.Background(), types.NamespacedName{Namespace: namespace, Name: name}, &deployment); err != nil {
  109. return err
  110. }
  111. deployment.Spec.Replicas = &replicas
  112. return f.CRClient.Update(context.Background(), &deployment)
  113. })).To(Succeed())
  114. }