Expose oc build timeout in preference (#3232)

* Expose oc build timeout in preference

* Fixing failures

* Fixing make bin failure

* Fixing make unit test failure

* Fixing gofmt issue

* Fixing UTs failure

* Addressing review comments

* Addressing review comment

* Addressing review comment

* Fixing timeout

* Fixing failure

* Added integration test

* Update integration test scenario

* Updated machine readable preference view

* Consumed suggestion

* Adding more unit tests

* Addressed review comment
This commit is contained in:
Amit Rout
2020-07-16 11:44:52 +05:30
committed by GitHub
parent a428995408
commit aa05fb4799
10 changed files with 202 additions and 26 deletions

View File

@@ -58,6 +58,13 @@ func toPreferenceItems(prefInfo PreferenceInfo) []PreferenceItem {
Type: getType(prefInfo.GetTimeout()),
Description: TimeoutSettingDescription,
},
{
Name: BuildTimeoutSetting,
Value: odoSettings.BuildTimeout,
Default: DefaultBuildTimeout,
Type: getType(prefInfo.GetBuildTimeout()),
Description: BuildTimeoutSettingDescription,
},
{
Name: PushTimeoutSetting,
Value: odoSettings.PushTimeout,

View File

@@ -29,6 +29,9 @@ const (
// DefaultPushTimeout is the default timeout for pods (in seconds)
DefaultPushTimeout = 240
// DefaultBuildTimeout is the default build timeout for pods (in seconds)
DefaultBuildTimeout = 300
// UpdateNotificationSetting is the name of the setting controlling update notification
UpdateNotificationSetting = "UpdateNotification"
@@ -44,6 +47,9 @@ const (
// TimeoutSetting is the name of the setting controlling timeout for connection check
TimeoutSetting = "Timeout"
// BuildTimeoutSetting is the name of the setting controlling BuildTimeout
BuildTimeoutSetting = "BuildTimeout"
// PushTimeoutSetting is the name of the setting controlling PushTimeout
PushTimeoutSetting = "PushTimeout"
@@ -80,6 +86,9 @@ var TimeoutSettingDescription = fmt.Sprintf("Timeout (in seconds) for OpenShift
// PushTimeoutSettingDescription adds a description for PushTimeout
var PushTimeoutSettingDescription = fmt.Sprintf("PushTimeout (in seconds) for waiting for a Pod to come up (Default: %d)", DefaultPushTimeout)
// BuildTimeoutSettingDescription adds a description for BuildTimeout
var BuildTimeoutSettingDescription = fmt.Sprintf("BuildTimeout (in seconds) for waiting for a build of the git component to complete (Default: %d)", DefaultBuildTimeout)
// This value can be provided to set a seperate directory for users 'homedir' resolution
// note for mocking purpose ONLY
var customHomeDir = os.Getenv("CUSTOM_HOMEDIR")
@@ -90,6 +99,7 @@ var (
UpdateNotificationSetting: UpdateNotificationSettingDescription,
NamePrefixSetting: NamePrefixSettingDescription,
TimeoutSetting: TimeoutSettingDescription,
BuildTimeoutSetting: BuildTimeoutSettingDescription,
PushTimeoutSetting: PushTimeoutSettingDescription,
ExperimentalSetting: ExperimentalDescription,
PushTargetSetting: PushTargetDescription,
@@ -117,6 +127,9 @@ type OdoSettings struct {
// Timeout for OpenShift server connection check
Timeout *int `yaml:"Timeout,omitempty"`
// BuildTimeout for OpenShift build timeout check
BuildTimeout *int `yaml:"BuildTimeout,omitempty"`
// PushTimeout for OpenShift pod timeout check
PushTimeout *int `yaml:"PushTimeout,omitempty"`
@@ -334,6 +347,16 @@ func (c *PreferenceInfo) SetConfiguration(parameter string, value string) error
}
c.OdoSettings.Timeout = &typedval
case "buildtimeout":
typedval, err := strconv.Atoi(value)
if err != nil {
return errors.Wrapf(err, "unable to set %s to %s", parameter, value)
}
if typedval < 0 {
return errors.Errorf("cannot set timeout to less than 0")
}
c.OdoSettings.BuildTimeout = &typedval
case "pushtimeout":
typedval, err := strconv.Atoi(value)
if err != nil {
@@ -414,6 +437,15 @@ func (c *PreferenceInfo) GetTimeout() int {
return *c.OdoSettings.Timeout
}
// GetBuildTimeout gets the value set by BuildTimeout
func (c *PreferenceInfo) GetBuildTimeout() int {
// default timeout value is 300
if c.OdoSettings.BuildTimeout == nil {
return DefaultBuildTimeout
}
return *c.OdoSettings.BuildTimeout
}
// GetPushTimeout gets the value set by PushTimeout
func (c *PreferenceInfo) GetPushTimeout() int {
// default timeout value is 1

View File

@@ -56,6 +56,62 @@ func TestNew(t *testing.T) {
}
}
func TestGetBuildTimeout(t *testing.T) {
tempConfigFile, err := ioutil.TempFile("", "odoconfig")
if err != nil {
t.Fatal(err)
}
defer tempConfigFile.Close()
os.Setenv(GlobalConfigEnvName, tempConfigFile.Name())
zeroValue := 0
nonzeroValue := 5
tests := []struct {
name string
existingConfig Preference
want int
}{
{
name: "Case 1: Validating default value from test case",
existingConfig: Preference{},
want: 300,
},
{
name: "Case 2: Validating value 0 from configuration",
existingConfig: Preference{
OdoSettings: OdoSettings{
BuildTimeout: &zeroValue,
},
},
want: 0,
},
{
name: "Case 3: Validating value 5 from configuration",
existingConfig: Preference{
OdoSettings: OdoSettings{
BuildTimeout: &nonzeroValue,
},
},
want: 5,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cfg, err := NewPreferenceInfo()
if err != nil {
t.Error(err)
}
cfg.Preference = tt.existingConfig
output := cfg.GetBuildTimeout()
if output != tt.want {
t.Errorf("GetBuildTimeout returned unexpeced value expected \ngot: %d \nexpected: %d\n", output, tt.want)
}
})
}
}
func TestGetPushTimeout(t *testing.T) {
tempConfigFile, err := ioutil.TempFile("", "odoconfig")
if err != nil {
@@ -290,7 +346,37 @@ func TestSetConfiguration(t *testing.T) {
wantErr: true,
},
{
name: fmt.Sprintf("Case 12: %s set to 300 with mixed case in parameter name", TimeoutSetting),
name: fmt.Sprintf("Case 12: %s set to 50 with mixed case in parameter name", TimeoutSetting),
parameter: "BuildTimeout",
value: "50",
existingConfig: Preference{},
want: 50,
wantErr: false,
},
{
name: fmt.Sprintf("Case 13: %s set to 0", TimeoutSetting),
parameter: TimeoutSetting,
value: "0",
existingConfig: Preference{},
want: 0,
wantErr: false,
},
{
name: fmt.Sprintf("Case 14: %s set to -1 with mixed case in parameter name", TimeoutSetting),
parameter: "BuildTimeout",
value: "-1",
existingConfig: Preference{},
wantErr: true,
},
{
name: fmt.Sprintf("Case 15: %s invalid value", TimeoutSetting),
parameter: TimeoutSetting,
value: "invalid",
existingConfig: Preference{},
wantErr: true,
},
{
name: fmt.Sprintf("Case 16: %s set to 99 with mixed case in parameter name", TimeoutSetting),
parameter: "PushTimeout",
value: "99",
existingConfig: Preference{},
@@ -299,7 +385,7 @@ func TestSetConfiguration(t *testing.T) {
},
// experimental setting
{
name: fmt.Sprintf("Case 13: %s set nil to true", ExperimentalSetting),
name: fmt.Sprintf("Case 17: %s set nil to true", ExperimentalSetting),
parameter: ExperimentalSetting,
value: "true",
existingConfig: Preference{},
@@ -307,7 +393,7 @@ func TestSetConfiguration(t *testing.T) {
wantErr: false,
},
{
name: fmt.Sprintf("Case 14: %s set true to false", ExperimentalSetting),
name: fmt.Sprintf("Case 18: %s set true to false", ExperimentalSetting),
parameter: ExperimentalSetting,
value: "false",
existingConfig: Preference{
@@ -319,7 +405,7 @@ func TestSetConfiguration(t *testing.T) {
wantErr: false,
},
{
name: fmt.Sprintf("Case 15: %s set false to true", ExperimentalSetting),
name: fmt.Sprintf("Case 19: %s set false to true", ExperimentalSetting),
parameter: ExperimentalSetting,
value: "true",
existingConfig: Preference{
@@ -331,7 +417,7 @@ func TestSetConfiguration(t *testing.T) {
wantErr: false,
},
{
name: fmt.Sprintf("Case 16: %s invalid value", ExperimentalSetting),
name: fmt.Sprintf("Case 20: %s invalid value", ExperimentalSetting),
parameter: ExperimentalSetting,
value: "invalid_value",
existingConfig: Preference{},
@@ -339,7 +425,7 @@ func TestSetConfiguration(t *testing.T) {
},
// pushtarget setting
{
name: fmt.Sprintf("Case 17: %s set nil to docker", PushTargetSetting),
name: fmt.Sprintf("Case 21: %s set nil to docker", PushTargetSetting),
parameter: PushTargetSetting,
value: dockerValue,
existingConfig: Preference{},
@@ -347,7 +433,7 @@ func TestSetConfiguration(t *testing.T) {
wantErr: false,
},
{
name: fmt.Sprintf("Case 18: %s set kube to docker", PushTargetSetting),
name: fmt.Sprintf("Case 22: %s set kube to docker", PushTargetSetting),
parameter: PushTargetSetting,
value: dockerValue,
existingConfig: Preference{
@@ -359,7 +445,7 @@ func TestSetConfiguration(t *testing.T) {
wantErr: false,
},
{
name: fmt.Sprintf("Case 19: %s set docker to kube", PushTargetSetting),
name: fmt.Sprintf("Case 23: %s set docker to kube", PushTargetSetting),
parameter: PushTargetSetting,
value: kubeValue,
existingConfig: Preference{
@@ -371,7 +457,7 @@ func TestSetConfiguration(t *testing.T) {
wantErr: false,
},
{
name: fmt.Sprintf("Case 20: %s invalid value", PushTargetSetting),
name: fmt.Sprintf("Case 24: %s invalid value", PushTargetSetting),
parameter: PushTargetSetting,
value: "invalid_value",
existingConfig: Preference{},
@@ -606,8 +692,10 @@ Available Parameters:
%s - %s
%s - %s
%s - %s
%s - %s
`
expected = fmt.Sprintf(expected,
BuildTimeoutSetting, BuildTimeoutSettingDescription,
ExperimentalSetting, ExperimentalDescription,
NamePrefixSetting, NamePrefixSettingDescription,
PushTargetSetting, PushTargetDescription,
@@ -621,7 +709,7 @@ Available Parameters:
}
func TestLowerCaseParameters(t *testing.T) {
expected := map[string]bool{"nameprefix": true, "pushtimeout": true, "timeout": true, "updatenotification": true, "experimental": true, "pushtarget": true}
expected := map[string]bool{"nameprefix": true, "buildtimeout": true, "pushtimeout": true, "timeout": true, "updatenotification": true, "experimental": true, "pushtarget": true}
actual := util.GetLowerCaseParameters(GetSupportedParameters())
if !reflect.DeepEqual(expected, actual) {
t.Errorf("expected '%v', got '%v'", expected, actual)