diff --git a/cmd/cluster/update_cluster.go b/cmd/cluster/update_cluster.go index 9862a3ae..2dc1388f 100644 --- a/cmd/cluster/update_cluster.go +++ b/cmd/cluster/update_cluster.go @@ -65,27 +65,27 @@ var updateClusterCmd = &cobra.Command{ regionInfoMapList := []map[string]string{} changedRegionInfo := cmd.Flags().Changed("region-info") - changedNodeInfo := cmd.Flags().Changed("node-config") - - defaultNumCores := 0 - defaultDiskSizeGb := 0 - defaultDiskIops := 0 - if changedNodeInfo { - nodeConfig, _ := cmd.Flags().GetStringToInt("node-config") - numCores, ok := nodeConfig["num-cores"] - if !asymmetricGeoEnabled && !ok { - logrus.Fatalln("Number of cores not specified in node config") - } - if asymmetricGeoEnabled && ok { - defaultNumCores = numCores - } - if diskSizeGb, ok := nodeConfig["disk-size-gb"]; ok { - defaultDiskSizeGb = diskSizeGb - } - if diskIops, ok := nodeConfig["disk-iops"]; ok { - defaultDiskIops = diskIops - } - } + changedNodeInfo := cmd.Flags().Changed("node-config") + + defaultNumCores := 0 + defaultDiskSizeGb := 0 + defaultDiskIops := 0 + if changedNodeInfo { + nodeConfig, _ := cmd.Flags().GetStringToInt("node-config") + numCores, ok := nodeConfig["num-cores"] + if !asymmetricGeoEnabled && !ok { + logrus.Fatalln("Number of cores not specified in node config") + } + if asymmetricGeoEnabled && ok { + defaultNumCores = numCores + } + if diskSizeGb, ok := nodeConfig["disk-size-gb"]; ok { + defaultDiskSizeGb = diskSizeGb + } + if diskIops, ok := nodeConfig["disk-iops"]; ok { + defaultDiskIops = diskIops + } + } if changedRegionInfo { regionInfoList, _ := cmd.Flags().GetStringArray("region-info") @@ -133,20 +133,20 @@ var updateClusterCmd = &cobra.Command{ logrus.Fatalln("Number of nodes not specified in region info") } if _, ok := regionInfoMap["num-cores"]; asymmetricGeoEnabled && !ok && defaultNumCores > 0 { - regionInfoMap["num-cores"] = strconv.Itoa(defaultNumCores) - } - if _, ok := regionInfoMap["disk-size-gb"]; asymmetricGeoEnabled && !ok && defaultDiskSizeGb > 0 { - regionInfoMap["disk-size-gb"] = strconv.Itoa(defaultDiskSizeGb) - } - if _, ok := regionInfoMap["disk-iops"]; asymmetricGeoEnabled && !ok && defaultDiskIops > 0 { - regionInfoMap["disk-iops"] = strconv.Itoa(defaultDiskIops) - } + regionInfoMap["num-cores"] = strconv.Itoa(defaultNumCores) + } + if _, ok := regionInfoMap["disk-size-gb"]; asymmetricGeoEnabled && !ok && defaultDiskSizeGb > 0 { + regionInfoMap["disk-size-gb"] = strconv.Itoa(defaultDiskSizeGb) + } + if _, ok := regionInfoMap["disk-iops"]; asymmetricGeoEnabled && !ok && defaultDiskIops > 0 { + regionInfoMap["disk-iops"] = strconv.Itoa(defaultDiskIops) + } regionInfoMapList = append(regionInfoMapList, regionInfoMap) } } - clusterSpec, err := authApi.CreateClusterSpec(cmd, regionInfoMapList) + clusterSpec, err := authApi.EditClusterSpec(cmd, regionInfoMapList, clusterID) if err != nil { logrus.Fatalf("Error while creating cluster spec: %v", err) } diff --git a/internal/client/client.go b/internal/client/client.go index 792ac2e9..0993924a 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -146,7 +146,7 @@ func (a *AuthApiClient) GetProjectID(projectID string) (string, error) { return projectData[0].Info.Id, nil } -func (a *AuthApiClient) CreateClusterSpec(cmd *cobra.Command, regionInfoList []map[string]string) (*ybmclient.ClusterSpec, error) { +func (a *AuthApiClient) buildClusterSpec(cmd *cobra.Command, regionInfoList []map[string]string, regionNodeConfigsMap map[string][]ybmclient.NodeConfigurationResponseItem) (*ybmclient.ClusterSpec, error) { var diskSizeGb int32 var diskIops int32 @@ -317,8 +317,12 @@ func (a *AuthApiClient) CreateClusterSpec(cmd *cobra.Command, regionInfoList []m for k, _ := range regionNodeInfoMap { regions = append(regions, k) } - // Grab available node configurations by region. - regionNodeConfigsMap := a.GetSupportedNodeConfigurationsV2(cloud, tier, regions, geoPartitioned) + + if regionNodeConfigsMap == nil { + // Grab available node configurations by region. + regionNodeConfigsMap = a.GetSupportedNodeConfigurationsV2(cloud, tier, regions, geoPartitioned) + } + // Create slice of region keys of node configurations response. nodeConfigurationsRegions := make([]string, 0, len(regionNodeConfigsMap)) for k, _ := range regionNodeConfigsMap { @@ -448,6 +452,20 @@ func (a *AuthApiClient) CreateClusterSpec(cmd *cobra.Command, regionInfoList []m return clusterSpec, nil } +func (a *AuthApiClient) CreateClusterSpec(cmd *cobra.Command, regionInfoList []map[string]string) (*ybmclient.ClusterSpec, error) { + return a.buildClusterSpec(cmd, regionInfoList, nil) +} + +func (a *AuthApiClient) EditClusterSpec(cmd *cobra.Command, regionInfoList []map[string]string, clusterID string) (*ybmclient.ClusterSpec, error) { + regions := make([]string, 0, len(regionInfoList)) + for _, regionInfo := range regionInfoList { + region := regionInfo["region"] + regions = append(regions, region) + } + var regionNodeConfigsMap = a.GetSupportedNodeConfigurationsForEdit(clusterID, regions) + return a.buildClusterSpec(cmd, regionInfoList, regionNodeConfigsMap) +} + func ToClusterNodeInfo(opt *ybmclient.OptionalClusterNodeInfo) ybmclient.ClusterNodeInfo { clusterNodeInfo := *ybmclient.NewClusterNodeInfoWithDefaults() clusterNodeInfo.SetNumCores(opt.GetNumCores()) @@ -933,6 +951,16 @@ func (a *AuthApiClient) GetSupportedNodeConfigurationsV2(cloud string, tier stri return instanceResp.GetData() } +func (a *AuthApiClient) GetSupportedNodeConfigurationsForEdit(clusterId string, regions []string) map[string][]ybmclient.NodeConfigurationResponseItem { + instanceResp, resp, err := a.ApiClient.ClusterApi.GetSupportedNodeConfigurationsForClusterEdit(a.ctx, a.AccountID, a.ProjectID, clusterId).Regions(regions).PerRegion(true).ShowDisabled(false).ClusterType("PRIMARY").Execute() + if err != nil { + b, _ := httputil.DumpResponse(resp, true) + logrus.Debug(b) + logrus.Fatalln(err) + } + return instanceResp.GetData() +} + func (a *AuthApiClient) GetFromInstanceType(resource string, cloud string, tier string, region string, numCores int32) (int32, error) { instanceResp, resp, err := a.GetSupportedNodeConfigurations(cloud, tier, region).Execute() if err != nil { @@ -1462,7 +1490,7 @@ func (a *AuthApiClient) ListMetricsExporterConfigs() ybmclient.ApiListMetricsExp } func (a *AuthApiClient) ListDbAuditLogsExportConfigs(clusterId string) ybmclient.ApiListDbAuditExporterConfigRequest { - return a.ApiClient.ClusterApi.ListDbAuditExporterConfig(a.ctx, a.AccountID, a.ProjectID, clusterId) + return a.ApiClient.ClusterApi.ListDbAuditExporterConfig(a.ctx, a.AccountID, a.ProjectID, clusterId) } func (a *AuthApiClient) DeleteMetricsExporterConfig(configId string) ybmclient.ApiDeleteMetricsExporterConfigRequest {