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

feat: adds a func environment command #1761

Merged
merged 5 commits into from
May 31, 2023
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
163 changes: 163 additions & 0 deletions cmd/environment.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
package cmd

import (
"encoding/json"
"fmt"
"os"
"strings"

"github.com/ory/viper"
"github.com/spf13/cobra"

"knative.dev/func/pkg/config"
"knative.dev/func/pkg/functions"
"knative.dev/func/pkg/k8s"
)

func NewEnvironmentCmd(newClient ClientFactory, version *Version) *cobra.Command {
cmd := &cobra.Command{
Use: "environment",
Short: "Display function execution environment information",
Long: `
NAME
{{rootCmdUse}} environment

SYNOPSIS
{{rootCmdUse}} environment - display function execution environment information

DESCRIPTION
Display information about the function execution environment, including
the version of func, the version of the function spec, the default builder,
available runtimes, and available templates.
`,
SuggestFor: []string{"env", "environemtn", "enviroment", "enviornment", "enviroment"},
RunE: func(cmd *cobra.Command, args []string) error {
return runEnvironment(cmd, newClient, version)
},
}
cfg, err := config.NewDefault()
if err != nil {
fmt.Fprintf(cmd.OutOrStdout(), "error loading config at '%v'. %v\n", config.File(), err)
}

addVerboseFlag(cmd, cfg.Verbose)

return cmd
}

type Environment struct {
Version string
GitRevision string
BuildDate string
SpecVersion string
SocatImage string
TarImage string
Languages []string
Templates map[string][]string
Environment []string
Cluster string
Defaults config.Global
}

func runEnvironment(cmd *cobra.Command, newClient ClientFactory, v *Version) (err error) {
cfg, err := newEnvironmentConfig()
if err != nil {
return
}

// Create a client to get runtimes and templates
client := functions.New(functions.WithVerbose(cfg.Verbose))

r, err := getRuntimes(client)
if err != nil {
return
}
t, err := getTemplates(client, r)
if err != nil {
return
}

// Get all environment variables that start with FUNC_
var envs []string
for _, e := range os.Environ() {
if strings.HasPrefix(e, "FUNC_") {
envs = append(envs, e)
}
}

// If no environment variables are set, make sure we return an empty array
// otherwise the output is "null" instead of "[]"
if len(envs) == 0 {
envs = make([]string, 0)
}

// Get global defaults
defaults, err := config.NewDefault()
if err != nil {
return
}

// Gets the cluster host
var host string
cc, err := k8s.GetClientConfig().ClientConfig()
if err != nil {
fmt.Printf("error getting client config %v\n", err)
} else {
host = cc.Host
}

environment := Environment{
Version: v.String(),
GitRevision: v.Hash,
BuildDate: v.Date,
SpecVersion: functions.LastSpecVersion(),
SocatImage: k8s.SocatImage,
TarImage: k8s.TarImage,
Languages: r,
Templates: t,
Environment: envs,
Cluster: host,
Defaults: defaults,
}

if s, err := json.MarshalIndent(environment, "", " "); err != nil {
return err
} else {
fmt.Fprintln(cmd.OutOrStdout(), string(s))
}

return nil
}

func getRuntimes(client *functions.Client) ([]string, error) {
runtimes, err := client.Runtimes()
if err != nil {
return nil, err
}
return runtimes, nil
}

func getTemplates(client *functions.Client, runtimes []string) (map[string][]string, error) {
templateMap := make(map[string][]string)
for _, runtime := range runtimes {
templates, err := client.Templates().List(runtime)
if err != nil {
return nil, err
}
templateMap[runtime] = templates
}
return templateMap, nil
}

type environmentConfig struct {
Verbose bool
// TODO: add format (e.g. JSON/YAML)
}

func newEnvironmentConfig() (cfg environmentConfig, err error) {
cfg = environmentConfig{
Verbose: viper.GetBool("verbose"),
}

return
}
1 change: 1 addition & 0 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ Learn more about Knative at: https://knative.dev`, cfg.Name),
NewLanguagesCmd(newClient),
NewTemplatesCmd(newClient),
NewRepositoryCmd(newClient),
NewEnvironmentCmd(newClient, &cfg.Version),
},
},
{
Expand Down
1 change: 1 addition & 0 deletions docs/reference/func.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ Learn more about Knative at: https://knative.dev
* [func delete](func_delete.md) - Undeploy a function
* [func deploy](func_deploy.md) - Deploy a function
* [func describe](func_describe.md) - Describe a function
* [func environment](func_environment.md) - Display function execution environment information
* [func invoke](func_invoke.md) - Invoke a local or remote function
* [func languages](func_languages.md) - List available function language runtimes
* [func list](func_list.md) - List deployed functions
Expand Down
34 changes: 34 additions & 0 deletions docs/reference/func_environment.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
## func environment

Display function execution environment information

### Synopsis


NAME
func environment

SYNOPSIS
func environment - display function execution environment information

DESCRIPTION
Display information about the function execution environment, including
the version of func, the version of the function spec, the default builder,
available runtimes, and available templates.


```
func environment
```

### Options

```
-h, --help help for environment
-v, --verbose Print verbose logs ($FUNC_VERBOSE)
```

### SEE ALSO

* [func](func.md) - func manages Knative Functions