Skip to content

Commit 1264428

Browse files
scotwellsclaude
andcommitted
feat: implement datumctl compute CLI plugin
Adds the datumctl-compute plugin binary with commands for deploying and managing containerized workloads on Datum Cloud via the developer CLI. Commands: - deploy — create or update a workload from flags or a manifest file - destroy — delete a workload and clean up its revision history - status — show health, placement summary, and recent revision info - instances — list and describe running instances across cities - scale — adjust minimum replica count across placements - rollout — watch live progress, view history, and roll back revisions - restart — trigger a rolling restart of a workload or specific city - quota — inspect per-city instance usage and quota headroom Closes #98. Depends on datum-cloud/datumctl#198. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a775ae6 commit 1264428

20 files changed

Lines changed: 2884 additions & 219 deletions

File tree

.goreleaser-plugin.yaml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
2+
version: 2
3+
4+
project_name: datumctl-compute
5+
6+
before:
7+
hooks:
8+
- go mod tidy
9+
10+
builds:
11+
- id: datumctl-compute
12+
binary: datumctl-compute
13+
main: ./cmd/datumctl-compute
14+
env:
15+
- CGO_ENABLED=0
16+
goos:
17+
- linux
18+
- darwin
19+
- windows
20+
goarch:
21+
- amd64
22+
- arm64
23+
ldflags:
24+
- "-X main.version=v{{.Version}}"
25+
26+
archives:
27+
- id: datumctl-compute
28+
builds:
29+
- datumctl-compute
30+
format: tar.gz
31+
name_template: >-
32+
{{ .ProjectName }}_
33+
{{- title .Os }}_
34+
{{- if eq .Arch "amd64" }}x86_64
35+
{{- else if eq .Arch "386" }}i386
36+
{{- else }}{{ .Arch }}{{ end }}
37+
{{- if .Arm }}v{{ .Arm }}{{ end }}
38+
format_overrides:
39+
- goos: windows
40+
format: zip
41+
42+
checksum:
43+
name_template: "checksums.txt"
44+
45+
changelog:
46+
sort: asc
47+
filters:
48+
exclude:
49+
- "^docs:"
50+
- "^test:"
51+
- "^chore:"

cmd/datumctl-compute/main.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package main
2+
3+
import (
4+
"os"
5+
6+
"go.datum.net/datumctl/plugin"
7+
8+
"go.datum.net/compute/internal/cmd/compute"
9+
)
10+
11+
// version is set at build time via ldflags.
12+
var version = "dev"
13+
14+
var manifest = plugin.Manifest{
15+
Name: "compute",
16+
Version: version,
17+
Description: "Deploy and manage containerized workloads on Datum Cloud",
18+
APIVersion: 1,
19+
MinAPIVersion: 1,
20+
}
21+
22+
func main() {
23+
plugin.ServeManifest(manifest)
24+
25+
if err := compute.Command().Execute(); err != nil {
26+
os.Exit(1)
27+
}
28+
}

go.mod

Lines changed: 69 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,120 @@
11
module go.datum.net/compute
22

3-
go 1.24.0
4-
5-
toolchain go1.24.2
3+
go 1.25.8
64

75
require (
86
github.com/google/go-cmp v0.7.0
9-
github.com/onsi/ginkgo/v2 v2.23.4
10-
github.com/onsi/gomega v1.37.0
7+
github.com/onsi/ginkgo/v2 v2.27.2
8+
github.com/onsi/gomega v1.38.2
9+
github.com/spf13/cobra v1.10.2
1110
github.com/stretchr/testify v1.11.1
11+
go.datum.net/datumctl v0.0.0
1212
go.datum.net/network-services-operator v0.1.0
1313
go.miloapis.com/milo v0.24.11
14-
golang.org/x/crypto v0.39.0
15-
golang.org/x/sync v0.16.0
14+
golang.org/x/crypto v0.49.0
15+
golang.org/x/sync v0.20.0
1616
google.golang.org/protobuf v1.36.11
17-
k8s.io/api v0.33.1
18-
k8s.io/apimachinery v0.33.2
19-
k8s.io/client-go v0.33.1
20-
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397
21-
sigs.k8s.io/controller-runtime v0.21.0
17+
k8s.io/api v0.35.3
18+
k8s.io/apimachinery v0.35.3
19+
k8s.io/client-go v0.35.3
20+
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
21+
sigs.k8s.io/controller-runtime v0.23.3
2222
sigs.k8s.io/gateway-api v1.2.1
2323
sigs.k8s.io/multicluster-runtime v0.21.0-alpha.8
2424
)
2525

