Skip to content

Commit 7301f4e

Browse files
committed
NetworkCheck diag: deprecate flags, use parameters
1 parent faac56f commit 7301f4e

File tree

2 files changed

+94
-42
lines changed

2 files changed

+94
-42
lines changed

pkg/diagnostics/network/run_pod.go

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,16 @@ import (
55
"fmt"
66
"os"
77
"os/signal"
8+
"path/filepath"
9+
"strconv"
10+
"strings"
811
"syscall"
912
"time"
1013

1114
flag "github.com/spf13/pflag"
1215

16+
"k8s.io/apimachinery/pkg/util/sets"
17+
kvalidation "k8s.io/apimachinery/pkg/util/validation"
1318
"k8s.io/apimachinery/pkg/util/wait"
1419
"k8s.io/apiserver/pkg/storage/names"
1520
kapi "k8s.io/kubernetes/pkg/api"
@@ -22,7 +27,12 @@ import (
2227
)
2328

2429
const (
25-
NetworkDiagnosticName = "NetworkCheck"
30+
NetworkDiagnosticName = "NetworkCheck"
31+
NetworkDiagLogDirParam = "logDir"
32+
NetworkDiagPodImageParam = "podImage"
33+
NetworkDiagTestPodImageParam = "testPodImage"
34+
NetworkDiagTestPodProtocolParam = "podProtocol"
35+
NetworkDiagTestPodPortParam = "podPort"
2636
)
2737

2838
// NetworkDiagnostic is a diagnostic that runs a network diagnostic pod and relays the results.
@@ -59,6 +69,68 @@ func (d *NetworkDiagnostic) Description() string {
5969
return "Create a pod on all schedulable nodes and run network diagnostics from the application standpoint"
6070
}
6171

72+
func (d *NetworkDiagnostic) AvailableParameters() map[string]string {
73+
return map[string]string{
74+
NetworkDiagLogDirParam: fmt.Sprintf("Path to store diagnostic results in case of errors (default %s)", util.NetworkDiagDefaultLogDir),
75+
NetworkDiagPodImageParam: fmt.Sprintf("Image to use for diagnostic pod (default %s)", util.GetNetworkDiagDefaultPodImage()),
76+
NetworkDiagTestPodImageParam: fmt.Sprintf("Image to use for diagnostic test pod (default %s)", util.GetNetworkDiagDefaultTestPodImage()),
77+
NetworkDiagTestPodProtocolParam: fmt.Sprintf("Protocol used to connect to diagnostic test pod (default %s)", util.NetworkDiagDefaultTestPodProtocol),
78+
NetworkDiagTestPodPortParam: fmt.Sprintf("Serving port on the diagnostic test pod (default %d)", util.NetworkDiagDefaultTestPodPort),
79+
}
80+
}
81+
82+
func (d *NetworkDiagnostic) SetParameters(params map[string]string) error {
83+
// translate parameters (if given) into the members previously filled by flags
84+
if p := params[NetworkDiagLogDirParam]; p != "" {
85+
d.LogDir = p
86+
}
87+
if p := params[NetworkDiagPodImageParam]; p != "" {
88+
d.PodImage = p
89+
}
90+
if p := params[NetworkDiagTestPodImageParam]; p != "" {
91+
d.TestPodImage = p
92+
}
93+
if p := params[NetworkDiagTestPodProtocolParam]; p != "" {
94+
d.TestPodProtocol = p
95+
}
96+
if p := params[NetworkDiagTestPodPortParam]; p != "" {
97+
if port, err := strconv.ParseInt(p, 0, 0); err == nil {
98+
d.TestPodPort = int(port)
99+
} else {
100+
return fmt.Errorf("%s.%s=%s is not a valid port number: %v", NetworkDiagnosticName, NetworkDiagTestPodPortParam, p, err)
101+
}
102+
}
103+
104+
// fill in defaults, validate
105+
if len(d.LogDir) == 0 {
106+
d.LogDir = util.NetworkDiagDefaultLogDir
107+
} else {
108+
logdir, err := filepath.Abs(d.LogDir)
109+
if err != nil {
110+
return err
111+
}
112+
if path, err := os.Stat(d.LogDir); err == nil && !path.Mode().IsDir() {
113+
return fmt.Errorf("Network log path %q exists but is not a directory", d.LogDir)
114+
}
115+
d.LogDir = logdir
116+
}
117+
if len(d.PodImage) == 0 {
118+
d.PodImage = util.GetNetworkDiagDefaultPodImage()
119+
}
120+
if len(d.TestPodImage) == 0 {
121+
d.TestPodImage = util.GetNetworkDiagDefaultTestPodImage()
122+
}
123+
124+
supportedProtocols := sets.NewString(string(kapi.ProtocolTCP), string(kapi.ProtocolUDP))
125+
if !supportedProtocols.Has(d.TestPodProtocol) {
126+
return fmt.Errorf("invalid protocol for network diagnostic test pod. Supported protocols: %s", strings.Join(supportedProtocols.List(), ","))
127+
}
128+
if kvalidation.IsValidPortNum(d.TestPodPort) != nil {
129+
return fmt.Errorf("invalid port for network diagnostic test pod. Must be in the range 1 to 65535.")
130+
}
131+
return nil
132+
}
133+
62134
// CanRun is part of the Diagnostic interface; it determines if the conditions are right to run this diagnostic.
63135
func (d *NetworkDiagnostic) CanRun() (bool, error) {
64136
if d.PreventModification {

pkg/oc/admin/diagnostics/diagnostics.go

Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"io"
66
"os"
7-
"path/filepath"
87
"runtime/debug"
98
"strings"
109

@@ -13,15 +12,14 @@ import (
1312

1413
kutilerrors "k8s.io/apimachinery/pkg/util/errors"
1514
"k8s.io/apimachinery/pkg/util/sets"
16-
kvalidation "k8s.io/apimachinery/pkg/util/validation"
17-
kapi "k8s.io/kubernetes/pkg/api"
1815
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
1916
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
2017

2118
"github.com/openshift/origin/pkg/cmd/flagtypes"
2219
osclientcmd "github.com/openshift/origin/pkg/cmd/util/clientcmd"
2320
"github.com/openshift/origin/pkg/cmd/util/variable"
2421
"github.com/openshift/origin/pkg/diagnostics/log"
22+
netdiag "github.com/openshift/origin/pkg/diagnostics/network"
2523
netutil "github.com/openshift/origin/pkg/diagnostics/networkpod/util"
2624
"github.com/openshift/origin/pkg/diagnostics/types"
2725
"github.com/openshift/origin/pkg/oc/admin/diagnostics/options"
@@ -58,7 +56,7 @@ type DiagnosticsOptions struct {
5856
LogOptions *log.LoggerOptions
5957
// The Logger is built with the options and should be used for all diagnostic output.
6058
Logger *log.Logger
61-
// Options specific to network diagnostics
59+
// Options specific to network diagnostics (deprecated)
6260
NetworkOptions *NetworkDiagnosticsOptions
6361
}
6462

@@ -161,15 +159,30 @@ func NewCmdDiagnostics(name string, fullName string, out io.Writer) *cobra.Comma
161159
cmd.Flags().StringVar(&o.ImageTemplate.Format, options.FlagImageTemplateName, o.ImageTemplate.Format, "Image template for DiagnosticPod to use in creating a pod")
162160
cmd.Flags().BoolVar(&o.ImageTemplate.Latest, options.FlagLatestImageName, false, "If true, when expanding the image template, use latest version, not release version")
163161
cmd.Flags().BoolVar(&o.PreventModification, options.FlagPreventModificationName, false, "If true, may be set to prevent diagnostics making any changes via the API")
162+
o.setNetworkFlags(cmd)
163+
flagtypes.GLog(cmd.Flags())
164+
options.BindLoggerOptionFlags(cmd.Flags(), o.LogOptions, options.RecommendedLoggerOptionFlags())
165+
166+
return cmd
167+
}
168+
169+
// Flags specific to NetworkCheck which are deprecated in favor of equivalent diagnostic parameters
170+
func (o *DiagnosticsOptions) setNetworkFlags(cmd *cobra.Command) {
164171
cmd.Flags().StringVar(&o.NetworkOptions.LogDir, options.FlagNetworkDiagLogDir, netutil.NetworkDiagDefaultLogDir, "Path to store network diagnostic results in case of errors")
165172
cmd.Flags().StringVar(&o.NetworkOptions.PodImage, options.FlagNetworkDiagPodImage, netutil.GetNetworkDiagDefaultPodImage(), "Image to use for network diagnostic pod")
166173
cmd.Flags().StringVar(&o.NetworkOptions.TestPodImage, options.FlagNetworkDiagTestPodImage, netutil.GetNetworkDiagDefaultTestPodImage(), "Image to use for network diagnostic test pod")
167174
cmd.Flags().StringVar(&o.NetworkOptions.TestPodProtocol, options.FlagNetworkDiagTestPodProtocol, netutil.NetworkDiagDefaultTestPodProtocol, "Protocol used to connect to network diagnostic test pod")
168175
cmd.Flags().IntVar(&o.NetworkOptions.TestPodPort, options.FlagNetworkDiagTestPodPort, netutil.NetworkDiagDefaultTestPodPort, "Serving port on the network diagnostic test pod")
169-
flagtypes.GLog(cmd.Flags())
170-
options.BindLoggerOptionFlags(cmd.Flags(), o.LogOptions, options.RecommendedLoggerOptionFlags())
171-
172-
return cmd
176+
for flag, param := range map[string]string{
177+
options.FlagNetworkDiagLogDir: netdiag.NetworkDiagLogDirParam,
178+
options.FlagNetworkDiagPodImage: netdiag.NetworkDiagPodImageParam,
179+
options.FlagNetworkDiagTestPodImage: netdiag.NetworkDiagTestPodImageParam,
180+
options.FlagNetworkDiagTestPodProtocol: netdiag.NetworkDiagTestPodProtocolParam,
181+
options.FlagNetworkDiagTestPodPort: netdiag.NetworkDiagTestPodPortParam,
182+
} {
183+
cmd.Flags().MarkDeprecated(flag, fmt.Sprintf("please set %s.%s instead.", netdiag.NetworkDiagnosticName, param))
184+
cmd.Flags().MarkHidden(flag)
185+
}
173186
}
174187

175188
// Complete fills in DiagnosticsOptions needed if the command is actually invoked.
@@ -193,42 +206,9 @@ func (o *DiagnosticsOptions) Complete(args []string) error {
193206
}
194207
}
195208

196-
if err = o.completeNetworkOptions(); err != nil {
197-
return err
198-
}
199209
return o.processArgs(args)
200210
}
201211

202-
func (o *DiagnosticsOptions) completeNetworkOptions() error {
203-
if len(o.NetworkOptions.LogDir) == 0 {
204-
o.NetworkOptions.LogDir = netutil.NetworkDiagDefaultLogDir
205-
} else {
206-
logdir, err := filepath.Abs(o.NetworkOptions.LogDir)
207-
if err != nil {
208-
return err
209-
}
210-
if path, err := os.Stat(o.NetworkOptions.LogDir); err == nil && !path.Mode().IsDir() {
211-
return fmt.Errorf("Network log path %q exists but is not a directory", o.NetworkOptions.LogDir)
212-
}
213-
o.NetworkOptions.LogDir = logdir
214-
}
215-
if len(o.NetworkOptions.PodImage) == 0 {
216-
o.NetworkOptions.PodImage = netutil.GetNetworkDiagDefaultPodImage()
217-
}
218-
if len(o.NetworkOptions.TestPodImage) == 0 {
219-
o.NetworkOptions.TestPodImage = netutil.GetNetworkDiagDefaultTestPodImage()
220-
}
221-
222-
supportedProtocols := sets.NewString(string(kapi.ProtocolTCP), string(kapi.ProtocolUDP))
223-
if !supportedProtocols.Has(o.NetworkOptions.TestPodProtocol) {
224-
return fmt.Errorf("invalid protocol for network diagnostic test pod. Supported protocols: %s", strings.Join(supportedProtocols.List(), ","))
225-
}
226-
if kvalidation.IsValidPortNum(o.NetworkOptions.TestPodPort) != nil {
227-
return fmt.Errorf("invalid port for network diagnostic test pod. Must be in the range 1 to 65535.")
228-
}
229-
return nil
230-
}
231-
232212
// Sort out the diagnostic names and any of their parameters.
233213
// oc adm diagnostics # all standard diagnostics
234214
// oc adm diagnostics Foo # only Foo

0 commit comments

Comments
 (0)