Skip to content

Commit eea6676

Browse files
committed
add support for environment variables in functions
1 parent 4fd23c0 commit eea6676

File tree

4 files changed

+57
-21
lines changed

4 files changed

+57
-21
lines changed

clean.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ fi
2626
images=$(docker image ls -q --filter label=$TF_TAG)
2727

2828
if [ -n "$images" ]; then
29-
docker rmi "$images" > /dev/null
29+
for image in $images; do
30+
docker image rm "$image" > /dev/null
31+
done
3032
else
3133
echo "No old images to remove. Skipping..."
3234
fi

cmd/manager/main.go

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"os/exec"
1212
"os/signal"
1313
"strconv"
14+
"strings"
1415

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

193194
// parse request
194195
d := struct {
195-
FunctionName string `json:"name"`
196-
FunctionEnv string `json:"env"`
197-
FunctionThreads int `json:"threads"`
198-
FunctionZip string `json:"zip"`
196+
FunctionName string `json:"name"`
197+
FunctionEnv string `json:"env"`
198+
FunctionThreads int `json:"threads"`
199+
FunctionZip string `json:"zip"`
200+
FunctionEnvs []string `json:"envs"`
199201
}{}
200202

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

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

210-
res, err := s.ms.Upload(d.FunctionName, d.FunctionEnv, d.FunctionThreads, d.FunctionZip)
212+
envs := make(map[string]string)
213+
for _, e := range d.FunctionEnvs {
214+
k, v, ok := strings.Cut(e, "=")
215+
216+
if !ok {
217+
log.Println("invalid env:", e)
218+
continue
219+
}
220+
221+
envs[k] = v
222+
}
223+
224+
res, err := s.ms.Upload(d.FunctionName, d.FunctionEnv, d.FunctionThreads, d.FunctionZip, envs)
211225

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

337351
// parse request
338352
d := struct {
339-
FunctionName string `json:"name"`
340-
FunctionEnv string `json:"env"`
341-
FunctionThreads int `json:"threads"`
342-
FunctionURL string `json:"url"`
343-
SubFolder string `json:"subfolder_path"`
353+
FunctionName string `json:"name"`
354+
FunctionEnv string `json:"env"`
355+
FunctionThreads int `json:"threads"`
356+
FunctionURL string `json:"url"`
357+
FunctionEnvs []string `json:"envs"`
358+
SubFolder string `json:"subfolder_path"`
344359
}{}
345360

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

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

355-
res, err := s.ms.UrlUpload(d.FunctionName, d.FunctionEnv, d.FunctionThreads, d.FunctionURL, d.SubFolder)
370+
envs := make(map[string]string)
371+
for _, e := range d.FunctionEnvs {
372+
k, v, ok := strings.Cut(e, "=")
373+
374+
if !ok {
375+
log.Println("invalid env:", e)
376+
continue
377+
}
378+
379+
envs[k] = v
380+
}
381+
382+
res, err := s.ms.UrlUpload(d.FunctionName, d.FunctionEnv, d.FunctionThreads, d.FunctionURL, d.SubFolder, envs)
356383

357384
if err != nil {
358385
w.WriteHeader(http.StatusInternalServerError)

pkg/docker/handler.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (db *DockerBackend) Stop() error {
6363
return nil
6464
}
6565

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

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

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

168+
e := make([]string, 0, len(envs))
169+
170+
for k, v := range envs {
171+
e = append(e, fmt.Sprintf("%s=%s", k, v))
172+
}
173+
168174
// create containers
169175
// docker run -d --network <network> --name <container> <image>
170176
for i := 0; i < dh.threads; i++ {
@@ -176,6 +182,7 @@ func (db *DockerBackend) Create(name string, env string, threads int, filedir st
176182
"tinyfaas-function": dh.name,
177183
"tinyFaaS": db.tinyFaaSID,
178184
},
185+
Env: e,
179186
},
180187
&container.HostConfig{
181188
NetworkMode: container.NetworkMode(dh.uniqueName),

pkg/manager/manager.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type ManagementService struct {
3232
}
3333

3434
type Backend interface {
35-
Create(name string, env string, threads int, filedir string) (Handler, error)
35+
Create(name string, env string, threads int, filedir string, envs map[string]string) (Handler, error)
3636
Stop() error
3737
}
3838

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

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

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

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

135135
if err != nil {
136136
return "", err
@@ -287,7 +287,7 @@ func (ms *ManagementService) Delete(name string) error {
287287
return nil
288288
}
289289

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

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

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

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

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

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

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

342342
if err != nil {
343343
// w.WriteHeader(http.StatusInternalServerError)

0 commit comments

Comments
 (0)