mirror of
https://github.com/redhat-developer/odo.git
synced 2025-10-19 03:06:19 +03:00
add config command for toggling update checker (#589)
* add odo utils config command for enable/disable parameters - add config command - create a new field 'config' in odoconfig file for storing odo specific configurations * update CLI structure in Readme.md
This commit is contained in:
committed by
Charlie Drage
parent
8ced49f7ae
commit
2bb2dca872
@@ -119,7 +119,6 @@ $ curl nodejs-myproject.192.168.42.147.nip.io
|
|||||||
Multiple component types are currently supported, like nodejs, perl, php, python, ruby, etc.
|
Multiple component types are currently supported, like nodejs, perl, php, python, ruby, etc.
|
||||||
|
|
||||||
## CLI Structure
|
## CLI Structure
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
odo --verbose : Odo (Openshift Do)
|
odo --verbose : Odo (Openshift Do)
|
||||||
app --short : Perform application operations
|
app --short : Perform application operations
|
||||||
@@ -166,10 +165,14 @@ odo --verbose : Odo (Openshift Do)
|
|||||||
create --application --component --port : Create a URL for a component
|
create --application --component --port : Create a URL for a component
|
||||||
delete --component --force : Delete a URL
|
delete --component --force : Delete a URL
|
||||||
list --application --component : List URLs
|
list --application --component : List URLs
|
||||||
utils : Utilities for completion and terminal commands
|
utils : Utilities for completion, terminal commands and modifying Odo configurations
|
||||||
completion : Output shell completion code
|
completion : Output shell completion code
|
||||||
|
config : Modifies configuration settings
|
||||||
|
set : Set a value in odo config file
|
||||||
|
view : View current configuration values
|
||||||
terminal : Add Odo terminal support to your development environment
|
terminal : Add Odo terminal support to your development environment
|
||||||
version : Print the client version information
|
version : Print the client version information
|
||||||
watch : Watch for changes, update component on change
|
watch : Watch for changes, update component on change
|
||||||
```
|
|
||||||
*_autogenerated_
|
*_autogenerated_
|
||||||
|
|
||||||
|
|||||||
93
cmd/config.go
Normal file
93
cmd/config.go
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"text/tabwriter"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/redhat-developer/odo/pkg/config"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
// configurationCmd represents the app command
|
||||||
|
var configurationCmd = &cobra.Command{
|
||||||
|
Use: "config",
|
||||||
|
Short: "Modifies configuration settings",
|
||||||
|
Long: `Modifies Odo specific configuration settings within the config file.
|
||||||
|
|
||||||
|
Available Parameters:
|
||||||
|
UpdateNotification - Controls if an update notification is shown or not (true or false)`,
|
||||||
|
Example: fmt.Sprintf("%s\n%s\n",
|
||||||
|
configurationViewCmd.Example,
|
||||||
|
configurationSetCmd.Example),
|
||||||
|
Aliases: []string{"configuration"},
|
||||||
|
// 'odo utils config' is the same as 'odo utils config --help'
|
||||||
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
|
if len(args) >= 1 && args[0] != "view" && args[0] != "set" {
|
||||||
|
return fmt.Errorf("Unknown command, use set or view")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}, Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
if len(args) > 0 && args[0] == "set" {
|
||||||
|
configurationSetCmd.Run(cmd, args)
|
||||||
|
} else if len(args) > 0 && args[0] == "view" {
|
||||||
|
configurationViewCmd.Run(cmd, args)
|
||||||
|
} else {
|
||||||
|
cmd.Help()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var configurationSetCmd = &cobra.Command{
|
||||||
|
Use: "set",
|
||||||
|
Short: "Set a value in odo config file",
|
||||||
|
Long: `Set an individual value in the Odo configuration file
|
||||||
|
Available Parameters:
|
||||||
|
UpdateNotification - Controls if an update notification is shown or not (true or false)`,
|
||||||
|
Example: `
|
||||||
|
# Set a configuration value
|
||||||
|
odo utils config set UpdateNotification false
|
||||||
|
`,
|
||||||
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
|
if len(args) < 2 {
|
||||||
|
return fmt.Errorf("Please provide a parameter name and value")
|
||||||
|
} else if len(args) > 2 {
|
||||||
|
return fmt.Errorf("Only one value per parameter is allowed")
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}, RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
cfg, err := config.New()
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrapf(err, "unable to set configuration")
|
||||||
|
}
|
||||||
|
value, err := strconv.ParseBool(args[1])
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrapf(err, "unable to set configuration")
|
||||||
|
}
|
||||||
|
return cfg.SetConfiguration(strings.ToLower(args[0]), value)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var configurationViewCmd = &cobra.Command{
|
||||||
|
Use: "view",
|
||||||
|
Short: "View current configuration values",
|
||||||
|
Long: "View current configuration values",
|
||||||
|
Example: `
|
||||||
|
# For viewing the current configuration
|
||||||
|
odo utils config view`,
|
||||||
|
Args: cobra.ExactArgs(0),
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
cfg, err := config.New()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err, ": unable to view configuration")
|
||||||
|
}
|
||||||
|
w := tabwriter.NewWriter(os.Stdout, 5, 2, 2, ' ', tabwriter.TabIndent)
|
||||||
|
fmt.Fprintln(w, "PARAMETER", "\t", "CURRENT_VALUE")
|
||||||
|
fmt.Fprintln(w, "UpdateNotification", "\t", cfg.GetUpdateNotification())
|
||||||
|
w.Flush()
|
||||||
|
},
|
||||||
|
}
|
||||||
31
cmd/root.go
31
cmd/root.go
@@ -7,6 +7,7 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
"github.com/redhat-developer/odo/pkg/config"
|
||||||
"github.com/redhat-developer/odo/pkg/notify"
|
"github.com/redhat-developer/odo/pkg/notify"
|
||||||
"github.com/redhat-developer/odo/pkg/occlient"
|
"github.com/redhat-developer/odo/pkg/occlient"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@@ -99,17 +100,27 @@ Find more information at https://github.com/redhat-developer/odo`,
|
|||||||
// This is called by main.main(). It only needs to happen once to the rootCmd.
|
// This is called by main.main(). It only needs to happen once to the rootCmd.
|
||||||
func Execute() {
|
func Execute() {
|
||||||
|
|
||||||
updateInfo := make(chan string)
|
// checking the value of updatenotification in config
|
||||||
go getLatestReleaseInfo(updateInfo)
|
// before proceeding with fetching the latest version
|
||||||
|
cfg, err := config.New()
|
||||||
checkError(rootCmd.Execute(), "")
|
if err != nil {
|
||||||
|
fmt.Println("unable to fetch configuration from Odo config file.")
|
||||||
select {
|
|
||||||
case message := <-updateInfo:
|
|
||||||
fmt.Println(message)
|
|
||||||
default:
|
|
||||||
glog.V(4).Info("Could not get the latest release information in time. Never mind, exiting gracefully :)")
|
|
||||||
}
|
}
|
||||||
|
if cfg.GetUpdateNotification() == true {
|
||||||
|
updateInfo := make(chan string)
|
||||||
|
go getLatestReleaseInfo(updateInfo)
|
||||||
|
|
||||||
|
checkError(rootCmd.Execute(), "")
|
||||||
|
select {
|
||||||
|
case message := <-updateInfo:
|
||||||
|
fmt.Println(message)
|
||||||
|
default:
|
||||||
|
glog.V(4).Info("Could not get the latest release information in time. Never mind, exiting gracefully :)")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
checkError(rootCmd.Execute(), "")
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
15
cmd/utils.go
15
cmd/utils.go
@@ -9,17 +9,24 @@ import (
|
|||||||
// utilsCmd represents the utils command
|
// utilsCmd represents the utils command
|
||||||
var utilsCmd = &cobra.Command{
|
var utilsCmd = &cobra.Command{
|
||||||
Use: "utils",
|
Use: "utils",
|
||||||
Short: "Utilities for completion and terminal commands",
|
Short: "Utilities for completion, terminal commands and modifying Odo configurations",
|
||||||
Long: `Utilities for completion and terminal commands`,
|
Long: `Utilities for completion, terminal commands and modifying Odo configurations`,
|
||||||
Example: fmt.Sprintf("%s\n%s",
|
Example: fmt.Sprintf("%s\n%s\n%s%s",
|
||||||
completionCmd.Example,
|
completionCmd.Example,
|
||||||
terminalCmd.Example),
|
terminalCmd.Example,
|
||||||
|
configurationSetCmd.Example,
|
||||||
|
configurationViewCmd.Example),
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
utilsCmd.Annotations = map[string]string{"command": "utility"}
|
utilsCmd.Annotations = map[string]string{"command": "utility"}
|
||||||
utilsCmd.SetUsageTemplate(cmdUsageTemplate)
|
utilsCmd.SetUsageTemplate(cmdUsageTemplate)
|
||||||
|
|
||||||
|
configurationCmd.AddCommand(configurationViewCmd)
|
||||||
|
configurationCmd.AddCommand(configurationSetCmd)
|
||||||
|
|
||||||
|
configurationCmd.SetUsageTemplate(cmdUsageTemplate)
|
||||||
|
utilsCmd.AddCommand(configurationCmd)
|
||||||
utilsCmd.AddCommand(completionCmd)
|
utilsCmd.AddCommand(completionCmd)
|
||||||
utilsCmd.AddCommand(terminalCmd)
|
utilsCmd.AddCommand(terminalCmd)
|
||||||
rootCmd.AddCommand(utilsCmd)
|
rootCmd.AddCommand(utilsCmd)
|
||||||
|
|||||||
@@ -16,6 +16,12 @@ const (
|
|||||||
configFileName = "odo"
|
configFileName = "odo"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// OdoSettings holds all odo specific configurations
|
||||||
|
type OdoSettings struct {
|
||||||
|
// Controls if an update notification is shown or not
|
||||||
|
UpdateNotification *bool `json:"updatenotification,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// ApplicationInfo holds all important information about one application
|
// ApplicationInfo holds all important information about one application
|
||||||
type ApplicationInfo struct {
|
type ApplicationInfo struct {
|
||||||
// name of the application
|
// name of the application
|
||||||
@@ -29,6 +35,9 @@ type ApplicationInfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
|
||||||
|
// odo specific configuration settings
|
||||||
|
OdoSettings OdoSettings `json:"settings"`
|
||||||
// remember active applications and components per project
|
// remember active applications and components per project
|
||||||
// when project or applications is switched we can go back to last active app/component
|
// when project or applications is switched we can go back to last active app/component
|
||||||
|
|
||||||
@@ -112,6 +121,30 @@ func (c *ConfigInfo) writeToFile() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetConfiguration modifies Odo configurations in the config file
|
||||||
|
// as of now only being used for updatenotification
|
||||||
|
func (c *ConfigInfo) SetConfiguration(parameter string, value bool) error {
|
||||||
|
switch parameter {
|
||||||
|
case "updatenotification":
|
||||||
|
c.OdoSettings.UpdateNotification = &value
|
||||||
|
default:
|
||||||
|
return errors.Errorf("unknown parameter :'%s' is not a parameter in odo config", parameter)
|
||||||
|
}
|
||||||
|
err := c.writeToFile()
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrapf(err, "unable to set %s", parameter)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetupdateNotification returns the value of UpdateNotification from config
|
||||||
|
func (c *ConfigInfo) GetUpdateNotification() bool {
|
||||||
|
if c.OdoSettings.UpdateNotification == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return *c.OdoSettings.UpdateNotification
|
||||||
|
}
|
||||||
|
|
||||||
// SetActiveComponent sets active component for given project and application.
|
// SetActiveComponent sets active component for given project and application.
|
||||||
// application must exist
|
// application must exist
|
||||||
func (c *ConfigInfo) SetActiveComponent(component string, application string, project string) error {
|
func (c *ConfigInfo) SetActiveComponent(component string, application string, project string) error {
|
||||||
|
|||||||
@@ -923,6 +923,126 @@ func TestDeleteApplication(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSetConfiguration(t *testing.T) {
|
||||||
|
|
||||||
|
tempConfigFile, err := ioutil.TempFile("", "odoconfig")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer tempConfigFile.Close()
|
||||||
|
os.Setenv(configEnvName, tempConfigFile.Name())
|
||||||
|
trueValue := true
|
||||||
|
falseValue := false
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
parameter string
|
||||||
|
existingConfig Config
|
||||||
|
want bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "updatenotification set nil to true",
|
||||||
|
parameter: "updatenotification",
|
||||||
|
existingConfig: Config{},
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "updatenotification set true to false",
|
||||||
|
parameter: "updatenotification",
|
||||||
|
existingConfig: Config{
|
||||||
|
OdoSettings: OdoSettings{
|
||||||
|
UpdateNotification: &trueValue,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "updatenotification set false to true",
|
||||||
|
parameter: "updatenotification",
|
||||||
|
existingConfig: Config{
|
||||||
|
OdoSettings: OdoSettings{
|
||||||
|
UpdateNotification: &falseValue,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
cfg, err := New()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
cfg.Config = tt.existingConfig
|
||||||
|
|
||||||
|
cfg.SetConfiguration(tt.parameter, tt.want)
|
||||||
|
|
||||||
|
// validating the value after executing Serconfiguration
|
||||||
|
if *cfg.OdoSettings.UpdateNotification != tt.want {
|
||||||
|
t.Errorf("unexpeced value after execution of SetConfiguration expected \ngot: %t \nexpected: %t\n", *cfg.OdoSettings.UpdateNotification, tt.want)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetupdateNotification(t *testing.T) {
|
||||||
|
|
||||||
|
tempConfigFile, err := ioutil.TempFile("", "odoconfig")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer tempConfigFile.Close()
|
||||||
|
os.Setenv(configEnvName, tempConfigFile.Name())
|
||||||
|
trueValue := true
|
||||||
|
falseValue := false
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
existingConfig Config
|
||||||
|
want bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "updatenotification nil",
|
||||||
|
existingConfig: Config{},
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "updatenotification true",
|
||||||
|
existingConfig: Config{
|
||||||
|
OdoSettings: OdoSettings{
|
||||||
|
UpdateNotification: &trueValue,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "updatenotification false",
|
||||||
|
existingConfig: Config{
|
||||||
|
OdoSettings: OdoSettings{
|
||||||
|
UpdateNotification: &falseValue,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
cfg := ConfigInfo{
|
||||||
|
Config: tt.existingConfig,
|
||||||
|
}
|
||||||
|
output := cfg.GetUpdateNotification()
|
||||||
|
|
||||||
|
if output != tt.want {
|
||||||
|
t.Errorf("GetUpdateNotification returned unexpeced value expected \ngot: %t \nexpected: %t\n", output, tt.want)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
//func TestGet(t *testing.T) {
|
//func TestGet(t *testing.T) {
|
||||||
//
|
//
|
||||||
|
|||||||
BIN
scripts/cli-structure/cli-structure
Executable file
BIN
scripts/cli-structure/cli-structure
Executable file
Binary file not shown.
@@ -127,6 +127,14 @@ var _ = Describe("odoe2e", func() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Context("odo utils config", func() {
|
||||||
|
It("should get true for updatenotification by defult", func() {
|
||||||
|
config := runCmd("odo utils config view")
|
||||||
|
Expect(config).To(ContainSubstring("true"))
|
||||||
|
Expect(config).To(ContainSubstring("UpdateNotification"))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
Context("creating component without an application", func() {
|
Context("creating component without an application", func() {
|
||||||
It("should create the component in default application", func() {
|
It("should create the component in default application", func() {
|
||||||
runCmd("odo create php testcmp")
|
runCmd("odo create php testcmp")
|
||||||
|
|||||||
Reference in New Issue
Block a user