return all error when install

Signed-off-by: cleverhu <shouping.hu@daocloud.io>
pull/11327/head
cleverhu 3 years ago
parent d79ae9f927
commit f4501ff524

@ -41,6 +41,7 @@ import (
"k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/util/strategicpatch"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
"k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/genericclioptions"
@ -373,16 +374,17 @@ func perform(infos ResourceList, fn func(*resource.Info) error) error {
return ErrNoObjectsVisited return ErrNoObjectsVisited
} }
errorList := make([]error, 0)
errs := make(chan error) errs := make(chan error)
go batchPerform(infos, fn, errs) go batchPerform(infos, fn, errs)
for range infos { for range infos {
err := <-errs err := <-errs
if err != nil { if err != nil {
return err errorList = append(errorList, err)
} }
} }
return nil return utilerrors.NewAggregate(errorList)
} }
// getManagedFieldsManager returns the manager string. If one was set it will be returned. // getManagedFieldsManager returns the manager string. If one was set it will be returned.

@ -18,10 +18,12 @@ package kube
import ( import (
"bytes" "bytes"
"fmt"
"io" "io"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"strings" "strings"
"sync"
"testing" "testing"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
@ -265,19 +267,32 @@ func TestPerform(t *testing.T) {
name: "Valid input", name: "Valid input",
reader: strings.NewReader(guestbookManifest), reader: strings.NewReader(guestbookManifest),
count: 6, count: 6,
}, { },
{
name: "Empty manifests", name: "Empty manifests",
reader: strings.NewReader(""), reader: strings.NewReader(""),
err: true, err: true,
errMessage: "no objects visited", errMessage: "no objects visited",
}, },
{
name: "Error manifests",
reader: strings.NewReader(testErrorManifest),
count: 2,
err: true,
errMessage: "[resource endpoints/my-service already exists, resource services/redis-master already exists]",
},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
results := []*resource.Info{} results := []*resource.Info{}
resourceMap := sync.Map{}
fn := func(info *resource.Info) error { fn := func(info *resource.Info) error {
_, exist := resourceMap.Load(info.ObjectName())
if exist {
return fmt.Errorf("resource %s already exists", info.ObjectName())
}
resourceMap.Store(info.ObjectName(), struct{}{})
results = append(results, info) results = append(results, info)
return nil return nil
} }
@ -520,3 +535,59 @@ spec:
ports: ports:
- containerPort: 80 - containerPort: 80
` `
const testErrorManifest = `
kind: Endpoints
apiVersion: v1
metadata:
name: my-service
subsets:
- addresses:
- ip: "1.2.3.4"
ports:
- port: 9376
---
kind: Endpoints
apiVersion: v1
metadata:
name: my-service
subsets:
- addresses:
- ip: "1.2.3.4"
ports:
- port: 9376
---
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
app: redis
tier: backend
role: master
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
tier: backend
role: master
---
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
app: redis
tier: backend
role: master
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
tier: backend
role: master
`

Loading…
Cancel
Save