install-eso-v2-e2e.sh 11 KB

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