Skip to content

Commit 21eb9c6

Browse files
committed
Add disks command.
1 parent f86ad86 commit 21eb9c6

File tree

11 files changed

+305
-34
lines changed

11 files changed

+305
-34
lines changed

.github/workflows/release.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ jobs:
77
runs-on: ubuntu-latest
88
steps:
99
- name: Checkout
10-
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # pin@v3
10+
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # pin@v4
1111
with:
1212
fetch-depth: 0
1313
- name: Install Go
14-
uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # pin@v3
14+
uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # pin@v5
1515
with:
16-
go-version: 1.18
16+
go-version: 1.22
1717
- name: Vet
1818
run: go vet ./...
1919
release:
@@ -22,22 +22,22 @@ jobs:
2222
runs-on: ubuntu-latest
2323
steps:
2424
- name: Checkout
25-
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # pin@v3
25+
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # pin@v4
2626
with:
2727
fetch-depth: 0
2828
- name: Install Go
29-
uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # pin@v3
29+
uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # pin@v5
3030
with:
31-
go-version: 1.18
31+
go-version: 1.22
3232
- name: Generate Token
3333
id: generate-token
34-
uses: tibdex/github-app-token@021a2405c7f990db57f5eae5397423dcc554159c # pin@v1
34+
uses: tibdex/github-app-token@3beb63f4bd073e61482598c45c71c1019b59b73a # pin@v2
3535
with:
3636
app_id: ${{ secrets.APP_ID }}
3737
private_key: ${{ secrets.PRIVATE_KEY }}
3838
- name: Run GoReleaser
39-
uses: goreleaser/goreleaser-action@b508e2e3ef3b19d4e4146d4f8fb3ba9db644a757 # pin@v3
39+
uses: goreleaser/goreleaser-action@286f3b13b1b49da4ac219696163fb8c1c93e1200 # pin@v6
4040
with:
41-
args: release --rm-dist
41+
args: release --clean
4242
env:
4343
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}

.goreleaser.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
version: 2
12
before:
23
hooks:
34
- go mod download
@@ -21,16 +22,16 @@ archives:
2122
files:
2223
- none*
2324
brews:
24-
- tap:
25+
- repository:
2526
owner: lade-io
2627
name: homebrew-tap
27-
folder: Formula
28+
directory: Formula
2829
homepage: https://github.com/lade-io/lade
2930
description: Developer tool to manage your apps
3031
checksum:
3132
name_template: 'checksums.txt'
3233
snapshot:
33-
name_template: "{{ .Tag }}-next"
34+
version_template: "{{ .Tag }}-next"
3435
changelog:
3536
sort: asc
3637
filters:

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ Commands:
7878
addons Manage addons
7979
apps Manage apps
8080
deploy Deploy an app
81+
disks Manage disks
8182
domains Manage domains
8283
env Manage app environment
8384
help Help about any command

cmd/apps.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,16 @@ func getAppName() string {
167167
return filepath.Base(cwd)
168168
}
169169

