Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve func config envs #1188

Merged
merged 1 commit into from
Aug 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
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)")
matejvasek marked this conversation as resolved.
Show resolved Hide resolved

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