Merge pull request #491 from fission/ciImprovements

CI modifications
This commit is contained in:
smruthi2187
2018-02-09 19:00:19 -08:00
committed by GitHub
26 changed files with 442 additions and 169 deletions
+5
View File
@@ -2,6 +2,10 @@ sudo: required
dist: trusty dist: trusty
branches:
only:
- master
language: go language: go
go: go:
@@ -18,6 +22,7 @@ services:
before_install: before_install:
- sudo apt-get update - sudo apt-get update
- sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce
- sudo sysctl net.ipv6.conf.all.disable_ipv6=0
install: install:
- go get github.com/Masterminds/glide - go get github.com/Masterminds/glide
@@ -129,6 +129,19 @@ spec:
imagePullPolicy: {{ .Values.pullPolicy }} imagePullPolicy: {{ .Values.pullPolicy }}
command: ["/fission-bundle"] command: ["/fission-bundle"]
args: ["--controllerPort", "8888"] args: ["--controllerPort", "8888"]
readinessProbe:
httpGet:
path: "/healthz"
port: 8888
initialDelaySeconds: 1
periodSeconds: 1
failureThreshold: 30
livenessProbe:
httpGet:
path: "/healthz"
port: 8888
initialDelaySeconds: 35
periodSeconds: 5
serviceAccount: fission-svc serviceAccount: fission-svc
--- ---
@@ -151,6 +164,19 @@ spec:
imagePullPolicy: {{ .Values.pullPolicy }} imagePullPolicy: {{ .Values.pullPolicy }}
command: ["/fission-bundle"] command: ["/fission-bundle"]
args: ["--routerPort", "8888", "--executorUrl", "http://executor.{{ .Release.Namespace }}"] args: ["--routerPort", "8888", "--executorUrl", "http://executor.{{ .Release.Namespace }}"]
readinessProbe:
httpGet:
path: "/router-healthz"
port: 8888
initialDelaySeconds: 1
periodSeconds: 1
failureThreshold: 30
livenessProbe:
httpGet:
path: "/router-healthz"
port: 8888
initialDelaySeconds: 35
periodSeconds: 5
serviceAccount: fission-svc serviceAccount: fission-svc
--- ---
@@ -196,6 +222,19 @@ spec:
value: "{{ .Values.pullPolicy }}" value: "{{ .Values.pullPolicy }}"
- name: RUNTIME_IMAGE_PULL_POLICY - name: RUNTIME_IMAGE_PULL_POLICY
value: "{{ .Values.pullPolicy }}" value: "{{ .Values.pullPolicy }}"
readinessProbe:
httpGet:
path: "/healthz"
port: 8888
initialDelaySeconds: 1
periodSeconds: 1
failureThreshold: 30
livenessProbe:
httpGet:
path: "/healthz"
port: 8888
initialDelaySeconds: 35
periodSeconds: 5
serviceAccount: fission-svc serviceAccount: fission-svc
--- ---
@@ -535,6 +574,19 @@ spec:
volumeMounts: volumeMounts:
- name: fission-storage - name: fission-storage
mountPath: /fission mountPath: /fission
readinessProbe:
httpGet:
path: "/healthz"
port: 8000
initialDelaySeconds: 1
periodSeconds: 1
failureThreshold: 30
livenessProbe:
httpGet:
path: "/healthz"
port: 8000
initialDelaySeconds: 35
periodSeconds: 5
serviceAccount: fission-svc serviceAccount: fission-svc
volumes: volumes:
- name: fission-storage - name: fission-storage
@@ -129,6 +129,19 @@ spec:
imagePullPolicy: {{ .Values.pullPolicy }} imagePullPolicy: {{ .Values.pullPolicy }}
command: ["/fission-bundle"] command: ["/fission-bundle"]
args: ["--controllerPort", "8888"] args: ["--controllerPort", "8888"]
readinessProbe:
httpGet:
path: "/healthz"
port: "8888"
initialDelaySeconds: 1
periodSeconds: 1
failureThreshold: 30
livenessProbe:
httpGet:
path: "/healthz"
port: "8888"
initialDelaySeconds: 35
periodSeconds: 5
serviceAccount: fission-svc serviceAccount: fission-svc
--- ---
@@ -151,6 +164,19 @@ spec:
imagePullPolicy: {{ .Values.pullPolicy }} imagePullPolicy: {{ .Values.pullPolicy }}
command: ["/fission-bundle"] command: ["/fission-bundle"]
args: ["--routerPort", "8888", "--executorUrl", "http://executor.{{ .Release.Namespace }}"] args: ["--routerPort", "8888", "--executorUrl", "http://executor.{{ .Release.Namespace }}"]
readinessProbe:
httpGet:
path: "/router-healthz"
port: "8888"
initialDelaySeconds: 1
periodSeconds: 1
failureThreshold: 30
livenessProbe:
httpGet:
path: "/router-healthz"
port: "8888"
initialDelaySeconds: 35
periodSeconds: 5
serviceAccount: fission-svc serviceAccount: fission-svc
--- ---
@@ -194,6 +220,19 @@ spec:
value: "{{ .Values.fetcherImage }}:{{ .Values.fetcherImageTag }}" value: "{{ .Values.fetcherImage }}:{{ .Values.fetcherImageTag }}"
- name: FETCHER_IMAGE_PULL_POLICY - name: FETCHER_IMAGE_PULL_POLICY
value: "{{ .Values.pullPolicy }}" value: "{{ .Values.pullPolicy }}"
readinessProbe:
httpGet:
path: "/healthz"
port: "8888"
initialDelaySeconds: 1
periodSeconds: 1
failureThreshold: 30
livenessProbe:
httpGet:
path: "/healthz"
port: "8888"
initialDelaySeconds: 35
periodSeconds: 5
serviceAccount: fission-svc serviceAccount: fission-svc
--- ---
+16
View File
@@ -18,9 +18,25 @@ package fission
import ( import (
"fmt" "fmt"
"os"
"os/signal"
"runtime/debug"
"syscall"
) )
func UrlForFunction(name string) string { func UrlForFunction(name string) string {
prefix := "/fission-function" prefix := "/fission-function"
return fmt.Sprintf("%v/%v", prefix, name) return fmt.Sprintf("%v/%v", prefix, name)
} }
func SetupStackTraceHandler() {
// register signal handler for dumping stack trace.
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGTERM)
go func() {
<-c
fmt.Println("Received SIGTERM : Dumping stack trace")
debug.PrintStack()
os.Exit(1)
}()
}
+5
View File
@@ -128,8 +128,13 @@ func (api *API) ApiVersionMismatchHandler(w http.ResponseWriter, r *http.Request
api.respondWithError(w, err) api.respondWithError(w, err)
} }
func (api *API) HealthHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}
func (api *API) Serve(port int) { func (api *API) Serve(port int) {
r := mux.NewRouter() r := mux.NewRouter()
r.HandleFunc("/healthz", api.HealthHandler).Methods("GET")
// Give a useful error message if an older CLI attempts to make a request // Give a useful error message if an older CLI attempts to make a request
r.HandleFunc(`/v1/{rest:[a-zA-Z0-9=\-\/]+}`, api.ApiVersionMismatchHandler) r.HandleFunc(`/v1/{rest:[a-zA-Z0-9=\-\/]+}`, api.ApiVersionMismatchHandler)
r.HandleFunc("/", api.HomeHandler) r.HandleFunc("/", api.HomeHandler)
+4
View File
@@ -19,10 +19,14 @@ package controller
import ( import (
"log" "log"
"github.com/fission/fission"
"github.com/fission/fission/crd" "github.com/fission/fission/crd"
) )
func Start(port int) { func Start(port int) {
// setup a signal handler for SIGTERM
fission.SetupStackTraceHandler()
fc, _, apiExtClient, err := crd.MakeFissionClient() fc, _, apiExtClient, err := crd.MakeFissionClient()
if err != nil { if err != nil {
log.Fatalf("Failed to connect to K8s API: %v", err) log.Fatalf("Failed to connect to K8s API: %v", err)
+23 -1
View File
@@ -10,15 +10,32 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
"os/signal"
"runtime/debug"
"strconv" "strconv"
"syscall"
"time" "time"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/environments/fetcher" "github.com/fission/fission/environments/fetcher"
) )
func dumpStackTrace() {
debug.PrintStack()
}
// Usage: fetcher <shared volume path> // Usage: fetcher <shared volume path>
func main() { func main() {
// register signal handler for dumping stack trace.
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGTERM)
go func() {
<-c
log.Println("Received SIGTERM : Dumping stack trace")
dumpStackTrace()
os.Exit(1)
}()
flag.Usage = fetcherUsage flag.Usage = fetcherUsage
specializeOnStart := flag.Bool("specialize-on-startup", false, "Flag to activate specialize process at pod starup") specializeOnStart := flag.Bool("specialize-on-startup", false, "Flag to activate specialize process at pod starup")
fetchPayload := flag.String("fetch-request", "", "JSON Payload for fetch request") fetchPayload := flag.String("fetch-request", "", "JSON Payload for fetch request")
@@ -42,7 +59,10 @@ func main() {
} }
} }
fetcher := fetcher.MakeFetcher(dir, *secretDir, *configDir) fetcher, err := fetcher.MakeFetcher(dir, *secretDir, *configDir)
if err != nil {
log.Fatalf("Error making fetcher: %v", err)
}
if *specializeOnStart { if *specializeOnStart {
specializePod(fetcher, fetchPayload, loadPayload) specializePod(fetcher, fetchPayload, loadPayload)
@@ -54,6 +74,8 @@ func main() {
mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
}) })
log.Println("Fetcher ready to receive requests")
http.ListenAndServe(":8000", mux) http.ListenAndServe(":8000", mux)
} }
+3 -3
View File
@@ -74,14 +74,14 @@ func makeVolumeDir(dirPath string) {
} }
} }
func MakeFetcher(sharedVolumePath string, sharedSecretPath string, sharedConfigPath string) *Fetcher { func MakeFetcher(sharedVolumePath string, sharedSecretPath string, sharedConfigPath string) (*Fetcher, error) {
makeVolumeDir(sharedVolumePath) makeVolumeDir(sharedVolumePath)
makeVolumeDir(sharedSecretPath) makeVolumeDir(sharedSecretPath)
makeVolumeDir(sharedConfigPath) makeVolumeDir(sharedConfigPath)
fissionClient, kubeClient, _, err := crd.MakeFissionClient() fissionClient, kubeClient, _, err := crd.MakeFissionClient()
if err != nil { if err != nil {
return nil return nil, err
} }
return &Fetcher{ return &Fetcher{
sharedVolumePath: sharedVolumePath, sharedVolumePath: sharedVolumePath,
@@ -89,7 +89,7 @@ func MakeFetcher(sharedVolumePath string, sharedSecretPath string, sharedConfigP
sharedConfigPath: sharedConfigPath, sharedConfigPath: sharedConfigPath,
fissionClient: fissionClient, fissionClient: fissionClient,
kubeClient: kubeClient, kubeClient: kubeClient,
} }, nil
} }
func downloadUrl(url string, localPath string) error { func downloadUrl(url string, localPath string) error {
+5
View File
@@ -99,10 +99,15 @@ func (executor *Executor) tapService(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
} }
func (executor *Executor) healthHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}
func (executor *Executor) Serve(port int) { func (executor *Executor) Serve(port int) {
r := mux.NewRouter() r := mux.NewRouter()
r.HandleFunc("/v2/getServiceForFunction", executor.getServiceForFunctionApi).Methods("POST") r.HandleFunc("/v2/getServiceForFunction", executor.getServiceForFunctionApi).Methods("POST")
r.HandleFunc("/v2/tapService", executor.tapService).Methods("POST") r.HandleFunc("/v2/tapService", executor.tapService).Methods("POST")
r.HandleFunc("/healthz", executor.healthHandler).Methods("GET")
address := fmt.Sprintf(":%v", port) address := fmt.Sprintf(":%v", port)
log.Printf("starting executor at port %v", port) log.Printf("starting executor at port %v", port)
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
+8
View File
@@ -18,6 +18,7 @@ package executor
import ( import (
"log" "log"
"runtime/debug"
"strings" "strings"
"sync" "sync"
"time" "time"
@@ -181,9 +182,16 @@ func (executor *Executor) getFunctionEnv(m *metav1.ObjectMeta) (*crd.Environment
return env, nil return env, nil
} }
func dumpStackTrace() {
debug.PrintStack()
}
// StartExecutor Starts executor and the executor components such as Poolmgr, // StartExecutor Starts executor and the executor components such as Poolmgr,
// deploymgr and potential future executor types // deploymgr and potential future executor types
func StartExecutor(fissionNamespace string, functionNamespace string, port int) error { func StartExecutor(fissionNamespace string, functionNamespace string, port int) error {
// setup a signal handler for SIGTERM
fission.SetupStackTraceHandler()
fissionClient, kubernetesClient, _, err := crd.MakeFissionClient() fissionClient, kubernetesClient, _, err := crd.MakeFissionClient()
restClient := fissionClient.GetCrdClient() restClient := fissionClient.GetCrdClient()
if err != nil { if err != nil {
+28
View File
@@ -519,6 +519,33 @@ func (gp *GenericPool) createPool() error {
"-secret-dir", gp.sharedSecretPath, "-secret-dir", gp.sharedSecretPath,
"-cfgmap-dir", gp.sharedCfgMapPath, "-cfgmap-dir", gp.sharedCfgMapPath,
gp.sharedMountPath}, gp.sharedMountPath},
ReadinessProbe: &apiv1.Probe{
InitialDelaySeconds: 1,
PeriodSeconds: 1,
FailureThreshold: 30,
Handler: apiv1.Handler{
HTTPGet: &apiv1.HTTPGetAction{
Path: "/healthz",
Port: intstr.IntOrString{
Type: intstr.Int,
IntVal: 8000,
},
},
},
},
LivenessProbe: &apiv1.Probe{
InitialDelaySeconds: 35,
PeriodSeconds: 5,
Handler: apiv1.Handler{
HTTPGet: &apiv1.HTTPGetAction{
Path: "/healthz",
Port: intstr.IntOrString{
Type: intstr.Int,
IntVal: 8000,
},
},
},
},
}, },
}, },
ServiceAccountName: "fission-fetcher", ServiceAccountName: "fission-fetcher",
@@ -528,6 +555,7 @@ func (gp *GenericPool) createPool() error {
} }
depl, err := gp.kubernetesClient.ExtensionsV1beta1().Deployments(gp.namespace).Create(deployment) depl, err := gp.kubernetesClient.ExtensionsV1beta1().Deployments(gp.namespace).Create(deployment)
if err != nil { if err != nil {
log.Printf("Error creating deployment for %s in kubernetes, err: %v", deployment.Name, err)
return err return err
} }
gp.deployment = depl gp.deployment = depl
+7
View File
@@ -89,6 +89,10 @@ func defaultHomeHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
} }
func routerHealthHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}
func (ts *HTTPTriggerSet) getRouter() *mux.Router { func (ts *HTTPTriggerSet) getRouter() *mux.Router {
muxRouter := mux.NewRouter() muxRouter := mux.NewRouter()
@@ -150,6 +154,9 @@ func (ts *HTTPTriggerSet) getRouter() *mux.Router {
muxRouter.HandleFunc(fission.UrlForFunction(function.Metadata.Name), fh.handler) muxRouter.HandleFunc(fission.UrlForFunction(function.Metadata.Name), fh.handler)
} }
// Healthz endpoint for the router.
muxRouter.HandleFunc("/router-healthz", routerHealthHandler).Methods("GET")
return muxRouter return muxRouter
} }
+4
View File
@@ -50,6 +50,7 @@ import (
"github.com/gorilla/handlers" "github.com/gorilla/handlers"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/fission/fission"
"github.com/fission/fission/crd" "github.com/fission/fission/crd"
executorClient "github.com/fission/fission/executor/client" executorClient "github.com/fission/fission/executor/client"
) )
@@ -72,6 +73,9 @@ func serve(ctx context.Context, port int, httpTriggerSet *HTTPTriggerSet, resolv
} }
func Start(port int, executorUrl string) { func Start(port int, executorUrl string) {
// setup a signal handler for SIGTERM
fission.SetupStackTraceHandler()
fmap := makeFunctionServiceMap(time.Minute) fmap := makeFunctionServiceMap(time.Minute)
fissionClient, _, _, err := crd.MakeFissionClient() fissionClient, _, _, err := crd.MakeFissionClient()
+9
View File
@@ -25,6 +25,7 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/fission/fission"
"github.com/gorilla/handlers" "github.com/gorilla/handlers"
"github.com/gorilla/mux" "github.com/gorilla/mux"
_ "github.com/graymeta/stow/local" _ "github.com/graymeta/stow/local"
@@ -149,6 +150,10 @@ func (ss *StorageService) downloadHandler(w http.ResponseWriter, r *http.Request
} }
} }
func (ss *StorageService) healthHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}
func MakeStorageService(storageClient *StowClient, port int) *StorageService { func MakeStorageService(storageClient *StowClient, port int) *StorageService {
return &StorageService{ return &StorageService{
storageClient: storageClient, storageClient: storageClient,
@@ -161,12 +166,16 @@ func (ss *StorageService) Start(port int) {
r.HandleFunc("/v1/archive", ss.uploadHandler).Methods("POST") r.HandleFunc("/v1/archive", ss.uploadHandler).Methods("POST")
r.HandleFunc("/v1/archive", ss.downloadHandler).Methods("GET") r.HandleFunc("/v1/archive", ss.downloadHandler).Methods("GET")
r.HandleFunc("/v1/archive", ss.deleteHandler).Methods("DELETE") r.HandleFunc("/v1/archive", ss.deleteHandler).Methods("DELETE")
r.HandleFunc("/healthz", ss.healthHandler).Methods("GET")
address := fmt.Sprintf(":%v", port) address := fmt.Sprintf(":%v", port)
log.Fatal(http.ListenAndServe(address, handlers.LoggingHandler(os.Stdout, r))) log.Fatal(http.ListenAndServe(address, handlers.LoggingHandler(os.Stdout, r)))
} }
func RunStorageService(storageType StorageType, storagePath string, containerName string, port int, enablePruner bool) *StorageService { func RunStorageService(storageType StorageType, storagePath string, containerName string, port int, enablePruner bool) *StorageService {
// setup a signal handler for SIGTERM
fission.SetupStackTraceHandler()
// initialize logger // initialize logger
log.SetLevel(log.InfoLevel) log.SetLevel(log.InfoLevel)
+93 -24
View File
@@ -59,7 +59,7 @@ build_and_push_fission_bundle() {
pushd $ROOT/fission-bundle pushd $ROOT/fission-bundle
./build.sh ./build.sh
docker build -t $image_tag . docker build -q -t $image_tag .
gcloud_login gcloud_login
@@ -72,7 +72,7 @@ build_and_push_fetcher() {
pushd $ROOT/environments/fetcher/cmd pushd $ROOT/environments/fetcher/cmd
./build.sh ./build.sh
docker build -t $image_tag . docker build -q -t $image_tag .
gcloud_login gcloud_login
@@ -86,7 +86,7 @@ build_and_push_builder() {
pushd $ROOT/builder/cmd pushd $ROOT/builder/cmd
./build.sh ./build.sh
docker build -t $image_tag . docker build -q -t $image_tag .
gcloud_login gcloud_login
@@ -98,7 +98,7 @@ build_and_push_fluentd(){
image_tag=$1 image_tag=$1
pushd $ROOT/logger/fluentd pushd $ROOT/logger/fluentd
docker build -t $image_tag . docker build -q -t $image_tag .
gcloud_login gcloud_login
@@ -112,7 +112,7 @@ build_and_push_env_runtime() {
image_tag=$2 image_tag=$2
pushd $ROOT/environments/$env/ pushd $ROOT/environments/$env/
docker build -t $image_tag . docker build -q -t $image_tag .
gcloud_login gcloud_login
@@ -127,7 +127,7 @@ build_and_push_env_builder() {
pushd $ROOT/environments/$env/builder pushd $ROOT/environments/$env/builder
docker build -t $image_tag --build-arg BUILDER_IMAGE=${builder_image} . docker build -q -t $image_tag --build-arg BUILDER_IMAGE=${builder_image} .
gcloud_login gcloud_login
@@ -174,14 +174,19 @@ helm_install_fission() {
echo "Deleting old releases" echo "Deleting old releases"
helm list -q|xargs -I@ bash -c "helm_uninstall_fission @" helm list -q|xargs -I@ bash -c "helm_uninstall_fission @"
# deleting ns does take a while after command is issued
while `kubectl get ns| grep fission-builder`
do
sleep 5
done
echo "Installing fission" echo "Installing fission"
helm install \ helm install \
--wait \ --wait \
--timeout 600 \ --timeout 540 \
--name $id \ --name $id \
--set $helmVars \ --set $helmVars \
--namespace $ns \ --namespace $ns \
--debug \
$ROOT/charts/fission-all $ROOT/charts/fission-all
helm list helm list
@@ -190,30 +195,65 @@ helm_install_fission() {
wait_for_service() { wait_for_service() {
id=$1 id=$1
svc=$2 svc=$2
health_endpoint=$3
ns=f-$id ns=f-$id
retry=0
max_retries=5
while true while true
do do
ip=$(kubectl -n $ns get svc $svc -o jsonpath='{...ip}') retry=$((retry+1))
if [ ! -z $ip ] if ((retry == max_retries)); then
then echo "Waiting for $svc to be routable exceeded max retries. Quitting.."
break exit 1
fi fi
echo Waiting for service $svc... ip=$(kubectl -n $ns get svc $svc -o jsonpath='{...ip}')
sleep 1 if [ -z $ip ]; then
continue
fi
http_status=`curl -sw "%{http_code}" "http://$ip/$health_endpoint"`
echo "http_status for svc $svc : $http_status"
if [ "$http_status" -ne "200" ]; then
echo "Service $svc returned response other than 200. waiting for 200 after backing off for 1 second"
sleep 1
else
break
fi
done done
} }
wait_for_services() { wait_for_services() {
id=$1 id=$1
wait_for_service $id controller echo "\n--- wait for controller and router services to be routable ---"
wait_for_service $id router wait_for_service $id controller "healthz"
wait_for_service $id router "router-healthz"
echo Waiting for service is routable... echo "\n--- end wait for controller and router services to be routable ---"
sleep 10
} }
dump_kubernetes_events() {
id=$1
ns=f-$id
fns=f-func-$id
echo "--- kubectl events $fns ---"
kubectl get events -n $fns
echo "--- end kubectl events $fns ---"
echo "--- kubectl events $ns ---"
kubectl get events -n $ns
echo "--- end kubectl events $ns ---"
}
export -f dump_kubernetes_events
dump_tiller_logs() {
echo "--- tiller logs ---"
tiller_pod=`kubectl get pods -n kube-system | grep tiller| tr -s " "| cut -d" " -f1`
kubectl logs $tiller_pod --since=30m -n kube-system
echo "--- end tiller logs ---"
}
export -f dump_tiller_logs
helm_uninstall_fission() {(set +e helm_uninstall_fission() {(set +e
id=$1 id=$1
@@ -222,10 +262,10 @@ helm_uninstall_fission() {(set +e
echo "Fission uninstallation skipped" echo "Fission uninstallation skipped"
return return
fi fi
echo "Uninstalling fission" echo "Uninstalling fission"
helm delete --purge $id helm delete --purge $id
kubectl delete ns f-$id || true
kubectl delete ns f-$id
)} )}
export -f helm_uninstall_fission export -f helm_uninstall_fission
@@ -313,11 +353,30 @@ dump_env_pods() {
echo --- End environment pods --- echo --- End environment pods ---
} }
describe_pods_ns() {
echo "--- describe pods $1---"
kubectl describe pods -n $1
echo "--- End describe pods $1 ---"
}
describe_all_pods() {
id=$1
ns=f-$id
fns=f-func-$id
bns=fission-builder
describe_pods_ns $ns
describe_pods_ns $fns
describe_pods_ns $bns
}
dump_all_fission_resources() { dump_all_fission_resources() {
ns=$1 ns=$1
echo "--- All objects in the fission namespace $ns ---" echo "--- All objects in the fission namespace $ns ---"
kubectl -n $ns get all kubectl -n $ns get pods -o wide
echo ""
kubectl -n $ns get svc
echo "--- End objects in the fission namespace $ns ---" echo "--- End objects in the fission namespace $ns ---"
} }
@@ -343,11 +402,17 @@ dump_logs() {
dump_fission_logs $ns $fns router dump_fission_logs $ns $fns router
dump_fission_logs $ns $fns buildermgr dump_fission_logs $ns $fns buildermgr
dump_fission_logs $ns $fns executor dump_fission_logs $ns $fns executor
dump_fission_logs $ns $fns storagesvc
dump_function_pod_logs $ns $fns dump_function_pod_logs $ns $fns
dump_builder_pod_logs $bns dump_builder_pod_logs $bns
dump_fission_crds dump_fission_crds
} }
log() {
echo `date +%Y/%m/%d:%H:%M:%S`" $1"
}
export -f log
export FAILURES=0 export FAILURES=0
run_all_tests() { run_all_tests() {
@@ -402,7 +467,9 @@ install_and_test() {
trap "helm_uninstall_fission $id" EXIT trap "helm_uninstall_fission $id" EXIT
if ! helm_install_fission $id $image $imageTag $fetcherImage $fetcherImageTag $controllerPort $routerPort $fluentdImage $fluentdImageTag $pruneInterval if ! helm_install_fission $id $image $imageTag $fetcherImage $fetcherImageTag $controllerPort $routerPort $fluentdImage $fluentdImageTag $pruneInterval
then then
dump_logs $id describe_all_pods $id
dump_kubernetes_events $id
dump_tiller_logs
exit 1 exit 1
fi fi
@@ -417,6 +484,8 @@ install_and_test() {
if [ $FAILURES -ne 0 ] if [ $FAILURES -ne 0 ]
then then
# describe each pod in fission ns and function namespace
describe_all_pods $id
exit 1 exit 1
fi fi
} }
+21 -21
View File
@@ -16,7 +16,7 @@ cleanup() {
} }
create_archive() { create_archive() {
echo "Creating an archive" log "Creating an archive"
mkdir test_dir mkdir test_dir
dd if=/dev/urandom of=test_dir/dynamically_generated_file bs=256k count=1 dd if=/dev/urandom of=test_dir/dynamically_generated_file bs=256k count=1
printf 'def main():\n return "Hello, world!"' > test_dir/hello.py printf 'def main():\n return "Hello, world!"' > test_dir/hello.py
@@ -24,17 +24,17 @@ create_archive() {
} }
create_package() { create_package() {
echo "Creating package" log "Creating package"
pkg=$(fission package create --deploy "test-deploy-pkg.zip" --env python| cut -f2 -d' '| tr -d \') pkg=$(fission package create --deploy "test-deploy-pkg.zip" --env python| cut -f2 -d' '| tr -d \')
} }
delete_package() { delete_package() {
echo "Deleting package: $1" log "Deleting package: $1"
fission package delete --name $1 fission package delete --name $1
} }
get_archive_url_from_package() { get_archive_url_from_package() {
echo "Getting archive URL from package: $1" log "Getting archive URL from package: $1"
url=`kubectl get package $1 -ojsonpath='{.spec.deployment.url}'` url=`kubectl get package $1 -ojsonpath='{.spec.deployment.url}'`
} }
@@ -42,76 +42,76 @@ get_archive_from_storage() {
http_status=`curl -sw "%{http_code}" $1 -o /tmp/file` http_status=`curl -sw "%{http_code}" $1 -o /tmp/file`
} }
#1. declare trap to cleanup for all the required signals #1. declare trap to cleanup for EXIT
#2. create an archives with large files such that total size of archive is > 256KB #2. create an archive with large files such that total size of archive is > 256KB
#3. create 2 pkgs referencing those archives #3. create 2 pkgs referencing those archives
#4. delete both the packages #4. delete both the packages
#5. verify archives are not recycled . this handles the case where archives are just created but not referenced by pkgs yet. #5. verify archives are not recycled . this handles the case where archives are just created but not referenced by pkgs yet.
#6. sleep for two minutes #6. sleep for two minutes
#7. now verify that both get deleted. #7. now verify that both got deleted.
main() { main() {
# trap # trap
trap cleanup EXIT trap cleanup EXIT
# create a huge archive # create a huge archive
create_archive create_archive
echo "created archive test-deploy-pkg.zip" log "created archive test-deploy-pkg.zip"
# create packages with the huge archive # create packages with the huge archive
create_package create_package
pkg_1=$pkg pkg_1=$pkg
get_archive_url_from_package $pkg_1 get_archive_url_from_package $pkg_1
url_1=$url url_1=$url
echo "pkg: $pkg_1, archive_url : $url_1" log "pkg: $pkg_1, archive_url : $url_1"
create_package create_package
pkg_2=$pkg pkg_2=$pkg
get_archive_url_from_package $pkg_2 get_archive_url_from_package $pkg_2
url_2=$url url_2=$url
echo "pkg: $pkg_2, archive_url : $url_2" log "pkg: $pkg_2, archive_url : $url_2"
# delete packages # delete packages
delete_package $pkg_1 delete_package $pkg_1
delete_package $pkg_2 delete_package $pkg_2
echo "deleted packages : $pkg_1 $pkg_2" log "deleted packages : $pkg_1 $pkg_2"
# curl on the archive url # curl on the archive url
get_archive_from_storage $url_1 get_archive_from_storage $url_1
echo "http_status for $url_1 : $http_status" log "http_status for $url_1 : $http_status"
if [ "$http_status" -ne "200" ]; then if [ "$http_status" -ne "200" ]; then
echo "Archive $url_1 absent on storage, while expected to be present" log "Archive $url_1 absent on storage, while expected to be present"
exit 1 exit 1
fi fi
# curl on the archive url # curl on the archive url
get_archive_from_storage $url_2 get_archive_from_storage $url_2
echo "http_status for $url_2 : $http_status" log "http_status for $url_2 : $http_status"
if [ "$http_status" -ne "200" ]; then if [ "$http_status" -ne "200" ]; then
echo "Archive $url_2 absent on storage, while expected to be present" log "Archive $url_2 absent on storage, while expected to be present"
exit 1 exit 1
fi fi
# archivePruner is set to run every minute for test. In production, its set to run every hour. # archivePruner is set to run every minute for test. In production, its set to run every hour.
echo "waiting for packages to get recycled" log "waiting for packages to get recycled"
sleep 120 sleep 120
# curl on the archive url # curl on the archive url
get_archive_from_storage $url_1 get_archive_from_storage $url_1
echo "http_status for $url_1 : $http_status" log "http_status for $url_1 : $http_status"
if [ "$http_status" -ne "404" ]; then if [ "$http_status" -ne "404" ]; then
echo "Archive $url_1 should have been recycled, but curl returned $http_status, while expected status is 404." log "Archive $url_1 should have been recycled, but curl returned $http_status, while expected status is 404."
exit 1 exit 1
fi fi
# curl on the archive url # curl on the archive url
get_archive_from_storage $url_2 get_archive_from_storage $url_2
echo "http_status for $url_2 : $http_status" log "http_status for $url_2 : $http_status"
if [ "$http_status" -ne "404" ]; then if [ "$http_status" -ne "404" ]; then
echo "Archive $url_2 should have been recycled, but curl returned $http_status, while expected status is 404." log "Archive $url_2 should have been recycled, but curl returned $http_status, while expected status is 404."
exit 1 exit 1
fi fi
echo "Test archive pruner PASSED" log "Test archive pruner PASSED"
} }
main main
+13 -13
View File
@@ -5,51 +5,51 @@ set -euo pipefail
ROOT=$(dirname $0)/../.. ROOT=$(dirname $0)/../..
# Create a hello world function in nodejs, test it with an http trigger # Create a hello world function in nodejs, test it with an http trigger
echo "NewDeploy ExecutorType: Pre-test cleanup" log "NewDeploy ExecutorType: Pre-test cleanup"
fission env delete --name nodejs || true fission env delete --name nodejs || true
echo "Creating nodejs env" log "Creating nodejs env"
fission env create --name nodejs --image fission/node-env --mincpu 20 --maxcpu 100 --minmemory 128 --maxmemory 256 fission env create --name nodejs --image fission/node-env --mincpu 20 --maxcpu 100 --minmemory 128 --maxmemory 256
trap "fission env delete --name nodejs" EXIT trap "fission env delete --name nodejs" EXIT
# TODO Imporve test code by reusing common blocks # TODO Imporve test code by reusing common blocks
echo "Creating function, testing for cold start with MinScale 0" log "Creating function, testing for cold start with MinScale 0"
fn0=nodejs-hello-$(date +%N) fn0=nodejs-hello-$(date +%N)
fission fn create --name $fn0 --env nodejs --code $ROOT/examples/nodejs/hello.js --minscale 0 --maxscale 4 --executortype newdeploy fission fn create --name $fn0 --env nodejs --code $ROOT/examples/nodejs/hello.js --minscale 0 --maxscale 4 --executortype newdeploy
trap "fission fn delete --name $fn0" EXIT trap "fission fn delete --name $fn0" EXIT
echo "Creating route" log "Creating route"
fission route create --function $fn0 --url /$fn0 --method GET fission route create --function $fn0 --url /$fn0 --method GET
echo "Waiting for router & newdeploy deployment creation" log "Waiting for router & newdeploy deployment creation"
sleep 5 sleep 5
echo "Doing an HTTP GET on the function's route" log "Doing an HTTP GET on the function's route"
response0=$(curl http://$FISSION_ROUTER/$fn0) response0=$(curl http://$FISSION_ROUTER/$fn0)
echo "Checking for valid response" log "Checking for valid response"
echo $response0 | grep -i hello echo $response0 | grep -i hello
echo "Creating function, testing for warm start with MinScale 1" log "Creating function, testing for warm start with MinScale 1"
fn1=nodejs-hello-$(date +%N) fn1=nodejs-hello-$(date +%N)
fission fn create --name $fn1 --env nodejs --code $ROOT/examples/nodejs/hello.js --minscale 1 --maxscale 4 --executortype newdeploy fission fn create --name $fn1 --env nodejs --code $ROOT/examples/nodejs/hello.js --minscale 1 --maxscale 4 --executortype newdeploy
trap "fission fn delete --name $fn1" EXIT trap "fission fn delete --name $fn1" EXIT
echo "Creating route" log "Creating route"
fission route create --function $fn1 --url /$fn1 --method GET fission route create --function $fn1 --url /$fn1 --method GET
echo "Waiting for router & newdeploy deployment creation" log "Waiting for router & newdeploy deployment creation"
sleep 5 sleep 5
echo "Doing an HTTP GET on the function's route" log "Doing an HTTP GET on the function's route"
response1=$(curl http://$FISSION_ROUTER/$fn0) response1=$(curl http://$FISSION_ROUTER/$fn0)
echo "Checking for valid response" log "Checking for valid response"
echo $response1 | grep -i hello echo $response1 | grep -i hello
# crappy cleanup, improve this later # crappy cleanup, improve this later
kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger
echo "NewDeploy ExecutorType: All done." log "NewDeploy ExecutorType: All done."
+8 -8
View File
@@ -7,30 +7,30 @@ ROOT=$(dirname $0)/../..
fn=nodejs-hello-$(date +%N) fn=nodejs-hello-$(date +%N)
# Create a hello world function in nodejs, test it with an http trigger # Create a hello world function in nodejs, test it with an http trigger
echo "Poolmgr ExecutorType: Pre-test cleanup" log "Poolmgr ExecutorType: Pre-test cleanup"
fission env delete --name nodejs || true fission env delete --name nodejs || true
echo "Creating nodejs env" log "Creating nodejs env"
fission env create --name nodejs --image fission/node-env --mincpu 20 --maxcpu 100 --minmemory 128 --maxmemory 256 fission env create --name nodejs --image fission/node-env --mincpu 20 --maxcpu 100 --minmemory 128 --maxmemory 256
trap "fission env delete --name nodejs" EXIT trap "fission env delete --name nodejs" EXIT
echo "Creating function" log "Creating function"
fission fn create --name $fn --env nodejs --code $ROOT/examples/nodejs/hello.js --executortype poolmgr fission fn create --name $fn --env nodejs --code $ROOT/examples/nodejs/hello.js --executortype poolmgr
trap "fission fn delete --name $fn" EXIT trap "fission fn delete --name $fn" EXIT
echo "Creating route" log "Creating route"
fission route create --function $fn --url /$fn --method GET fission route create --function $fn --url /$fn --method GET
echo "Waiting for router to catch up" log "Waiting for router to catch up"
sleep 5 sleep 5
echo "Doing an HTTP GET on the function's route" log "Doing an HTTP GET on the function's route"
response=$(curl http://$FISSION_ROUTER/$fn) response=$(curl http://$FISSION_ROUTER/$fn)
echo "Checking for valid response" log "Checking for valid response"
echo $response | grep -i hello echo $response | grep -i hello
# crappy cleanup, improve this later # crappy cleanup, improve this later
kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger
echo "Poolmgr ExecutorType: All done." log "Poolmgr ExecutorType: All done."
+13 -13
View File
@@ -15,16 +15,16 @@ PYTHON_BUILDER_IMAGE=gcr.io/fission-ci/python-env-builder:test
fn=python-srcbuild-$(date +%s) fn=python-srcbuild-$(date +%s)
checkFunctionResponse() { checkFunctionResponse() {
echo "Doing an HTTP GET on the function's route" log "Doing an HTTP GET on the function's route"
response=$(curl http://$FISSION_ROUTER/$1) response=$(curl http://$FISSION_ROUTER/$1)
echo "Checking for valid response" log "Checking for valid response"
echo $response log $response
echo $response | grep -i "a: 1 b: {c: 3, d: 4}" echo $response | grep -i "a: 1 b: {c: 3, d: 4}"
} }
waitBuild() { waitBuild() {
echo "Waiting for builder manager to finish the build" log "Waiting for builder manager to finish the build"
while true; do while true; do
kubectl --namespace default get packages $1 -o jsonpath='{.status.buildstatus}'|grep succeeded kubectl --namespace default get packages $1 -o jsonpath='{.status.buildstatus}'|grep succeeded
@@ -39,7 +39,7 @@ waitEnvBuilder() {
env=$1 env=$1
envRV=$(kubectl -n default get environments ${env} -o jsonpath='{.metadata.resourceVersion}') envRV=$(kubectl -n default get environments ${env} -o jsonpath='{.metadata.resourceVersion}')
echo "Waiting for env builder to catch up" log "Waiting for env builder to catch up"
while true; do while true; do
kubectl -n fission-builder get pod -l envName=${env},envResourceVersion=${envRV} \ kubectl -n fission-builder get pod -l envName=${env},envResourceVersion=${envRV} \
@@ -51,27 +51,27 @@ waitEnvBuilder() {
} }
export -f waitEnvBuilder export -f waitEnvBuilder
echo "Pre-test cleanup" log "Pre-test cleanup"
fission env delete --name python || true fission env delete --name python || true
kubectl --namespace default get packages|grep -v NAME|awk '{print $1}'|xargs -I@ bash -c 'kubectl --namespace default delete packages @' || true kubectl --namespace default get packages|grep -v NAME|awk '{print $1}'|xargs -I@ bash -c 'kubectl --namespace default delete packages @' || true
echo "Creating python env" log "Creating python env"
fission env create --name python --image $PYTHON_RUNTIME_IMAGE --builder $PYTHON_BUILDER_IMAGE fission env create --name python --image $PYTHON_RUNTIME_IMAGE --builder $PYTHON_BUILDER_IMAGE
trap "fission env delete --name python" EXIT trap "fission env delete --name python" EXIT
timeout 180s bash -c "waitEnvBuilder python" timeout 180s bash -c "waitEnvBuilder python"
echo "Creating source pacakage" log "Creating source pacakage"
zip -jr demo-src-pkg.zip $ROOT/examples/python/sourcepkg/ zip -jr demo-src-pkg.zip $ROOT/examples/python/sourcepkg/
echo "Creating function " $fn log "Creating function " $fn
fission fn create --name $fn --env python --src demo-src-pkg.zip --entrypoint "user.main" --buildcmd "./build.sh" fission fn create --name $fn --env python --src demo-src-pkg.zip --entrypoint "user.main" --buildcmd "./build.sh"
trap "fission fn delete --name $fn" EXIT trap "fission fn delete --name $fn" EXIT
echo "Creating route" log "Creating route"
fission route create --function $fn --url /$fn --method GET fission route create --function $fn --url /$fn --method GET
echo "Waiting for router to catch up" log "Waiting for router to catch up"
sleep 3 sleep 3
pkg=$(kubectl --namespace default get functions $fn -o jsonpath='{.spec.package.packageref.name}') pkg=$(kubectl --namespace default get functions $fn -o jsonpath='{.spec.package.packageref.name}')
@@ -81,7 +81,7 @@ timeout 60s bash -c "waitBuild $pkg"
checkFunctionResponse $fn checkFunctionResponse $fn
echo "Updating function " $fn log "Updating function " $fn
fission fn update --name $fn --src demo-src-pkg.zip fission fn update --name $fn --src demo-src-pkg.zip
trap "fission fn delete --name $fn" EXIT trap "fission fn delete --name $fn" EXIT
@@ -95,4 +95,4 @@ checkFunctionResponse $fn
# crappy cleanup, improve this later # crappy cleanup, improve this later
kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger
echo "All done." log "All done."
+12 -12
View File
@@ -10,28 +10,28 @@ fn=nodejs-hello-$(date +%s)
# Update it and check it's output, the output should be # Update it and check it's output, the output should be
# different from the previous one. # different from the previous one.
echo "Pre-test cleanup" log "Pre-test cleanup"
fission env delete --name nodejs || true fission env delete --name nodejs || true
echo "Creating nodejs env" log "Creating nodejs env"
fission env create --name nodejs --image fission/node-env fission env create --name nodejs --image fission/node-env
trap "fission env delete --name nodejs" EXIT trap "fission env delete --name nodejs" EXIT
echo "Creating function" log "Creating function"
echo 'module.exports = function(context, callback) { callback(200, "foo!\n"); }' > foo.js echo 'module.exports = function(context, callback) { callback(200, "foo!\n"); }' > foo.js
fission fn create --name $fn --env nodejs --code foo.js fission fn create --name $fn --env nodejs --code foo.js
trap "fission fn delete --name $fn" EXIT trap "fission fn delete --name $fn" EXIT
echo "Creating route" log "Creating route"
fission route create --function $fn --url /$fn --method GET fission route create --function $fn --url /$fn --method GET
echo "Waiting for router to catch up" log "Waiting for router to catch up"
sleep 10 sleep 10
echo "Doing an HTTP GET on the function's route" log "Doing an HTTP GET on the function's route"
response=$(curl http://$FISSION_ROUTER/$fn) response=$(curl http://$FISSION_ROUTER/$fn)
echo "Checking for valid response" log "Checking for valid response"
echo $response | grep -i foo echo $response | grep -i foo
# Running a background process to keep access the # Running a background process to keep access the
@@ -40,18 +40,18 @@ echo $response | grep -i foo
( watch -n1 curl http://$FISSION_ROUTER/$fn ) > /dev/null 2>&1 & ( watch -n1 curl http://$FISSION_ROUTER/$fn ) > /dev/null 2>&1 &
pid=$! pid=$!
echo "Updating function" log "Updating function"
echo 'module.exports = function(context, callback) { callback(200, "bar!\n"); }' > bar.js echo 'module.exports = function(context, callback) { callback(200, "bar!\n"); }' > bar.js
fission fn update --name $fn --code bar.js fission fn update --name $fn --code bar.js
trap "fission fn delete --name $fn" EXIT trap "fission fn delete --name $fn" EXIT
echo "Waiting for router to update cache" log "Waiting for router to update cache"
sleep 10 sleep 10
echo "Doing an HTTP GET on the function's route" log "Doing an HTTP GET on the function's route"
response=$(curl http://$FISSION_ROUTER/$fn) response=$(curl http://$FISSION_ROUTER/$fn)
echo "Checking for valid response again" log "Checking for valid response again"
echo $response | grep -i bar echo $response | grep -i bar
kill -15 $pid kill -15 $pid
@@ -59,4 +59,4 @@ kill -15 $pid
# crappy cleanup, improve this later # crappy cleanup, improve this later
kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger
echo "All done." log "All done."
+8 -8
View File
@@ -9,38 +9,38 @@ set -euo pipefail
ROOT=$(dirname $0)/../.. ROOT=$(dirname $0)/../..
echo "Pre-test cleanup" log "Pre-test cleanup"
fission env delete --name nodejs || true fission env delete --name nodejs || true
echo "Creating nodejs env" log "Creating nodejs env"
fission env create --name nodejs --image fission/node-env fission env create --name nodejs --image fission/node-env
trap "fission env delete --name nodejs" EXIT trap "fission env delete --name nodejs" EXIT
echo "Writing functions" log "Writing functions"
f1=f1-$(date +%s) f1=f1-$(date +%s)
f2=f2-$(date +%s) f2=f2-$(date +%s)
echo $f1 $f2 log $f1 $f2
for f in $f1 $f2 for f in $f1 $f2
do do
echo "module.exports = function(context, callback) { callback(200, \"$f\n\"); }" > $f.js echo "module.exports = function(context, callback) { callback(200, \"$f\n\"); }" > $f.js
done done
echo "Creating functions" log "Creating functions"
for f in $f1 $f2 for f in $f1 $f2
do do
fission fn create --name $f --env nodejs --code $f.js fission fn create --name $f --env nodejs --code $f.js
trap "fission fn delete --name $f" EXIT trap "fission fn delete --name $f" EXIT
done done
echo "Waiting for router to catch up" log "Waiting for router to catch up"
sleep 2 sleep 2
echo "Testing internal routes" log "Testing internal routes"
for f in $f1 $f2 for f in $f1 $f2
do do
response=$(curl http://$FISSION_ROUTER/fission-function/$f) response=$(curl http://$FISSION_ROUTER/fission-function/$f)
echo $response | grep $f echo $response | grep $f
done done
echo "All done." log "All done."
+14 -14
View File
@@ -8,39 +8,39 @@ ROOT=$(dirname $0)/../..
fn=nodejs-logtest-$(date +%N) fn=nodejs-logtest-$(date +%N)
function cleanup { function cleanup {
echo "Cleanup route" log "Cleanup route"
var=$(fission route list | grep $fn | awk '{print $1;}') var=$(fission route list | grep $fn | awk '{print $1;}')
fission route delete --name $var fission route delete --name $var
echo "delete logfile" log "delete logfile"
rm "/tmp/logfile" rm "/tmp/logfile"
} }
# Create a hello world function in nodejs, test it with an http trigger # Create a hello world function in nodejs, test it with an http trigger
echo "Pre-test cleanup" log "Pre-test cleanup"
fission env delete --name nodejs || true fission env delete --name nodejs || true
echo "Creating nodejs env" log "Creating nodejs env"
fission env create --name nodejs --image fission/node-env fission env create --name nodejs --image fission/node-env
trap "fission env delete --name nodejs" EXIT trap "fission env delete --name nodejs" EXIT
echo "Creating function" log "Creating function"
fission fn create --name $fn --env nodejs --code log.js fission fn create --name $fn --env nodejs --code log.js
trap "fission fn delete --name $fn" EXIT trap "fission fn delete --name $fn" EXIT
echo "Creating route" log "Creating route"
fission route create --function $fn --url /$fn --method GET fission route create --function $fn --url /$fn --method GET
trap cleanup EXIT trap cleanup EXIT
echo "Waiting for router to catch up" log "Waiting for router to catch up"
sleep 15 sleep 15
echo "Doing 4 HTTP GETs on the function's route" log "Doing 4 HTTP GETs on the function's route"
for i in 1 2 3 4 for i in 1 2 3 4
do do
curl -s http://$FISSION_ROUTER/$fn curl -s http://$FISSION_ROUTER/$fn
done done
echo "Grabbing logs, should have 4 calls in logs" log "Grabbing logs, should have 4 calls in logs"
sleep 15 sleep 15
@@ -52,15 +52,15 @@ then
fission function logs --name $fn --detail > /tmp/logfile fission function logs --name $fn --detail > /tmp/logfile
fi fi
echo "---function logs---" log "---function logs---"
cat /tmp/logfile cat /tmp/logfile
echo "------" log "------"
num=$(grep 'log test' /tmp/logfile | wc -l) num=$(grep 'log test' /tmp/logfile | wc -l)
echo $num logs found log $num logs found
if [ $num -ne 4 ] if [ $num -ne 4 ]
then then
echo "Test Failed: expected 4, found $num logs" log "Test Failed: expected 4, found $num logs"
fi fi
echo "All done." log "All done."
+8 -8
View File
@@ -7,30 +7,30 @@ ROOT=$(dirname $0)/../..
fn=nodejs-hello-$(date +%N) fn=nodejs-hello-$(date +%N)
# Create a hello world function in nodejs, test it with an http trigger # Create a hello world function in nodejs, test it with an http trigger
echo "Pre-test cleanup" log "Pre-test cleanup"
fission env delete --name nodejs || true fission env delete --name nodejs || true
echo "Creating nodejs env" log "Creating nodejs env"
fission env create --name nodejs --image fission/node-env fission env create --name nodejs --image fission/node-env
trap "fission env delete --name nodejs" EXIT trap "fission env delete --name nodejs" EXIT
echo "Creating function" log "Creating function"
fission fn create --name $fn --env nodejs --code $ROOT/examples/nodejs/hello.js fission fn create --name $fn --env nodejs --code $ROOT/examples/nodejs/hello.js
trap "fission fn delete --name $fn" EXIT trap "fission fn delete --name $fn" EXIT
echo "Creating route" log "Creating route"
fission route create --function $fn --url /$fn --method GET fission route create --function $fn --url /$fn --method GET
echo "Waiting for router to catch up" log "Waiting for router to catch up"
sleep 3 sleep 3
echo "Doing an HTTP GET on the function's route" log "Doing an HTTP GET on the function's route"
response=$(curl http://$FISSION_ROUTER/$fn) response=$(curl http://$FISSION_ROUTER/$fn)
echo "Checking for valid response" log "Checking for valid response"
echo $response | grep -i hello echo $response | grep -i hello
# crappy cleanup, improve this later # crappy cleanup, improve this later
kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger
echo "All done." log "All done."
+15 -15
View File
@@ -14,7 +14,7 @@ PYTHON_BUILDER_IMAGE=gcr.io/fission-ci/python-env-builder:test
fn=python-srcbuild-$(date +%s) fn=python-srcbuild-$(date +%s)
waitBuild() { waitBuild() {
echo "Waiting for builder manager to finish the build" log "Waiting for builder manager to finish the build"
while true; do while true; do
kubectl --namespace default get packages $1 -o jsonpath='{.status.buildstatus}'|grep succeeded kubectl --namespace default get packages $1 -o jsonpath='{.status.buildstatus}'|grep succeeded
@@ -26,11 +26,11 @@ waitBuild() {
export -f waitBuild export -f waitBuild
checkFunctionResponse() { checkFunctionResponse() {
echo "Doing an HTTP GET on the function's route" log "Doing an HTTP GET on the function's route"
response=$(curl http://$FISSION_ROUTER/$1) response=$(curl http://$FISSION_ROUTER/$1)
echo "Checking for valid response" log "Checking for valid response"
echo $response log $response
echo $response | grep -i "$2" echo $response | grep -i "$2"
} }
@@ -38,7 +38,7 @@ waitEnvBuilder() {
env=$1 env=$1
envRV=$(kubectl -n default get environments ${env} -o jsonpath='{.metadata.resourceVersion}') envRV=$(kubectl -n default get environments ${env} -o jsonpath='{.metadata.resourceVersion}')
echo "Waiting for env builder to catch up" log "Waiting for env builder to catch up"
while true; do while true; do
kubectl -n fission-builder get pod -l envName=${env},envResourceVersion=${envRV} \ kubectl -n fission-builder get pod -l envName=${env},envResourceVersion=${envRV} \
@@ -50,46 +50,46 @@ waitEnvBuilder() {
} }
export -f waitEnvBuilder export -f waitEnvBuilder
echo "Pre-test cleanup" log "Pre-test cleanup"
fission env delete --name python || true fission env delete --name python || true
echo "Creating python env" log "Creating python env"
fission env create --name python --image $PYTHON_RUNTIME_IMAGE --builder $PYTHON_BUILDER_IMAGE fission env create --name python --image $PYTHON_RUNTIME_IMAGE --builder $PYTHON_BUILDER_IMAGE
trap "fission env delete --name python" EXIT trap "fission env delete --name python" EXIT
timeout 180s bash -c "waitEnvBuilder python" timeout 180s bash -c "waitEnvBuilder python"
echo "Creating pacakage with source archive" log "Creating pacakage with source archive"
zip -jr demo-src-pkg.zip $ROOT/examples/python/sourcepkg/ zip -jr demo-src-pkg.zip $ROOT/examples/python/sourcepkg/
pkgName=$(fission package create --src demo-src-pkg.zip --env python --buildcmd "./build.sh"| cut -f2 -d' '| tr -d \') pkgName=$(fission package create --src demo-src-pkg.zip --env python --buildcmd "./build.sh"| cut -f2 -d' '| tr -d \')
# wait for build to finish at most 60s # wait for build to finish at most 60s
timeout 60s bash -c "waitBuild $pkgName" timeout 60s bash -c "waitBuild $pkgName"
echo "Creating function " $fn log "Creating function " $fn
fission fn create --name $fn --pkg $pkgName --entrypoint "user.main" fission fn create --name $fn --pkg $pkgName --entrypoint "user.main"
trap "fission fn delete --name $fn" EXIT trap "fission fn delete --name $fn" EXIT
echo "Creating route" log "Creating route"
fission route create --function $fn --url /$fn --method GET fission route create --function $fn --url /$fn --method GET
echo "Waiting for router to catch up" log "Waiting for router to catch up"
sleep 3 sleep 3
checkFunctionResponse $fn 'a: 1 b: {c: 3, d: 4}' checkFunctionResponse $fn 'a: 1 b: {c: 3, d: 4}'
echo "Creating package with deploy archive" log "Creating package with deploy archive"
mkdir testDir mkdir testDir
touch testDir/__init__.py touch testDir/__init__.py
printf 'def main():\n return "Hello, world!"' > testDir/hello.py printf 'def main():\n return "Hello, world!"' > testDir/hello.py
zip -jr demo-deploy-pkg.zip testDir/ zip -jr demo-deploy-pkg.zip testDir/
pkgName=$(fission package create --deploy demo-deploy-pkg.zip --env python| cut -f2 -d' '| tr -d \') pkgName=$(fission package create --deploy demo-deploy-pkg.zip --env python| cut -f2 -d' '| tr -d \')
echo "Updating function " $fn log "Updating function " $fn
fission fn update --name $fn --pkg $pkgName --entrypoint "hello.main" fission fn update --name $fn --pkg $pkgName --entrypoint "hello.main"
trap "fission fn delete --name $fn" EXIT trap "fission fn delete --name $fn" EXIT
echo "Waiting for router to update cache" log "Waiting for router to update cache"
sleep 3 sleep 3
checkFunctionResponse $fn 'Hello, world!' checkFunctionResponse $fn 'Hello, world!'
@@ -97,4 +97,4 @@ checkFunctionResponse $fn 'Hello, world!'
# crappy cleanup, improve this later # crappy cleanup, improve this later
kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger kubectl get httptrigger -o name | tail -1 | cut -f2 -d'/' | xargs kubectl delete httptrigger
echo "All done." log "All done."
+3 -3
View File
@@ -5,8 +5,8 @@ set -euo pipefail
# This doesn't test fission, just the test framework. It ensures we # This doesn't test fission, just the test framework. It ensures we
# have the right environment, that's all. # have the right environment, that's all.
echo "Test test, please ignore." log "Test test, please ignore."
echo $FISSION_URL log $FISSION_URL
echo $FISSION_ROUTER log $FISSION_ROUTER
which fission which fission
@@ -15,7 +15,7 @@ cp cfgmap.py.template cfgmap.py
sed -i "s/{{ FN_CFGMAP }}/${fn_cfgmap}/g" cfgmap.py sed -i "s/{{ FN_CFGMAP }}/${fn_cfgmap}/g" cfgmap.py
function cleanup { function cleanup {
echo "Cleanup everything" log "Cleanup everything"
kubectl delete secret -n default ${fn_secret} kubectl delete secret -n default ${fn_secret}
kubectl delete configmap -n default ${fn_cfgmap} kubectl delete configmap -n default ${fn_cfgmap}
fission function delete --name ${fn_secret} fission function delete --name ${fn_secret}
@@ -30,84 +30,84 @@ function cleanup {
} }
# Create a hello world function in nodejs, test it with an http trigger # Create a hello world function in nodejs, test it with an http trigger
echo "Pre-test cleanup" log "Pre-test cleanup"
fission env delete --name python || true fission env delete --name python || true
echo "Creating python env" log "Creating python env"
fission env create --name python --image fission/python-env fission env create --name python --image fission/python-env
trap "fission env delete --name python" EXIT trap "fission env delete --name python" EXIT
echo "Creating secret" log "Creating secret"
kubectl create secret generic ${fn_secret} --from-literal=TEST_KEY="TESTVALUE" -n default kubectl create secret generic ${fn_secret} --from-literal=TEST_KEY="TESTVALUE" -n default
trap "kubectl delete secret ${fn_secret} -n default" EXIT trap "kubectl delete secret ${fn_secret} -n default" EXIT
echo "Creating function with secret" log "Creating function with secret"
fission fn create --name ${fn_secret} --env python --code secret.py --secret ${fn_secret} fission fn create --name ${fn_secret} --env python --code secret.py --secret ${fn_secret}
trap "fission fn delete --name ${fn_secret}" EXIT trap "fission fn delete --name ${fn_secret}" EXIT
echo "Creating route" log "Creating route"
fission route create --function ${fn_secret} --url /${fn_secret} --method GET fission route create --function ${fn_secret} --url /${fn_secret} --method GET
echo "Waiting for router to catch up" log "Waiting for router to catch up"
sleep 5 sleep 5
echo "HTTP GET on the function's route" log "HTTP GET on the function's route"
res=$(curl http://${FISSION_ROUTER}/${fn_secret}) res=$(curl http://${FISSION_ROUTER}/${fn_secret})
val='TESTVALUE' val='TESTVALUE'
if [[ ${res} != ${val} ]] if [[ ${res} != ${val} ]]
then then
echo "test secret failed" log "test secret failed"
cleanup cleanup
exit 1 exit 1
fi fi
echo "test secret passed" log "test secret passed"
echo "Creating configmap" log "Creating configmap"
kubectl create configmap ${fn_cfgmap} --from-literal=TEST_KEY=TESTVALUE -n default kubectl create configmap ${fn_cfgmap} --from-literal=TEST_KEY=TESTVALUE -n default
trap "kubectl delete configmap ${fn_cfgmap} -n default" EXIT trap "kubectl delete configmap ${fn_cfgmap} -n default" EXIT
echo "creating function with configmap" log "creating function with configmap"
fission fn create --name ${fn_cfgmap} --env python --code cfgmap.py --configmap ${fn_cfgmap} fission fn create --name ${fn_cfgmap} --env python --code cfgmap.py --configmap ${fn_cfgmap}
trap "fission fn delete --name ${fn_cfgmap}" EXIT trap "fission fn delete --name ${fn_cfgmap}" EXIT
echo "Creating route" log "Creating route"
fission route create --function ${fn_cfgmap} --url /${fn_cfgmap} --method GET fission route create --function ${fn_cfgmap} --url /${fn_cfgmap} --method GET
echo "Waiting for router to catch up" log "Waiting for router to catch up"
sleep 5 sleep 5
echo "HTTP GET on the function's route" log "HTTP GET on the function's route"
rescfg=$(curl http://${FISSION_ROUTER}/${fn_cfgmap}) rescfg=$(curl http://${FISSION_ROUTER}/${fn_cfgmap})
if [ ${rescfg} != ${val} ] if [ ${rescfg} != ${val} ]
then then
echo "test cfgmap failed" log "test cfgmap failed"
cleanup cleanup
exit 1 exit 1
fi fi
echo "test configmap passed" log "test configmap passed"
echo "testing creating a function without a secret or configmap" log "testing creating a function without a secret or configmap"
fission function create --name ${fn} --env python --code empty.py fission function create --name ${fn} --env python --code empty.py
trap "fission fn delete --name ${fn}" EXIT trap "fission fn delete --name ${fn}" EXIT
echo "Creating route" log "Creating route"
fission route create --function ${fn} --url /${fn} --method GET fission route create --function ${fn} --url /${fn} --method GET
echo "Waiting for router to catch up" log "Waiting for router to catch up"
sleep 5 sleep 5
echo "HTTP GET on the function's route" log "HTTP GET on the function's route"
resnormal=$(curl http://${FISSION_ROUTER}/${fn}) resnormal=$(curl http://${FISSION_ROUTER}/${fn})
if [ ${resnormal} != "yes" ] if [ ${resnormal} != "yes" ]
then then
echo "test empty failed" log "test empty failed"
cleanup cleanup
exit 1 exit 1
fi fi
echo "test empty passed" log "test empty passed"
echo "All done." log "All done."
trap "cleanup" EXIT trap "cleanup" EXIT