170+
func getDiskPlan(client *lade.Client) string {
171+
plan, err := client.Plan.Default("disk")
172+
if err != nil {
173+
return ""
174+
}
175+
return plan.ID
176+
}
177+
170178
func getPlan(client *lade.Client) string {
171-
plan, err := client.Plan.Default()
179+
plan, err := client.Plan.Default("")
172180
if err != nil {
173181
return ""
174182
}

cmd/disks.go

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
package cmd
2+
3+
import (
4+
"strconv"
5+
6+
"github.com/AlecAivazis/survey/v2"
7+
"github.com/dustin/go-humanize"
8+
"github.com/lade-io/go-lade"
9+
"github.com/rodaine/table"
10+
"github.com/spf13/cobra"
11+
)
12+
13+
var disksCmd = &cobra.Command{
14+
Use: "disks",
15+
Short: "Manage disks",
16+
}
17+
18+
var disksAddCmd = func() *cobra.Command {
19+
var appName string
20+
opts := &lade.DiskCreateOpts{}
21+
cmd := &cobra.Command{
22+
Use: "add <disk-name>",
23+
Short: "Add a disk to an app",
24+
Args: cobra.MaximumNArgs(1),
25+
RunE: func(cmd *cobra.Command, args []string) error {
26+
client, err := getClient()
27+
if err != nil {
28+
return err
29+
}
30+
if len(args) > 0 {
31+
opts.Name = args[0]
32+
}
33+
return disksAddRun(client, opts, appName)
34+
},
35+
}
36+
cmd.Flags().StringVarP(&appName, "app", "a", "", "App Name")
37+
cmd.Flags().StringVar(&opts.Path, "path", "", "Path")
38+
cmd.Flags().StringVarP(&opts.PlanID, "plan", "p", "", "Plan")
39+
return cmd
40+
}()
41+
42+
var disksListCmd = func() *cobra.Command {
43+
var appName string
44+
cmd := &cobra.Command{
45+
Use: "list",
46+
Short: "List disks of an app",
47+
Args: cobra.NoArgs,
48+
RunE: func(cmd *cobra.Command, args []string) error {
49+
client, err := getClient()
50+
if err != nil {
51+
return err
52+
}
53+
return disksListRun(client, appName)
54+
},
55+
}
56+
cmd.Flags().StringVarP(&appName, "app", "a", "", "App Name")
57+
return cmd
58+
}()
59+
60+
var disksPlansCmd = &cobra.Command{
61+
Use: "plans",
62+
Short: "List available plans",
63+
Args: cobra.NoArgs,
64+
RunE: func(cmd *cobra.Command, args []string) error {
65+
client, err := getClient()
66+
if err != nil {
67+
return err
68+
}
69+
return disksPlansRun(client)
70+
},
71+
}
72+
73+
var disksRemoveCmd = func() *cobra.Command {
74+
var appName string
75+
cmd := &cobra.Command{
76+
Use: "remove <disk-name>",
77+
Short: "Remove a disk from an app",
78+
Args: cobra.MaximumNArgs(1),
79+
RunE: func(cmd *cobra.Command, args []string) error {
80+
client, err := getClient()
81+
if err != nil {
82+
return err
83+
}
84+
var diskName string
85+
if len(args) > 0 {
86+
diskName = args[0]
87+
}
88+
return disksRemoveRun(client, appName, diskName)
89+
},
90+
}
91+
cmd.Flags().StringVarP(&appName, "app", "a", "", "App Name")
92+
return cmd
93+
}()
94+
95+
var disksUpdateCmd = func() *cobra.Command {
96+
var appName string
97+
opts := &lade.DiskUpdateOpts{}
98+
cmd := &cobra.Command{
99+
Use: "update <disk-name>",
100+
Short: "Update a disk of an app",
101+
RunE: func(cmd *cobra.Command, args []string) error {
102+
client, err := getClient()
103+
if err != nil {
104+
return err
105+
}
106+
var diskName string
107+
if len(args) > 0 {
108+
diskName = args[0]
109+
}
110+
return disksUpdateRun(client, opts, appName, diskName)
111+
},
112+
}
113+
cmd.Flags().StringVarP(&appName, "app", "a", "", "App Name")
114+
cmd.Flags().StringVarP(&opts.PlanID, "plan", "p", "", "Plan")
115+
return cmd
116+
}()
117+
118+
func init() {
119+
disksCmd.AddCommand(disksAddCmd)
120+
disksCmd.AddCommand(disksListCmd)
121+
disksCmd.AddCommand(disksPlansCmd)
122+
disksCmd.AddCommand(disksRemoveCmd)
123+
disksCmd.AddCommand(disksUpdateCmd)
124+
}
125+
126+
func disksAddRun(client *lade.Client, opts *lade.DiskCreateOpts, appName string) error {
127+
if err := askSelect("App Name:", getAppName, client, getAppOptions, &appName); err != nil {
128+
return err
129+
}
130+
if err := askInput("Disk Name:", appName, &opts.Name, validateDiskName(client, appName)); err != nil {
131+
return err
132+
}
133+
if err := askSelect("Plan:", getDiskPlan, client, getDiskPlanOptions(""), &opts.PlanID); err != nil {
134+
return err
135+
}
136+
if err := askInput("Path:", "/data", &opts.Path, validatePath); err != nil {
137+
return err
138+
}
139+
_, err := client.Disk.Create(appName, opts)
140+
return err
141+
}
142+
143+
func disksListRun(client *lade.Client, appName string) error {
144+
if err := askSelect("App Name:", getAppName, client, getAppOptions, &appName); err != nil {
145+
return err
146+
}
147+
disks, err := client.Disk.List(appName)
148+
if err != nil {
149+
return err
150+
}
151+
t := table.New("NAME", "PLAN", "PATH", "CREATED")
152+
for _, disk := range disks {
153+
t.AddRow(disk.Name, disk.PlanID, disk.Path, humanize.Time(disk.CreatedAt))
154+
}
155+
t.Print()
156+
return nil
157+
}
158+
159+
func disksPlansRun(client *lade.Client) error {
160+
plans, err := client.Plan.List("disk")
161+
if err != nil {
162+
return err
163+
}
164+
t := table.New("ID", "DISK", "PRICE HOURLY", "PRICE MONTHLY")
165+
for _, plan := range plans {
166+
priceHourly := printPrice(plan.PriceHourly, -1)
167+
priceMonthly := printPrice(plan.PriceMonthly, 2)
168+
t.AddRow(plan.ID, plan.Disk, priceHourly, priceMonthly)
169+
}
170+
t.Print()
171+
return nil
172+
}
173+
174+
func disksRemoveRun(client *lade.Client, appName, diskName string) error {
175+
if err := askSelect("App Name:", getAppName, client, getAppOptions, &appName); err != nil {
176+
return err
177+
}
178+
if err := askSelect("Disk Name:", "", client, getDiskOptions(appName), &diskName); err != nil {
179+
return err
180+
}
181+
disk, err := client.Disk.Get(appName, diskName)
182+
if err != nil {
183+
return err
184+
}
185+
prompt := &survey.Confirm{
186+
Message: "Do you really want to delete " + disk.Name + "?",
187+
}
188+
confirm := false
189+
survey.AskOne(prompt, &confirm, nil)
190+
if confirm {
191+
err = client.Disk.Delete(disk)
192+
}
193+
return err
194+
}
195+
196+
func disksUpdateRun(client *lade.Client, opts *lade.DiskUpdateOpts, appName, diskName string) error {
197+
if err := askSelect("App Name:", getAppName, client, getAppOptions, &appName); err != nil {
198+
return err
199+
}
200+
if err := askSelect("Disk Name:", "", client, getDiskOptions(appName), &diskName); err != nil {
201+
return err
202+
}
203+
disk, err := client.Disk.Get(appName, diskName)
204+
if err != nil {
205+
return err
206+
}
207+
if err = askSelect("Plan:", disk.PlanID, client, getDiskPlanOptions(disk.PlanID), &opts.PlanID); err != nil {
208+
return err
209+
}
210+
_, err = client.Disk.Update(strconv.Itoa(disk.AppID), strconv.Itoa(disk.ID), opts)
211+
return err
212+
}

cmd/plans.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var plansCmd = &cobra.Command{
2020
}
2121

2222
func plansRun(client *lade.Client) error {
23-
plans, err := client.Plan.List()
23+
plans, err := client.Plan.List("")
2424
if err != nil {
2525
return err
2626
}

0 commit comments

Comments
 (0)