Skip to content

Commit 210a6df

Browse files
authored
chore: detect os/arch and warn if ARM arch (#2545)
This change logs a warning and suggests a workaround for ARM machines. Tested that the warning was logged on ARM arch, and also that `svc deploy` worked with the workaround. Next step: target platform amd64/x86 for ARM builds. (This includes an unrelated addition to the Makefile.) Related: #1949, #2369. By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.
1 parent 43524c9 commit 210a6df

File tree

14 files changed

+691
-478
lines changed

14 files changed

+691
-478
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ gen-mocks: tools
190190
${GOBIN}/mockgen -package=mocks -destination=./internal/pkg/deploy/cloudformation/stack/mocks/mock_rd_web_svc.go -source=./internal/pkg/deploy/cloudformation/stack/rd_web_svc.go
191191
${GOBIN}/mockgen -package=mocks -destination=./internal/pkg/deploy/cloudformation/stack/mocks/mock_backend_svc.go -source=./internal/pkg/deploy/cloudformation/stack/backend_svc.go
192192
${GOBIN}/mockgen -package=mocks -destination=./internal/pkg/deploy/cloudformation/stack/mocks/mock_scheduled_job.go -source=./internal/pkg/deploy/cloudformation/stack/scheduled_job.go
193+
${GOBIN}/mockgen -package=mocks -destination=./internal/pkg/describe/mocks/mock_status_describe.go -source=./internal/pkg/describe/status_describe.go
193194
${GOBIN}/mockgen -package=mocks -destination=./internal/pkg/template/mocks/mock_template.go -source=./internal/pkg/template/template.go
194195
${GOBIN}/mockgen -package=mocks -destination=./internal/pkg/task/mocks/mock_task.go -source=./internal/pkg/task/task.go
195196
${GOBIN}/mockgen -package=mocks -destination=./internal/pkg/repository/mocks/mock_repository.go -source=./internal/pkg/repository/repository.go

internal/pkg/cli/init.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,11 @@ func newInitOpts(vars initVars) (*initOpts, error) {
214214
opts := initJobOpts{
215215
initJobVars: jobVars,
216216

217-
fs: fs,
218-
init: wlInitializer,
219-
sel: sel,
220-
prompt: prompt,
221-
dockerEngineValidator: exec.NewDockerCommand(),
217+
fs: fs,
218+
init: wlInitializer,
219+
sel: sel,
220+
prompt: prompt,
221+
dockerEngine: exec.NewDockerCommand(),
222222
initParser: func(s string) dockerfileParser {
223223
return exec.NewDockerfile(fs, s)
224224
},
@@ -234,11 +234,11 @@ func newInitOpts(vars initVars) (*initOpts, error) {
234234
opts := initSvcOpts{
235235
initSvcVars: svcVars,
236236

237-
fs: fs,
238-
init: wlInitializer,
239-
sel: sel,
240-
prompt: prompt,
241-
dockerEngineValidator: exec.NewDockerCommand(),
237+
fs: fs,
238+
init: wlInitializer,
239+
sel: sel,
240+
prompt: prompt,
241+
dockerEngine: exec.NewDockerCommand(),
242242
}
243243
opts.dockerfile = func(path string) dockerfileParser {
244244
if opts.df != nil {

internal/pkg/cli/interfaces.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,8 +568,9 @@ type runningTaskSelector interface {
568568
RunningTask(prompt, help string, opts ...selector.TaskOpts) (*awsecs.Task, error)
569569
}
570570

571-
type dockerEngineValidator interface {
571+
type dockerEngine interface {
572572
CheckDockerEngineRunning() error
573+
GetPlatform() (string, string, error)
573574
}
574575

575576
type codestar interface {

internal/pkg/cli/job_init.go

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,17 @@ type initJobOpts struct {
5454
initJobVars
5555

5656
// Interfaces to interact with dependencies.
57-
fs afero.Fs
58-
store store
59-
init jobInitializer
60-
prompt prompter
61-
sel initJobSelector
62-
dockerEngineValidator dockerEngineValidator
57+
fs afero.Fs
58+
store store
59+
init jobInitializer
60+
prompt prompter
61+
sel initJobSelector
62+
dockerEngine dockerEngine
6363

6464
// Outputs stored on successful actions.
6565
manifestPath string
66+
os string
67+
arch string
6668

6769
// Init a Dockerfile parser using fs and input path
6870
initParser func(string) dockerfileParser
@@ -99,12 +101,12 @@ func newInitJobOpts(vars initJobVars) (*initJobOpts, error) {
99101
return &initJobOpts{
100102
initJobVars: vars,
101103

102-
fs: fs,
103-
store: store,
104-
init: jobInitter,
105-
prompt: prompter,
106-
sel: sel,
107-
dockerEngineValidator: exec.NewDockerCommand(),
104+
fs: fs,
105+
store: store,
106+
init: jobInitter,
107+
prompt: prompter,
108+
sel: sel,
109+
dockerEngine: exec.NewDockerCommand(),
108110
initParser: func(path string) dockerfileParser {
109111
return exec.NewDockerfile(fs, path)
110112
},
@@ -184,13 +186,23 @@ func (o *initJobOpts) Execute() error {
184186
log.Warningf("Cannot parse the HEALTHCHECK instruction from the Dockerfile: %v\n", err)
185187
}
186188
}
189+
190+
o.os, o.arch, err = dockerPlatform(o.dockerEngine, o.image)
191+
if err != nil {
192+
return err
193+
}
194+
187195
manifestPath, err := o.init.Job(&initialize.JobProps{
188196
WorkloadProps: initialize.WorkloadProps{
189197
App: o.appName,
190198
Name: o.name,
191199
Type: o.wkldType,
192200
DockerfilePath: o.dockerfilePath,
193201
Image: o.image,
202+
Platform: &manifest.PlatformConfig{
203+
OS: o.os,
204+
Arch: o.arch,
205+
},
194206
},
195207

196208
Schedule: o.schedule,
@@ -262,7 +274,7 @@ func (o *initJobOpts) askDockerfile() (isDfSelected bool, err error) {
262274
if o.dockerfilePath != "" || o.image != "" {
263275
return true, nil
264276
}
265-
if err = o.dockerEngineValidator.CheckDockerEngineRunning(); err != nil {
277+
if err = o.dockerEngine.CheckDockerEngineRunning(); err != nil {
266278
var errDaemon *exec.ErrDockerDaemonNotResponsive
267279
switch {
268280
case errors.Is(err, exec.ErrDockerCommandNotFound):

internal/pkg/cli/job_init_test.go

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,10 @@ func TestJobInitOpts_Ask(t *testing.T) {
181181
inDockerfilePath string
182182
inJobSchedule string
183183

184-
mockFileSystem func(mockFS afero.Fs)
185-
mockPrompt func(m *mocks.Mockprompter)
186-
mockSel func(m *mocks.MockinitJobSelector)
187-
mockValidator func(m *mocks.MockdockerEngineValidator)
184+
mockFileSystem func(mockFS afero.Fs)
185+
mockPrompt func(m *mocks.Mockprompter)
186+
mockSel func(m *mocks.MockinitJobSelector)
187+
mockDockerEngine func(m *mocks.MockdockerEngine)
188188

189189
wantedErr error
190190
wantedSchedule string
@@ -204,8 +204,8 @@ func TestJobInitOpts_Ask(t *testing.T) {
204204
gomock.Any(),
205205
).Return(wantedJobName, nil)
206206
},
207-
mockSel: func(m *mocks.MockinitJobSelector) {},
208-
mockValidator: func(m *mocks.MockdockerEngineValidator) {},
207+
mockSel: func(m *mocks.MockinitJobSelector) {},
208+
mockDockerEngine: func(m *mocks.MockdockerEngine) {},
209209

210210
wantedSchedule: wantedCronSchedule,
211211
},
@@ -220,8 +220,8 @@ func TestJobInitOpts_Ask(t *testing.T) {
220220
m.EXPECT().Get(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).
221221
Return("", errors.New("some error"))
222222
},
223-
mockSel: func(m *mocks.MockinitJobSelector) {},
224-
mockValidator: func(m *mocks.MockdockerEngineValidator) {},
223+
mockSel: func(m *mocks.MockinitJobSelector) {},
224+
mockDockerEngine: func(m *mocks.MockdockerEngine) {},
225225

226226
wantedErr: fmt.Errorf("get job name: some error"),
227227
},
@@ -232,10 +232,10 @@ func TestJobInitOpts_Ask(t *testing.T) {
232232
inDockerfilePath: "",
233233
inJobSchedule: wantedCronSchedule,
234234

235-
mockPrompt: func(m *mocks.Mockprompter) {},
236-
mockSel: func(m *mocks.MockinitJobSelector) {},
237-
mockFileSystem: func(mockFS afero.Fs) {},
238-
mockValidator: func(m *mocks.MockdockerEngineValidator) {},
235+
mockPrompt: func(m *mocks.Mockprompter) {},
236+
mockSel: func(m *mocks.MockinitJobSelector) {},
237+
mockFileSystem: func(mockFS afero.Fs) {},
238+
mockDockerEngine: func(m *mocks.MockdockerEngine) {},
239239

240240
wantedSchedule: wantedCronSchedule,
241241
},
@@ -247,7 +247,7 @@ func TestJobInitOpts_Ask(t *testing.T) {
247247
mockPrompt: func(m *mocks.Mockprompter) {},
248248
mockSel: func(m *mocks.MockinitJobSelector) {},
249249
mockFileSystem: func(mockFS afero.Fs) {},
250-
mockValidator: func(m *mocks.MockdockerEngineValidator) {
250+
mockDockerEngine: func(m *mocks.MockdockerEngine) {
251251
m.EXPECT().CheckDockerEngineRunning().Return(errors.New("some error"))
252252
},
253253

@@ -264,7 +264,7 @@ func TestJobInitOpts_Ask(t *testing.T) {
264264
},
265265
mockSel: func(m *mocks.MockinitJobSelector) {},
266266
mockFileSystem: func(mockFS afero.Fs) {},
267-
mockValidator: func(m *mocks.MockdockerEngineValidator) {
267+
mockDockerEngine: func(m *mocks.MockdockerEngine) {
268268
m.EXPECT().CheckDockerEngineRunning().Return(exec.ErrDockerCommandNotFound)
269269
},
270270

@@ -281,7 +281,7 @@ func TestJobInitOpts_Ask(t *testing.T) {
281281
},
282282
mockSel: func(m *mocks.MockinitJobSelector) {},
283283
mockFileSystem: func(mockFS afero.Fs) {},
284-
mockValidator: func(m *mocks.MockdockerEngineValidator) {
284+
mockDockerEngine: func(m *mocks.MockdockerEngine) {
285285
m.EXPECT().CheckDockerEngineRunning().Return(&exec.ErrDockerDaemonNotResponsive{})
286286
},
287287

@@ -305,7 +305,7 @@ func TestJobInitOpts_Ask(t *testing.T) {
305305
gomock.Any(),
306306
).Return("Use an existing image instead", nil)
307307
},
308-
mockValidator: func(m *mocks.MockdockerEngineValidator) {
308+
mockDockerEngine: func(m *mocks.MockdockerEngine) {
309309
m.EXPECT().CheckDockerEngineRunning().Return(nil)
310310
},
311311
mockFileSystem: func(mockFS afero.Fs) {},
@@ -332,7 +332,7 @@ func TestJobInitOpts_Ask(t *testing.T) {
332332
).Return("Use an existing image instead", nil)
333333
},
334334
mockFileSystem: func(mockFS afero.Fs) {},
335-
mockValidator: func(m *mocks.MockdockerEngineValidator) {
335+
mockDockerEngine: func(m *mocks.MockdockerEngine) {
336336
m.EXPECT().CheckDockerEngineRunning().Return(nil)
337337
},
338338

@@ -355,7 +355,7 @@ func TestJobInitOpts_Ask(t *testing.T) {
355355
gomock.Any(),
356356
).Return("cuteness-aggregator/Dockerfile", nil)
357357
},
358-
mockValidator: func(m *mocks.MockdockerEngineValidator) {
358+
mockDockerEngine: func(m *mocks.MockdockerEngine) {
359359
m.EXPECT().CheckDockerEngineRunning().Return(nil)
360360
},
361361

@@ -378,7 +378,7 @@ func TestJobInitOpts_Ask(t *testing.T) {
378378
gomock.Any(),
379379
).Return("", errors.New("some error"))
380380
},
381-
mockValidator: func(m *mocks.MockdockerEngineValidator) {
381+
mockDockerEngine: func(m *mocks.MockdockerEngine) {
382382
m.EXPECT().CheckDockerEngineRunning().Return(nil)
383383
},
384384

@@ -399,8 +399,8 @@ func TestJobInitOpts_Ask(t *testing.T) {
399399
gomock.Any(),
400400
).Return(wantedCronSchedule, nil)
401401
},
402-
mockPrompt: func(m *mocks.Mockprompter) {},
403-
mockValidator: func(m *mocks.MockdockerEngineValidator) {},
402+
mockPrompt: func(m *mocks.Mockprompter) {},
403+
mockDockerEngine: func(m *mocks.MockdockerEngine) {},
404404

405405
wantedSchedule: wantedCronSchedule,
406406
},
@@ -420,7 +420,7 @@ func TestJobInitOpts_Ask(t *testing.T) {
420420
gomock.Any(),
421421
).Return("", fmt.Errorf("some error"))
422422
},
423-
mockValidator: func(m *mocks.MockdockerEngineValidator) {},
423+
mockDockerEngine: func(m *mocks.MockdockerEngine) {},
424424

425425
wantedErr: fmt.Errorf("get schedule: some error"),
426426
},
@@ -433,7 +433,7 @@ func TestJobInitOpts_Ask(t *testing.T) {
433433

434434
mockPrompt := mocks.NewMockprompter(ctrl)
435435
mockSel := mocks.NewMockinitJobSelector(ctrl)
436-
mockValidator := mocks.NewMockdockerEngineValidator(ctrl)
436+
mockDockerEngine := mocks.NewMockdockerEngine(ctrl)
437437
opts := &initJobOpts{
438438
initJobVars: initJobVars{
439439
initWkldVars: initWkldVars{
@@ -444,16 +444,16 @@ func TestJobInitOpts_Ask(t *testing.T) {
444444
},
445445
schedule: tc.inJobSchedule,
446446
},
447-
fs: &afero.Afero{Fs: afero.NewMemMapFs()},
448-
sel: mockSel,
449-
dockerEngineValidator: mockValidator,
450-
prompt: mockPrompt,
447+
fs: &afero.Afero{Fs: afero.NewMemMapFs()},
448+
sel: mockSel,
449+
dockerEngine: mockDockerEngine,
450+
prompt: mockPrompt,
451451
}
452452

453453
tc.mockFileSystem(opts.fs)
454454
tc.mockPrompt(mockPrompt)
455455
tc.mockSel(mockSel)
456-
tc.mockValidator(mockValidator)
456+
tc.mockDockerEngine(mockDockerEngine)
457457

458458
// WHEN
459459
err := opts.Ask()
@@ -481,8 +481,9 @@ func TestJobInitOpts_Execute(t *testing.T) {
481481
second := time.Second
482482
zero := 0
483483
testCases := map[string]struct {
484-
mockJobInit func(m *mocks.MockjobInitializer)
485-
mockDockerfile func(m *mocks.MockdockerfileParser)
484+
mockJobInit func(m *mocks.MockjobInitializer)
485+
mockDockerfile func(m *mocks.MockdockerfileParser)
486+
mockDockerEngine func(m *mocks.MockdockerEngine)
486487

487488
inApp string
488489
inName string
@@ -511,13 +512,20 @@ func TestJobInitOpts_Execute(t *testing.T) {
511512
Retries: zero,
512513
}, nil)
513514
},
515+
mockDockerEngine: func(m *mocks.MockdockerEngine) {
516+
m.EXPECT().GetPlatform().Return("linux", "amd64", nil)
517+
},
514518
mockJobInit: func(m *mocks.MockjobInitializer) {
515519
m.EXPECT().Job(&initialize.JobProps{
516520
WorkloadProps: initialize.WorkloadProps{
517521
App: "sample",
518522
Name: "mailer",
519523
Type: "Scheduled Job",
520524
DockerfilePath: "./Dockerfile",
525+
Platform: &manifest.PlatformConfig{
526+
OS: "linux",
527+
Arch: "amd64",
528+
},
521529
},
522530
Schedule: "@hourly",
523531
HealthCheck: &manifest.ContainerHealthCheck{
@@ -531,6 +539,9 @@ func TestJobInitOpts_Execute(t *testing.T) {
531539
},
532540
},
533541
"fail to init job": {
542+
mockDockerEngine: func(m *mocks.MockdockerEngine) {
543+
m.EXPECT().GetPlatform().Return("linux", "amd64", nil)
544+
},
534545
mockJobInit: func(m *mocks.MockjobInitializer) {
535546
m.EXPECT().Job(gomock.Any()).Return("", errors.New("some error"))
536547
},
@@ -545,13 +556,17 @@ func TestJobInitOpts_Execute(t *testing.T) {
545556

546557
mockJobInitializer := mocks.NewMockjobInitializer(ctrl)
547558
mockDockerfile := mocks.NewMockdockerfileParser(ctrl)
559+
mockDockerEngine := mocks.NewMockdockerEngine(ctrl)
548560

549561
if tc.mockJobInit != nil {
550562
tc.mockJobInit(mockJobInitializer)
551563
}
552564
if tc.mockDockerfile != nil {
553565
tc.mockDockerfile(mockDockerfile)
554566
}
567+
if tc.mockDockerEngine != nil {
568+
tc.mockDockerEngine(mockDockerEngine)
569+
}
555570

556571
opts := initJobOpts{
557572
initJobVars: initJobVars{
@@ -567,6 +582,7 @@ func TestJobInitOpts_Execute(t *testing.T) {
567582
initParser: func(s string) dockerfileParser {
568583
return mockDockerfile
569584
},
585+
dockerEngine: mockDockerEngine,
570586
}
571587

572588
// WHEN

0 commit comments

Comments
 (0)