From ac03a2bda37cd3728497598a8b0c518e191b0f34 Mon Sep 17 00:00:00 2001 From: David Wertenteil Date: Sun, 22 May 2022 15:21:06 +0300 Subject: [PATCH 1/4] load data from config.json --- core/cautils/customerloader.go | 4 ++++ core/pkg/resourcehandler/k8sresources.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/cautils/customerloader.go b/core/cautils/customerloader.go index 6b4f7dda..a76dffe5 100644 --- a/core/cautils/customerloader.go +++ b/core/cautils/customerloader.go @@ -288,9 +288,13 @@ func (c *ClusterConfig) loadConfigFromConfigMap() (*ConfigObj, error) { return nil, err } + if jsonConf, ok := configMap.Data["config.json"]; ok { + return readConfig([]byte(jsonConf)) + } if bData, err := json.Marshal(configMap.Data); err == nil { return readConfig(bData) } + return nil, nil } diff --git a/core/pkg/resourcehandler/k8sresources.go b/core/pkg/resourcehandler/k8sresources.go index b16b0bcf..55af92bc 100644 --- a/core/pkg/resourcehandler/k8sresources.go +++ b/core/pkg/resourcehandler/k8sresources.go @@ -88,7 +88,7 @@ func (k8sHandler *K8sResourceHandler) GetResources(sessionObj *cautils.OPASessio logger.L().Warning("failed to collect image vulnerabilities", helpers.Error(err)) } if isEmptyImgVulns(*armoResourceMap) { - cautils.SetInfoMapForResources("image scanning not configured. For more information: https://hub.armo.cloud/docs/cluster-vulnerability-scanning", imgVulnResources, sessionObj.InfoMap) + cautils.SetInfoMapForResources("image scanning is not configured. for more information: https://hub.armo.cloud/docs/cluster-vulnerability-scanning", imgVulnResources, sessionObj.InfoMap) } } From 15081aa9c3a6df017d33a8db9057afa26d1fd3d5 Mon Sep 17 00:00:00 2001 From: David Wertenteil Date: Sun, 22 May 2022 15:45:55 +0300 Subject: [PATCH 2/4] update auth url --- core/cautils/getter/armoapi.go | 3 +- core/cautils/getter/armoapiutils.go | 45 ++++++++----------- .../armosec/v1/civarmoadaptor.go | 2 +- .../armosec/v1/civarmoadaptorutils.go | 2 +- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/core/cautils/getter/armoapi.go b/core/cautils/getter/armoapi.go index 20362d00..d3b63be2 100644 --- a/core/cautils/getter/armoapi.go +++ b/core/cautils/getter/armoapi.go @@ -147,7 +147,8 @@ func (armoAPI *ArmoAPI) IsLoggedIn() bool { return armoAPI.loggedIn func (armoAPI *ArmoAPI) GetClientID() string { return armoAPI.clientID } func (armoAPI *ArmoAPI) GetSecretKey() string { return armoAPI.secretKey } func (armoAPI *ArmoAPI) GetFrontendURL() string { return armoAPI.feURL } -func (armoAPI *ArmoAPI) GetAPIURL() string { return armoAPI.apiURL } +func (armoAPI *ArmoAPI) GetApiURL() string { return armoAPI.apiURL } +func (armoAPI *ArmoAPI) GetAuthURL() string { return armoAPI.authURL } func (armoAPI *ArmoAPI) GetReportReceiverURL() string { return armoAPI.erURL } func (armoAPI *ArmoAPI) SetAccountID(accountID string) { armoAPI.accountID = accountID } func (armoAPI *ArmoAPI) SetClientID(clientID string) { armoAPI.clientID = clientID } diff --git a/core/cautils/getter/armoapiutils.go b/core/cautils/getter/armoapiutils.go index a8062772..562dabfe 100644 --- a/core/cautils/getter/armoapiutils.go +++ b/core/cautils/getter/armoapiutils.go @@ -9,23 +9,11 @@ import ( "strings" ) -func parseHost(urlObj *url.URL) { - if strings.Contains(urlObj.Host, "http://") { - urlObj.Scheme = "http" - urlObj.Host = strings.Replace(urlObj.Host, "http://", "", 1) - } else { - urlObj.Scheme = "https" - urlObj.Host = strings.Replace(urlObj.Host, "https://", "", 1) - } -} - var NativeFrameworks = []string{"nsa", "mitre", "armobest", "devopsbest"} func (armoAPI *ArmoAPI) getFrameworkURL(frameworkName string) string { u := url.URL{} - u.Host = armoAPI.GetAPIURL() - parseHost(&u) - + u.Scheme, u.Host = parseHost(armoAPI.GetApiURL()) u.Path = "api/v1/armoFrameworks" q := u.Query() q.Add("customerGUID", armoAPI.getCustomerGUIDFallBack()) @@ -42,9 +30,7 @@ func (armoAPI *ArmoAPI) getFrameworkURL(frameworkName string) string { func (armoAPI *ArmoAPI) getListFrameworkURL() string { u := url.URL{} - u.Host = armoAPI.GetAPIURL() - parseHost(&u) - + u.Scheme, u.Host = parseHost(armoAPI.GetApiURL()) u.Path = "api/v1/armoFrameworks" q := u.Query() q.Add("customerGUID", armoAPI.getCustomerGUIDFallBack()) @@ -54,8 +40,7 @@ func (armoAPI *ArmoAPI) getListFrameworkURL() string { } func (armoAPI *ArmoAPI) getExceptionsURL(clusterName string) string { u := url.URL{} - u.Host = armoAPI.GetAPIURL() - parseHost(&u) + u.Scheme, u.Host = parseHost(armoAPI.GetApiURL()) u.Path = "api/v1/armoPostureExceptions" q := u.Query() @@ -70,8 +55,7 @@ func (armoAPI *ArmoAPI) getExceptionsURL(clusterName string) string { func (armoAPI *ArmoAPI) exceptionsURL(exceptionsPolicyName string) string { u := url.URL{} - u.Host = armoAPI.GetAPIURL() - parseHost(&u) + u.Scheme, u.Host = parseHost(armoAPI.GetApiURL()) u.Path = "api/v1/postureExceptionPolicy" q := u.Query() @@ -93,8 +77,7 @@ func (armoAPI *ArmoAPI) getAccountConfigDefault(clusterName string) string { func (armoAPI *ArmoAPI) getAccountConfig(clusterName string) string { u := url.URL{} - u.Host = armoAPI.GetAPIURL() - parseHost(&u) + u.Scheme, u.Host = parseHost(armoAPI.GetApiURL()) u.Path = "api/v1/armoCustomerConfiguration" q := u.Query() @@ -109,22 +92,21 @@ func (armoAPI *ArmoAPI) getAccountConfig(clusterName string) string { func (armoAPI *ArmoAPI) getAccountURL() string { u := url.URL{} - u.Host = armoAPI.GetAPIURL() - parseHost(&u) + u.Scheme, u.Host = parseHost(armoAPI.GetApiURL()) u.Path = "api/v1/createTenant" return u.String() } func (armoAPI *ArmoAPI) getApiToken() string { u := url.URL{} - u.Scheme = "https" - u.Path = "frontegg/identity/resources/auth/v1/api-token" + u.Scheme, u.Host = parseHost(armoAPI.GetAuthURL()) + u.Path = "identity/resources/auth/v1/api-token" return u.String() } func (armoAPI *ArmoAPI) getOpenidCustomers() string { u := url.URL{} - u.Scheme = "https" + u.Scheme, u.Host = parseHost(armoAPI.GetApiURL()) u.Path = "api/v1/openid_customers" return u.String() } @@ -183,3 +165,12 @@ func (armoAPI *ArmoAPI) getCustomerGUIDFallBack() string { } return "11111111-1111-1111-1111-111111111111" } + +func parseHost(host string) (string, string) { + if strings.HasPrefix(host, "http://") { + return "http", strings.Replace(host, "http://", "", 1) + } + + // default scheme + return "https", strings.Replace(host, "https://", "", 1) +} diff --git a/core/pkg/registryadaptors/armosec/v1/civarmoadaptor.go b/core/pkg/registryadaptors/armosec/v1/civarmoadaptor.go index 86cc61c6..06db0980 100644 --- a/core/pkg/registryadaptors/armosec/v1/civarmoadaptor.go +++ b/core/pkg/registryadaptors/armosec/v1/civarmoadaptor.go @@ -51,7 +51,7 @@ func (armoCivAdaptor *ArmoCivAdaptor) GetImageVulnerability(imageID *registryvul pageNumber := 1 request := V2ListRequest{PageSize: &pageSize, PageNum: &pageNumber, InnerFilters: filter, OrderBy: "timestamp:desc"} requestBody, _ := json.Marshal(request) - requestUrl := fmt.Sprintf("https://%s/api/v1/vulnerability/scanResultsDetails?customerGUID=%s", armoCivAdaptor.armoAPI.GetAPIURL(), armoCivAdaptor.armoAPI.GetAccountID()) + requestUrl := fmt.Sprintf("https://%s/api/v1/vulnerability/scanResultsDetails?customerGUID=%s", armoCivAdaptor.armoAPI.GetApiURL(), armoCivAdaptor.armoAPI.GetAccountID()) resp, err := armoCivAdaptor.armoAPI.Post(requestUrl, map[string]string{"Content-Type": "application/json"}, requestBody) if err != nil { diff --git a/core/pkg/registryadaptors/armosec/v1/civarmoadaptorutils.go b/core/pkg/registryadaptors/armosec/v1/civarmoadaptorutils.go index e3112cbe..f70d9f7a 100644 --- a/core/pkg/registryadaptors/armosec/v1/civarmoadaptorutils.go +++ b/core/pkg/registryadaptors/armosec/v1/civarmoadaptorutils.go @@ -14,7 +14,7 @@ func (armoCivAdaptor *ArmoCivAdaptor) getImageLastScanId(imageID *registryvulner pageNumber := 1 request := V2ListRequest{PageSize: &pageSize, PageNum: &pageNumber, InnerFilters: filter, OrderBy: "timestamp:desc"} requestBody, _ := json.Marshal(request) - requestUrl := fmt.Sprintf("https://%s/api/v1/vulnerability/scanResultsSumSummary?customerGUID=%s", armoCivAdaptor.armoAPI.GetAPIURL(), armoCivAdaptor.armoAPI.GetAccountID()) + requestUrl := fmt.Sprintf("https://%s/api/v1/vulnerability/scanResultsSumSummary?customerGUID=%s", armoCivAdaptor.armoAPI.GetApiURL(), armoCivAdaptor.armoAPI.GetAccountID()) resp, err := armoCivAdaptor.armoAPI.Post(requestUrl, map[string]string{"Content-Type": "application/json"}, requestBody) if err != nil { From f8e85941da93bc8c55a0262fbaaea9074a59db7e Mon Sep 17 00:00:00 2001 From: David Wertenteil Date: Mon, 23 May 2022 09:47:40 +0300 Subject: [PATCH 3/4] update loading customer config --- core/cautils/customerloader.go | 70 +++++++----- core/cautils/customerloader_test.go | 167 ++++++++++++++++++++++++++++ core/core/download.go | 4 +- core/core/list.go | 4 +- core/core/scan.go | 2 +- 5 files changed, 212 insertions(+), 35 deletions(-) create mode 100644 core/cautils/customerloader_test.go diff --git a/core/cautils/customerloader.go b/core/cautils/customerloader.go index a76dffe5..e7595d2b 100644 --- a/core/cautils/customerloader.go +++ b/core/cautils/customerloader.go @@ -69,7 +69,10 @@ type ITenantConfig interface { // getters GetContextName() string GetAccountID() string - GetTennatEmail() string + GetTenantEmail() string + GetToken() string + GetClientID() string + GetSecretKey() string GetConfigObj() *ConfigObj // GetBackendAPI() getter.IBackend // GenerateURL() @@ -96,7 +99,7 @@ func NewLocalConfig( } // get from configMap if existsConfigFile() { // get from file - configObj, _ = loadConfigFromFile() + loadConfigFromFile(lc.configObj) } else { configObj = &ConfigObj{} } @@ -119,9 +122,12 @@ func NewLocalConfig( } func (lc *LocalConfig) GetConfigObj() *ConfigObj { return lc.configObj } -func (lc *LocalConfig) GetTennatEmail() string { return lc.configObj.CustomerAdminEMail } +func (lc *LocalConfig) GetTenantEmail() string { return lc.configObj.CustomerAdminEMail } func (lc *LocalConfig) GetAccountID() string { return lc.configObj.AccountID } +func (lc *LocalConfig) GetClientID() string { return lc.configObj.ClientID } +func (lc *LocalConfig) GetSecretKey() string { return lc.configObj.SecretKey } func (lc *LocalConfig) GetContextName() string { return lc.configObj.ClusterName } +func (lc *LocalConfig) GetToken() string { return lc.configObj.Token } func (lc *LocalConfig) IsConfigFound() bool { return existsConfigFile() } func (lc *LocalConfig) SetTenant() error { @@ -191,7 +197,7 @@ type ClusterConfig struct { } func NewClusterConfig(k8s *k8sinterface.KubernetesApi, backendAPI getter.IBackend, customerGUID, clusterName string) *ClusterConfig { - var configObj *ConfigObj + // var configObj *ConfigObj c := &ClusterConfig{ k8s: k8s, backendAPI: backendAPI, @@ -202,14 +208,12 @@ func NewClusterConfig(k8s *k8sinterface.KubernetesApi, backendAPI getter.IBacken // get from configMap if c.existsConfigMap() { - configObj, _ = c.loadConfigFromConfigMap() + c.loadConfigFromConfigMap() } - if configObj == nil && existsConfigFile() { // get from file - configObj, _ = loadConfigFromFile() - } - if configObj != nil { - c.configObj = configObj + if c.configObj == nil && existsConfigFile() { // get from file + loadConfigFromFile(c.configObj) } + if customerGUID != "" { c.configObj.AccountID = customerGUID // override config customerGUID } @@ -234,7 +238,10 @@ func NewClusterConfig(k8s *k8sinterface.KubernetesApi, backendAPI getter.IBacken func (c *ClusterConfig) GetConfigObj() *ConfigObj { return c.configObj } func (c *ClusterConfig) GetDefaultNS() string { return c.configMapNamespace } func (c *ClusterConfig) GetAccountID() string { return c.configObj.AccountID } -func (c *ClusterConfig) GetTennatEmail() string { return c.configObj.CustomerAdminEMail } +func (c *ClusterConfig) GetClientID() string { return c.configObj.ClientID } +func (c *ClusterConfig) GetSecretKey() string { return c.configObj.SecretKey } +func (c *ClusterConfig) GetTenantEmail() string { return c.configObj.CustomerAdminEMail } +func (c *ClusterConfig) GetToken() string { return c.configObj.Token } func (c *ClusterConfig) IsConfigFound() bool { return existsConfigFile() || c.existsConfigMap() } func (c *ClusterConfig) SetTenant() error { @@ -282,22 +289,26 @@ func (c *ClusterConfig) ToMapString() map[string]interface{} { } return m } -func (c *ClusterConfig) loadConfigFromConfigMap() (*ConfigObj, error) { +func (c *ClusterConfig) loadConfigFromConfigMap() error { configMap, err := c.k8s.KubernetesClient.CoreV1().ConfigMaps(c.configMapNamespace).Get(context.Background(), c.configMapName, metav1.GetOptions{}) if err != nil { - return nil, err + return err } - if jsonConf, ok := configMap.Data["config.json"]; ok { - return readConfig([]byte(jsonConf)) - } - if bData, err := json.Marshal(configMap.Data); err == nil { - return readConfig(bData) - } - - return nil, nil + return loadConfigFromData(c.configObj, configMap.Data) } +func loadConfigFromData(co *ConfigObj, data map[string]string) error { + var e error + if jsonConf, ok := data["config.json"]; ok { + e = readConfig([]byte(jsonConf), co) + } + if bData, err := json.Marshal(data); err == nil { + e = readConfig(bData, co) + } + + return e +} func (c *ClusterConfig) existsConfigMap() bool { _, err := c.k8s.KubernetesClient.CoreV1().ConfigMaps(c.configMapNamespace).Get(context.Background(), c.configMapName, metav1.GetOptions{}) // TODO - check if has customerGUID @@ -415,28 +426,27 @@ func (c *ClusterConfig) updateConfigData(configMap *corev1.ConfigMap) { } } } -func loadConfigFromFile() (*ConfigObj, error) { +func loadConfigFromFile(configObj *ConfigObj) error { dat, err := os.ReadFile(ConfigFileFullPath()) if err != nil { - return nil, err + return err } - - return readConfig(dat) + return readConfig(dat, configObj) } -func readConfig(dat []byte) (*ConfigObj, error) { +func readConfig(dat []byte, configObj *ConfigObj) error { if len(dat) == 0 { - return nil, nil + return nil } - configObj := &ConfigObj{} + if err := json.Unmarshal(dat, configObj); err != nil { - return nil, err + return err } if configObj.AccountID == "" { configObj.AccountID = configObj.CustomerGUID } configObj.CustomerGUID = "" - return configObj, nil + return nil } // Check if the customer is submitted diff --git a/core/cautils/customerloader_test.go b/core/cautils/customerloader_test.go new file mode 100644 index 00000000..e8f363b3 --- /dev/null +++ b/core/cautils/customerloader_test.go @@ -0,0 +1,167 @@ +package cautils + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" + corev1 "k8s.io/api/core/v1" +) + +func mockConfigObj() *ConfigObj { + return &ConfigObj{ + AccountID: "aaa", + ClientID: "bbb", + SecretKey: "ccc", + ClusterName: "ddd", + CustomerAdminEMail: "ab@cd", + Token: "eee", + } +} +func mockLocalConfig() *LocalConfig { + return &LocalConfig{ + backendAPI: nil, + configObj: mockConfigObj(), + } +} + +func mockClusterConfig() *ClusterConfig { + return &ClusterConfig{ + backendAPI: nil, + configObj: mockConfigObj(), + } +} +func TestConfig(t *testing.T) { + co := mockConfigObj() + cop := ConfigObj{} + + assert.NoError(t, json.Unmarshal(co.Config(), &cop)) + assert.Equal(t, co.AccountID, cop.AccountID) + assert.Equal(t, co.ClientID, cop.ClientID) + assert.Equal(t, co.SecretKey, cop.SecretKey) + assert.Equal(t, "", cop.ClusterName) // Not copied to bytes + assert.Equal(t, "", cop.CustomerAdminEMail) // Not copied to bytes + assert.Equal(t, "", cop.Token) // Not copied to bytes + +} + +func TestITenantConfig(t *testing.T) { + var lc ITenantConfig + var c ITenantConfig + lc = mockLocalConfig() + c = mockClusterConfig() + + co := mockConfigObj() + + // test LocalConfig methods + assert.Equal(t, co.AccountID, lc.GetAccountID()) + assert.Equal(t, co.ClientID, lc.GetClientID()) + assert.Equal(t, co.SecretKey, lc.GetSecretKey()) + assert.Equal(t, co.ClusterName, lc.GetContextName()) + assert.Equal(t, co.CustomerAdminEMail, lc.GetTenantEmail()) + assert.Equal(t, co.Token, lc.GetToken()) + + // test ClusterConfig methods + assert.Equal(t, co.AccountID, c.GetAccountID()) + assert.Equal(t, co.ClientID, c.GetClientID()) + assert.Equal(t, co.SecretKey, c.GetSecretKey()) + assert.Equal(t, co.ClusterName, c.GetContextName()) + assert.Equal(t, co.CustomerAdminEMail, c.GetTenantEmail()) + assert.Equal(t, co.Token, c.GetToken()) +} + +func TestUpdateConfigData(t *testing.T) { + c := mockClusterConfig() + + configMap := &corev1.ConfigMap{} + + c.updateConfigData(configMap) + + assert.Equal(t, c.GetAccountID(), configMap.Data["accountID"]) + assert.Equal(t, c.GetClientID(), configMap.Data["clientID"]) + assert.Equal(t, c.GetSecretKey(), configMap.Data["secretKey"]) +} + +func TestReadConfig(t *testing.T) { + com := mockConfigObj() + co := &ConfigObj{} + + b, e := json.Marshal(com) + assert.NoError(t, e) + + readConfig(b, co) + + assert.Equal(t, com.AccountID, co.AccountID) + assert.Equal(t, com.ClientID, co.ClientID) + assert.Equal(t, com.SecretKey, co.SecretKey) + assert.Equal(t, com.ClusterName, co.ClusterName) + assert.Equal(t, com.CustomerAdminEMail, co.CustomerAdminEMail) + assert.Equal(t, com.Token, co.Token) +} + +func TestLoadConfigFromData(t *testing.T) { + + // use case: all data is in base config + { + c := mockClusterConfig() + co := mockConfigObj() + + configMap := &corev1.ConfigMap{} + + c.updateConfigData(configMap) + + c.configObj = &ConfigObj{} + + loadConfigFromData(c.configObj, configMap.Data) + + assert.Equal(t, c.GetAccountID(), co.AccountID) + assert.Equal(t, c.GetClientID(), co.ClientID) + assert.Equal(t, c.GetSecretKey(), co.SecretKey) + assert.Equal(t, c.GetContextName(), co.ClusterName) + assert.Equal(t, c.GetTenantEmail(), co.CustomerAdminEMail) + assert.Equal(t, c.GetToken(), co.Token) + } + + // use case: all data is in config.json + { + c := mockClusterConfig() + + co := mockConfigObj() + configMap := &corev1.ConfigMap{ + Data: make(map[string]string), + } + + configMap.Data["config.json"] = string(c.GetConfigObj().Config()) + c.configObj = &ConfigObj{} + + loadConfigFromData(c.configObj, configMap.Data) + + assert.Equal(t, c.GetAccountID(), co.AccountID) + assert.Equal(t, c.GetClientID(), co.ClientID) + assert.Equal(t, c.GetSecretKey(), co.SecretKey) + } + + // use case: all data is in config.json + { + c := mockClusterConfig() + configMap := &corev1.ConfigMap{ + Data: make(map[string]string), + } + + // add to map + configMap.Data["clientID"] = c.configObj.ClientID + configMap.Data["secretKey"] = c.configObj.SecretKey + + // delete the content + c.configObj.ClientID = "" + c.configObj.SecretKey = "" + + configMap.Data["config.json"] = string(c.GetConfigObj().Config()) + loadConfigFromData(c.configObj, configMap.Data) + + assert.NotEmpty(t, c.GetAccountID()) + assert.NotEmpty(t, c.GetClientID()) + assert.NotEmpty(t, c.GetSecretKey()) + } + +} diff --git a/core/core/download.go b/core/core/download.go index 62c8d83a..1704d019 100644 --- a/core/core/download.go +++ b/core/core/download.go @@ -130,7 +130,7 @@ func downloadFramework(downloadInfo *metav1.DownloadInfo) error { tenant := getTenantConfig(downloadInfo.Account, "", getKubernetesApi()) - g := getPolicyGetter(nil, tenant.GetTennatEmail(), true, nil) + g := getPolicyGetter(nil, tenant.GetTenantEmail(), true, nil) if downloadInfo.Name == "" { // if framework name not specified - download all frameworks @@ -172,7 +172,7 @@ func downloadControl(downloadInfo *metav1.DownloadInfo) error { tenant := getTenantConfig(downloadInfo.Account, "", getKubernetesApi()) - g := getPolicyGetter(nil, tenant.GetTennatEmail(), false, nil) + g := getPolicyGetter(nil, tenant.GetTenantEmail(), false, nil) if downloadInfo.Name == "" { // TODO - support diff --git a/core/core/list.go b/core/core/list.go index 94b4ea61..4259a6b9 100644 --- a/core/core/list.go +++ b/core/core/list.go @@ -45,7 +45,7 @@ func (ks *Kubescape) List(listPolicies *metav1.ListPolicies) error { func listFrameworks(listPolicies *metav1.ListPolicies) ([]string, error) { tenant := getTenantConfig(listPolicies.Account, "", getKubernetesApi()) // change k8sinterface - g := getPolicyGetter(nil, tenant.GetTennatEmail(), true, nil) + g := getPolicyGetter(nil, tenant.GetTenantEmail(), true, nil) return listFrameworksNames(g), nil } @@ -53,7 +53,7 @@ func listFrameworks(listPolicies *metav1.ListPolicies) ([]string, error) { func listControls(listPolicies *metav1.ListPolicies) ([]string, error) { tenant := getTenantConfig(listPolicies.Account, "", getKubernetesApi()) // change k8sinterface - g := getPolicyGetter(nil, tenant.GetTennatEmail(), false, nil) + g := getPolicyGetter(nil, tenant.GetTenantEmail(), false, nil) l := getter.ListName if listPolicies.ListIDs { l = getter.ListID diff --git a/core/core/scan.go b/core/core/scan.go index 5a0dcd57..7fd93b7a 100644 --- a/core/core/scan.go +++ b/core/core/scan.go @@ -124,7 +124,7 @@ func (ks *Kubescape) Scan(scanInfo *cautils.ScanInfo) (*resultshandling.ResultsH downloadReleasedPolicy := getter.NewDownloadReleasedPolicy() // download config inputs from github release // set policy getter only after setting the customerGUID - scanInfo.Getters.PolicyGetter = getPolicyGetter(scanInfo.UseFrom, interfaces.tenantConfig.GetTennatEmail(), scanInfo.FrameworkScan, downloadReleasedPolicy) + scanInfo.Getters.PolicyGetter = getPolicyGetter(scanInfo.UseFrom, interfaces.tenantConfig.GetTenantEmail(), scanInfo.FrameworkScan, downloadReleasedPolicy) scanInfo.Getters.ControlsInputsGetter = getConfigInputsGetter(scanInfo.ControlsInputs, interfaces.tenantConfig.GetAccountID(), downloadReleasedPolicy) scanInfo.Getters.ExceptionsGetter = getExceptionsGetter(scanInfo.UseExceptions) From 56b3239e30cc66209b4bb542ea95ea80d789efe9 Mon Sep 17 00:00:00 2001 From: David Wertenteil Date: Mon, 23 May 2022 10:10:41 +0300 Subject: [PATCH 4/4] loading from file fallback --- core/cautils/customerloader.go | 14 +++++--------- core/cautils/customerloader_test.go | 28 +++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/core/cautils/customerloader.go b/core/cautils/customerloader.go index e7595d2b..aa4e51f8 100644 --- a/core/cautils/customerloader.go +++ b/core/cautils/customerloader.go @@ -91,7 +91,6 @@ type LocalConfig struct { func NewLocalConfig( backendAPI getter.IBackend, customerGUID, clusterName string) *LocalConfig { - var configObj *ConfigObj lc := &LocalConfig{ backendAPI: backendAPI, @@ -100,12 +99,8 @@ func NewLocalConfig( // get from configMap if existsConfigFile() { // get from file loadConfigFromFile(lc.configObj) - } else { - configObj = &ConfigObj{} - } - if configObj != nil { - lc.configObj = configObj } + if customerGUID != "" { lc.configObj.AccountID = customerGUID // override config customerGUID } @@ -206,14 +201,15 @@ func NewClusterConfig(k8s *k8sinterface.KubernetesApi, backendAPI getter.IBacken configMapNamespace: getConfigMapNamespace(), } - // get from configMap + // first, load from configMap if c.existsConfigMap() { c.loadConfigFromConfigMap() } - if c.configObj == nil && existsConfigFile() { // get from file + + // second, load from file + if existsConfigFile() { // get from file loadConfigFromFile(c.configObj) } - if customerGUID != "" { c.configObj.AccountID = customerGUID // override config customerGUID } diff --git a/core/cautils/customerloader_test.go b/core/cautils/customerloader_test.go index e8f363b3..3a17106f 100644 --- a/core/cautils/customerloader_test.go +++ b/core/cautils/customerloader_test.go @@ -141,7 +141,7 @@ func TestLoadConfigFromData(t *testing.T) { assert.Equal(t, c.GetSecretKey(), co.SecretKey) } - // use case: all data is in config.json + // use case: some data is in config.json { c := mockClusterConfig() configMap := &corev1.ConfigMap{ @@ -164,4 +164,30 @@ func TestLoadConfigFromData(t *testing.T) { assert.NotEmpty(t, c.GetSecretKey()) } + // use case: some data is in config.json + { + c := mockClusterConfig() + configMap := &corev1.ConfigMap{ + Data: make(map[string]string), + } + + c.configObj.AccountID = "tttt" + + // add to map + configMap.Data["accountID"] = mockConfigObj().AccountID + configMap.Data["clientID"] = c.configObj.ClientID + configMap.Data["secretKey"] = c.configObj.SecretKey + + // delete the content + c.configObj.ClientID = "" + c.configObj.SecretKey = "" + + configMap.Data["config.json"] = string(c.GetConfigObj().Config()) + loadConfigFromData(c.configObj, configMap.Data) + + assert.Equal(t, mockConfigObj().AccountID, c.GetAccountID()) + assert.NotEmpty(t, c.GetClientID()) + assert.NotEmpty(t, c.GetSecretKey()) + } + }