run an integration test script against minikube
This commit is contained in:
parent
283848c594
commit
8bcdeed432
8
Makefile
8
Makefile
|
|
@ -21,10 +21,18 @@ test:
|
||||||
go test -v ${PKGS} -cover -race -p=1
|
go test -v ${PKGS} -cover -race -p=1
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
|
|
||||||
|
integration:
|
||||||
|
bash test/integration/run.sh
|
||||||
|
.PHONY: integration
|
||||||
|
|
||||||
cross:
|
cross:
|
||||||
gox -os '!freebsd !netbsd' -arch '!arm' -output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}" -ldflags '-X main.Version=${TAG}' ${TARGETS}
|
gox -os '!freebsd !netbsd' -arch '!arm' -output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}" -ldflags '-X main.Version=${TAG}' ${TARGETS}
|
||||||
.PHONY: cross
|
.PHONY: cross
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm dist/helmfile_*
|
||||||
|
.PHONY: clean
|
||||||
|
|
||||||
pristine: generate fmt
|
pristine: generate fmt
|
||||||
git ls-files --exclude-standard --modified --deleted --others | diff /dev/null -
|
git ls-files --exclude-standard --modified --deleted --others | diff /dev/null -
|
||||||
.PHONY: pristine
|
.PHONY: pristine
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Patterns to ignore when building packages.
|
||||||
|
# This supports shell glob matching, relative path matching, and
|
||||||
|
# negation (prefixed with !). Only one pattern per line.
|
||||||
|
.DS_Store
|
||||||
|
# Common VCS dirs
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.bzr/
|
||||||
|
.bzrignore
|
||||||
|
.hg/
|
||||||
|
.hgignore
|
||||||
|
.svn/
|
||||||
|
# Common backup files
|
||||||
|
*.swp
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*~
|
||||||
|
# Various IDEs
|
||||||
|
.project
|
||||||
|
.idea/
|
||||||
|
*.tmproj
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
apiVersion: v1
|
||||||
|
description: HTTP Request & Response Service, written in Python + Flask. https://httpbin.org
|
||||||
|
name: httpbin
|
||||||
|
version: 0.1.0
|
||||||
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
{{/* vim: set filetype=mustache: */}}
|
||||||
|
{{/*
|
||||||
|
Expand the name of the chart.
|
||||||
|
*/}}
|
||||||
|
{{- define "httpbin.name" -}}
|
||||||
|
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified app name.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
*/}}
|
||||||
|
{{- define "httpbin.fullname" -}}
|
||||||
|
{{- $name := default .Chart.Name .Values.nameOverride -}}
|
||||||
|
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
metadata:
|
||||||
|
name: {{ template "httpbin.fullname" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "httpbin.name" . }}
|
||||||
|
chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
strategy: {}
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: {{ template "httpbin.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: {{ .Chart.Name }}
|
||||||
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: {{ .Values.service.internalPort }}
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: {{ .Values.service.internalPort }}
|
||||||
|
ports:
|
||||||
|
- containerPort: {{ .Values.service.internalPort }}
|
||||||
|
resources:
|
||||||
|
{{ toYaml .Values.resources | indent 10 }}
|
||||||
|
|
||||||
|
status: {}
|
||||||
|
---
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
{{- if .Values.ingress.enabled -}}
|
||||||
|
{{- $serviceName := include "httpbin.fullname" . -}}
|
||||||
|
{{- $servicePort := .Values.service.externalPort -}}
|
||||||
|
{{- $prefix := .Values.ingress.prefix -}}
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: {{ template "httpbin.fullname" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "httpbin.name" . }}
|
||||||
|
chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
annotations:
|
||||||
|
{{- range $key, $value := .Values.ingress.annotations }}
|
||||||
|
{{ $key }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
{{- range $host := .Values.ingress.hosts }}
|
||||||
|
- host: {{ $host }}
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
backend:
|
||||||
|
serviceName: {{ $serviceName }}
|
||||||
|
servicePort: {{ $servicePort }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if .Values.ingress.tls }}
|
||||||
|
tls:
|
||||||
|
{{ toYaml .Values.ingress.tls | indent 4 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ template "httpbin.fullname" . }}
|
||||||
|
labels:
|
||||||
|
app: {{ template "httpbin.name" . }}
|
||||||
|
chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
heritage: {{ .Release.Service }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.service.type }}
|
||||||
|
ports:
|
||||||
|
- port: {{ .Values.service.externalPort }}
|
||||||
|
targetPort: {{ .Values.service.internalPort }}
|
||||||
|
protocol: TCP
|
||||||
|
name: {{ .Values.service.name }}
|
||||||
|
selector:
|
||||||
|
app: {{ template "httpbin.name" . }}
|
||||||
|
release: {{ .Release.Name }}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
image:
|
||||||
|
repository: docker.io/citizenstig/httpbin
|
||||||
|
tag: latest
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
service:
|
||||||
|
name: httpbin
|
||||||
|
type: LoadBalancer
|
||||||
|
externalPort: 8000
|
||||||
|
internalPort: 8000
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
hosts:
|
||||||
|
- httpbin.local
|
||||||
|
resources: {}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
repositories:
|
||||||
|
- name: stable
|
||||||
|
url: https://kubernetes-charts.storage.googleapis.com/
|
||||||
|
|
||||||
|
context: minikube
|
||||||
|
|
||||||
|
releases:
|
||||||
|
|
||||||
|
- name: httpbin
|
||||||
|
chart: ./charts/httpbin
|
||||||
|
set:
|
||||||
|
- name: ingress.enabled
|
||||||
|
value: false
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Check environment is correctly setup
|
||||||
|
|
||||||
|
if ! hash minikube 2>/dev/null; then
|
||||||
|
fail "Minikube needs to be installed."
|
||||||
|
fi
|
||||||
|
if [ ! $(minikube status --format '{{.MinikubeStatus}}') == "Running" ]; then
|
||||||
|
fail "Minikube is not running."
|
||||||
|
fi
|
||||||
|
if [ ! $(minikube status --format '{{.ClusterStatus}}') == "Running" ]; then
|
||||||
|
fail "Minikube Cluster is not running."
|
||||||
|
fi
|
||||||
|
if ! kubectl version --short 1> /dev/null; then
|
||||||
|
fail "Could not connect to minikube apiserver"
|
||||||
|
fi
|
||||||
|
if ! hash curl 1>/dev/null; then
|
||||||
|
fail "curl needs to be installed."
|
||||||
|
fi
|
||||||
|
if ! hash docker 1>/dev/null; then
|
||||||
|
fail "Docker needs to be installed."
|
||||||
|
fi
|
||||||
|
if ! docker version 1> /dev/null; then
|
||||||
|
fail "Could not connect to Docker daemon"
|
||||||
|
fi
|
||||||
|
if ! hash helm 1>/dev/null; then
|
||||||
|
fail "Helm needs to be installed."
|
||||||
|
fi
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
declare -i tests_total=0
|
||||||
|
|
||||||
|
function info () {
|
||||||
|
tput bold; tput setaf 4; echo -n "INFO: "; tput sgr0; echo "${@}"
|
||||||
|
}
|
||||||
|
function warn () {
|
||||||
|
tput bold; tput setaf 3; echo -n "WARN: "; tput sgr0; echo "${@}"
|
||||||
|
}
|
||||||
|
function fail () {
|
||||||
|
tput bold; tput setaf 1; echo -n "FAIL: "; tput sgr0; echo "${@}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
function test_start () {
|
||||||
|
tput bold; tput setaf 6; echo -n "TEST: "; tput sgr0; echo "${@}"
|
||||||
|
}
|
||||||
|
function test_pass () {
|
||||||
|
tests_total=$((tests_total+1))
|
||||||
|
tput bold; tput setaf 2; echo -n "PASS: "; tput sgr0; echo "${@}"
|
||||||
|
}
|
||||||
|
function all_tests_passed () {
|
||||||
|
tput bold; tput setaf 2; echo -n "PASS: "; tput sgr0; echo "${tests_total} tests passed"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# IMPORTS -----------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# determine working directory to use to relative paths irrespective of starting directory
|
||||||
|
dir="${BASH_SOURCE%/*}"
|
||||||
|
if [[ ! -d "${dir}" ]]; then dir="${PWD}"; fi
|
||||||
|
|
||||||
|
. "${dir}/lib/output.sh"
|
||||||
|
. "${dir}/lib/ensure.sh"
|
||||||
|
|
||||||
|
|
||||||
|
# GLOBALS -----------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_ns="helmfile-tests-$(date +"%Y%m%d-%H%M%S")"
|
||||||
|
helmfile="./helmfile --namespace=${test_ns}"
|
||||||
|
helm="helm --kube-context=minikube"
|
||||||
|
kubectl="kubectl --context=minikube --namespace=${test_ns}"
|
||||||
|
|
||||||
|
# FUNCTIONS ----------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
function wait_deploy_ready() {
|
||||||
|
$kubectl rollout status deployment ${1}
|
||||||
|
while [ "$($kubectl get deploy ${1} -o=jsonpath='{.status.readyReplicas}')" == "0" ]; do
|
||||||
|
info "Waiting for deployment ${1} to be ready"
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# RUN BUILD & SETUP --------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
set -e
|
||||||
|
$helm init 1> /dev/null
|
||||||
|
make build 1> /dev/null
|
||||||
|
$helmfile -v 1> /dev/null
|
||||||
|
$kubectl get namespace ${test_ns} &> /dev/null && warn "Namespace ${test_ns} exists, from a previous test run?"
|
||||||
|
trap "{ $kubectl delete namespace ${test_ns}; }" EXIT # remove namespace whenever we exit this script
|
||||||
|
|
||||||
|
info "Using namespace: ${test_ns}"
|
||||||
|
info "Using Helm version: $(helm version --short --client | grep -o v.*$)"
|
||||||
|
|
||||||
|
# TEST CASES----------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_start "happypath - simple rollout of httpbin chart"
|
||||||
|
$helmfile -f ${dir}/happypath.yaml sync
|
||||||
|
wait_deploy_ready httpbin-httpbin
|
||||||
|
curl --fail $(minikube service --url --namespace=${test_ns} httpbin-httpbin)/status/200 \
|
||||||
|
|| fail "httpbin failed to return 200 OK"
|
||||||
|
$helmfile -f ${dir}/happypath.yaml delete
|
||||||
|
$helm status --namespace=${test_ns} httpbin &> /dev/null \
|
||||||
|
&& fail "release should not exist anymore after a delete"
|
||||||
|
test_pass "happypath"
|
||||||
|
|
||||||
|
|
||||||
|
# ALL DONE -----------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
all_tests_passed
|
||||||
Loading…
Reference in New Issue