From a2315fe9317e69dc76e1c9b82f851d1a9ee13d52 Mon Sep 17 00:00:00 2001 From: Lukas Bachschwell Date: Sat, 26 Feb 2022 22:54:28 +0100 Subject: [PATCH] Do not filter on linux/amd64 per default (#805) * Do not filter on linux/amd64 per default & add tests Tasks with no platform would otherwise not perform on runners with different OS/ARCH combos Signed-off-by: Lukas Bachschwell Co-authored-by: 6543 <6543@obermui.de> --- pipeline/frontend/metadata.go | 3 -- server/grpc/filter.go | 5 ++ server/grpc/filter_test.go | 97 +++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 server/grpc/filter_test.go diff --git a/pipeline/frontend/metadata.go b/pipeline/frontend/metadata.go index 830af5c47..619f74f89 100644 --- a/pipeline/frontend/metadata.go +++ b/pipeline/frontend/metadata.go @@ -218,8 +218,5 @@ func (m *Metadata) Environ() map[string]string { var pullRegexp = regexp.MustCompile(`\d+`) func (m *Metadata) SetPlatform(platform string) { - if platform == "" { - platform = "linux/amd64" - } m.Sys.Arch = platform } diff --git a/server/grpc/filter.go b/server/grpc/filter.go index 98c12c74f..dd4002365 100644 --- a/server/grpc/filter.go +++ b/server/grpc/filter.go @@ -39,6 +39,11 @@ func createFilterFunc(filter rpc.Filter) (queue.Filter, error) { } for k, v := range filter.Labels { + // if platform is not set ignore that filter + if k == "platform" && task.Labels[k] == "" { + continue + } + if task.Labels[k] != v { return false } diff --git a/server/grpc/filter_test.go b/server/grpc/filter_test.go new file mode 100644 index 000000000..bac98280f --- /dev/null +++ b/server/grpc/filter_test.go @@ -0,0 +1,97 @@ +// Copyright 2022 Woodpecker 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 grpc + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/woodpecker-ci/woodpecker/pipeline/rpc" + "github.com/woodpecker-ci/woodpecker/server/queue" +) + +func TestCreateFilterFunc(t *testing.T) { + t.Parallel() + + type filterTests struct { + tsk queue.Task + exp bool + } + + tests := []struct { + struc rpc.Filter + ft []filterTests + }{{ + struc: rpc.Filter{}, + ft: []filterTests{{ + tsk: queue.Task{ + Labels: map[string]string{"platform": "", "repo": "test/woodpecker"}, + }, + exp: true, + }, { + tsk: queue.Task{ + Labels: map[string]string{"platform": ""}, + }, + exp: true, + }}, + }, { + struc: rpc.Filter{ + Labels: map[string]string{"platform": "abc"}, + }, + ft: []filterTests{{ + tsk: queue.Task{ + Labels: map[string]string{"platform": "def"}, + }, + exp: false, + }, { + tsk: queue.Task{ + Labels: map[string]string{"platform": ""}, + }, + exp: true, + }}, + }, { + struc: rpc.Filter{ + Expr: "platform = 'abc' OR repo = 'test/woodpecker'", + }, + ft: []filterTests{{ + tsk: queue.Task{ + Labels: map[string]string{"platform": "", "repo": "test/woodpecker"}, + }, + exp: true, + }, { + tsk: queue.Task{ + Labels: map[string]string{"platform": "abc", "repo": "else"}, + }, + exp: true, + }, { + tsk: queue.Task{ + Labels: map[string]string{"platform": "also", "repo": "else"}, + }, + exp: false, + }}, + }} + + for _, test := range tests { + fn, err := createFilterFunc(test.struc) + if !assert.NoError(t, err) { + t.Fail() + } + + for _, ft := range test.ft { + assert.EqualValues(t, ft.exp, fn(&ft.tsk)) + } + } +}