Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
3a21562
feat(client): expand config; read from existing config file
mattrent Mar 26, 2023
de6c955
ci(lint): increase golangcilint timeout
mattrent Mar 26, 2023
67b1594
fix(fn_service): add missing api auth token in requests
mattrent Mar 27, 2023
74ae47f
test(fn_service): add nil check and fix fn_service tests
mattrent Mar 27, 2023
af6006a
fix(mod_service): add missing auth token in requests
mattrent Mar 27, 2023
6e746af
fix(user_service): add missing auth token in requests
mattrent Mar 27, 2023
f039283
feat(cfg): add cfg subcommand for config management
mattrent Mar 29, 2023
e0ad245
test(cfg): add cfg tests
mattrent Mar 29, 2023
88042c0
fix(cfg): handle missing config file; set correct host key
mattrent Mar 29, 2023
fa40157
feat(client): add injecthost function to services
mattrent Mar 31, 2023
98c2dda
fix(client): add custom type for fl context keys
mattrent Mar 31, 2023
322d860
feat(command): add override host flag in user/fn/mod subcommands
mattrent Mar 31, 2023
922a8f8
test(command): fix tests for fn/user/mod subcommands
mattrent Mar 31, 2023
a9dad4d
Merge branch 'main' into fixes
mattrent Apr 1, 2023
52336bd
feat(deploy): add secret_key_base from config in docker env
mattrent Apr 2, 2023
14385eb
test: fix docker-related tests and mocks
mattrent Apr 2, 2023
3c33a85
fix(docker): correctly handle custom worker/core images
mattrent Apr 2, 2023
89360fe
test(docker): fix docker-up image swap tests
mattrent Apr 2, 2023
f3b765f
feat: add auth token logging in docker deploy
mattrent Apr 2, 2023
d9f176f
test: fix docker tests and mocks
mattrent Apr 2, 2023
e62b30a
feat(deploy): inject secret_key_base from config in k8s secret
mattrent Apr 3, 2023
1dffa1a
feat(deploy): add token extraction from fl-core pod in k8s deployment
mattrent Apr 3, 2023
a67300b
test(deploy): fix k8s tests and mocks
mattrent Apr 3, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
# working-directory: somedir

# Optional: golangci-lint command line arguments.
# args: --issues-exit-code=0
args: --timeout=3m

