Skip to content

Commit

Permalink
Ignore variant when looking up command for platform in entrypoint
Browse files Browse the repository at this point in the history
This change changes our runtime platform selection logic to allow
matching platforms that don't match the CPU variant, since some indexes
only provide the variant-less platform, and should be chosen in that
case rather than failing.

If the platform's command is found including the CPU variant, it will be
used. If not, we'll also check if there's a variant-less platform that
matches, and if so, we'll use that command.
  • Loading branch information
imjasonh authored and tekton-robot committed Feb 7, 2022
1 parent ed4200b commit 6cb0f4c
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 5 deletions.
27 changes: 22 additions & 5 deletions cmd/entrypoint/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package main
import (
"encoding/json"
"flag"
"fmt"
"log"
"os"
"os/exec"
Expand Down Expand Up @@ -110,11 +111,10 @@ func main() {
log.Fatal(err)
}
plat := platforms.DefaultString()

var found bool
cmd, found = cmds[plat]
if !found {
log.Fatalf("could not find command for platform %q", plat)
var err error
cmd, err = selectCommandForPlatform(cmds, plat)
if err != nil {
log.Fatal(err)
}
}

Expand Down Expand Up @@ -173,3 +173,20 @@ func main() {
}
}
}

func selectCommandForPlatform(cmds map[string][]string, plat string) ([]string, error) {
cmd, found := cmds[plat]
if found {
return cmd, nil
}

// If the command wasn't found, check if there's a
// command defined for the same platform without a CPU
// variant specified.
platWithoutVariant := plat[:strings.LastIndex(plat, "/")]
cmd, found = cmds[platWithoutVariant]
if found {
return cmd, nil
}
return nil, fmt.Errorf("could not find command for platform %q", plat)
}
1 change: 1 addition & 0 deletions cmd/entrypoint/namespaces.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
//go:build !linux
// +build !linux

package main
Expand Down
17 changes: 17 additions & 0 deletions cmd/entrypoint/namespaces_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
//go:build linux
// +build linux

/*
Copyright 2022 The Tekton Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package main

import (
Expand Down
78 changes: 78 additions & 0 deletions cmd/entrypoint/platform_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*
Copyright 2022 The Tekton Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package main

import (
"testing"

"github.com/google/go-cmp/cmp"
)

func TestSelectCommandForPlatform(t *testing.T) {
for _, c := range []struct {
desc string
m map[string][]string
plat string
want []string
wantErr bool
}{{
desc: "platform exists",
m: map[string][]string{
"linux/amd64": {"my", "command"},
"linux/s390x": {"other", "one"},
},
plat: "linux/amd64",
want: []string{"my", "command"},
}, {
desc: "platform not found",
m: map[string][]string{
"linux/amd64": {"my", "command"},
"linux/s390x": {"other", "one"},
},
plat: "linux/ppc64le",
wantErr: true,
}, {
desc: "platform fallback",
m: map[string][]string{
"linux/amd64": {"my", "command"},
"linux/s390x": {"other", "one"},
},
plat: "linux/amd64/v8",
want: []string{"my", "command"},
}, {
desc: "platform fallback not needed",
m: map[string][]string{
"linux/amd64": {"other", "one"},
"linux/amd64/v8": {"my", "command"},
},
plat: "linux/amd64/v8",
want: []string{"my", "command"},
}} {
t.Run(c.desc, func(t *testing.T) {
got, err := selectCommandForPlatform(c.m, c.plat)
if err != nil {
if c.wantErr {
return
}
t.Fatalf("Unexpected error: %v", err)
}
if d := cmp.Diff(c.want, got); d != "" {
t.Fatalf("Diff(-want,+got):\n%s", d)
}
})
}
}
1 change: 1 addition & 0 deletions cmd/entrypoint/runner.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
//go:build !windows
// +build !windows

/*
Expand Down
1 change: 1 addition & 0 deletions cmd/entrypoint/runner_windows.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
//go:build windows
// +build windows

/*
Expand Down

0 comments on commit 6cb0f4c

Please sign in to comment.