mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-29 17:41:13 +00:00
Merge pull request #2081 from mortent/FixDefaultNamespaceIssue
Change the ResourceIdentifier used in kstatus to use only Group instead of GroupVersion
This commit is contained in:
@@ -10,8 +10,8 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/cli-runtime/pkg/genericclioptions"
|
||||
"k8s.io/cli-runtime/pkg/resource"
|
||||
"k8s.io/kubectl/pkg/cmd/util"
|
||||
@@ -47,7 +47,12 @@ func (s *StatusOptions) AddFlags(c *cobra.Command) {
|
||||
}
|
||||
|
||||
func (s *StatusOptions) waitForStatus(infos []*resource.Info) error {
|
||||
c, err := getClient(s.factory)
|
||||
mapper, err := getRESTMapper(s.factory)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
c, err := getClient(s.factory, mapper)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -55,16 +60,15 @@ func (s *StatusOptions) waitForStatus(infos []*resource.Info) error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), s.timeout)
|
||||
defer cancel()
|
||||
|
||||
resolver := wait.NewResolver(c, s.period)
|
||||
resolver := wait.NewResolver(c, mapper, s.period)
|
||||
ch := resolver.WaitForStatus(ctx, infosToResourceIdentifiers(infos))
|
||||
|
||||
for msg := range ch {
|
||||
switch msg.Type {
|
||||
case wait.ResourceUpdate:
|
||||
id := msg.EventResource.Identifier
|
||||
gv, _ := schema.ParseGroupVersion(id.GetAPIVersion())
|
||||
gvk := gv.WithKind(id.GetKind())
|
||||
fmt.Fprintf(s.ioStreams.Out, "%s/%s is %s: %s\n", strings.ToLower(gvk.GroupKind().String()), id.GetName(), msg.EventResource.Status.String(), msg.EventResource.Message)
|
||||
id := msg.EventResource.ResourceIdentifier
|
||||
gk := id.GroupKind
|
||||
fmt.Fprintf(s.ioStreams.Out, "%s/%s is %s: %s\n", strings.ToLower(gk.String()), id.Name, msg.EventResource.Status.String(), msg.EventResource.Message)
|
||||
case wait.Completed:
|
||||
fmt.Fprint(s.ioStreams.Out, "all resources has reached the Current status\n")
|
||||
case wait.Aborted:
|
||||
@@ -78,18 +82,21 @@ func infosToResourceIdentifiers(infos []*resource.Info) []wait.ResourceIdentifie
|
||||
var resources []wait.ResourceIdentifier
|
||||
for _, info := range infos {
|
||||
u := info.Object.(*unstructured.Unstructured)
|
||||
resources = append(resources, u)
|
||||
resources = append(resources, wait.ResourceIdentifier{
|
||||
GroupKind: u.GroupVersionKind().GroupKind(),
|
||||
Namespace: u.GetNamespace(),
|
||||
Name: u.GetName(),
|
||||
})
|
||||
}
|
||||
return resources
|
||||
}
|
||||
|
||||
func getClient(f util.Factory) (client.Reader, error) {
|
||||
config, err := f.ToRESTConfig()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
func getRESTMapper(f util.Factory) (meta.RESTMapper, error) {
|
||||
return f.ToRESTMapper()
|
||||
}
|
||||
|
||||
mapper, err := f.ToRESTMapper()
|
||||
func getClient(f util.Factory, mapper meta.RESTMapper) (client.Reader, error) {
|
||||
config, err := f.ToRESTConfig()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -10,14 +10,13 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
"sigs.k8s.io/kustomize/cmd/resource/status/generateddocs/commands"
|
||||
"sigs.k8s.io/kustomize/kstatus/wait"
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
)
|
||||
|
||||
// GetEventsRunner returns a command EventsRunner.
|
||||
func GetEventsRunner() *EventsRunner {
|
||||
r := &EventsRunner{
|
||||
createClientFunc: createClient,
|
||||
newResolverFunc: newResolver,
|
||||
}
|
||||
c := &cobra.Command{
|
||||
Use: "events DIR...",
|
||||
@@ -49,18 +48,16 @@ type EventsRunner struct {
|
||||
Timeout time.Duration
|
||||
Command *cobra.Command
|
||||
|
||||
createClientFunc createClientFunc
|
||||
newResolverFunc newResolverFunc
|
||||
}
|
||||
|
||||
func (r *EventsRunner) runE(c *cobra.Command, args []string) error {
|
||||
ctx := context.Background()
|
||||
|
||||
// Create a client and use it to set up a new resolver.
|
||||
client, err := r.createClientFunc()
|
||||
resolver, err := r.newResolverFunc(r.Interval)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error creating client")
|
||||
return errors.Wrap(err, "error creating resolver")
|
||||
}
|
||||
resolver := wait.NewResolver(client, r.Interval)
|
||||
|
||||
// Set up a CaptureIdentifierFilter and run all inputs through the
|
||||
// filter with the pipeline to capture the inventory of resources
|
||||
|
||||
@@ -9,6 +9,8 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"sigs.k8s.io/kustomize/kstatus/status"
|
||||
"sigs.k8s.io/kustomize/kstatus/wait"
|
||||
)
|
||||
@@ -20,7 +22,7 @@ func TestEventsNoResources(t *testing.T) {
|
||||
fakeClient := &FakeClient{}
|
||||
|
||||
r := GetEventsRunner()
|
||||
r.createClientFunc = newClientFunc(fakeClient)
|
||||
r.newResolverFunc = fakeResolver(fakeClient)
|
||||
r.Command.SetArgs([]string{})
|
||||
r.Command.SetIn(inBuffer)
|
||||
r.Command.SetOut(outBuffer)
|
||||
@@ -64,7 +66,7 @@ metadata:
|
||||
}
|
||||
|
||||
r := GetEventsRunner()
|
||||
r.createClientFunc = newClientFunc(fakeClient)
|
||||
r.newResolverFunc = fakeResolver(fakeClient, appsv1.SchemeGroupVersion.WithKind("Deployment"))
|
||||
r.Command.SetArgs([]string{})
|
||||
r.Command.SetIn(inBuffer)
|
||||
r.Command.SetOut(outBuffer)
|
||||
@@ -141,7 +143,8 @@ items:
|
||||
}
|
||||
|
||||
r := GetEventsRunner()
|
||||
r.createClientFunc = newClientFunc(fakeClient)
|
||||
r.newResolverFunc = fakeResolver(fakeClient, corev1.SchemeGroupVersion.WithKind("Pod"),
|
||||
corev1.SchemeGroupVersion.WithKind("Service"))
|
||||
r.Command.SetArgs([]string{})
|
||||
r.Command.SetIn(inBuffer)
|
||||
r.Command.SetOut(outBuffer)
|
||||
|
||||
@@ -18,7 +18,7 @@ import (
|
||||
// GetFetchRunner returns a command FetchRunner.
|
||||
func GetFetchRunner() *FetchRunner {
|
||||
r := &FetchRunner{
|
||||
createClientFunc: createClient,
|
||||
newResolverFunc: newResolver,
|
||||
}
|
||||
c := &cobra.Command{
|
||||
Use: "fetch DIR...",
|
||||
@@ -44,20 +44,17 @@ type FetchRunner struct {
|
||||
IncludeSubpackages bool
|
||||
Command *cobra.Command
|
||||
|
||||
createClientFunc createClientFunc
|
||||
newResolverFunc newResolverFunc
|
||||
}
|
||||
|
||||
func (r *FetchRunner) runE(c *cobra.Command, args []string) error {
|
||||
ctx := context.Background()
|
||||
|
||||
// Create a new client and use it to set up a resolver.
|
||||
k8sClient, err := r.createClientFunc()
|
||||
resolver, err := r.newResolverFunc(time.Minute)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error creating k8sClient")
|
||||
return errors.Wrap(err, "error creating resolver")
|
||||
}
|
||||
|
||||
resolver := wait.NewResolver(k8sClient, time.Minute)
|
||||
|
||||
// Set up a CaptureIdentifierFilter and run all inputs through the
|
||||
// filter with the pipeline to capture the inventory of resources
|
||||
// which we are interested in.
|
||||
@@ -108,7 +105,7 @@ func (f FetchStatusInfo) CurrentStatus() StatusData {
|
||||
var resourceData []ResourceStatusData
|
||||
for _, res := range f.Results {
|
||||
rsd := ResourceStatusData{
|
||||
Identifier: res.Resource,
|
||||
Identifier: res.ResourceIdentifier,
|
||||
}
|
||||
if res.Error != nil {
|
||||
rsd.Status = status.UnknownStatus
|
||||
|
||||
@@ -25,7 +25,7 @@ func TestEmptyManifest(t *testing.T) {
|
||||
fakeClient := fake.NewFakeClientWithScheme(scheme)
|
||||
|
||||
r := GetFetchRunner()
|
||||
r.createClientFunc = newClientFunc(fakeClient)
|
||||
r.newResolverFunc = fakeResolver(fakeClient)
|
||||
r.Command.SetArgs([]string{})
|
||||
r.Command.SetIn(inBuffer)
|
||||
r.Command.SetOut(outBuffer)
|
||||
@@ -65,7 +65,7 @@ metadata:
|
||||
fakeClient := fake.NewFakeClientWithScheme(scheme, deployment)
|
||||
|
||||
r := GetFetchRunner()
|
||||
r.createClientFunc = newClientFunc(fakeClient)
|
||||
r.newResolverFunc = fakeResolver(fakeClient, appsv1.SchemeGroupVersion.WithKind("Deployment"))
|
||||
r.Command.SetArgs([]string{})
|
||||
r.Command.SetIn(inBuffer)
|
||||
r.Command.SetOut(outBuffer)
|
||||
@@ -78,7 +78,7 @@ metadata:
|
||||
tableOutput := parseTableOutput(t, cleanOutput)
|
||||
|
||||
expectedResource := ResourceIdentifier{
|
||||
apiVersion: "apps/v1",
|
||||
apiVersion: "apps",
|
||||
kind: "Deployment",
|
||||
namespace: "default",
|
||||
name: "bar",
|
||||
@@ -139,7 +139,8 @@ metadata:
|
||||
outBuffer := &bytes.Buffer{}
|
||||
|
||||
r := GetFetchRunner()
|
||||
r.createClientFunc = newClientFunc(fakeClient)
|
||||
r.newResolverFunc = fakeResolver(fakeClient, appsv1.SchemeGroupVersion.WithKind("Deployment"),
|
||||
v1.SchemeGroupVersion.WithKind("Service"))
|
||||
r.Command.SetArgs([]string{d})
|
||||
r.Command.SetOut(outBuffer)
|
||||
|
||||
@@ -152,7 +153,7 @@ metadata:
|
||||
tableOutput := parseTableOutput(t, cleanOutput)
|
||||
|
||||
expectedDeploymentResource := ResourceIdentifier{
|
||||
apiVersion: "apps/v1",
|
||||
apiVersion: "apps",
|
||||
kind: "Deployment",
|
||||
namespace: "default",
|
||||
name: "foo",
|
||||
@@ -162,7 +163,7 @@ metadata:
|
||||
verifyOutputContains(t, tableOutput, expectedDeploymentResource, expectedDeploymentStatus, expectedDeploymentMessage)
|
||||
|
||||
expectedServiceResource := ResourceIdentifier{
|
||||
apiVersion: "v1",
|
||||
apiVersion: "",
|
||||
kind: "Service",
|
||||
namespace: "default",
|
||||
name: "foo",
|
||||
|
||||
@@ -6,11 +6,15 @@ import (
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/kustomize/kstatus/status"
|
||||
"sigs.k8s.io/kustomize/kstatus/wait"
|
||||
)
|
||||
|
||||
type TableOutput struct {
|
||||
@@ -232,10 +236,25 @@ func (f *FakeClient) Get(_ context.Context, _ client.ObjectKey, obj runtime.Obje
|
||||
return callbackFunc(u)
|
||||
}
|
||||
|
||||
func (f *FakeClient) List(ctx context.Context, list runtime.Object, opts ...client.ListOption) error {
|
||||
func (f *FakeClient) List(context.Context, runtime.Object, ...client.ListOption) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func fakeResolver(fakeClient client.Reader, mapperTypes ...schema.GroupVersionKind) newResolverFunc {
|
||||
return func(pollInterval time.Duration) (*wait.Resolver, error) {
|
||||
var groupVersions []schema.GroupVersion
|
||||
for _, gvk := range mapperTypes {
|
||||
groupVersions = append(groupVersions, gvk.GroupVersion())
|
||||
}
|
||||
mapper := meta.NewDefaultRESTMapper(groupVersions)
|
||||
for _, gvk := range mapperTypes {
|
||||
mapper.Add(gvk, meta.RESTScopeNamespace)
|
||||
}
|
||||
|
||||
return wait.NewResolver(fakeClient, mapper, pollInterval), nil
|
||||
}
|
||||
}
|
||||
|
||||
func joinStatuses(statuses []status.Status) string {
|
||||
var stringStatuses []string
|
||||
for _, s := range statuses {
|
||||
|
||||
@@ -61,8 +61,7 @@ var (
|
||||
width: 25,
|
||||
colorFunc: defaultColorFunc,
|
||||
contentFunc: func(data ResourceStatusData) string {
|
||||
return fmt.Sprintf("%s/%s", data.Identifier.GetAPIVersion(),
|
||||
data.Identifier.GetKind())
|
||||
return fmt.Sprintf("%s/%s", data.Identifier.GroupKind.Group, data.Identifier.GroupKind.Kind)
|
||||
},
|
||||
},
|
||||
namespaceColumn: {
|
||||
@@ -70,7 +69,7 @@ var (
|
||||
width: 15,
|
||||
colorFunc: defaultColorFunc,
|
||||
contentFunc: func(data ResourceStatusData) string {
|
||||
return data.Identifier.GetNamespace()
|
||||
return data.Identifier.Namespace
|
||||
},
|
||||
},
|
||||
nameColumn: {
|
||||
@@ -78,7 +77,7 @@ var (
|
||||
width: 20,
|
||||
colorFunc: defaultColorFunc,
|
||||
contentFunc: func(data ResourceStatusData) string {
|
||||
return data.Identifier.GetName()
|
||||
return data.Identifier.Name
|
||||
},
|
||||
},
|
||||
statusColumn: {
|
||||
@@ -255,8 +254,8 @@ var (
|
||||
width: 20,
|
||||
requireResourceUpdateEvent: true,
|
||||
contentFunc: func(event wait.Event) string {
|
||||
return fmt.Sprintf("%s/%s", event.EventResource.Identifier.GetAPIVersion(),
|
||||
event.EventResource.Identifier.GetKind())
|
||||
return fmt.Sprintf("%s/%s", event.EventResource.ResourceIdentifier.GroupKind.Group,
|
||||
event.EventResource.ResourceIdentifier.GroupKind.Kind)
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -264,7 +263,7 @@ var (
|
||||
width: 15,
|
||||
requireResourceUpdateEvent: true,
|
||||
contentFunc: func(event wait.Event) string {
|
||||
return event.EventResource.Identifier.GetNamespace()
|
||||
return event.EventResource.ResourceIdentifier.Namespace
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -272,7 +271,7 @@ var (
|
||||
width: 20,
|
||||
requireResourceUpdateEvent: true,
|
||||
contentFunc: func(event wait.Event) string {
|
||||
return event.EventResource.Identifier.GetName()
|
||||
return event.EventResource.ResourceIdentifier.Name
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
@@ -4,7 +4,10 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
|
||||
ctrl "sigs.k8s.io/controller-runtime"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
@@ -22,23 +25,23 @@ func init() {
|
||||
_ = clientgoscheme.AddToScheme(scheme)
|
||||
}
|
||||
|
||||
type createClientFunc func() (client.Reader, error)
|
||||
type newResolverFunc func(pollInterval time.Duration) (*wait.Resolver, error)
|
||||
|
||||
// createClient returns a client for talking to a Kubernetes cluster. The client
|
||||
// is from controller-runtime.
|
||||
func createClient() (client.Reader, error) {
|
||||
// newResolver returns a new resolver that can resolve status for resources based
|
||||
// on polling the cluster.
|
||||
func newResolver(pollInterval time.Duration) (*wait.Resolver, error) {
|
||||
config := ctrl.GetConfigOrDie()
|
||||
mapper, err := apiutil.NewDiscoveryRESTMapper(config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return client.New(config, client.Options{Scheme: scheme, Mapper: mapper})
|
||||
}
|
||||
|
||||
func newClientFunc(c client.Reader) func() (client.Reader, error) {
|
||||
return func() (client.Reader, error) {
|
||||
return c, nil
|
||||
c, err := client.New(config, client.Options{Scheme: scheme, Mapper: mapper})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return wait.NewResolver(c, mapper, pollInterval), nil
|
||||
}
|
||||
|
||||
// CaptureIdentifiersFilter implements the Filter interface in the kio package. It
|
||||
@@ -55,8 +58,20 @@ func (f *CaptureIdentifiersFilter) Filter(slice []*yaml.RNode) ([]*yaml.RNode, e
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// TODO(mortent): Update kyaml library
|
||||
id := meta.GetIdentifier()
|
||||
f.Identifiers = append(f.Identifiers, &id)
|
||||
gv, err := schema.ParseGroupVersion(id.APIVersion)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
f.Identifiers = append(f.Identifiers, wait.ResourceIdentifier{
|
||||
Name: id.Name,
|
||||
Namespace: id.Namespace,
|
||||
GroupKind: schema.GroupKind{
|
||||
Group: gv.Group,
|
||||
Kind: id.Kind,
|
||||
},
|
||||
})
|
||||
}
|
||||
return slice, nil
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ import (
|
||||
// GetWaitRunner return a command WaitRunner.
|
||||
func GetWaitRunner() *WaitRunner {
|
||||
r := &WaitRunner{
|
||||
createClientFunc: createClient,
|
||||
newResolverFunc: newResolver,
|
||||
}
|
||||
c := &cobra.Command{
|
||||
Use: "wait DIR...",
|
||||
@@ -51,7 +51,7 @@ type WaitRunner struct {
|
||||
Timeout time.Duration
|
||||
Command *cobra.Command
|
||||
|
||||
createClientFunc createClientFunc
|
||||
newResolverFunc newResolverFunc
|
||||
}
|
||||
|
||||
// runE implements the logic of the command and will call the Wait command in the wait
|
||||
@@ -59,12 +59,11 @@ type WaitRunner struct {
|
||||
// TablePrinter to display the information.
|
||||
func (r *WaitRunner) runE(c *cobra.Command, args []string) error {
|
||||
ctx := context.Background()
|
||||
client, err := r.createClientFunc()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error creating client")
|
||||
}
|
||||
|
||||
resolver := wait.NewResolver(client, r.Interval)
|
||||
resolver, err := r.newResolverFunc(r.Interval)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "errors creating resolver")
|
||||
}
|
||||
|
||||
captureFilter := &CaptureIdentifiersFilter{}
|
||||
filters := []kio.Filter{captureFilter}
|
||||
@@ -131,10 +130,9 @@ func (r *ResourceStatusCollector) updateResourceStatus(msg wait.Event) {
|
||||
r.AggregateStatus = msg.AggregateStatus
|
||||
eventResource := msg.EventResource
|
||||
for _, resourceState := range r.ResourceStatuses {
|
||||
if resourceState.Identifier.GetAPIVersion() == eventResource.Identifier.GetAPIVersion() &&
|
||||
resourceState.Identifier.GetKind() == eventResource.Identifier.GetKind() &&
|
||||
resourceState.Identifier.GetNamespace() == eventResource.Identifier.GetNamespace() &&
|
||||
resourceState.Identifier.GetName() == eventResource.Identifier.GetName() {
|
||||
if resourceState.Identifier.GroupKind == eventResource.ResourceIdentifier.GroupKind &&
|
||||
resourceState.Identifier.Namespace == eventResource.ResourceIdentifier.Namespace &&
|
||||
resourceState.Identifier.Name == eventResource.ResourceIdentifier.Name {
|
||||
resourceState.Status = eventResource.Status
|
||||
resourceState.Message = eventResource.Message
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ import (
|
||||
|
||||
"github.com/acarl005/stripansi"
|
||||
"github.com/stretchr/testify/assert"
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"sigs.k8s.io/kustomize/kstatus/status"
|
||||
)
|
||||
|
||||
@@ -18,7 +20,7 @@ func TestWaitNoResources(t *testing.T) {
|
||||
fakeClient := &FakeClient{}
|
||||
|
||||
r := GetWaitRunner()
|
||||
r.createClientFunc = newClientFunc(fakeClient)
|
||||
r.newResolverFunc = fakeResolver(fakeClient)
|
||||
r.Command.SetArgs([]string{})
|
||||
r.Command.SetIn(inBuffer)
|
||||
r.Command.SetOut(outBuffer)
|
||||
@@ -72,7 +74,7 @@ metadata:
|
||||
}
|
||||
|
||||
r := GetWaitRunner()
|
||||
r.createClientFunc = newClientFunc(fakeClient)
|
||||
r.newResolverFunc = fakeResolver(fakeClient, appsv1.SchemeGroupVersion.WithKind("Deployment"))
|
||||
r.Command.SetArgs([]string{})
|
||||
r.Command.SetIn(inBuffer)
|
||||
r.Command.SetOut(outBuffer)
|
||||
@@ -144,7 +146,8 @@ items:
|
||||
}
|
||||
|
||||
r := GetWaitRunner()
|
||||
r.createClientFunc = newClientFunc(fakeClient)
|
||||
r.newResolverFunc = fakeResolver(fakeClient, corev1.SchemeGroupVersion.WithKind("Pod"),
|
||||
corev1.SchemeGroupVersion.WithKind("Service"))
|
||||
r.Command.SetArgs([]string{})
|
||||
r.Command.SetIn(inBuffer)
|
||||
r.Command.SetOut(outBuffer)
|
||||
|
||||
Reference in New Issue
Block a user