From 213e930466b473841d945f41f16b2384380f7b03 Mon Sep 17 00:00:00 2001 From: "Ariel Abuel (NCS)" Date: Mon, 8 Nov 2021 14:38:29 +0800 Subject: [PATCH] added lookup feature --- Makefile | 4 +- config/data_source_config_common_functions.go | 103 ++++++++++++++++++ config/data_source_configuration_workbook.go | 47 ++++++-- docs/data-sources/workbook.md | 23 +++- examples/files/event.xlsx | Bin 0 -> 11840 bytes examples/main.tf | 30 ++++- 6 files changed, 192 insertions(+), 15 deletions(-) create mode 100644 examples/files/event.xlsx diff --git a/Makefile b/Makefile index 82b8950..0c4f651 100644 --- a/Makefile +++ b/Makefile @@ -2,9 +2,9 @@ TEST?=$$(go list ./... | grep -v 'vendor') HOSTNAME=aa NAMESPACE=test NAME=config -VERSION=0.1.6 +VERSION=0.2.1 BINARY=terraform-provider-${NAME} -OS_ARCH=darwin_amd64 +OS_ARCH=linux_amd64 default: install diff --git a/config/data_source_config_common_functions.go b/config/data_source_config_common_functions.go index fbe04e8..2d2c32b 100644 --- a/config/data_source_config_common_functions.go +++ b/config/data_source_config_common_functions.go @@ -3,6 +3,7 @@ package config import ( "fmt" + "github.com/360EntSecGroup-Skylar/excelize/v2" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -26,6 +27,33 @@ func dataSourceFilterSchema() *schema.Schema { } } +func dataSourceLookupSchema() *schema.Schema { + return &schema.Schema{ + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "column": { + Type: schema.TypeString, + Required: true, + }, + "worksheet": { + Type: schema.TypeString, + Optional: true, + }, + "key_column": { + Type: schema.TypeString, + Required: true, + }, + "value_column": { + Type: schema.TypeString, + Required: true, + }, + }, + }, + } +} + func buildConfigDataSourceFilters(set *schema.Set) []map[string]interface{} { var filters []map[string]interface{} for _, v := range set.List() { @@ -42,6 +70,81 @@ func buildConfigDataSourceFilters(set *schema.Set) []map[string]interface{} { return filters } +func buildConfigDataSourceLookup(set *schema.Set) []map[string]interface{} { + var lookup []map[string]interface{} + for _, v := range set.List() { + m := v.(map[string]interface{}) + mvalue := make(map[string]interface{}) + mvalue["Column"] = m["column"].(string) + if m["worksheet"] != nil { + mvalue["Worksheet"] = m["worksheet"].(string) + } else { + mvalue["Worksheet"] = nil + } + mvalue["Key"] = m["key_column"].(string) + mvalue["Value"] = m["value_column"].(string) + lookup = append(lookup, mvalue) + } + return lookup +} + +func checkLookupValue(lookup []map[string]interface{}, key string) bool { + for _, lv := range lookup { + if lv["Column"].(string) == key { + return true + } + } + return false +} + +func getLookupValue(lookup []map[string]interface{}, excel_file, default_worksheet string, key string, value string) (string, error) { + var lookupValue = "" + for _, lv := range lookup { + if lv["Column"].(string) == key { + f, err := excelize.OpenFile(excel_file) + if err != nil { + return "", err + } + worksheet := "" + if lv["Worksheet"].(string) != "" { + worksheet = lv["Worksheet"].(string) + } else { + worksheet = default_worksheet + } + rows, err := f.GetRows(worksheet) + if err != nil { + return "", fmt.Errorf(fmt.Sprintf("%v", rows)) + } + + columns := len(rows[0]) + + // get column of key + header := rows[0] + column_key := 0 + column_value := -1 + for i := 0; i < columns; i++ { + if header[i] == key { + column_key = i + } + if header[i] == lv["Value"] { + column_value = i + } + } + // get row of key + if column_value >= 0 { + for _, row := range rows { + if row[column_key] == value { + lookupValue = row[column_value] + } + } + } else { + return "", fmt.Errorf("lookup value not found") + } + } + } + return lookupValue, nil +} + func checkFiltersForItem(filters []map[string]interface{}, key string, value string) bool { for _, fv := range filters { if fv["Name"] == key { diff --git a/config/data_source_configuration_workbook.go b/config/data_source_configuration_workbook.go index 2cccbe5..b94f1b2 100644 --- a/config/data_source_configuration_workbook.go +++ b/config/data_source_configuration_workbook.go @@ -65,6 +65,7 @@ func dataSourceConfigurationWorkbook() *schema.Resource { Optional: true, }, "filter": dataSourceFilterSchema(), + "lookup": dataSourceLookupSchema(), }, } } @@ -84,12 +85,17 @@ func dataSourceConfigurationItemRead(ctx context.Context, d *schema.ResourceData end_column := d.Get("col_end").(string) var filters []map[string]interface{} - // gather all filters if v, ok := d.GetOk("filter"); ok { filters = buildConfigDataSourceFilters(v.(*schema.Set)) } + var lookup []map[string]interface{} + // gather all lookups + if v, ok := d.GetOk("lookup"); ok { + lookup = buildConfigDataSourceLookup(v.(*schema.Set)) + } + // set the default configuration item column name if col_config_item == "" { col_config_item = "configuration_item" @@ -170,7 +176,7 @@ func dataSourceConfigurationItemRead(ctx context.Context, d *schema.ResourceData mapping := map_yaml.(map[interface{}]interface{}) // remap all csv headers based on mapping configuration - records := reMapData(csv, mapping["config_schema"], filters, col_config_item) + records := reMapData(csv, mapping["config_schema"], filters, lookup, excel_file, sheet_name, col_config_item) // get the transformed data data := getItemData(records, items, col_config_item) @@ -389,7 +395,7 @@ func unique(items []string) []string { return list } -func reMapData(csv []map[string]string, mapping interface{}, filters []map[string]interface{}, configuration_item string) []map[string]interface{} { +func reMapData(csv []map[string]string, mapping interface{}, filters []map[string]interface{}, lookup []map[string]interface{}, excel_file string, worksheet string, configuration_item string) []map[string]interface{} { new_csv := make([]map[string]interface{}, len(csv)) for key, value := range csv { item_key := "" @@ -436,7 +442,7 @@ func reMapData(csv []map[string]string, mapping interface{}, filters []map[strin new_value[k] = value[k] } else if strings.HasPrefix(k, "s_") || strings.HasPrefix(k, "string_") { replacer := strings.NewReplacer("s_", "", "string_", "") - new_key := replacer.Replace(k) + new_key = replacer.Replace(k) if value[k] != "" { new_value[new_key] = value[k] } else { @@ -444,7 +450,7 @@ func reMapData(csv []map[string]string, mapping interface{}, filters []map[strin } } else if strings.HasPrefix(k, "t_") || strings.HasPrefix(k, "tag_") { replacer := strings.NewReplacer("t_", "", "tag_", "") - new_key := strings.Title(replacer.Replace(k)) + new_key = strings.Title(replacer.Replace(k)) if value[k] != "" { new_tag[new_key] = value[k] } else { @@ -452,7 +458,7 @@ func reMapData(csv []map[string]string, mapping interface{}, filters []map[strin } } else if strings.HasPrefix(k, "n_") || strings.HasPrefix(k, "num_") || strings.HasPrefix(k, "number_") || strings.HasPrefix(k, "numeric_") { replacer := strings.NewReplacer("n_", "", "num_", "", "number_", "", "numeric_", "") - new_key := replacer.Replace(k) + new_key = replacer.Replace(k) if value[k] != "" { n, _ := strconv.ParseFloat(value[k], 64) new_value[new_key] = n @@ -461,7 +467,7 @@ func reMapData(csv []map[string]string, mapping interface{}, filters []map[strin } } else if strings.HasPrefix(k, "b_") || strings.HasPrefix(k, "bool_") || strings.HasPrefix(k, "boolean_") { replacer := strings.NewReplacer("b_", "", "bool_", "", "boolean_", "") - new_key := replacer.Replace(k) + new_key = replacer.Replace(k) if value[k] != "" { val, _ := strconv.ParseBool(value[k]) new_value[new_key] = val @@ -470,7 +476,7 @@ func reMapData(csv []map[string]string, mapping interface{}, filters []map[strin } } else if strings.HasPrefix(k, "l_") || strings.HasPrefix(k, "list_") { replacer := strings.NewReplacer("l_", "", "list_", "") - new_key := replacer.Replace(k) + new_key = replacer.Replace(k) if value[k] != "" { new_value[new_key] = strings.Split(value[k], ",") } else { @@ -478,7 +484,7 @@ func reMapData(csv []map[string]string, mapping interface{}, filters []map[strin } } else if strings.HasPrefix(k, "m_") || strings.HasPrefix(k, "map_") || strings.HasPrefix(k, "h_") || strings.HasPrefix(k, "hash_") { replacer := strings.NewReplacer("m_", "", "map_", "", "h_", "", "hash_", "") - new_key := replacer.Replace(k) + new_key = replacer.Replace(k) if value[k] != "" { vlist := strings.Split(value[k], ",") vmap := make(map[string]string) @@ -491,9 +497,32 @@ func reMapData(csv []map[string]string, mapping interface{}, filters []map[strin new_value[new_key] = map[string]string{} } } else { + new_key = k new_value[k] = value[k] } + // get lookup value + if lookup != nil && checkLookupValue(lookup, new_key) { + if strings.Contains(value[new_key], ",") { + lkvals := strings.Split(value[new_key], ",") + for idx, vl := range lkvals { + lookup_value, err := getLookupValue(lookup, excel_file, worksheet, new_key, vl) + if err == nil && lookup_value != "" { + if idx == 0 { + new_value[new_key] = lookup_value + } else { + new_value[new_key] = new_value[new_key].(string) + "," + lookup_value + } + } + } + } else { + lookup_value, err := getLookupValue(lookup, excel_file, worksheet, new_key, value[new_key]) + if err == nil && lookup_value != "" { + new_value[new_key] = lookup_value + } + } + } + // check if value included in filter if len(filters) > 0 { if !include_value { diff --git a/docs/data-sources/workbook.md b/docs/data-sources/workbook.md index cf37d88..eca5bd4 100644 --- a/docs/data-sources/workbook.md +++ b/docs/data-sources/workbook.md @@ -40,6 +40,17 @@ data "config_workbook" "excel" { } } +data "config_workbook" "excel" { + excel = "filename.xlsx" + worksheet = "Sheet1" + lookup { + column = "script_name" + worksheet = "event_target" + key = "name" + value = "script" + } +} + data "config_workbook" "excel_vertical" { excel = "filename.xlsx" worksheet = "Sheet2" @@ -214,15 +225,25 @@ config_schema: - **schema** (String) - (Optional) JSON/YAML format string containing the schema of the configurations. - **worksheet** (String) - (Optional) The sheet name of the excel worksheet - **orientation** (String) - (Optional) default horizontal. Valid values are (horizontal,vertical) +- **filter** (Block) - (Optional) Filter the data +- **lookup** (Block) - (Optional) Replace data using lookup. Like `vlookup` function in Excel #### There should only be 1 instance of **csv** or **excel**. You cannot define both on the same data source -### Filters +### Filter Nested `filter` blocks have the following structure: - **name** (String) - (Required) The name of the header/column - **values** (List) - (Required) The list of valid values to filter +### Lookup + +Nested `lookup` blocks have the following structure: +- **column** (String) - (Required) Column name of data you need lookup +- **worksheet** (String) - (Optional) Worksheet of the reference data. Default value is current worksheet +- **column_key** (String) - (Required) Colummn name of the lookup key +- **column_value** (String) - (Required) Column name of the lookup value + ### Output - **id** (String) The ID of this resource. diff --git a/examples/files/event.xlsx b/examples/files/event.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7d462dbc1f47542be32dbdbb81028bbf615e5b49 GIT binary patch literal 11840 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 R*XR&IP+kLP!PGzR{tsgFV5R^7 literal 0 HcmV?d00001 diff --git a/examples/main.tf b/examples/main.tf index 18100fb..5bf6cb5 100644 --- a/examples/main.tf +++ b/examples/main.tf @@ -1,8 +1,8 @@ terraform { required_providers { config = { - version = "0.1.6" - source = "alabuel/config" + version = "0.2.1" + source = "aa/test/config" } } } @@ -29,10 +29,30 @@ data "config_workbook" "excel" { data "config_workbook" "vexcel" { excel = "files/data.xlsx" worksheet = "Vert" - type = "vertical" + orientation = "vertical" configuration_item = "my_vertical" } +data "config_workbook" "lkexcel" { + excel = "files/event.xlsx" + worksheet = "cloudwatch_event_rule" + configuration_item = "cloudwatch_event_rule" + + lookup { + column = "command" + worksheet = "event_target" + key_column = "name" + value_column = "script" + } + + lookup { + column = "dependents" + worksheet = "event_target" + key_column = "name" + value_column = "script" + } +} + output "horiz" { value = jsondecode(data.config_workbook.excel.json) } @@ -40,3 +60,7 @@ output "horiz" { output "vert" { value = jsondecode(data.config_workbook.vexcel.json) } + +output "lookup" { + value = jsondecode(data.config_workbook.lkexcel.json) +} \ No newline at end of file