diff --git a/tools/cli/commands.go b/tools/cli/commands.go index f0f7c4b9ea8..9cbb29d01fc 100644 --- a/tools/cli/commands.go +++ b/tools/cli/commands.go @@ -117,6 +117,8 @@ const ( FlagActiveClusterNameWithAlias = FlagActiveClusterName + ", ac" FlagClusters = "clusters" FlagClustersWithAlias = FlagClusters + ", cl" + FlagDomainData = "domain_data" + FlagDomainDataWithAlias = FlagDomainData + ", dmd" ) const ( @@ -191,6 +193,22 @@ func RegisterDomain(c *cli.Context) { return } } + + domainData := map[string]string{} + if len(requiredDomainDataKeys) > 0 { + domainDataStr := getRequiredOption(c, FlagDomainData) + domainData, err = parseDomainDataKVs(domainDataStr) + if err != nil { + fmt.Printf("Register Domain failed: %v.\n", err.Error()) + return + } + err = checkRequiredDomainDataKVs(domainData) + if err != nil { + fmt.Printf("Register Domain failed: %v.\n", err.Error()) + return + } + } + var activeClusterName string if c.IsSet(FlagActiveClusterName) { activeClusterName = c.String(FlagActiveClusterName) @@ -209,9 +227,10 @@ func RegisterDomain(c *cli.Context) { } request := &s.RegisterDomainRequest{ - Name: common.StringPtr(domain), - Description: common.StringPtr(description), - OwnerEmail: common.StringPtr(ownerEmail), + Name: common.StringPtr(domain), + Description: common.StringPtr(description), + OwnerEmail: common.StringPtr(ownerEmail), + Data: domainData, WorkflowExecutionRetentionPeriodInDays: common.Int32Ptr(int32(retentionDays)), EmitMetric: common.BoolPtr(emitMetric), Clusters: clusters, @@ -274,6 +293,14 @@ func UpdateDomain(c *cli.Context) { if c.IsSet(FlagOwnerEmail) { ownerEmail = c.String(FlagOwnerEmail) } + domainData := map[string]string{} + if c.IsSet(FlagDomainData) { + domainDataStr := c.String(FlagDomainData) + domainData, err = parseDomainDataKVs(domainDataStr) + if err != nil { + ErrorAndExit("Update Domain failed", err) + } + } if c.IsSet(FlagRetentionDays) { retentionDays = int32(c.Int(FlagRetentionDays)) } @@ -298,6 +325,7 @@ func UpdateDomain(c *cli.Context) { updateInfo := &s.UpdateDomainInfo{ Description: common.StringPtr(description), OwnerEmail: common.StringPtr(ownerEmail), + Data: domainData, } updateConfig := &s.DomainConfiguration{ WorkflowExecutionRetentionPeriodInDays: common.Int32Ptr(int32(retentionDays)), @@ -341,11 +369,12 @@ func DescribeDomain(c *cli.Context) { fmt.Printf("Domain %s does not exist.\n", domain) } } else { - fmt.Printf("Name: %v\nDescription: %v\nOwnerEmail: %v\nStatus: %v\nRetentionInDays: %v\n"+ + fmt.Printf("Name: %v\nDescription: %v\nOwnerEmail: %v\nDomainData: %v\nStatus: %v\nRetentionInDays: %v\n"+ "EmitMetrics: %v\nActiveClusterName: %v\nClusters: %v\n", resp.DomainInfo.GetName(), resp.DomainInfo.GetDescription(), resp.DomainInfo.GetOwnerEmail(), + resp.DomainInfo.Data, resp.DomainInfo.GetStatus(), resp.Configuration.GetWorkflowExecutionRetentionPeriodInDays(), resp.Configuration.GetEmitMetric(), diff --git a/tools/cli/domain.go b/tools/cli/domain.go index d5cde50f7b0..f333eaf459a 100644 --- a/tools/cli/domain.go +++ b/tools/cli/domain.go @@ -20,7 +20,47 @@ package cli -import "github.com/urfave/cli" +import ( + "fmt" + "strings" + + "github.com/urfave/cli" +) + +// by default we don't require any domain data. But this can be overridden by calling SetRequiredDomainDataKeys() +var requiredDomainDataKeys = []string{} + +// SetRequiredDomainDataKeys will set requiredDomainDataKeys +func SetRequiredDomainDataKeys(keys []string) { + requiredDomainDataKeys = keys +} + +func checkRequiredDomainDataKVs(domainData map[string]string) error { + //check requiredDomainDataKeys + for _, k := range requiredDomainDataKeys { + _, ok := domainData[k] + if !ok { + return fmt.Errorf("domain data error, missing required key %v . All required keys: %v", k, requiredDomainDataKeys) + } + } + return nil +} + +func parseDomainDataKVs(domainDataStr string) (map[string]string, error) { + kvstrs := strings.Split(domainDataStr, ",") + kvMap := map[string]string{} + for _, kvstr := range kvstrs { + kv := strings.Split(kvstr, ":") + if len(kv) != 2 { + return kvMap, fmt.Errorf("domain data format error. It must be k1:v2,k2:v2,...,kn:vn") + } + k := strings.TrimSpace(kv[0]) + v := strings.TrimSpace(kv[1]) + kvMap[k] = v + } + + return kvMap, nil +} func newDomainCommands() []cli.Command { return []cli.Command{ @@ -53,6 +93,10 @@ func newDomainCommands() []cli.Command { Name: FlagClustersWithAlias, Usage: "Clusters", }, + cli.StringFlag{ + Name: FlagDomainDataWithAlias, + Usage: "Domain data of key value pairs, in format of k1:v1,k2:v2,k3:v3 ", + }, }, Action: func(c *cli.Context) { RegisterDomain(c) @@ -87,6 +131,10 @@ func newDomainCommands() []cli.Command { Name: FlagClustersWithAlias, Usage: "Clusters", }, + cli.StringFlag{ + Name: FlagDomainDataWithAlias, + Usage: "Domain data of key value pairs, in format of k1:v1,k2:v2,k3:v3 ", + }, }, Action: func(c *cli.Context) { UpdateDomain(c)