# Optional: show only new issues if it's a pull request. The default value is `false`.
# only-new-issues: true
Expand Down
11 changes: 9 additions & 2 deletions cmd/fl/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (

"github.com/alecthomas/kong"
"github.com/funlessdev/fl-cli/internal/command/admin"
"github.com/funlessdev/fl-cli/internal/command/cfg"
"github.com/funlessdev/fl-cli/internal/command/fn"
"github.com/funlessdev/fl-cli/internal/command/mod"
"github.com/funlessdev/fl-cli/internal/command/template"
Expand All @@ -36,6 +37,7 @@ type CLI struct {
Mod mod.Mod `cmd:"" help:"Create, delete and manage modules"`
Admin admin.Admin `cmd:"" aliases:"a" help:"Deploy and manage the platform"`
Template template.Template `cmd:"" help:"Pull function templates"`
Cfg cfg.Cfg `cmd:"" aliases:"c,config" help:"Manage local configuration"`

Version kong.VersionFlag `short:"v" cmd:"" passthrough:"" help:"Show fl version"`
}
Expand All @@ -56,7 +58,10 @@ func ParseCMD(version string) (*kong.Context, error) {
return nil, err
}

flConfig := client.Config{Host: "http://localhost:4000"}
flConfig, err := client.NewConfig(pkg.ConfigFileName)
if err != nil {
return nil, err
}
flClient, err := client.NewClient(http.DefaultClient, flConfig)
validator := client.InputValidator{}
if err != nil {
Expand All @@ -78,14 +83,16 @@ func ParseCMD(version string) (*kong.Context, error) {
kong.BindTo(ctx, (*context.Context)(nil)),
kong.BindTo(fnSvc, (*client.FnHandler)(nil)),
kong.BindTo(modSvc, (*client.ModHandler)(nil)),
kong.BindTo(userSvc, (*client.UserHandler)(nil)),
kong.BindTo(logger, (*log.FLogger)(nil)),
kong.BindTo(dockerShell, (*deploy.DockerShell)(nil)),
kong.BindTo(kubernetesDeployer, (*deploy.KubernetesDeployer)(nil)),
kong.BindTo(kubernetesRemover, (*deploy.KubernetesRemover)(nil)),
kong.BindTo(wasmBuilder, (*build.DockerBuilder)(nil)),
kong.BindTo(userSvc, (*client.UserHandler)(nil)),
kong.BindTo(flConfig, (*client.Config)(nil)),
kong.Vars{
"version": version,
"config_keys": pkg.ConfigKeys,
"default_core_image": pkg.CoreImg,
"default_worker_image": pkg.WorkerImg,
},
Expand Down
7 changes: 4 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ require (
github.com/funlessdev/fl-client-sdk-go v0.0.0-20230312081443-2c80f8dc5ba5
github.com/theckman/yacspin v0.13.12
golang.org/x/exp v0.0.0-20230223210539-50820d90acfd
gopkg.in/yaml.v2 v2.4.0
gotest.tools/v3 v3.4.0
k8s.io/api v0.26.1
k8s.io/apimachinery v0.26.1
Expand Down Expand Up @@ -51,7 +52,7 @@ require (
github.com/google/gnostic v0.6.9 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/imdario/mergo v0.3.13 // indirect
github.com/imdario/mergo v0.3.14 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
Expand All @@ -60,6 +61,7 @@ require (
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.17 // indirect
github.com/mattn/go-runewidth v0.0.14 // indirect
github.com/moby/spdystream v0.2.0 // indirect
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
Expand Down Expand Up @@ -89,7 +91,6 @@ require (
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/klog/v2 v2.90.0 // indirect
k8s.io/kube-openapi v0.0.0-20230127205639-68031ae9242a // indirect
Expand All @@ -103,5 +104,5 @@ require (
github.com/go-git/go-git/v5 v5.5.2
github.com/mitchellh/go-homedir v1.1.0
github.com/pkg/errors v0.9.1 // indirect
github.com/stretchr/testify v1.8.1
github.com/stretchr/testify v1.8.2
)
14 changes: 8 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5Xh
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc=
github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ=
github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
Expand All @@ -59,10 +60,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=
github.com/funlessdev/fl-client-sdk-go v0.0.0-20230126150929-357b8efdaab0 h1:sR6tDlHDrfvheLt8cDQddgE5nUX+mD5d2nmAEiFZD98=
github.com/funlessdev/fl-client-sdk-go v0.0.0-20230126150929-357b8efdaab0/go.mod h1:ysqKhDMya3Qzmu37XEpkbGuNWk67I88e93g47GT5vz4=
github.com/funlessdev/fl-client-sdk-go v0.0.0-20230218195230-0cef4bf202e2 h1:8GtBi2j3ApEv8ffiasZLsVKVwyGKhF3PqC9Ip7DGeTA=
github.com/funlessdev/fl-client-sdk-go v0.0.0-20230218195230-0cef4bf202e2/go.mod h1:hnAtdQhg4An6FDhte2RWdM5C6v2kZ78+f/4/dN/+cGU=
github.com/funlessdev/fl-client-sdk-go v0.0.0-20230312081443-2c80f8dc5ba5 h1:8Ax6MDbmmXOM/+McMj2iR3DC/BX6XnQpWPX7GfE0Gy4=
github.com/funlessdev/fl-client-sdk-go v0.0.0-20230312081443-2c80f8dc5ba5/go.mod h1:hnAtdQhg4An6FDhte2RWdM5C6v2kZ78+f/4/dN/+cGU=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
Expand Down Expand Up @@ -119,10 +116,12 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
github.com/imdario/mergo v0.3.14 h1:fOqeC1+nCuuk6PKQdg9YmosXX7Y7mHX6R/0ZldI9iHo=
github.com/imdario/mergo v0.3.14/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
Expand Down Expand Up @@ -155,6 +154,8 @@ github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWV
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8=
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
Expand Down Expand Up @@ -209,8 +210,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/theckman/yacspin v0.13.12 h1:CdZ57+n0U6JMuh2xqjnjRq5Haj6v1ner2djtLQRzJr4=
github.com/theckman/yacspin v0.13.12/go.mod h1:Rd2+oG2LmQi5f3zC3yeZAOl245z8QOvrH4OPOJNZxLg=
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
Expand Down
4 changes: 2 additions & 2 deletions internal/command/admin/deploy/docker/docker_down.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func (r *Down) Run(ctx context.Context, dk deploy.DockerShell, logger log.FLogge
if err != nil {
errorMsg := "unable to read docker-compose.yml file"
if os.IsNotExist(err) {
lines, _ := dk.ComposeList()
lines, _ := dk.ComposeList(ctx)
if slices.Contains(lines, "fl") {
errorMsg = "unable to locate docker-compose.yml, but a local deployment was found. The file might have been moved or deleted."
} else {
Expand All @@ -45,7 +45,7 @@ func (r *Down) Run(ctx context.Context, dk deploy.DockerShell, logger log.FLogge
}
defer os.Remove(composeFilePath)

err = dk.ComposeDown(composeFilePath)
err = dk.ComposeDown(ctx, composeFilePath)
if err != nil {
return err
}
Expand Down
9 changes: 5 additions & 4 deletions internal/command/admin/deploy/docker/docker_down_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (

"github.com/funlessdev/fl-cli/pkg/homedir"
"github.com/funlessdev/fl-cli/test/mocks"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)

Expand Down Expand Up @@ -60,7 +61,7 @@ func TestDockerDownRun(t *testing.T) {
require.NoError(t, err)

out.Reset()
mockDockerShell.On("ComposeDown", path).Return(errors.New("some compose down error")).Once()
mockDockerShell.On("ComposeDown", mock.Anything, path).Return(errors.New("some compose down error")).Once()

err = down.Run(ctx, mockDockerShell, logger)
require.Error(t, err)
Expand All @@ -78,7 +79,7 @@ func TestDockerDownRun(t *testing.T) {
}()

out.Reset()
mockDockerShell.On("ComposeList").Return([]string{"fl"}, nil).Once()
mockDockerShell.On("ComposeList", mock.Anything).Return([]string{"fl"}, nil).Once()

err = down.Run(ctx, mockDockerShell, logger)
require.Error(t, err)
Expand All @@ -98,7 +99,7 @@ func TestDockerDownRun(t *testing.T) {
}()

out.Reset()
mockDockerShell.On("ComposeList").Return([]string{"test"}, nil).Once()
mockDockerShell.On("ComposeList", mock.Anything).Return([]string{"test"}, nil).Once()

err = down.Run(ctx, mockDockerShell, logger)
require.Error(t, err)
Expand All @@ -111,7 +112,7 @@ func TestDockerDownRun(t *testing.T) {
require.NoError(t, err)

out.Reset()
mockDockerShell.On("ComposeDown", path).Return(nil)
mockDockerShell.On("ComposeDown", mock.Anything, path).Return(nil)

err = down.Run(ctx, mockDockerShell, logger)
require.NoError(t, err)
Expand Down
51 changes: 38 additions & 13 deletions internal/command/admin/deploy/docker/docker_up.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ import (
"errors"
"io"
"net/http"
"strings"

"github.com/funlessdev/fl-cli/pkg"
"github.com/funlessdev/fl-cli/pkg/client"
"github.com/funlessdev/fl-cli/pkg/deploy"
"github.com/funlessdev/fl-cli/pkg/homedir"
"github.com/funlessdev/fl-cli/pkg/log"
"gopkg.in/yaml.v2"
)

const (
Expand Down Expand Up @@ -52,9 +53,12 @@ EXAMPLES
$ fl admin deploy docker up --core <your-core-image> --worker <your-worker-image>`
}

func (u *Up) Run(ctx context.Context, dk deploy.DockerShell, logger log.FLogger) error {
func (u *Up) Run(ctx context.Context, dk deploy.DockerShell, logger log.FLogger, config client.Config) error {
logger.Info("Deploying FunLess locally...\n\n")

cmdEnv := map[string]string{"SECRET_KEY_BASE": config.SecretKeyBase}
ctx = context.WithValue(ctx, pkg.FLContextKey("env"), cmdEnv)

_ = logger.StartSpinner("Setting things up...")

composeFilePath, err := downloadFile("docker-compose.yml", dockerComposeYmlUrl)
Expand Down Expand Up @@ -84,11 +88,20 @@ func (u *Up) Run(ctx context.Context, dk deploy.DockerShell, logger log.FLogger)

_ = logger.StopSpinner(nil)

if err := dk.ComposeUp(composeFilePath); err != nil {
if err := dk.ComposeUp(ctx, composeFilePath); err != nil {
return err
}

logger.Info("\nDeployment complete!\n")
logger.Info("\nExtracting auth tokens... 🔒\n\n")

err = dk.LogTokens(ctx)
if err != nil {
logger.Info("Couldn't extract auth tokens from core container. Completing deployment...")
} else {
logger.Info("\n\nRemember to add these tokens in ~/.fl/config as api_token and admin_token.")
}

logger.Info("\n\nDeployment complete!\n")
logger.Info("You can now start using FunLess! 🎉\n")

return nil
Expand Down Expand Up @@ -141,23 +154,35 @@ func downloadFolderFile(folder, file, url string) error {
}

func replaceImages(core string, worker string) error {
if core == pkg.CoreImg && worker == pkg.WorkerImg {
return nil
}

content, _, err := homedir.ReadFromConfigDir("docker-compose.yml")
if err != nil {
return errors.New("unable to read docker-compose.yml")
}

newCompose := string(content)
if core != pkg.CoreImg {
newCompose = strings.Replace(string(content), pkg.CoreImg, core, 1)
var composeYaml map[string]interface{}
err = yaml.Unmarshal(content, &composeYaml)
if err != nil {
return err
}
if worker != pkg.WorkerImg {
newCompose = strings.Replace(newCompose, pkg.WorkerImg, worker, 1)

svc := composeYaml["services"].(map[interface{}]interface{})
svcCore := svc["core"].(map[interface{}]interface{})
svcWorker := svc["worker"].(map[interface{}]interface{})

svcCore["image"] = core
svcWorker["image"] = worker

svc["core"] = svcCore
svc["worker"] = svcWorker
composeYaml["services"] = svc

newCompose, err := yaml.Marshal(composeYaml)

if err != nil {
return err
}

_, err = homedir.WriteToConfigDir("docker-compose.yml", []byte(newCompose), true)

return err
}
Loading