diff --git a/cmd/prune-junit-xml/prunexml.go b/cmd/prune-junit-xml/prunexml.go
index 21d0b0fa312..9fbf506d988 100644
--- a/cmd/prune-junit-xml/prunexml.go
+++ b/cmd/prune-junit-xml/prunexml.go
@@ -17,23 +17,33 @@ limitations under the License.
package main
import (
+ "bufio"
+ "bytes"
"encoding/xml"
"flag"
"fmt"
"io"
"os"
+ "os/exec"
+ "path"
"regexp"
"strings"
"k8s.io/kubernetes/cmd/prune-junit-xml/logparse"
"k8s.io/kubernetes/third_party/forked/gotestsum/junitxml"
+ "sigs.k8s.io/yaml"
)
func main() {
maxTextSize := flag.Int("max-text-size", 1, "maximum size of attribute or text (in MB)")
pruneTests := flag.Bool("prune-tests", true,
"prune's xml files to display only top level tests and failed sub-tests")
+ addOwners := flag.Bool("add-owners", true,
+ "when pruning tests, also look for OWNERs files of the packages and prefix the names with [sig-...] if found")
flag.Parse()
+
+ pkgs := newPackageOwners(*addOwners)
+
for _, path := range flag.Args() {
fmt.Printf("processing junit xml file : %s\n", path)
xmlReader, err := os.Open(path)
@@ -48,7 +58,7 @@ func main() {
pruneXML(suites, *maxTextSize*1e6) // convert MB into bytes (roughly!)
if *pruneTests {
- pruneTESTS(suites)
+ pruneTESTS(suites, pkgs)
}
xmlWriter, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
@@ -121,7 +131,7 @@ func pruneStringIfNeeded(str *string, maxBytes int, msg string, args ...any) {
// This function condenses the junit xml to have package name as top level identifier
// and nesting under that.
-func pruneTESTS(suites *junitxml.JUnitTestSuites) {
+func pruneTESTS(suites *junitxml.JUnitTestSuites, pkgs *packageOwners) {
var updatedTestsuites []junitxml.JUnitTestSuite
for _, suite := range suites.Suites {
@@ -130,10 +140,23 @@ func pruneTESTS(suites *junitxml.JUnitTestSuites) {
var updatedTestcaseFailure junitxml.JUnitFailure
failflag := false
name := suite.Name
+
+ // Inject the owning SIG prefix, if possible.
+ // This has to be done while we still have what
+ // is likely to be the full package name.
+ name = pkgs.addOwner(name)
+
regex := regexp.MustCompile(`^(.*?)/([^/]+)/?$`)
match := regex.FindStringSubmatch(name)
- updatedTestcase.Classname = match[1]
- updatedTestcase.Name = match[2]
+ baseName := match[1]
+ leafName := match[2]
+
+ // testgrid uses suite.Name.
+ // Spyglass/Prow use testcase.Classname.
+ // Therefore we need to update both.
+ suite.Name = baseName
+ updatedTestcase.Classname = baseName
+ updatedTestcase.Name = leafName
updatedTestcase.Time = suite.Time
updatedSystemOut := ""
updatedSystemErr := ""
@@ -208,3 +231,79 @@ func streamXML(writer io.Writer, in *junitxml.JUnitTestSuites) error {
}
return encoder.Flush()
}
+
+type packageOwners struct {
+ // pkgs maps from import path to directory.
+ pkgs map[string]string
+}
+
+func newPackageOwners(enabled bool) *packageOwners {
+ if !enabled {
+ return nil
+ }
+
+ return &packageOwners{
+ pkgs: make(map[string]string),
+ }
+}
+
+// addOwner takes a package name (= import path, like k8s.io/client-go),
+// tries to look up the source code of the package, and then
+// walks up until it finds an OWNERS file with some sig label.
+// The first sig label found this way is used.
+//
+// If successful, that SIG gets added to the name.
+// If not, the name remains unchanged.
+func (p *packageOwners) addOwner(name string) string {
+ if p == nil {
+ return name
+ }
+
+ dir := p.pkgs[name]
+ if dir == "" {
+ // Look up via `go list`. To invoke it less often,
+ // we also ask for sub-packages and cache the results.
+ // We don't care about errors.
+ //
+ // This is roughly what golang.org/x/tools/go/packages does,
+ // which we can't use here because it would add a new
+ // dependency to k/k.
+ cmd := exec.Command("go", "list", "-f", "{{.ImportPath}}:{{.Dir}}", name+"/...")
+ out, _ := cmd.Output()
+ scanner := bufio.NewScanner(bytes.NewReader(out))
+ for scanner.Scan() {
+ line := scanner.Text()
+ parts := strings.SplitN(line, ":", 2)
+ if len(parts) != 2 {
+ continue
+ }
+ p.pkgs[parts[0]] = parts[1]
+ }
+ dir = p.pkgs[name]
+ }
+
+ // Walk up starting from an absolute path until we cannot go up further.
+ for ; dir != "" && dir != "." && dir != "/"; dir = path.Dir(dir) {
+ data, err := os.ReadFile(path.Join(dir, "OWNERS"))
+ if err != nil {
+ continue
+ }
+ var owners owners
+ if err := yaml.Unmarshal(data, &owners); err != nil {
+ continue
+ }
+ for _, label := range owners.Labels {
+ if strings.HasPrefix(label, "sig/") {
+ // Bingo!
+ return fmt.Sprintf("[sig-%s] %s", label[4:], name)
+ }
+ }
+ }
+
+ return name
+}
+
+// owners contains only fields from https://go.k8s.io/owners that we care about.
+type owners struct {
+ Labels []string `json:"labels"`
+}
diff --git a/cmd/prune-junit-xml/prunexml_test.go b/cmd/prune-junit-xml/prunexml_test.go
index 3dde79a0691..bd82abde716 100644
--- a/cmd/prune-junit-xml/prunexml_test.go
+++ b/cmd/prune-junit-xml/prunexml_test.go
@@ -76,16 +76,16 @@ func TestPruneXML(t *testing.T) {
func TestPruneTESTS(t *testing.T) {
sourceXML := `
-
+
-
-
-
-
-
-
+
+
+
+
+
+
@@ -129,25 +129,34 @@ func TestPruneTESTS(t *testing.T) {
sub-test failed
+
+
+
+
`
+ // This test uses the real OWNERS files from k/k because those exist.
+ // The downside it that OWNERS changes (not unlikely in the case of cluster/gce)
+ // imply changing this test data.
+ //
+ // Fake packages have no source and thus no OWNERS.
outputXML := `
-
+
-
+
-
+
-
+
FailureContent
-
+
@@ -155,7 +164,7 @@ func TestPruneTESTS(t *testing.T) {
FailureContentA
FailureContentB
-
+
@@ -165,9 +174,13 @@ func TestPruneTESTS(t *testing.T) {
err A
err B
+
+
+
+
`
suites, _ := fetchXML(strings.NewReader(sourceXML))
- pruneTESTS(suites)
+ pruneTESTS(suites, newPackageOwners(true))
var output bytes.Buffer
writer := bufio.NewWriter(&output)
_ = streamXML(writer, suites)
diff --git a/test/integration/apimachinery/OWNERS b/test/integration/apimachinery/OWNERS
new file mode 100644
index 00000000000..55a1deac4ea
--- /dev/null
+++ b/test/integration/apimachinery/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/api-machinery
diff --git a/test/integration/apiserver/OWNERS b/test/integration/apiserver/OWNERS
index 259d204ec55..9f0d5365c9f 100644
--- a/test/integration/apiserver/OWNERS
+++ b/test/integration/apiserver/OWNERS
@@ -3,3 +3,5 @@ approvers:
- alexzielenski
- jefftree
- jpbetz
+labels:
+ - sig/api-machinery
diff --git a/test/integration/auth/OWNERS b/test/integration/auth/OWNERS
new file mode 100644
index 00000000000..f357da7076c
--- /dev/null
+++ b/test/integration/auth/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/auth
diff --git a/test/integration/authutil/OWNERS b/test/integration/authutil/OWNERS
new file mode 100644
index 00000000000..f357da7076c
--- /dev/null
+++ b/test/integration/authutil/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/auth
diff --git a/test/integration/certificates/OWNERS b/test/integration/certificates/OWNERS
new file mode 100644
index 00000000000..f357da7076c
--- /dev/null
+++ b/test/integration/certificates/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/auth
diff --git a/test/integration/client/OWNERS b/test/integration/client/OWNERS
new file mode 100644
index 00000000000..55a1deac4ea
--- /dev/null
+++ b/test/integration/client/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/api-machinery
diff --git a/test/integration/cloudprovider/OWNERS b/test/integration/cloudprovider/OWNERS
new file mode 100644
index 00000000000..1cb61c828f1
--- /dev/null
+++ b/test/integration/cloudprovider/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/cloud-provider
diff --git a/test/integration/clustertrustbundles/OWNERS b/test/integration/clustertrustbundles/OWNERS
new file mode 100644
index 00000000000..f357da7076c
--- /dev/null
+++ b/test/integration/clustertrustbundles/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/auth
diff --git a/test/integration/configmap/configmap_test.go b/test/integration/configmap/configmap_test.go
deleted file mode 100644
index 16d8565a9a6..00000000000
--- a/test/integration/configmap/configmap_test.go
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
-Copyright 2015 The Kubernetes 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 configmap
-
-// This file tests use of the configMap API resource.
-
-import (
- "context"
- "testing"
-
- "k8s.io/api/core/v1"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- clientset "k8s.io/client-go/kubernetes"
- kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
- "k8s.io/kubernetes/test/integration"
- "k8s.io/kubernetes/test/integration/framework"
-)
-
-// TestConfigMap tests apiserver-side behavior of creation of ConfigMaps and pods that consume them.
-func TestConfigMap(t *testing.T) {
- // Disable ServiceAccount admission plugin as we don't have serviceaccount controller running.
- server := kubeapiservertesting.StartTestServerOrDie(t, nil, framework.DefaultTestServerFlags(), framework.SharedEtcd())
- defer server.TearDownFn()
-
- client := clientset.NewForConfigOrDie(server.ClientConfig)
-
- ns := framework.CreateNamespaceOrDie(client, "config-map", t)
- defer framework.DeleteNamespaceOrDie(client, ns, t)
-
- DoTestConfigMap(t, client, ns)
-}
-
-func DoTestConfigMap(t *testing.T, client clientset.Interface, ns *v1.Namespace) {
- cfg := v1.ConfigMap{
- ObjectMeta: metav1.ObjectMeta{
- Name: "configmap",
- Namespace: ns.Name,
- },
- Data: map[string]string{
- "data-1": "value-1",
- "data-2": "value-2",
- "data-3": "value-3",
- },
- }
-
- if _, err := client.CoreV1().ConfigMaps(cfg.Namespace).Create(context.TODO(), &cfg, metav1.CreateOptions{}); err != nil {
- t.Errorf("unable to create test configMap: %v", err)
- }
- defer deleteConfigMapOrErrorf(t, client, cfg.Namespace, cfg.Name)
-
- pod := &v1.Pod{
- ObjectMeta: metav1.ObjectMeta{
- Name: "XXX",
- Namespace: ns.Name,
- },
- Spec: v1.PodSpec{
- Containers: []v1.Container{
- {
- Name: "fake-name",
- Image: "fakeimage",
- Env: []v1.EnvVar{
- {
- Name: "CONFIG_DATA_1",
- ValueFrom: &v1.EnvVarSource{
- ConfigMapKeyRef: &v1.ConfigMapKeySelector{
- LocalObjectReference: v1.LocalObjectReference{
- Name: "configmap",
- },
- Key: "data-1",
- },
- },
- },
- {
- Name: "CONFIG_DATA_2",
- ValueFrom: &v1.EnvVarSource{
- ConfigMapKeyRef: &v1.ConfigMapKeySelector{
- LocalObjectReference: v1.LocalObjectReference{
- Name: "configmap",
- },
- Key: "data-2",
- },
- },
- }, {
- Name: "CONFIG_DATA_3",
- ValueFrom: &v1.EnvVarSource{
- ConfigMapKeyRef: &v1.ConfigMapKeySelector{
- LocalObjectReference: v1.LocalObjectReference{
- Name: "configmap",
- },
- Key: "data-3",
- },
- },
- },
- },
- },
- },
- },
- }
-
- pod.ObjectMeta.Name = "uses-configmap"
- if _, err := client.CoreV1().Pods(ns.Name).Create(context.TODO(), pod, metav1.CreateOptions{}); err != nil {
- t.Errorf("Failed to create pod: %v", err)
- }
- defer integration.DeletePodOrErrorf(t, client, ns.Name, pod.Name)
-}
-
-func deleteConfigMapOrErrorf(t *testing.T, c clientset.Interface, ns, name string) {
- if err := c.CoreV1().ConfigMaps(ns).Delete(context.TODO(), name, metav1.DeleteOptions{}); err != nil {
- t.Errorf("unable to delete ConfigMap %v: %v", name, err)
- }
-}
diff --git a/test/integration/configmap/main_test.go b/test/integration/configmap/main_test.go
deleted file mode 100644
index c05a94633b4..00000000000
--- a/test/integration/configmap/main_test.go
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Copyright 2017 The Kubernetes 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 configmap
-
-import (
- "testing"
-
- "k8s.io/kubernetes/test/integration/framework"
-)
-
-func TestMain(m *testing.M) {
- framework.EtcdMain(m.Run)
-}
diff --git a/test/integration/cronjob/OWNERS b/test/integration/cronjob/OWNERS
new file mode 100644
index 00000000000..688ea8bd0cf
--- /dev/null
+++ b/test/integration/cronjob/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/apps
diff --git a/test/integration/defaulttolerationseconds/OWNERS b/test/integration/defaulttolerationseconds/OWNERS
new file mode 100644
index 00000000000..688ea8bd0cf
--- /dev/null
+++ b/test/integration/defaulttolerationseconds/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/apps
diff --git a/test/integration/disruption/OWNERS b/test/integration/disruption/OWNERS
new file mode 100644
index 00000000000..688ea8bd0cf
--- /dev/null
+++ b/test/integration/disruption/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/apps
diff --git a/test/integration/dryrun/OWNERS b/test/integration/dryrun/OWNERS
index 2d24eb2504a..48304a74352 100644
--- a/test/integration/dryrun/OWNERS
+++ b/test/integration/dryrun/OWNERS
@@ -6,3 +6,5 @@ approvers:
reviewers:
- deads2k
- liggitt
+labels:
+ - sig/api-machinery
diff --git a/test/integration/dualstack/OWNERS b/test/integration/dualstack/OWNERS
new file mode 100644
index 00000000000..c8324a82542
--- /dev/null
+++ b/test/integration/dualstack/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/network
diff --git a/test/integration/endpoints/OWNERS b/test/integration/endpoints/OWNERS
new file mode 100644
index 00000000000..c8324a82542
--- /dev/null
+++ b/test/integration/endpoints/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/network
diff --git a/test/integration/endpointslice/OWNERS b/test/integration/endpointslice/OWNERS
new file mode 100644
index 00000000000..c8324a82542
--- /dev/null
+++ b/test/integration/endpointslice/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/network
diff --git a/test/integration/events/OWNERS b/test/integration/events/OWNERS
new file mode 100644
index 00000000000..c75722ecff5
--- /dev/null
+++ b/test/integration/events/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/instrumentation
diff --git a/test/integration/evictions/OWNERS b/test/integration/evictions/OWNERS
new file mode 100644
index 00000000000..688ea8bd0cf
--- /dev/null
+++ b/test/integration/evictions/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/apps
diff --git a/test/integration/examples/OWNERS b/test/integration/examples/OWNERS
new file mode 100644
index 00000000000..55a1deac4ea
--- /dev/null
+++ b/test/integration/examples/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/api-machinery
diff --git a/test/integration/garbagecollector/OWNERS b/test/integration/garbagecollector/OWNERS
new file mode 100644
index 00000000000..55a1deac4ea
--- /dev/null
+++ b/test/integration/garbagecollector/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/api-machinery
diff --git a/test/integration/ipamperf/OWNERS b/test/integration/ipamperf/OWNERS
new file mode 100644
index 00000000000..c8324a82542
--- /dev/null
+++ b/test/integration/ipamperf/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/network
diff --git a/test/integration/kubelet/OWNERS b/test/integration/kubelet/OWNERS
new file mode 100644
index 00000000000..fbc36618c83
--- /dev/null
+++ b/test/integration/kubelet/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/node
diff --git a/test/integration/namespace/OWNERS b/test/integration/namespace/OWNERS
new file mode 100644
index 00000000000..55a1deac4ea
--- /dev/null
+++ b/test/integration/namespace/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/api-machinery
diff --git a/test/integration/network/OWNERS b/test/integration/network/OWNERS
new file mode 100644
index 00000000000..c8324a82542
--- /dev/null
+++ b/test/integration/network/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/network
diff --git a/test/integration/node/OWNERS b/test/integration/node/OWNERS
index d8a9ea055d4..65e322510c3 100644
--- a/test/integration/node/OWNERS
+++ b/test/integration/node/OWNERS
@@ -4,3 +4,5 @@ approvers:
- sig-node-approvers
reviewers:
- sig-node-reviewers
+labels:
+ - sig/node
diff --git a/test/integration/objectmeta/main_test.go b/test/integration/objectmeta/main_test.go
deleted file mode 100644
index ca65234eb42..00000000000
--- a/test/integration/objectmeta/main_test.go
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Copyright 2017 The Kubernetes 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 objectmeta
-
-import (
- "testing"
-
- "k8s.io/kubernetes/test/integration/framework"
-)
-
-func TestMain(m *testing.M) {
- framework.EtcdMain(m.Run)
-}
diff --git a/test/integration/openshift/OWNERS b/test/integration/openshift/OWNERS
new file mode 100644
index 00000000000..55a1deac4ea
--- /dev/null
+++ b/test/integration/openshift/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/api-machinery
diff --git a/test/integration/podcertificaterequests/OWNERS b/test/integration/podcertificaterequests/OWNERS
new file mode 100644
index 00000000000..f357da7076c
--- /dev/null
+++ b/test/integration/podcertificaterequests/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/auth
diff --git a/test/integration/pods/OWNERS b/test/integration/pods/OWNERS
index 7ed78e3d1cc..a21b4289d3e 100644
--- a/test/integration/pods/OWNERS
+++ b/test/integration/pods/OWNERS
@@ -10,3 +10,5 @@ reviewers:
emeritus_approvers:
- vishh
- dchen1107
+labels:
+ - sig/node
diff --git a/test/integration/pvc/OWNERS b/test/integration/pvc/OWNERS
new file mode 100644
index 00000000000..b3a806c0a19
--- /dev/null
+++ b/test/integration/pvc/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/storage
diff --git a/test/integration/quota/OWNERS b/test/integration/quota/OWNERS
new file mode 100644
index 00000000000..55a1deac4ea
--- /dev/null
+++ b/test/integration/quota/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/api-machinery
diff --git a/test/integration/replicaset/OWNERS b/test/integration/replicaset/OWNERS
new file mode 100644
index 00000000000..688ea8bd0cf
--- /dev/null
+++ b/test/integration/replicaset/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/apps
diff --git a/test/integration/replicationcontroller/OWNERS b/test/integration/replicationcontroller/OWNERS
new file mode 100644
index 00000000000..688ea8bd0cf
--- /dev/null
+++ b/test/integration/replicationcontroller/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/apps
diff --git a/test/integration/scale/OWNERS b/test/integration/scale/OWNERS
new file mode 100644
index 00000000000..688ea8bd0cf
--- /dev/null
+++ b/test/integration/scale/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/apps
diff --git a/test/integration/secrets/OWNERS b/test/integration/secrets/OWNERS
new file mode 100644
index 00000000000..f357da7076c
--- /dev/null
+++ b/test/integration/secrets/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/auth
diff --git a/test/integration/service/OWNERS b/test/integration/service/OWNERS
new file mode 100644
index 00000000000..c8324a82542
--- /dev/null
+++ b/test/integration/service/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/network
diff --git a/test/integration/serviceaccount/OWNERS b/test/integration/serviceaccount/OWNERS
new file mode 100644
index 00000000000..f357da7076c
--- /dev/null
+++ b/test/integration/serviceaccount/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/auth
diff --git a/test/integration/servicecidr/OWNERS b/test/integration/servicecidr/OWNERS
new file mode 100644
index 00000000000..c8324a82542
--- /dev/null
+++ b/test/integration/servicecidr/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/network
diff --git a/test/integration/serving/OWNERS b/test/integration/serving/OWNERS
new file mode 100644
index 00000000000..f357da7076c
--- /dev/null
+++ b/test/integration/serving/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/auth
diff --git a/test/integration/staleness/OWNERS b/test/integration/staleness/OWNERS
new file mode 100644
index 00000000000..55a1deac4ea
--- /dev/null
+++ b/test/integration/staleness/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/api-machinery
diff --git a/test/integration/statefulset/OWNERS b/test/integration/statefulset/OWNERS
new file mode 100644
index 00000000000..688ea8bd0cf
--- /dev/null
+++ b/test/integration/statefulset/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/apps
diff --git a/test/integration/storageclasses/OWNERS b/test/integration/storageclasses/OWNERS
new file mode 100644
index 00000000000..b3a806c0a19
--- /dev/null
+++ b/test/integration/storageclasses/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/storage
diff --git a/test/integration/storageversion/OWNERS b/test/integration/storageversion/OWNERS
new file mode 100644
index 00000000000..55a1deac4ea
--- /dev/null
+++ b/test/integration/storageversion/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/api-machinery
diff --git a/test/integration/storageversionmigrator/OWNERS b/test/integration/storageversionmigrator/OWNERS
new file mode 100644
index 00000000000..55a1deac4ea
--- /dev/null
+++ b/test/integration/storageversionmigrator/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/api-machinery
diff --git a/test/integration/tls/OWNERS b/test/integration/tls/OWNERS
new file mode 100644
index 00000000000..f357da7076c
--- /dev/null
+++ b/test/integration/tls/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/auth
diff --git a/test/integration/ttlcontroller/OWNERS b/test/integration/ttlcontroller/OWNERS
new file mode 100644
index 00000000000..688ea8bd0cf
--- /dev/null
+++ b/test/integration/ttlcontroller/OWNERS
@@ -0,0 +1,4 @@
+# See the OWNERS docs at https://go.k8s.io/owners
+
+labels:
+ - sig/apps