Skip to content

Commit

Permalink
ignore DeploymentConfig warning on oc status
Browse files Browse the repository at this point in the history
  • Loading branch information
sanchezl committed Jun 3, 2024
1 parent 143d405 commit b2c5038
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 4 deletions.
19 changes: 16 additions & 3 deletions pkg/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ package cli
import (
"flag"
"fmt"
"log/slog"
"os"
"runtime"
"slices"
"strings"

"github.com/MakeNowJust/heredoc"
"github.com/openshift/oc/pkg/helpers/apps"
"github.com/spf13/cobra"

"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/cli-runtime/pkg/genericiooptions"
"k8s.io/client-go/rest"
Expand Down Expand Up @@ -176,8 +178,19 @@ func NewOcCommand(o kubecmd.KubectlOptions) *cobra.Command {
Long: cliLong,
Run: runHelp,
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
rest.SetDefaultWarningHandler(warningHandler)

switch cmd.Name() {
case "status":
rest.SetDefaultWarningHandler(apps.NewIgnoreDeploymentConfigWarningHandler(warningHandler))
case "get":
if slices.ContainsFunc(args, func(s string) bool { return slices.Contains(strings.Split(s, ","), "all") }) {
rest.SetDefaultWarningHandler(apps.NewIgnoreDeploymentConfigWarningHandler(warningHandler))
} else {
rest.SetDefaultWarningHandler(warningHandler)
}
default:
rest.SetDefaultWarningHandler(warningHandler)
}
slog.Info("PersistentPreRunE", "name", cmd.Name(), "calledAs", cmd.CalledAs(), "args", args)
if cmd.Name() == cobra.ShellCompRequestCmd {
// This is the __complete or __completeNoDesc command which
// indicates shell completion has been requested.
Expand Down
1 change: 0 additions & 1 deletion pkg/cli/status/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (

"github.com/gonum/graph/encoding/dot"
"github.com/spf13/cobra"

kapierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/cli-runtime/pkg/genericiooptions"
Expand Down
22 changes: 22 additions & 0 deletions pkg/helpers/apps/warning_handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package apps

import (
"strings"

"k8s.io/client-go/rest"
)

type ignoreDeploymentConfigWarningHandler struct {
handler rest.WarningHandler
}

func NewIgnoreDeploymentConfigWarningHandler(handler rest.WarningHandler) rest.WarningHandler {
return &ignoreDeploymentConfigWarningHandler{handler: handler}
}

func (h *ignoreDeploymentConfigWarningHandler) HandleWarningHeader(code int, agent string, text string) {
if h.handler == nil || strings.Contains(text, `apps.openshift.io/v1 DeploymentConfig is deprecated`) {
return
}
h.handler.HandleWarningHeader(code, agent, text)
}
66 changes: 66 additions & 0 deletions pkg/helpers/apps/warning_handler_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package apps

import (
"net/http"
"testing"
)

func TestHandleWarningHeader(t *testing.T) {
testCases := []struct {
name string
text string
wraps bool
expectOutput bool
}{
{
name: "deprecated old",
text: `apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+`,
wraps: true,
expectOutput: false,
},
{
name: "deprecated new",
text: `apps.openshift.io/v1 DeploymentConfig is deprecated in v1.27+`,
wraps: true,
expectOutput: false,
},
{
name: "do not panic no match",
text: `something else`,
},
{
name: "do not panic match",
text: `apps.openshift.io/v1 DeploymentConfig is deprecated in v1.27+`,
wraps: false,
},
{
name: "not deprecation warning",
text: `DeploymentConfig is not deprecated`,
wraps: true,
expectOutput: true,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
var wrappedHandler mockWarningHandler
if tc.wraps {
wrappedHandler = mockWarningHandler{}
}
h := NewIgnoreDeploymentConfigWarningHandler(&wrappedHandler)
h.HandleWarningHeader(http.StatusOK, "agent", tc.text)
if tc.wraps {
if tc.expectOutput != wrappedHandler.invoked {
t.Fatalf("Wrapped hander: invoke expected: %v, invoke actual: %v", tc.expectOutput, wrappedHandler.invoked)
}
}
})
}
}

type mockWarningHandler struct {
invoked bool
}

func (m *mockWarningHandler) HandleWarningHeader(warnStatusCode int, header string, text string) {
m.invoked = true
}

0 comments on commit b2c5038

Please sign in to comment.