install-eso-v2-e2e.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. #!/bin/bash
  2. #
  3. # Install External Secrets Operator V2 for E2E testing
  4. # This script deploys the controller and Kubernetes provider using the monolithic Helm chart
  5. #
  6. # Prerequisites:
  7. # - kubectl and helm installed
  8. # - Access to a Kubernetes cluster (kind recommended for local testing)
  9. # - Docker images built and available:
  10. # * ghcr.io/external-secrets/external-secrets:latest
  11. # * ghcr.io/external-secrets/provider-kubernetes:latest
  12. #
  13. # For kind clusters, images will be automatically loaded if available locally.
  14. #
  15. # Build images before running (if not already built):
  16. # make docker.build VERSION=latest
  17. # # This builds:
  18. # # - Controller: ghcr.io/external-secrets/external-secrets:latest
  19. # # - Kubernetes Provider: ghcr.io/external-secrets/provider-kubernetes:latest
  20. # # - AWS Provider: ghcr.io/external-secrets/provider-aws:latest
  21. #
  22. set -e
  23. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  24. ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
  25. CHARTS_DIR="$ROOT_DIR/deploy/charts"
  26. NAMESPACE="external-secrets-system"
  27. # Colors
  28. GREEN='\033[0;32m'
  29. RED='\033[0;31m'
  30. YELLOW='\033[1;33m'
  31. NC='\033[0m' # No Color
  32. log_info() {
  33. echo -e "${GREEN}[INFO]${NC} $1"
  34. }
  35. log_error() {
  36. echo -e "${RED}[ERROR]${NC} $1"
  37. }
  38. log_warning() {
  39. echo -e "${YELLOW}[WARN]${NC} $1"
  40. }
  41. # Check prerequisites
  42. check_prerequisites() {
  43. log_info "Checking prerequisites"
  44. if ! command -v kubectl &> /dev/null; then
  45. log_error "kubectl not found"
  46. exit 1
  47. fi
  48. if ! command -v helm &> /dev/null; then
  49. log_error "helm not found"
  50. exit 1
  51. fi
  52. if ! kubectl cluster-info &> /dev/null; then
  53. log_error "Cannot connect to Kubernetes cluster"
  54. exit 1
  55. fi
  56. log_info "Prerequisites check passed"
  57. }
  58. # Detect if running in kind cluster
  59. is_kind_cluster() {
  60. kubectl config current-context | grep -q "kind-"
  61. }
  62. # Get kind cluster name from context
  63. get_kind_cluster_name() {
  64. kubectl config current-context | sed 's/kind-//'
  65. }
  66. # Load Docker images into kind cluster
  67. load_images_to_kind() {
  68. if ! is_kind_cluster; then
  69. log_info "Not a kind cluster, skipping image loading"
  70. return 0
  71. fi
  72. if ! command -v kind &> /dev/null; then
  73. log_warning "kind CLI not found, cannot load images"
  74. log_warning "Please ensure images are available in the cluster"
  75. return 0
  76. fi
  77. local cluster_name
  78. cluster_name=$(get_kind_cluster_name)
  79. log_info "Detected kind cluster: $cluster_name"
  80. log_info "Loading Docker images into kind cluster"
  81. # Controller image
  82. local controller_image="ghcr.io/external-secrets/external-secrets:latest"
  83. if docker image inspect "$controller_image" &> /dev/null; then
  84. log_info "Loading controller image: $controller_image"
  85. kind load docker-image "$controller_image" --name "$cluster_name"
  86. else
  87. log_warning "Controller image not found locally: $controller_image"
  88. log_warning "Attempting to pull from registry (may fail if not published)"
  89. fi
  90. # Provider images
  91. local kubernetes_provider_image="ghcr.io/external-secrets/provider-kubernetes:latest"
  92. if docker image inspect "$kubernetes_provider_image" &> /dev/null; then
  93. log_info "Loading provider image: $kubernetes_provider_image"
  94. kind load docker-image "$kubernetes_provider_image" --name "$cluster_name"
  95. else
  96. log_warning "Provider image not found locally: $kubernetes_provider_image"
  97. log_warning "Attempting to pull from registry (may fail if not published)"
  98. fi
  99. local fake_provider_image="ghcr.io/external-secrets/provider-fake:latest"
  100. if docker image inspect "$fake_provider_image" &> /dev/null; then
  101. log_info "Loading provider image: $fake_provider_image"
  102. kind load docker-image "$fake_provider_image" --name "$cluster_name"
  103. else
  104. log_warning "Fake provider image not found locally: $fake_provider_image"
  105. log_warning "Attempting to pull from registry (may fail if not published)"
  106. fi
  107. local aws_provider_image="ghcr.io/external-secrets/provider-aws:latest"
  108. if docker image inspect "$aws_provider_image" &> /dev/null; then
  109. log_info "Loading provider image: $aws_provider_image"
  110. kind load docker-image "$aws_provider_image" --name "$cluster_name"
  111. else
  112. log_warning "aws provider image not found locally: $aws_provider_image"
  113. log_warning "Attempting to pull from registry (may fail if not published)"
  114. fi
  115. log_info "Image loading complete"
  116. }
  117. # Install External Secrets with Kubernetes provider using monolithic chart
  118. install_external_secrets() {
  119. log_info "Installing External Secrets V2 with Kubernetes provider"
  120. # Create a temporary values file for the installation
  121. local values_file
  122. values_file=$(mktemp)
  123. cat > "$values_file" <<EOF
  124. # Controller configuration
  125. installCRDs: true
  126. replicaCount: 1
  127. image:
  128. repository: ghcr.io/external-secrets/external-secrets
  129. tag: latest
  130. pullPolicy: IfNotPresent
  131. certController:
  132. image:
  133. repository: ghcr.io/external-secrets/external-secrets
  134. tag: latest
  135. pullPolicy: IfNotPresent
  136. webhook:
  137. create: true
  138. image:
  139. repository: ghcr.io/external-secrets/external-secrets
  140. tag: latest
  141. pullPolicy: IfNotPresent
  142. # Provider defaults configuration
  143. providerDefaults:
  144. replicaCount: 1
  145. serviceAccount:
  146. create: true
  147. automount: true
  148. podSecurityContext:
  149. enabled: true
  150. runAsNonRoot: true
  151. runAsUser: 65532
  152. fsGroup: 65532
  153. seccompProfile:
  154. type: RuntimeDefault
  155. securityContext:
  156. enabled: true
  157. allowPrivilegeEscalation: false
  158. readOnlyRootFilesystem: true
  159. runAsNonRoot: true
  160. runAsUser: 65532
  161. capabilities:
  162. drop:
  163. - ALL
  164. service:
  165. type: ClusterIP
  166. port: 8080
  167. resources:
  168. limits:
  169. cpu: 200m
  170. memory: 256Mi
  171. requests:
  172. cpu: 50m
  173. memory: 64Mi
  174. tls:
  175. enabled: true
  176. # Enable provider deployments
  177. providers:
  178. enabled: true
  179. list:
  180. - name: kubernetes
  181. type: kubernetes
  182. enabled: true
  183. image:
  184. repository: ghcr.io/external-secrets/provider-kubernetes
  185. tag: latest
  186. pullPolicy: IfNotPresent
  187. - name: fake
  188. type: fake
  189. enabled: true
  190. image:
  191. repository: ghcr.io/external-secrets/provider-fake
  192. tag: latest
  193. pullPolicy: IfNotPresent
  194. - name: aws
  195. type: aws
  196. enabled: true
  197. image:
  198. repository: ghcr.io/external-secrets/provider-aws
  199. tag: latest
  200. pullPolicy: IfNotPresent
  201. extraEnv:
  202. - name: AWS_SECRET_ACCESS_KEY
  203. value: "${AWS_SECRET_ACCESS_KEY}"
  204. - name: AWS_ACCESS_KEY_ID
  205. value: "${AWS_ACCESS_KEY_ID}"
  206. - name: AWS_SESSION_TOKEN
  207. value: "${AWS_SESSION_TOKEN}"
  208. - name: AWS_REGION
  209. value: "eu-central-1"
  210. # Controller resources
  211. resources:
  212. limits:
  213. cpu: 200m
  214. memory: 256Mi
  215. requests:
  216. cpu: 50m
  217. memory: 64Mi
  218. EOF
  219. log_info "Installing with monolithic Helm chart"
  220. helm upgrade --install external-secrets "$CHARTS_DIR/external-secrets" \
  221. --create-namespace \
  222. --namespace "$NAMESPACE" \
  223. --values "$values_file" \
  224. --wait \
  225. --timeout 5m
  226. # Cleanup temporary file
  227. rm -f "$values_file"
  228. log_info "External Secrets with Kubernetes provider installed"
  229. kubectl -n "$NAMESPACE" delete po -l app.kubernetes.io/instance=external-secrets
  230. }
  231. # Verify installation
  232. verify_installation() {
  233. log_info "Verifying installation"
  234. # Check controller pod
  235. log_info "Waiting for controller pod to be ready"
  236. if ! kubectl wait --for=condition=ready pod \
  237. -l app.kubernetes.io/name=external-secrets \
  238. -n "$NAMESPACE" \
  239. --timeout=300s; then
  240. log_error "Controller pod not ready"
  241. kubectl get pods -n "$NAMESPACE"
  242. kubectl describe pods -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets
  243. kubectl logs -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets --tail=50
  244. exit 1
  245. fi
  246. # Check Kubernetes provider pod
  247. log_info "Waiting for Kubernetes provider pod to be ready"
  248. if ! kubectl wait --for=condition=ready pod \
  249. -l "app.kubernetes.io/name=external-secrets-provider-kubernetes" \
  250. -n "$NAMESPACE" \
  251. --timeout=300s; then
  252. log_error "Kubernetes provider pod not ready"
  253. kubectl get pods -n "$NAMESPACE"
  254. kubectl describe pods -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets-provider-kubernetes
  255. kubectl logs -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets-provider-kubernetes --tail=50
  256. exit 1
  257. fi
  258. # Check Fake provider pod
  259. log_info "Waiting for Fake provider pod to be ready"
  260. if ! kubectl wait --for=condition=ready pod \
  261. -l "app.kubernetes.io/name=external-secrets-provider-fake" \
  262. -n "$NAMESPACE" \
  263. --timeout=300s; then
  264. log_error "Fake provider pod not ready"
  265. kubectl get pods -n "$NAMESPACE"
  266. kubectl describe pods -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets-provider-fake
  267. kubectl logs -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets-provider-fake --tail=50
  268. exit 1
  269. fi
  270. # Check cert controller pod
  271. log_info "Waiting for cert controller pod to be ready"
  272. if ! kubectl wait --for=condition=ready pod \
  273. -l app.kubernetes.io/name=external-secrets-cert-controller \
  274. -n "$NAMESPACE" \
  275. --timeout=300s; then
  276. log_warning "Cert controller pod not ready (may not be critical for testing)"
  277. fi
  278. log_info "All pods are ready"
  279. kubectl get pods -n "$NAMESPACE"
  280. # Show services
  281. log_info "Services:"
  282. kubectl get svc -n "$NAMESPACE"
  283. }
  284. # Main installation flow
  285. main() {
  286. log_info "Installing External Secrets Operator V2 for E2E testing"
  287. log_info "Using monolithic Helm chart with Kubernetes provider"
  288. check_prerequisites
  289. load_images_to_kind
  290. install_external_secrets
  291. verify_installation
  292. log_info "Installation complete!"
  293. log_info ""
  294. log_info "Deployment summary:"
  295. log_info " - Controller: external-secrets"
  296. log_info " - Provider: kubernetes (integrated)"
  297. log_info " - Namespace: $NAMESPACE"
  298. log_info ""
  299. log_info "Next steps:"
  300. log_info " 1. Run E2E tests: make test.e2e.v2"
  301. log_info " 2. View controller logs: kubectl logs -n $NAMESPACE -l app.kubernetes.io/name=external-secrets -f"
  302. log_info " 3. View provider logs: kubectl logs -n $NAMESPACE -l app.kubernetes.io/component=provider -f"
  303. log_info " 4. Cleanup: ./hack/uninstall-eso-v2-e2e.sh"
  304. }
  305. main "$@"