install-eso-v2-e2e.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  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. v2:
  128. enabled: true
  129. crds:
  130. createProvider: true
  131. createClusterProvider: true
  132. image:
  133. repository: ghcr.io/external-secrets/external-secrets
  134. tag: latest
  135. pullPolicy: IfNotPresent
  136. certController:
  137. image:
  138. repository: ghcr.io/external-secrets/external-secrets
  139. tag: latest
  140. pullPolicy: IfNotPresent
  141. webhook:
  142. create: true
  143. image:
  144. repository: ghcr.io/external-secrets/external-secrets
  145. tag: latest
  146. pullPolicy: IfNotPresent
  147. # Provider defaults configuration
  148. providerDefaults:
  149. replicaCount: 1
  150. serviceAccount:
  151. create: true
  152. automount: true
  153. podSecurityContext:
  154. enabled: true
  155. runAsNonRoot: true
  156. runAsUser: 65532
  157. fsGroup: 65532
  158. seccompProfile:
  159. type: RuntimeDefault
  160. securityContext:
  161. enabled: true
  162. allowPrivilegeEscalation: false
  163. readOnlyRootFilesystem: true
  164. runAsNonRoot: true
  165. runAsUser: 65532
  166. capabilities:
  167. drop:
  168. - ALL
  169. service:
  170. type: ClusterIP
  171. port: 8080
  172. resources:
  173. limits:
  174. cpu: 200m
  175. memory: 256Mi
  176. requests:
  177. cpu: 50m
  178. memory: 64Mi
  179. tls:
  180. enabled: true
  181. # Enable provider deployments
  182. providers:
  183. enabled: true
  184. list:
  185. - name: kubernetes
  186. type: kubernetes
  187. enabled: true
  188. image:
  189. repository: ghcr.io/external-secrets/provider-kubernetes
  190. tag: latest
  191. pullPolicy: IfNotPresent
  192. - name: fake
  193. type: fake
  194. enabled: true
  195. image:
  196. repository: ghcr.io/external-secrets/provider-fake
  197. tag: latest
  198. pullPolicy: IfNotPresent
  199. - name: aws
  200. type: aws
  201. enabled: true
  202. image:
  203. repository: ghcr.io/external-secrets/provider-aws
  204. tag: latest
  205. pullPolicy: IfNotPresent
  206. extraEnv:
  207. - name: AWS_SECRET_ACCESS_KEY
  208. value: "${AWS_SECRET_ACCESS_KEY}"
  209. - name: AWS_ACCESS_KEY_ID
  210. value: "${AWS_ACCESS_KEY_ID}"
  211. - name: AWS_SESSION_TOKEN
  212. value: "${AWS_SESSION_TOKEN}"
  213. - name: AWS_REGION
  214. value: "eu-central-1"
  215. # Controller resources
  216. resources:
  217. limits:
  218. cpu: 200m
  219. memory: 256Mi
  220. requests:
  221. cpu: 50m
  222. memory: 64Mi
  223. EOF
  224. log_info "Installing with monolithic Helm chart"
  225. helm upgrade --install external-secrets "$CHARTS_DIR/external-secrets" \
  226. --create-namespace \
  227. --namespace "$NAMESPACE" \
  228. --values "$values_file" \
  229. --wait \
  230. --timeout 5m
  231. # Cleanup temporary file
  232. rm -f "$values_file"
  233. log_info "External Secrets with Kubernetes provider installed"
  234. kubectl -n "$NAMESPACE" delete po -l app.kubernetes.io/instance=external-secrets
  235. }
  236. # Verify installation
  237. verify_installation() {
  238. log_info "Verifying installation"
  239. # Check controller pod
  240. log_info "Waiting for controller pod to be ready"
  241. if ! kubectl wait --for=condition=ready pod \
  242. -l app.kubernetes.io/name=external-secrets \
  243. -n "$NAMESPACE" \
  244. --timeout=300s; then
  245. log_error "Controller pod not ready"
  246. kubectl get pods -n "$NAMESPACE"
  247. kubectl describe pods -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets
  248. kubectl logs -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets --tail=50
  249. exit 1
  250. fi
  251. # Check Kubernetes provider pod
  252. log_info "Waiting for Kubernetes provider pod to be ready"
  253. if ! kubectl wait --for=condition=ready pod \
  254. -l "app.kubernetes.io/name=external-secrets-provider-kubernetes" \
  255. -n "$NAMESPACE" \
  256. --timeout=300s; then
  257. log_error "Kubernetes provider pod not ready"
  258. kubectl get pods -n "$NAMESPACE"
  259. kubectl describe pods -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets-provider-kubernetes
  260. kubectl logs -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets-provider-kubernetes --tail=50
  261. exit 1
  262. fi
  263. # Check Fake provider pod
  264. log_info "Waiting for Fake provider pod to be ready"
  265. if ! kubectl wait --for=condition=ready pod \
  266. -l "app.kubernetes.io/name=external-secrets-provider-fake" \
  267. -n "$NAMESPACE" \
  268. --timeout=300s; then
  269. log_error "Fake provider pod not ready"
  270. kubectl get pods -n "$NAMESPACE"
  271. kubectl describe pods -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets-provider-fake
  272. kubectl logs -n "$NAMESPACE" -l app.kubernetes.io/name=external-secrets-provider-fake --tail=50
  273. exit 1
  274. fi
  275. # Check cert controller pod
  276. log_info "Waiting for cert controller pod to be ready"
  277. if ! kubectl wait --for=condition=ready pod \
  278. -l app.kubernetes.io/name=external-secrets-cert-controller \
  279. -n "$NAMESPACE" \
  280. --timeout=300s; then
  281. log_warning "Cert controller pod not ready (may not be critical for testing)"
  282. fi
  283. log_info "All pods are ready"
  284. kubectl get pods -n "$NAMESPACE"
  285. # Show services
  286. log_info "Services:"
  287. kubectl get svc -n "$NAMESPACE"
  288. }
  289. # Main installation flow
  290. main() {
  291. log_info "Installing External Secrets Operator V2 for E2E testing"
  292. log_info "Using monolithic Helm chart with Kubernetes provider"
  293. check_prerequisites
  294. load_images_to_kind
  295. install_external_secrets
  296. verify_installation
  297. log_info "Installation complete!"
  298. log_info ""
  299. log_info "Deployment summary:"
  300. log_info " - Controller: external-secrets"
  301. log_info " - Provider: kubernetes (integrated)"
  302. log_info " - Namespace: $NAMESPACE"
  303. log_info ""
  304. log_info "Next steps:"
  305. log_info " 1. Run E2E tests: make test.e2e.v2"
  306. log_info " 2. View controller logs: kubectl logs -n $NAMESPACE -l app.kubernetes.io/name=external-secrets -f"
  307. log_info " 3. View provider logs: kubectl logs -n $NAMESPACE -l app.kubernetes.io/component=provider -f"
  308. log_info " 4. Cleanup: ./hack/uninstall-eso-v2-e2e.sh"
  309. }
  310. main "$@"