@@ -26,7 +26,7 @@ import (
26
26
mobyterm "github.com/moby/term"
27
27
"github.com/sirupsen/logrus"
28
28
"github.com/urfave/cli/v2"
29
- restclient "k8s.io/client-go/rest"
29
+ "k8s.io/client-go/rest"
30
30
remoteclient "k8s.io/client-go/tools/remotecommand"
31
31
internalapi "k8s.io/cri-api/pkg/apis"
32
32
pb "k8s.io/cri-api/pkg/apis/runtime/v1"
@@ -37,6 +37,10 @@ const (
37
37
// TODO: make this configurable in kubelet.
38
38
kubeletURLSchema = "http"
39
39
kubeletURLHost = "http://127.0.0.1:10250"
40
+
41
+ transportFlag = "transport"
42
+ transportWebsocket = "websocket"
43
+ transportSpdy = "spdy"
40
44
)
41
45
42
46
const detachSequence = "ctrl-p,ctrl-q"
@@ -67,6 +71,12 @@ var runtimeExecCommand = &cli.Command{
67
71
Aliases : []string {"i" },
68
72
Usage : "Keep STDIN open" ,
69
73
},
74
+ & cli.StringFlag {
75
+ Name : transportFlag ,
76
+ Aliases : []string {"r" },
77
+ Value : transportSpdy ,
78
+ Usage : fmt .Sprintf ("Transport protocol to be used, must be one of: %s, %s" , transportSpdy , transportWebsocket ),
79
+ },
70
80
},
71
81
Action : func (c * cli.Context ) error {
72
82
if c .NArg () < 2 {
@@ -79,11 +89,12 @@ var runtimeExecCommand = &cli.Command{
79
89
}
80
90
81
91
var opts = execOptions {
82
- id : c .Args ().First (),
83
- timeout : c .Int64 ("timeout" ),
84
- tty : c .Bool ("tty" ),
85
- stdin : c .Bool ("interactive" ),
86
- cmd : c .Args ().Slice ()[1 :],
92
+ id : c .Args ().First (),
93
+ timeout : c .Int64 ("timeout" ),
94
+ tty : c .Bool ("tty" ),
95
+ stdin : c .Bool ("interactive" ),
96
+ cmd : c .Args ().Slice ()[1 :],
97
+ transport : c .String (transportFlag ),
87
98
}
88
99
if c .Bool ("sync" ) {
89
100
exitCode , err := ExecSync (runtimeClient , opts )
@@ -160,13 +171,13 @@ func Exec(ctx context.Context, client internalapi.RuntimeService, opts execOptio
160
171
}
161
172
162
173
logrus .Debugf ("Exec URL: %v" , URL )
163
- return stream (ctx , opts .stdin , opts .tty , URL )
174
+ return stream (ctx , opts .stdin , opts .tty , opts . transport , URL )
164
175
}
165
176
166
- func stream (ctx context.Context , in , tty bool , url * url.URL ) error {
167
- executor , err := remoteclient . NewSPDYExecutor ( & restclient. Config { TLSClientConfig : restclient. TLSClientConfig { Insecure : true }}, "POST" , url )
177
+ func stream (ctx context.Context , in , tty bool , transport string , url * url.URL ) error {
178
+ executor , err := getExecutor ( transport , url )
168
179
if err != nil {
169
- return err
180
+ return fmt . Errorf ( "get executor: %w" , err )
170
181
}
171
182
172
183
stdin , stdout , stderr := mobyterm .StdStreams ()
@@ -204,3 +215,19 @@ func stream(ctx context.Context, in, tty bool, url *url.URL) error {
204
215
streamOptions .TerminalSizeQueue = t .MonitorSize (t .GetSize ())
205
216
return t .Safe (func () error { return executor .StreamWithContext (ctx , streamOptions ) })
206
217
}
218
+
219
+ func getExecutor (transport string , url * url.URL ) (exec remoteclient.Executor , err error ) {
220
+ config := & rest.Config {TLSClientConfig : rest.TLSClientConfig {Insecure : true }}
221
+
222
+ switch transport {
223
+ case transportSpdy :
224
+ return remoteclient .NewSPDYExecutor (config , "POST" , url )
225
+
226
+ case transportWebsocket :
227
+ return remoteclient .NewWebSocketExecutor (config , "GET" , url .String ())
228
+
229
+ default :
230
+ return nil , fmt .Errorf ("unknown transport: %s" , transport )
231
+
232
+ }
233
+ }
0 commit comments