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 committed Feb 5, 2022
1 parent 05baf08 commit 53699ec
Show file tree
Hide file tree
Showing 3 changed files with 116 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)
}
16 changes: 16 additions & 0 deletions cmd/entrypoint/namespaces_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
// +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": []string{"my", "command"},
"linux/s390x": []string{"other", "one"},
},
plat: "linux/amd64",
want: []string{"my", "command"},
}, {
desc: "platform not found",
m: map[string][]string{
"linux/amd64": []string{"my", "command"},
"linux/s390x": []string{"other", "one"},
},
plat: "linux/ppc64le",
wantErr: true,
}, {
desc: "platform fallback",
m: map[string][]string{
"linux/amd64": []string{"my", "command"},
"linux/s390x": []string{"other", "one"},
},
plat: "linux/amd64/v8",
want: []string{"my", "command"},
}, {
desc: "platform fallback not needed",
m: map[string][]string{
"linux/amd64": []string{"other", "one"},
"linux/amd64/v8": []string{"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)
}
})
}
}

0 comments on commit 53699ec

Please sign in to comment.