A container registry that uses the AT Protocol for manifest storage and S3 for blob storage.
atcr.io
docker
container
atproto
go
1package main
2
3import (
4 "context"
5 "fmt"
6 "sort"
7
8 "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud"
9 "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/service"
10 "github.com/charmbracelet/huh"
11)
12
13// pickZone fetches available zones from the UpCloud API and presents an
14// interactive selector. Only public zones are shown.
15func pickZone(ctx context.Context, svc *service.Service) (string, error) {
16 resp, err := svc.GetZones(ctx)
17 if err != nil {
18 return "", fmt.Errorf("fetch zones: %w", err)
19 }
20
21 var opts []huh.Option[string]
22 for _, z := range resp.Zones {
23 if z.Public != upcloud.True {
24 continue
25 }
26 label := fmt.Sprintf("%s — %s", z.ID, z.Description)
27 opts = append(opts, huh.NewOption(label, z.ID))
28 }
29
30 if len(opts) == 0 {
31 return "", fmt.Errorf("no public zones available")
32 }
33
34 sort.Slice(opts, func(i, j int) bool {
35 return opts[i].Value < opts[j].Value
36 })
37
38 var zone string
39 err = huh.NewSelect[string]().
40 Title("Select a zone").
41 Options(opts...).
42 Value(&zone).
43 Run()
44 if err != nil {
45 return "", err
46 }
47
48 return zone, nil
49}
50
51// pickPlan fetches available plans from the UpCloud API and presents an
52// interactive selector. GPU plans are filtered out.
53func pickPlan(ctx context.Context, svc *service.Service) (string, error) {
54 resp, err := svc.GetPlans(ctx)
55 if err != nil {
56 return "", fmt.Errorf("fetch plans: %w", err)
57 }
58
59 var opts []huh.Option[string]
60 for _, p := range resp.Plans {
61 if p.GPUAmount > 0 {
62 continue
63 }
64 memGB := p.MemoryAmount / 1024
65 label := fmt.Sprintf("%s — %d CPU, %d GB RAM, %d GB disk", p.Name, p.CoreNumber, memGB, p.StorageSize)
66 opts = append(opts, huh.NewOption(label, p.Name))
67 }
68
69 if len(opts) == 0 {
70 return "", fmt.Errorf("no plans available")
71 }
72
73 sort.Slice(opts, func(i, j int) bool {
74 return opts[i].Value < opts[j].Value
75 })
76
77 var plan string
78 err = huh.NewSelect[string]().
79 Title("Select a plan").
80 Options(opts...).
81 Value(&plan).
82 Run()
83 if err != nil {
84 return "", err
85 }
86
87 return plan, nil
88}