Skip to content

Commit

Permalink
add support for environment variables in functions
Browse files Browse the repository at this point in the history
  • Loading branch information
pfandzelter committed Aug 30, 2023
1 parent 4fd23c0 commit eea6676
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 21 deletions.
4 changes: 3 additions & 1 deletion clean.sh
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ fi
images=$(docker image ls -q --filter label=$TF_TAG)

if [ -n "$images" ]; then
docker rmi "$images" > /dev/null
for image in $images; do
docker image rm "$image" > /dev/null
done
else
echo "No old images to remove. Skipping..."
fi
Expand Down
51 changes: 39 additions & 12 deletions cmd/manager/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"os/exec"
"os/signal"
"strconv"
"strings"

"github.com/OpenFogStack/tinyFaaS/pkg/docker"
"github.com/OpenFogStack/tinyFaaS/pkg/manager"
Expand Down Expand Up @@ -192,10 +193,11 @@ func (s *server) uploadHandler(w http.ResponseWriter, r *http.Request) {

// parse request
d := struct {
FunctionName string `json:"name"`
FunctionEnv string `json:"env"`
FunctionThreads int `json:"threads"`
FunctionZip string `json:"zip"`
FunctionName string `json:"name"`
FunctionEnv string `json:"env"`
FunctionThreads int `json:"threads"`
FunctionZip string `json:"zip"`
FunctionEnvs []string `json:"envs"`
}{}

err := json.NewDecoder(r.Body).Decode(&d)
Expand All @@ -205,9 +207,21 @@ func (s *server) uploadHandler(w http.ResponseWriter, r *http.Request) {
return
}

log.Println("got request to upload function: Name", d.FunctionName, "Env", d.FunctionEnv, "Threads", d.FunctionThreads, "Bytes", len(d.FunctionZip))
log.Println("got request to upload function: Name", d.FunctionName, "Env", d.FunctionEnv, "Threads", d.FunctionThreads, "Bytes", len(d.FunctionZip), "Envs", d.FunctionEnvs)

res, err := s.ms.Upload(d.FunctionName, d.FunctionEnv, d.FunctionThreads, d.FunctionZip)
envs := make(map[string]string)
for _, e := range d.FunctionEnvs {
k, v, ok := strings.Cut(e, "=")

if !ok {
log.Println("invalid env:", e)
continue
}

envs[k] = v
}

res, err := s.ms.Upload(d.FunctionName, d.FunctionEnv, d.FunctionThreads, d.FunctionZip, envs)

if err != nil {
w.WriteHeader(http.StatusInternalServerError)
Expand Down Expand Up @@ -336,11 +350,12 @@ func (s *server) urlUploadHandler(w http.ResponseWriter, r *http.Request) {

// parse request
d := struct {
FunctionName string `json:"name"`
FunctionEnv string `json:"env"`
FunctionThreads int `json:"threads"`
FunctionURL string `json:"url"`
SubFolder string `json:"subfolder_path"`
FunctionName string `json:"name"`
FunctionEnv string `json:"env"`
FunctionThreads int `json:"threads"`
FunctionURL string `json:"url"`
FunctionEnvs []string `json:"envs"`
SubFolder string `json:"subfolder_path"`
}{}

err := json.NewDecoder(r.Body).Decode(&d)
Expand All @@ -352,7 +367,19 @@ func (s *server) urlUploadHandler(w http.ResponseWriter, r *http.Request) {

log.Println("got request to upload function:", d)

res, err := s.ms.UrlUpload(d.FunctionName, d.FunctionEnv, d.FunctionThreads, d.FunctionURL, d.SubFolder)
envs := make(map[string]string)
for _, e := range d.FunctionEnvs {
k, v, ok := strings.Cut(e, "=")

if !ok {
log.Println("invalid env:", e)
continue
}

envs[k] = v
}

res, err := s.ms.UrlUpload(d.FunctionName, d.FunctionEnv, d.FunctionThreads, d.FunctionURL, d.SubFolder, envs)

if err != nil {
w.WriteHeader(http.StatusInternalServerError)
Expand Down
9 changes: 8 additions & 1 deletion pkg/docker/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func (db *DockerBackend) Stop() error {
return nil
}

func (db *DockerBackend) Create(name string, env string, threads int, filedir string) (manager.Handler, error) {
func (db *DockerBackend) Create(name string, env string, threads int, filedir string, envs map[string]string) (manager.Handler, error) {

// make a unique function name by appending uuid string to function name
uuid, err := uuid.NewRandom()
Expand Down Expand Up @@ -165,6 +165,12 @@ func (db *DockerBackend) Create(name string, env string, threads int, filedir st

log.Println("created network", dh.uniqueName, "with id", network.ID)

e := make([]string, 0, len(envs))

for k, v := range envs {
e = append(e, fmt.Sprintf("%s=%s", k, v))
}

// create containers
// docker run -d --network <network> --name <container> <image>
for i := 0; i < dh.threads; i++ {
Expand All @@ -176,6 +182,7 @@ func (db *DockerBackend) Create(name string, env string, threads int, filedir st
"tinyfaas-function": dh.name,
"tinyFaaS": db.tinyFaaSID,
},
Env: e,
},
&container.HostConfig{
NetworkMode: container.NetworkMode(dh.uniqueName),
Expand Down
14 changes: 7 additions & 7 deletions pkg/manager/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ type ManagementService struct {
}

type Backend interface {
Create(name string, env string, threads int, filedir string) (Handler, error)
Create(name string, env string, threads int, filedir string, envs map[string]string) (Handler, error)
Stop() error
}

Expand All @@ -57,7 +57,7 @@ func New(id string, rproxyListenAddress string, rproxyPort map[string]int, rprox
return ms
}

func (ms *ManagementService) createFunction(name string, env string, threads int, funczip []byte, subfolderPath string) (string, error) {
func (ms *ManagementService) createFunction(name string, env string, threads int, funczip []byte, subfolderPath string, envs map[string]string) (string, error) {

// only allow alphanumeric characters
if !util.IsAlphaNumeric(name) {
Expand Down Expand Up @@ -130,7 +130,7 @@ func (ms *ManagementService) createFunction(name string, env string, threads int
ms.functionHandlersMutex.Lock()
defer ms.functionHandlersMutex.Unlock()

fh, err := ms.backend.Create(name, env, threads, p)
fh, err := ms.backend.Create(name, env, threads, p, envs)

if err != nil {
return "", err
Expand Down Expand Up @@ -287,7 +287,7 @@ func (ms *ManagementService) Delete(name string) error {
return nil
}

func (ms *ManagementService) Upload(name string, env string, threads int, zipped string) (string, error) {
func (ms *ManagementService) Upload(name string, env string, threads int, zipped string, envs map[string]string) (string, error) {

// b64 decode zip
zip, err := base64.StdEncoding.DecodeString(zipped)
Expand All @@ -298,7 +298,7 @@ func (ms *ManagementService) Upload(name string, env string, threads int, zipped
}

// create function handler
n, err := ms.createFunction(name, env, threads, zip, "")
n, err := ms.createFunction(name, env, threads, zip, "", envs)

if err != nil {
// w.WriteHeader(http.StatusInternalServerError)
Expand All @@ -316,7 +316,7 @@ func (ms *ManagementService) Upload(name string, env string, threads int, zipped
return r, nil
}

func (ms *ManagementService) UrlUpload(name string, env string, threads int, funcurl string, subfolder string) (string, error) {
func (ms *ManagementService) UrlUpload(name string, env string, threads int, funcurl string, subfolder string, envs map[string]string) (string, error) {

// download url
resp, err := http.Get(funcurl)
Expand All @@ -337,7 +337,7 @@ func (ms *ManagementService) UrlUpload(name string, env string, threads int, fun
}

// create function handler
n, err := ms.createFunction(name, env, threads, zip, subfolder)
n, err := ms.createFunction(name, env, threads, zip, subfolder, envs)

if err != nil {
// w.WriteHeader(http.StatusInternalServerError)
Expand Down

0 comments on commit eea6676

Please sign in to comment.