Skip to content

Commit 14226ec

Browse files
authored
feat(all): add support for certificate bundles (#534)
1 parent 7e01472 commit 14226ec

3 files changed

Lines changed: 94 additions & 12 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- Support certificate-bundle resources in `all list` and `all purge` commands.
13+
1014
## [3.22.0] - 2025-08-15
1115

1216
### Added
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package all
2+
3+
import (
4+
"context"
5+
6+
"github.com/UpCloudLtd/upcloud-cli/v3/internal/commands"
7+
"github.com/UpCloudLtd/upcloud-cli/v3/internal/output"
8+
"github.com/UpCloudLtd/upcloud-cli/v3/internal/resolver"
9+
internal "github.com/UpCloudLtd/upcloud-cli/v3/internal/service"
10+
11+
"github.com/UpCloudLtd/upcloud-go-api/v8/upcloud"
12+
"github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/request"
13+
)
14+
15+
// cachingCertificateBundle implements resolver for certificate bundles by name, caching the results
16+
type cachingCertificateBundle struct {
17+
resolver.Cache[upcloud.LoadBalancerCertificateBundle]
18+
19+
Type string
20+
}
21+
22+
var (
23+
_ resolver.ResolutionProvider = &cachingCertificateBundle{}
24+
_ resolver.CachingResolutionProvider[upcloud.LoadBalancerCertificateBundle] = &cachingCertificateBundle{}
25+
)
26+
27+
// Get implements ResolutionProvider.Get
28+
func (s *cachingCertificateBundle) Get(ctx context.Context, svc internal.AllServices) (resolver.Resolver, error) {
29+
certBundles, err := svc.GetLoadBalancerCertificateBundles(ctx, &request.GetLoadBalancerCertificateBundlesRequest{
30+
Page: &request.Page{
31+
Number: 0,
32+
Size: 100,
33+
},
34+
})
35+
if err != nil {
36+
return nil, err
37+
}
38+
39+
for _, cb := range certBundles {
40+
s.AddCached(cb.UUID, cb)
41+
}
42+
43+
return func(arg string) resolver.Resolved {
44+
rv := resolver.Resolved{Arg: arg}
45+
for _, cb := range certBundles {
46+
rv.AddMatch(cb.UUID, resolver.MatchTitle(arg, cb.Name))
47+
rv.AddMatch(cb.UUID, resolver.MatchUUID(arg, cb.UUID))
48+
}
49+
return rv
50+
}, nil
51+
}
52+
53+
// PositionalArgumentHelp implements resolver.ResolutionProvider
54+
func (s *cachingCertificateBundle) PositionalArgumentHelp() string {
55+
return "<Name...>"
56+
}
57+
58+
func deleteCertificateBundle(exec commands.Executor, uuid string) (output.Output, error) {
59+
svc := exec.All()
60+
err := svc.DeleteLoadBalancerCertificateBundle(exec.Context(), &request.DeleteLoadBalancerCertificateBundleRequest{
61+
UUID: uuid,
62+
})
63+
if err != nil {
64+
return nil, err
65+
}
66+
67+
return output.None{}, nil
68+
}

internal/commands/all/resource.go

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,18 @@ const (
3030
includeHelp = "Include resources matching the given name. If defined multiple times, resource is included if it matches any of the given names. `*` matches all resources."
3131
excludeHelp = "Exclude resources matching the given name. If defined multiple times, resource is included if it matches any of the given names."
3232

33-
typeKubernetes = "kubernetes-cluster"
34-
typeLoadBalancer = "load-balancer"
35-
typeNetwork = "network"
36-
typeNetworkPeering = "network-peering"
37-
typeRouter = "router"
38-
typeObjectStorage = "object-storage"
39-
typeDatabase = "database"
40-
typeServer = "server"
41-
typeServerGroup = "server-group"
42-
typeStorage = "storage"
43-
typeTag = "tag"
33+
typeKubernetes = "kubernetes-cluster"
34+
typeLoadBalancer = "load-balancer"
35+
typeCertificateBundle = "certificate-bundle"
36+
typeNetwork = "network"
37+
typeNetworkPeering = "network-peering"
38+
typeRouter = "router"
39+
typeObjectStorage = "object-storage"
40+
typeDatabase = "database"
41+
typeServer = "server"
42+
typeServerGroup = "server-group"
43+
typeStorage = "storage"
44+
typeTag = "tag"
4445
)
4546

4647
type Resource struct {
@@ -148,7 +149,7 @@ func findResources[T any](exec commands.Executor, wg *sync.WaitGroup, returnChan
148149

149150
func listResources(exec commands.Executor, include, exclude []string) ([]Resource, error) {
150151
var resources []Resource
151-
returnChan := make(chan findResult, 11)
152+
returnChan := make(chan findResult, 12)
152153

153154
var wg sync.WaitGroup
154155

@@ -163,6 +164,7 @@ func listResources(exec commands.Executor, include, exclude []string) ([]Resourc
163164
findResources(exec, &wg, returnChan, &resolver.CachingServerGroup{}, include, exclude)
164165
findResources(exec, &wg, returnChan, &resolver.CachingStorage{Access: "private"}, include, exclude)
165166
findResources(exec, &wg, returnChan, &cachingTag{}, include, exclude)
167+
findResources(exec, &wg, returnChan, &cachingCertificateBundle{}, include, exclude)
166168

167169
wg.Wait()
168170
close(returnChan)
@@ -193,6 +195,12 @@ func getResource(val any) (Resource, error) {
193195
Type: typeLoadBalancer,
194196
UUID: v.UUID,
195197
}, nil
198+
case upcloud.LoadBalancerCertificateBundle:
199+
return Resource{
200+
Name: v.Name,
201+
Type: typeCertificateBundle,
202+
UUID: v.UUID,
203+
}, nil
196204
case upcloud.KubernetesCluster:
197205
return Resource{
198206
Name: v.Name,
@@ -281,6 +289,8 @@ func deleteResource(exec commands.Executor, resource Resource) (err error) {
281289
_, err = storage.Delete(exec, resource.UUID, "delete")
282290
case typeTag:
283291
_, err = deleteTag(exec, resource.Name)
292+
case typeCertificateBundle:
293+
_, err = deleteCertificateBundle(exec, resource.UUID)
284294
}
285295
return
286296
}

0 commit comments

Comments
 (0)