2626
require (
27-
cel.dev/expr v0.19.1 // indirect
27+
cel.dev/expr v0.24.0 // indirect
28+
github.com/Masterminds/semver/v3 v3.4.0 // indirect
2829
github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
2930
github.com/beorn7/perks v1.0.1 // indirect
3031
github.com/blang/semver/v4 v4.0.0 // indirect
3132
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
3233
github.com/cespare/xxhash/v2 v2.3.0 // indirect
3334
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
34-
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
35+
github.com/emicklei/go-restful/v3 v3.13.0 // indirect
3536
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
3637
github.com/felixge/httpsnoop v1.0.4 // indirect
3738
github.com/fsnotify/fsnotify v1.9.0 // indirect
38-
github.com/fxamacker/cbor/v2 v2.8.0 // indirect
39+
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
3940
github.com/go-logr/logr v1.4.3 // indirect
4041
github.com/go-logr/stdr v1.2.2 // indirect
4142
github.com/go-logr/zapr v1.3.0 // indirect
42-
github.com/go-openapi/jsonpointer v0.21.1 // indirect
43-
github.com/go-openapi/jsonreference v0.21.0 // indirect
44-
github.com/go-openapi/swag v0.23.1 // indirect
43+
github.com/go-openapi/jsonpointer v0.22.4 // indirect
44+
github.com/go-openapi/jsonreference v0.21.4 // indirect
45+
github.com/go-openapi/swag v0.25.4 // indirect
46+
github.com/go-openapi/swag/cmdutils v0.25.4 // indirect
47+
github.com/go-openapi/swag/conv v0.25.4 // indirect
48+
github.com/go-openapi/swag/fileutils v0.25.4 // indirect
49+
github.com/go-openapi/swag/jsonname v0.25.4 // indirect
50+
github.com/go-openapi/swag/jsonutils v0.25.4 // indirect
51+
github.com/go-openapi/swag/loading v0.25.4 // indirect
52+
github.com/go-openapi/swag/mangling v0.25.4 // indirect
53+
github.com/go-openapi/swag/netutils v0.25.4 // indirect
54+
github.com/go-openapi/swag/stringutils v0.25.4 // indirect
55+
github.com/go-openapi/swag/typeutils v0.25.4 // indirect
56+
github.com/go-openapi/swag/yamlutils v0.25.4 // indirect
4557
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
46-
github.com/gogo/protobuf v1.3.2 // indirect
4758
github.com/google/btree v1.1.3 // indirect
48-
github.com/google/cel-go v0.23.2 // indirect
49-
github.com/google/gnostic-models v0.6.9 // indirect
59+
github.com/google/cel-go v0.26.0 // indirect
60+
github.com/google/gnostic-models v0.7.1 // indirect
5061
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
5162
github.com/google/uuid v1.6.0 // indirect
5263
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
5364
github.com/inconshreveable/mousetrap v1.1.0 // indirect
54-
github.com/josharian/intern v1.0.0 // indirect
5565
github.com/json-iterator/go v1.1.12 // indirect
56-
github.com/mailru/easyjson v0.9.0 // indirect
5766
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
58-
github.com/modern-go/reflect2 v1.0.2 // indirect
67+
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
5968
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
60-
github.com/pkg/errors v0.9.1 // indirect
6169
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
62-
github.com/prometheus/client_golang v1.22.0 // indirect
70+
github.com/prometheus/client_golang v1.23.2 // indirect
6371
github.com/prometheus/client_model v0.6.2 // indirect
64-
github.com/prometheus/common v0.64.0 // indirect
72+
github.com/prometheus/common v0.66.1 // indirect
6573
github.com/prometheus/procfs v0.16.1 // indirect
66-
github.com/spf13/cobra v1.9.1 // indirect
67-
github.com/spf13/pflag v1.0.7 // indirect
74+
github.com/spf13/pflag v1.0.10 // indirect
6875
github.com/stoewer/go-strcase v1.3.0 // indirect
6976
github.com/x448/float16 v0.8.4 // indirect
70-
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
71-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect
72-
go.opentelemetry.io/otel v1.35.0 // indirect
73-
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect
74-
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 // indirect
75-
go.opentelemetry.io/otel/metric v1.35.0 // indirect
76-
go.opentelemetry.io/otel/sdk v1.34.0 // indirect
77-
go.opentelemetry.io/otel/trace v1.35.0 // indirect
78-
go.opentelemetry.io/proto/otlp v1.4.0 // indirect
79-
go.uber.org/automaxprocs v1.6.0 // indirect
77+
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
78+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
79+
go.opentelemetry.io/otel v1.40.0 // indirect
80+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
81+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
82+
go.opentelemetry.io/otel/metric v1.40.0 // indirect
83+
go.opentelemetry.io/otel/sdk v1.36.0 // indirect
84+
go.opentelemetry.io/otel/trace v1.40.0 // indirect
85+
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
8086
go.uber.org/multierr v1.11.0 // indirect
8187
go.uber.org/zap v1.27.0 // indirect
82-
go.yaml.in/yaml/v2 v2.4.2 // indirect
88+
go.yaml.in/yaml/v2 v2.4.3 // indirect
89+
go.yaml.in/yaml/v3 v3.0.4 // indirect
8390
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
84-
golang.org/x/net v0.41.0 // indirect
85-
golang.org/x/oauth2 v0.30.0 // indirect
86-
golang.org/x/sys v0.33.0 // indirect
87-
golang.org/x/term v0.32.0 // indirect
88-
golang.org/x/text v0.26.0 // indirect
89-
golang.org/x/time v0.12.0 // indirect
90-
golang.org/x/tools v0.33.0 // indirect
91+
golang.org/x/mod v0.35.0 // indirect
92+
golang.org/x/net v0.52.0 // indirect
93+
golang.org/x/oauth2 v0.36.0 // indirect
94+
golang.org/x/sys v0.44.0 // indirect
95+
golang.org/x/term v0.43.0 // indirect
96+
golang.org/x/text v0.35.0 // indirect
97+
golang.org/x/time v0.15.0 // indirect
98+
golang.org/x/tools v0.43.0 // indirect
9199
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
92100
google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect
93-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect
94-
google.golang.org/grpc v1.71.1 // indirect
95-
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
101+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect
102+
google.golang.org/grpc v1.72.2 // indirect
103+
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
96104
gopkg.in/inf.v0 v0.9.1 // indirect
97105
gopkg.in/yaml.v3 v3.0.1 // indirect
98-
k8s.io/apiextensions-apiserver v0.33.1 // indirect
99-
k8s.io/apiserver v0.33.1 // indirect
100-
k8s.io/component-base v0.33.1 // indirect
106+
k8s.io/apiextensions-apiserver v0.35.0 // indirect
107+
k8s.io/apiserver v0.35.3 // indirect
108+
k8s.io/component-base v0.35.3 // indirect
101109
k8s.io/klog/v2 v2.130.1 // indirect
102-
k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a // indirect
110+
k8s.io/kube-openapi v0.0.0-20260330154417-16be699c7b31 // indirect
103111
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect
104-
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
112+
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
105113
sigs.k8s.io/randfill v1.0.0 // indirect
106-
sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect
107-
sigs.k8s.io/yaml v1.5.0 // indirect
114+
sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect
115+
sigs.k8s.io/yaml v1.6.0 // indirect
108116
)
117+
118+
// datumctl plugin SDK — replace with a released version once PR #198 is merged
119+
// (https://github.com/datum-cloud/datumctl/pull/198)
120+
replace go.datum.net/datumctl => ../datumctl/.claude/worktrees/agent-aaa7004d0f14304c6

0 commit comments

Comments
 (0)