Skip to content

Commit 0e8e0a3

Browse files
authored
feat(api): handle config item "when" attribute (#2450)
* feat(api): filter config disabled * f * f
1 parent 17c5d20 commit 0e8e0a3

File tree

8 files changed

+847
-20
lines changed

8 files changed

+847
-20
lines changed

api/controllers/kubernetes/install/app.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ func (c *InstallController) GetAppConfig(ctx context.Context) (kotsv1beta1.Confi
1515
return kotsv1beta1.Config{}, errors.New("app config not found")
1616
}
1717

18-
return *c.releaseData.AppConfig, nil
18+
return c.appConfigManager.GetConfig(*c.releaseData.AppConfig)
1919
}
2020

2121
func (c *InstallController) SetAppConfigValues(ctx context.Context, values map[string]string) (finalErr error) {
22+
if c.releaseData == nil || c.releaseData.AppConfig == nil {
23+
return errors.New("app config not found")
24+
}
25+
2226
lock, err := c.stateMachine.AcquireLock()
2327
if err != nil {
2428
return types.NewConflictError(err)
@@ -47,7 +51,7 @@ func (c *InstallController) SetAppConfigValues(ctx context.Context, values map[s
4751
}
4852
}()
4953

50-
err = c.appConfigManager.SetConfigValues(ctx, values)
54+
err = c.appConfigManager.SetConfigValues(*c.releaseData.AppConfig, values)
5155
if err != nil {
5256
return fmt.Errorf("set app config values: %w", err)
5357
}

api/controllers/kubernetes/install/controller_mock.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ func (m *MockController) GetInfra(ctx context.Context) (types.Infra, error) {
5757
// GetAppConfig mocks the GetAppConfig method
5858
func (m *MockController) GetAppConfig(ctx context.Context) (kotsv1beta1.Config, error) {
5959
args := m.Called(ctx)
60-
if args.Get(0) == nil {
61-
return kotsv1beta1.Config{}, args.Error(1)
62-
}
6360
return args.Get(0).(kotsv1beta1.Config), args.Error(1)
6461
}
6562

api/controllers/linux/install/app.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ func (c *InstallController) GetAppConfig(ctx context.Context) (kotsv1beta1.Confi
1515
return kotsv1beta1.Config{}, errors.New("app config not found")
1616
}
1717

18-
return *c.releaseData.AppConfig, nil
18+
return c.appConfigManager.GetConfig(*c.releaseData.AppConfig)
1919
}
2020

2121
func (c *InstallController) SetAppConfigValues(ctx context.Context, values map[string]string) (finalErr error) {
22+
if c.releaseData == nil || c.releaseData.AppConfig == nil {
23+
return errors.New("app config not found")
24+
}
25+
2226
lock, err := c.stateMachine.AcquireLock()
2327
if err != nil {
2428
return types.NewConflictError(err)
@@ -47,7 +51,7 @@ func (c *InstallController) SetAppConfigValues(ctx context.Context, values map[s
4751
}
4852
}()
4953

50-
err = c.appConfigManager.SetConfigValues(ctx, values)
54+
err = c.appConfigManager.SetConfigValues(*c.releaseData.AppConfig, values)
5155
if err != nil {
5256
return fmt.Errorf("set app config values: %w", err)
5357
}

api/controllers/linux/install/controller_mock.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,6 @@ func (m *MockController) GetInfra(ctx context.Context) (types.Infra, error) {
9090
// GetAppConfig mocks the GetAppConfig method
9191
func (m *MockController) GetAppConfig(ctx context.Context) (kotsv1beta1.Config, error) {
9292
args := m.Called(ctx)
93-
if args.Get(0) == nil {
94-
return kotsv1beta1.Config{}, args.Error(1)
95-
}
9693
return args.Get(0).(kotsv1beta1.Config), args.Error(1)
9794
}
9895

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,76 @@
11
package config
22

33
import (
4-
"context"
4+
"fmt"
5+
6+
kotsv1beta1 "github.com/replicatedhq/kotskinds/apis/kots/v1beta1"
7+
"github.com/replicatedhq/kotskinds/multitype"
8+
"github.com/tiendc/go-deepcopy"
59
)
610

11+
func (m *appConfigManager) GetConfig(config kotsv1beta1.Config) (kotsv1beta1.Config, error) {
12+
return filterAppConfig(config)
13+
}
14+
715
func (m *appConfigManager) GetConfigValues() (map[string]string, error) {
816
return m.appConfigStore.GetConfigValues()
917
}
1018

11-
func (m *appConfigManager) SetConfigValues(ctx context.Context, values map[string]string) error {
12-
return m.appConfigStore.SetConfigValues(values)
19+
func (m *appConfigManager) SetConfigValues(config kotsv1beta1.Config, configValues map[string]string) error {
20+
filteredValues := make(map[string]string)
21+
22+
// only include values for enabled groups and items
23+
for _, g := range config.Spec.Groups {
24+
for _, i := range g.Items {
25+
if isItemEnabled(g.When) && isItemEnabled(i.When) {
26+
value, ok := configValues[i.Name]
27+
if ok {
28+
filteredValues[i.Name] = value
29+
}
30+
for _, c := range i.Items {
31+
value, ok := configValues[c.Name]
32+
if ok {
33+
filteredValues[c.Name] = value
34+
}
35+
}
36+
}
37+
}
38+
}
39+
40+
return m.appConfigStore.SetConfigValues(filteredValues)
41+
}
42+
43+
// filterAppConfig filters out disabled groups and items based on their 'when' condition
44+
func filterAppConfig(config kotsv1beta1.Config) (kotsv1beta1.Config, error) {
45+
// deepcopy the config to avoid mutating the original config
46+
var updatedConfig kotsv1beta1.Config
47+
if err := deepcopy.Copy(&updatedConfig, &config); err != nil {
48+
return kotsv1beta1.Config{}, fmt.Errorf("deepcopy: %w", err)
49+
}
50+
51+
filteredGroups := make([]kotsv1beta1.ConfigGroup, 0)
52+
53+
for _, group := range config.Spec.Groups {
54+
if !isItemEnabled(group.When) {
55+
continue
56+
}
57+
filteredItems := make([]kotsv1beta1.ConfigItem, 0)
58+
for _, item := range group.Items {
59+
if !isItemEnabled(item.When) {
60+
continue
61+
}
62+
filteredItems = append(filteredItems, item)
63+
}
64+
if len(filteredItems) > 0 {
65+
group.Items = filteredItems
66+
filteredGroups = append(filteredGroups, group)
67+
}
68+
}
69+
updatedConfig.Spec.Groups = filteredGroups
70+
return updatedConfig, nil
71+
}
72+
73+
// isItemEnabled checks if an item is enabled based on its 'when' condition
74+
func isItemEnabled(when multitype.QuotedBool) bool {
75+
return when != "false"
1376
}

0 commit comments

Comments
 (0)