Skip to content

Commit

Permalink
Improve func config envs (#1188)
Browse files Browse the repository at this point in the history
* Added ability to add env non-interactively
* Added ability to list envs as JSON

Signed-off-by: Matej Vasek <mvasek@redhat.com>

Signed-off-by: Matej Vasek <mvasek@redhat.com>
  • Loading branch information
matejvasek authored Aug 30, 2022
1 parent 70c6130 commit 56b1db3
Show file tree
Hide file tree
Showing 8 changed files with 319 additions and 54 deletions.
27 changes: 11 additions & 16 deletions cmd/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/AlecAivazis/survey/v2"
"github.com/AlecAivazis/survey/v2/terminal"
"github.com/ory/viper"
"github.com/spf13/cobra"

fn "knative.dev/kn-plugin-func"
Expand Down Expand Up @@ -43,7 +44,7 @@ func (s standardLoaderSaver) Save(f fn.Function) error {

var defaultLoaderSaver standardLoaderSaver

func NewConfigCmd() *cobra.Command {
func NewConfigCmd(loadSaver functionLoaderSaver) *cobra.Command {
cmd := &cobra.Command{
Use: "config",
Short: "Configure a function",
Expand All @@ -61,16 +62,16 @@ or from the directory specified with --path.

setPathFlag(cmd)

cmd.AddCommand(NewConfigLabelsCmd(defaultLoaderSaver))
cmd.AddCommand(NewConfigEnvsCmd())
cmd.AddCommand(NewConfigLabelsCmd(loadSaver))
cmd.AddCommand(NewConfigEnvsCmd(loadSaver))
cmd.AddCommand(NewConfigVolumesCmd())

return cmd
}

func runConfigCmd(cmd *cobra.Command, args []string) (err error) {

function, err := initConfigCommand(args, defaultLoaderSaver)
function, err := initConfigCommand(defaultLoaderSaver)
if err != nil {
return
}
Expand Down Expand Up @@ -128,7 +129,7 @@ func runConfigCmd(cmd *cobra.Command, args []string) (err error) {
if answers.SelectedConfig == "Volumes" {
listVolumes(function)
} else if answers.SelectedConfig == "Environment variables" {
listEnvs(function)
err = listEnvs(function, cmd.OutOrStdout(), Human)
} else if answers.SelectedConfig == "Labels" {
listLabels(function)
}
Expand All @@ -141,25 +142,19 @@ func runConfigCmd(cmd *cobra.Command, args []string) (err error) {
// ------------------------------

type configCmdConfig struct {
Name string
Path string
Verbose bool
}

func newConfigCmdConfig(args []string) configCmdConfig {
var name string
if len(args) > 0 {
name = args[0]
}
func newConfigCmdConfig() configCmdConfig {
return configCmdConfig{
Name: deriveName(name, getPathFlag()),
Path: getPathFlag(),
Path: getPathFlag(),
Verbose: viper.GetBool("verbose"),
}

}

func initConfigCommand(args []string, loader functionLoader) (fn.Function, error) {
config := newConfigCmdConfig(args)
func initConfigCommand(loader functionLoader) (fn.Function, error) {
config := newConfigCmdConfig()

function, err := loader.Load(config.Path)
if err != nil {
Expand Down
110 changes: 87 additions & 23 deletions cmd/config_envs.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,23 @@ package cmd

import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
"os"

"github.com/AlecAivazis/survey/v2"
"github.com/AlecAivazis/survey/v2/terminal"
"github.com/ory/viper"
"github.com/spf13/cobra"

fn "knative.dev/kn-plugin-func"
"knative.dev/kn-plugin-func/k8s"
"knative.dev/kn-plugin-func/utils"
)

func NewConfigEnvsCmd() *cobra.Command {
func NewConfigEnvsCmd(loadSaver functionLoaderSaver) *cobra.Command {
cmd := &cobra.Command{
Use: "envs",
Short: "List and manage configured environment variable for a function",
Expand All @@ -25,20 +28,20 @@ Prints configured Environment variable for a function project present in
the current directory or from the directory specified with --path.
`,
SuggestFor: []string{"ensv", "env"},
PreRunE: bindEnv("path"),
PreRunE: bindEnv("path", "output"),
RunE: func(cmd *cobra.Command, args []string) (err error) {
function, err := initConfigCommand(args, defaultLoaderSaver)
function, err := initConfigCommand(loadSaver)
if err != nil {
return
}

listEnvs(function)

return
return listEnvs(function, cmd.OutOrStdout(), Format(viper.GetString("output")))
},
}

configEnvsAddCmd := NewConfigEnvsAddCmd()
cmd.Flags().StringP("output", "o", "human", "Output format (human|json) (Env: $FUNC_OUTPUT)")

configEnvsAddCmd := NewConfigEnvsAddCmd(loadSaver)
configEnvsRemoveCmd := NewConfigEnvsRemoveCmd()

setPathFlag(cmd)
Expand All @@ -51,29 +54,78 @@ the current directory or from the directory specified with --path.
return cmd
}

func NewConfigEnvsAddCmd() *cobra.Command {
func NewConfigEnvsAddCmd(loadSaver functionLoaderSaver) *cobra.Command {
cmd := &cobra.Command{
Use: "add",
Short: "Add environment variable to the function configuration",
Long: `Add environment variable to the function configuration
Long: `Add environment variable to the function configuration.
Interactive prompt to add Environment variables to the function project
in the current directory or from the directory specified with --path.
If environment variable is not set explicitly by flag, interactive prompt is used.
The environment variable can be set directly from a value,
from an environment variable on the local machine or from Secrets and ConfigMaps.
`,
It is also possible to import all keys as environment variables from a Secret or ConfigMap.`,
Example: `# set environment variable directly
{{.Name}} config envs add --name=VARNAME --value=myValue
# set environment variable from local env $LOC_ENV
{{.Name}} config envs add --name=VARNAME --value='{{"{{"}} env:LOC_ENV {{"}}"}}'
set environment variable from a secret
{{.Name}} config envs add --name=VARNAME --value='{{"{{"}} secret:secretName:key {{"}}"}}'
# set all key as environment variables from a secret
{{.Name}} config envs add --value='{{"{{"}} secret:secretName {{"}}"}}'
# set environment variable from a configMap
{{.Name}} config envs add --name=VARNAME --value='{{"{{"}} configMap:confMapName:key {{"}}"}}'
# set all key as environment variables from a configMap
{{.Name}} config envs add --value='{{"{{"}} configMap:confMapName {{"}}"}}'`,
SuggestFor: []string{"ad", "create", "insert", "append"},
PreRunE: bindEnv("path"),
PreRunE: bindEnv("path", "name", "value"),
RunE: func(cmd *cobra.Command, args []string) (err error) {
function, err := initConfigCommand(args, defaultLoaderSaver)
function, err := initConfigCommand(loadSaver)
if err != nil {
return
}

var np *string
var vp *string

if cmd.Flags().Changed("name") {
s, e := cmd.Flags().GetString("name")
if e != nil {
return e
}
np = &s
}
if cmd.Flags().Changed("value") {
s, e := cmd.Flags().GetString("value")
if e != nil {
return e
}
vp = &s
}

if np != nil || vp != nil {
if np != nil {
if err := utils.ValidateEnvVarName(*np); err != nil {
return err
}
}

function.Envs = append(function.Envs, fn.Env{Name: np, Value: vp})
return loadSaver.Save(function)
}

return runAddEnvsPrompt(cmd.Context(), function)
},
}

cmd.Flags().StringP("name", "", "", "Name of the environment variable.")
cmd.Flags().StringP("value", "", "", "Value of the environment variable.")

cmd.SetHelpFunc(defaultTemplatedHelp)
return cmd
}
Expand All @@ -90,7 +142,7 @@ in the current directory or from the directory specified with --path.
SuggestFor: []string{"rm", "del", "delete", "rmeove"},
PreRunE: bindEnv("path"),
RunE: func(cmd *cobra.Command, args []string) (err error) {
function, err := initConfigCommand(args, defaultLoaderSaver)
function, err := initConfigCommand(defaultLoaderSaver)
if err != nil {
return
}
Expand All @@ -101,15 +153,27 @@ in the current directory or from the directory specified with --path.

}

func listEnvs(f fn.Function) {
if len(f.Envs) == 0 {
fmt.Println("There aren't any configured Environment variables")
return
}
func listEnvs(f fn.Function, w io.Writer, outputFormat Format) error {
switch outputFormat {
case Human:
if len(f.Envs) == 0 {
_, err := fmt.Fprintln(w, "There aren't any configured Environment variables")
return err
}

fmt.Println("Configured Environment variables:")
for _, e := range f.Envs {
fmt.Println(" - ", e.String())
fmt.Println("Configured Environment variables:")
for _, e := range f.Envs {
_, err := fmt.Fprintln(w, " - ", e.String())
if err != nil {
return err
}
}
return nil
case JSON:
enc := json.NewEncoder(w)
return enc.Encode(f.Envs)
default:
return fmt.Errorf("bad format: %v", outputFormat)
}
}

Expand Down
6 changes: 3 additions & 3 deletions cmd/config_labels.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ the current directory or from the directory specified with --path.
SuggestFor: []string{"albels", "abels", "label"},
PreRunE: bindEnv("path"),
RunE: func(cmd *cobra.Command, args []string) (err error) {
function, err := initConfigCommand(args, loaderSaver)
function, err := initConfigCommand(loaderSaver)
if err != nil {
return
}
Expand All @@ -51,7 +51,7 @@ the local machine.
SuggestFor: []string{"ad", "create", "insert", "append"},
PreRunE: bindEnv("path"),
RunE: func(cmd *cobra.Command, args []string) (err error) {
function, err := initConfigCommand(args, loaderSaver)
function, err := initConfigCommand(loaderSaver)
if err != nil {
return
}
Expand All @@ -72,7 +72,7 @@ directory or from the directory specified with --path.
SuggestFor: []string{"del", "delete", "rmeove"},
PreRunE: bindEnv("path"),
RunE: func(cmd *cobra.Command, args []string) (err error) {
function, err := initConfigCommand(args, loaderSaver)
function, err := initConfigCommand(loaderSaver)
if err != nil {
return
}
Expand Down
Loading

0 comments on commit 56b1db3

Please sign in to comment.