Skip to content

Commit 480ac8f

Browse files
fix: Update release command
1 parent f9bb0ce commit 480ac8f

File tree

6 files changed

+351
-7
lines changed

6 files changed

+351
-7
lines changed

cmd/ctrlc/root/api/api.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/create"
88
"github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/delete"
99
"github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/get"
10+
"github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/update"
1011
"github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/upsert"
1112
"github.com/spf13/cobra"
1213
"github.com/spf13/viper"
@@ -49,6 +50,7 @@ func NewAPICmd() *cobra.Command {
4950
cmd.AddCommand(create.NewCreateCmd())
5051
cmd.AddCommand(upsert.NewUpsertCmd())
5152
cmd.AddCommand(delete.NewDeleteCmd())
53+
cmd.AddCommand(update.NewUpdateCmd())
5254

5355
return cmd
5456
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package release
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"strings"
7+
8+
"github.com/MakeNowJust/heredoc/v2"
9+
"github.com/ctrlplanedev/cli/internal/api"
10+
"github.com/ctrlplanedev/cli/internal/cliutil"
11+
"github.com/spf13/cobra"
12+
"github.com/spf13/viper"
13+
)
14+
15+
func safeConvertToReleaseStatus(stat string) (*api.UpdateReleaseJSONBodyStatus, error) {
16+
if stat == "" {
17+
return nil, nil
18+
}
19+
status := stat
20+
statusLower := strings.ToLower(status)
21+
if statusLower == "ready" || statusLower == "" {
22+
s := api.UpdateReleaseJSONBodyStatusReady
23+
return &s, nil
24+
}
25+
if statusLower == "building" {
26+
s := api.UpdateReleaseJSONBodyStatusBuilding
27+
return &s, nil
28+
}
29+
if statusLower == "failed" {
30+
s := api.UpdateReleaseJSONBodyStatusFailed
31+
return &s, nil
32+
}
33+
return nil, fmt.Errorf("invalid release status: %s", status)
34+
}
35+
36+
func NewUpdateReleaseCmd() *cobra.Command {
37+
var releaseID string
38+
var versionFlag string
39+
var metadata map[string]string
40+
var configArray map[string]string
41+
var links map[string]string
42+
var name string
43+
var status string
44+
var message string
45+
46+
cmd := &cobra.Command{
47+
Use: "release [flags]",
48+
Short: "Update a release",
49+
Long: `Update a release with the specified version and configuration.`,
50+
Example: heredoc.Doc(`
51+
# Update a release
52+
$ ctrlc update release --release-id 1234567890 --version v1.0.0 --status ready
53+
`),
54+
RunE: func(cmd *cobra.Command, args []string) error {
55+
if releaseID == "" {
56+
return fmt.Errorf("release ID is required")
57+
}
58+
59+
apiURL := viper.GetString("url")
60+
apiKey := viper.GetString("api-key")
61+
client, err := api.NewAPIKeyClientWithResponses(apiURL, apiKey)
62+
if err != nil {
63+
return fmt.Errorf("failed to create API client: %w", err)
64+
}
65+
66+
stat, err := safeConvertToReleaseStatus(status)
67+
if err != nil {
68+
return fmt.Errorf("failed to convert release status: %w", err)
69+
}
70+
71+
if len(links) > 0 {
72+
linksJSON, err := json.Marshal(links)
73+
if err != nil {
74+
return fmt.Errorf("failed to marshal links: %w", err)
75+
}
76+
metadata["ctrlplane/links"] = string(linksJSON)
77+
}
78+
79+
config := cliutil.ConvertConfigArrayToNestedMap(configArray)
80+
81+
resp, err := client.UpdateRelease(cmd.Context(), releaseID, api.UpdateReleaseJSONRequestBody{
82+
Version: cliutil.StringPtr(versionFlag),
83+
Metadata: cliutil.MetadataPtr(metadata),
84+
Config: cliutil.ConfigPtr(config),
85+
Name: cliutil.StringPtr(name),
86+
Status: stat,
87+
Message: cliutil.StringPtr(message),
88+
})
89+
if err != nil {
90+
return fmt.Errorf("failed to update release: %w", err)
91+
}
92+
93+
return cliutil.HandleOutput(cmd, resp)
94+
},
95+
}
96+
97+
cmd.Flags().StringVarP(&releaseID, "release-id", "r", "", "ID of the release to update (required)")
98+
cmd.Flags().StringVarP(&versionFlag, "version", "v", "", "Version of the release")
99+
cmd.Flags().StringToStringVarP(&metadata, "metadata", "m", make(map[string]string), "Metadata key-value pairs (e.g. --metadata key=value)")
100+
cmd.Flags().StringToStringVarP(&configArray, "config", "c", make(map[string]string), "Config key-value pairs with nested values (can be specified multiple times)")
101+
cmd.Flags().StringToStringVarP(&links, "link", "l", make(map[string]string), "Links key-value pairs (can be specified multiple times)")
102+
cmd.Flags().StringVarP(&name, "name", "n", "", "Name of the release")
103+
cmd.Flags().StringVarP(&status, "status", "s", "", "Status of the release")
104+
cmd.Flags().StringVar(&message, "message", "", "Message of the release")
105+
106+
cmd.MarkFlagRequired("release-id")
107+
108+
return cmd
109+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package update
2+
3+
import (
4+
"github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/update/release"
5+
"github.com/spf13/cobra"
6+
)
7+
8+
func NewUpdateCmd() *cobra.Command {
9+
cmd := &cobra.Command{
10+
Use: "update <command>",
11+
Short: "Update resources",
12+
Long: `Commands for updating resources.`,
13+
RunE: func(cmd *cobra.Command, args []string) error {
14+
return cmd.Help()
15+
},
16+
}
17+
18+
cmd.AddCommand(release.NewUpdateReleaseCmd())
19+
20+
return cmd
21+
}

cmd/ctrlc/root/api/upsert/release/release.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ import (
1717
func safeConvertToReleaseStatus(status string) (*api.UpsertReleaseJSONBodyStatus, error) {
1818
statusLower := strings.ToLower(status)
1919
if statusLower == "ready" || statusLower == "" {
20-
s := api.Ready
20+
s := api.UpsertReleaseJSONBodyStatusReady
2121
return &s, nil
2222
}
2323
if statusLower == "building" {
24-
s := api.Building
24+
s := api.UpsertReleaseJSONBodyStatusBuilding
2525
return &s, nil
2626
}
2727
if statusLower == "failed" {
28-
s := api.Failed
28+
s := api.UpsertReleaseJSONBodyStatusFailed
2929
return &s, nil
3030
}
3131
return nil, fmt.Errorf("invalid release status: %s", status)
@@ -117,7 +117,7 @@ func NewUpsertReleaseCmd() *cobra.Command {
117117
cmd.Flags().StringToStringVarP(&links, "link", "l", make(map[string]string), "Links key-value pairs (can be specified multiple times)")
118118
cmd.Flags().StringVarP(&createdAt, "created-at", "t", "", "Created at timestamp (e.g. --created-at 2024-01-01T00:00:00Z) for the release channel")
119119
cmd.Flags().StringVarP(&name, "name", "n", "", "Name of the release channel")
120-
cmd.Flags().StringVarP(&status, "status", "s", string(api.Ready), "Status of the release channel (one of: ready, building, failed)")
120+
cmd.Flags().StringVarP(&status, "status", "s", string(api.UpsertReleaseJSONBodyStatusReady), "Status of the release channel (one of: ready, building, failed)")
121121
cmd.Flags().StringVar(&message, "message", "", "Message of the release channel")
122122

123123
cmd.MarkFlagRequired("version")

0 commit comments

Comments
 (0)