Skip to content

Commit 0fa6459

Browse files
Inject base image/config instead of os/tag (#262)
1 parent 378608e commit 0fa6459

File tree

15 files changed

+220
-1236
lines changed

15 files changed

+220
-1236
lines changed

cmd/rwx/resolve.go

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
)
99

1010
var resolveCmd = &cobra.Command{
11-
Short: "Resolve and add versions for base layers and RWX packages",
11+
Short: "Resolve and add versions for base images and RWX packages",
1212
Use: "resolve [flags] [files...]",
1313
RunE: func(cmd *cobra.Command, args []string) error {
1414
if len(args) > 0 {
@@ -29,19 +29,13 @@ var resolveCmd = &cobra.Command{
2929
}
3030

3131
var (
32-
resolveBaseOs string
33-
resolveBaseTag string
34-
resolveBaseArch string
35-
3632
resolveBaseCmd = &cobra.Command{
3733
RunE: func(cmd *cobra.Command, args []string) error {
3834
return resolveBase(args)
3935
},
40-
Short: "Add a base layer to RWX run configurations that do not have one",
41-
Long: "Add a base layer to RWX run configurations that do not have one.\n" +
42-
"Updates all top-level YAML files in .rwx that are missing a 'base' to include one.\n" +
43-
"The best match will be found based on the provided flags. If no flags are provided,\n" +
44-
"it will use the current default base layer.",
36+
Short: "Add a base image to RWX run configurations that do not have one",
37+
Long: "Add a base image to RWX run configurations that do not have one.\n" +
38+
"Updates all top-level YAML files in .rwx that are missing a 'base' to include one.",
4539
Use: "base [flags] [files...]",
4640
}
4741

@@ -58,7 +52,7 @@ var (
5852
)
5953

6054
func resolveBase(files []string) error {
61-
base, err := service.ResolveBase(cli.ResolveBaseConfig{
55+
base, err := service.InsertBase(cli.InsertBaseConfig{
6256
Files: files,
6357
RwxDirectory: RwxDirectory,
6458
})
@@ -81,9 +75,6 @@ func resolvePackages(files []string) error {
8175
}
8276

8377
func init() {
84-
resolveBaseCmd.Flags().StringVar(&resolveBaseOs, "os", "", "target operating system")
85-
resolveBaseCmd.Flags().StringVar(&resolveBaseTag, "tag", "", "target base layer tag")
86-
resolveBaseCmd.Flags().StringVar(&resolveBaseArch, "arch", "", "target architecture")
8778
addRwxDirFlag(resolveBaseCmd)
8879

8980
addRwxDirFlag(resolvePackagesCmd)

cmd/rwx/update.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ var (
3333
RunE: func(cmd *cobra.Command, args []string) error {
3434
return updateBase(args)
3535
},
36-
Short: "Update all base layers to their latest (minor) version",
37-
Long: "Update all base layers to their latest (minor) version.\n" +
38-
"Takes a list of files as arguments, or updates all toplevel YAML files in .rwx if no files are given.",
36+
Short: "Add a base image to RWX run configurations that do not have one",
37+
Long: "Add a base image to RWX run configurations that do not have one.\n" +
38+
"Updates all top-level YAML files in .rwx that are missing a 'base' to include one.",
3939
Use: "base [flags] [files...]",
4040
}
4141

@@ -51,7 +51,7 @@ var (
5151
)
5252

5353
func updateBase(files []string) error {
54-
_, err := service.UpdateBase(cli.UpdateBaseConfig{
54+
_, err := service.InsertBase(cli.InsertBaseConfig{
5555
Files: files,
5656
RwxDirectory: RwxDirectory,
5757
})

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ require (
1919
github.com/spf13/cobra v1.10.1
2020
github.com/stretchr/testify v1.11.1
2121
golang.org/x/crypto v0.45.0
22-
golang.org/x/sync v0.18.0
2322
golang.org/x/term v0.37.0
2423
)
2524

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,6 @@ golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
247247
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
248248
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
249249
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
250-
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
251-
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
252250
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
253251
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
254252
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=

internal/api/client.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -474,16 +474,11 @@ func (c Client) GetPackageVersions() (*PackageVersionsResult, error) {
474474
return &respBody, nil
475475
}
476476

477-
func (c Client) ResolveBaseLayer(cfg ResolveBaseLayerConfig) (ResolveBaseLayerResult, error) {
478-
endpoint := "/mint/api/base_layers/resolve"
479-
result := ResolveBaseLayerResult{}
477+
func (c Client) GetDefaultBase() (DefaultBaseResult, error) {
478+
endpoint := "/mint/api/base/default"
479+
result := DefaultBaseResult{}
480480

481-
encodedBody, err := json.Marshal(cfg)
482-
if err != nil {
483-
return result, errors.Wrap(err, "unable to encode as JSON")
484-
}
485-
486-
req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewBuffer(encodedBody))
481+
req, err := http.NewRequest(http.MethodGet, endpoint, nil)
487482
if err != nil {
488483
return result, errors.Wrap(err, "unable to create new HTTP request")
489484
}

internal/api/client_test.go

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -285,16 +285,13 @@ func TestAPIClient_GetDispatch(t *testing.T) {
285285
})
286286
}
287287

288-
func TestAPIClient_ResolveBaseLayer(t *testing.T) {
288+
func TestAPIClient_GetDefaultBase(t *testing.T) {
289289
t.Run("builds the request and parses the response", func(t *testing.T) {
290290
roundTrip := func(req *http.Request) (*http.Response, error) {
291-
require.Equal(t, "/mint/api/base_layers/resolve", req.URL.Path)
292-
require.Equal(t, http.MethodPost, req.Method)
293-
reqBody, err := io.ReadAll(req.Body)
294-
require.NoError(t, err)
295-
require.Contains(t, string(reqBody), "gentoo 99")
291+
require.Equal(t, "/mint/api/base/default", req.URL.Path)
292+
require.Equal(t, http.MethodGet, req.Method)
296293

297-
body := `{"os": "gentoo 99", "tag": "1.2", "arch": "quantum"}`
294+
body := `{"image": "ubuntu:24.04", "config": "rwx/base 1.0.0", "arch": "x86_64"}`
298295
return &http.Response{
299296
Status: "200 OK",
300297
StatusCode: 200,
@@ -304,15 +301,11 @@ func TestAPIClient_ResolveBaseLayer(t *testing.T) {
304301

305302
c := api.NewClientWithRoundTrip(roundTrip)
306303

307-
resolveConfig := api.ResolveBaseLayerConfig{
308-
Os: "gentoo 99",
309-
}
310-
311-
result, err := c.ResolveBaseLayer(resolveConfig)
304+
result, err := c.GetDefaultBase()
312305
require.NoError(t, err)
313-
require.Equal(t, "gentoo 99", result.Os)
314-
require.Equal(t, "1.2", result.Tag)
315-
require.Equal(t, "quantum", result.Arch)
306+
require.Equal(t, "ubuntu:24.04", result.Image)
307+
require.Equal(t, "rwx/base 1.0.0", result.Config)
308+
require.Equal(t, "x86_64", result.Arch)
316309
})
317310
}
318311

internal/api/config.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -225,15 +225,12 @@ type PackageVersionsResult struct {
225225
LatestMinor map[string]map[string]string `json:"latest_minor"`
226226
}
227227

228-
type resolveBaseLayerSpec struct {
229-
Os string `json:"os,omitempty"`
230-
Tag string `json:"tag,omitempty"`
231-
Arch string `json:"arch,omitempty"`
228+
type DefaultBaseResult struct {
229+
Image string `json:"image,omitempty"`
230+
Config string `json:"config,omitempty"`
231+
Arch string `json:"arch,omitempty"`
232232
}
233233

234-
type ResolveBaseLayerConfig = resolveBaseLayerSpec
235-
type ResolveBaseLayerResult = resolveBaseLayerSpec
236-
237234
type StartImagePushConfig struct {
238235
TaskID string `json:"task_id"`
239236
Image StartImagePushConfigImage `json:"image"`

internal/cli/config.go

Lines changed: 9 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@ import (
44
"io"
55
"time"
66

7-
"github.com/Masterminds/semver/v3"
87
"github.com/distribution/reference"
98
"github.com/rwx-cloud/cli/internal/accesstoken"
109
"github.com/rwx-cloud/cli/internal/api"
1110
"github.com/rwx-cloud/cli/internal/docker"
1211
"github.com/rwx-cloud/cli/internal/errors"
13-
"github.com/rwx-cloud/cli/internal/versions"
1412
)
1513

1614
type Config struct {
@@ -187,15 +185,6 @@ func (c SetSecretsInVaultConfig) Validate() error {
187185
return nil
188186
}
189187

190-
type UpdateBaseConfig struct {
191-
RwxDirectory string
192-
Files []string
193-
}
194-
195-
func (c UpdateBaseConfig) Validate() error {
196-
return nil
197-
}
198-
199188
type UpdatePackagesConfig struct {
200189
RwxDirectory string
201190
Files []string
@@ -210,97 +199,33 @@ func (c UpdatePackagesConfig) Validate() error {
210199
return nil
211200
}
212201

213-
type ResolveBaseConfig struct {
202+
type InsertBaseConfig struct {
214203
RwxDirectory string
215204
Files []string
216-
Os string
217-
Tag string
218-
Arch string
219205
}
220206

221-
func (c ResolveBaseConfig) Validate() error {
207+
func (c InsertBaseConfig) Validate() error {
222208
return nil
223209
}
224210

225-
type BaseLayerSpec struct {
226-
Os string `yaml:"os"`
227-
Tag string `yaml:"tag"`
228-
Arch string `yaml:"arch"`
229-
}
230-
231-
func (b BaseLayerSpec) TagVersion() *semver.Version {
232-
if b.Tag == "" {
233-
return versions.EmptyVersion
234-
}
235-
236-
return semver.MustParse(b.Tag)
237-
}
238-
239-
func (b BaseLayerSpec) Equal(other BaseLayerSpec) bool {
240-
if b.Os != other.Os {
241-
return false
242-
}
243-
244-
if b.Tag != other.Tag {
245-
return false
246-
}
247-
248-
arch1 := b.Arch
249-
if arch1 == "" {
250-
arch1 = DefaultArch
251-
}
252-
arch2 := other.Arch
253-
if arch2 == "" {
254-
arch2 = DefaultArch
255-
}
256-
if arch1 != arch2 {
257-
return false
258-
}
259-
260-
return true
261-
}
262-
263-
func (b BaseLayerSpec) Merge(other BaseLayerSpec) BaseLayerSpec {
264-
os := b.Os
265-
if other.Os != "" {
266-
os = other.Os
267-
}
268-
269-
tag := b.Tag
270-
if other.Tag != "" {
271-
tag = other.Tag
272-
}
273-
274-
arch := b.Arch
275-
if other.Arch != "" {
276-
arch = other.Arch
277-
}
278-
279-
return BaseLayerSpec{
280-
Os: os,
281-
Tag: tag,
282-
Arch: arch,
283-
}
211+
type BaseSpec struct {
212+
Image string `yaml:"image"`
213+
Config string `yaml:"config"`
214+
Arch string `yaml:"arch"`
284215
}
285216

286217
type BaseLayerRunFile struct {
287-
Spec BaseLayerSpec
288-
OriginalBase BaseLayerSpec
289-
ResolvedBase BaseLayerSpec
218+
ResolvedBase BaseSpec
290219
OriginalPath string
291220
Error error
292221
}
293222

294-
func (rf BaseLayerRunFile) HasChanges() bool {
295-
return !rf.OriginalBase.Equal(rf.ResolvedBase)
296-
}
297-
298-
type ResolveBaseResult struct {
223+
type InsertDefaultBaseResult struct {
299224
ErroredRunFiles []BaseLayerRunFile
300225
UpdatedRunFiles []BaseLayerRunFile
301226
}
302227

303-
func (r ResolveBaseResult) HasChanges() bool {
228+
func (r InsertDefaultBaseResult) HasChanges() bool {
304229
return len(r.ErroredRunFiles) > 0 || len(r.UpdatedRunFiles) > 0
305230
}
306231

internal/cli/interfaces.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ type APIClient interface {
1919
Whoami() (*api.WhoamiResult, error)
2020
SetSecretsInVault(api.SetSecretsInVaultConfig) (*api.SetSecretsInVaultResult, error)
2121
GetPackageVersions() (*api.PackageVersionsResult, error)
22-
ResolveBaseLayer(api.ResolveBaseLayerConfig) (api.ResolveBaseLayerResult, error)
22+
GetDefaultBase() (api.DefaultBaseResult, error)
2323
StartImagePush(cfg api.StartImagePushConfig) (api.StartImagePushResult, error)
2424
ImagePushStatus(pushID string) (api.ImagePushStatusResult, error)
2525
TaskStatus(api.TaskStatusConfig) (api.TaskStatusResult, error)

0 commit comments

Comments
 (0)