@@ -3,15 +3,28 @@ package cmd
3
3
import (
4
4
"fmt"
5
5
"io"
6
+ "sort"
6
7
"time"
7
8
8
9
"github.com/spf13/cobra"
9
10
11
+ "k8s.io/api/core/v1"
12
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13
+ "k8s.io/apimachinery/pkg/labels"
14
+ "k8s.io/kubernetes/pkg/apis/apps"
15
+ "k8s.io/kubernetes/pkg/apis/batch"
16
+ kapi "k8s.io/kubernetes/pkg/apis/core"
17
+ "k8s.io/kubernetes/pkg/apis/extensions"
18
+ kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
19
+ "k8s.io/kubernetes/pkg/controller"
10
20
kubecmd "k8s.io/kubernetes/pkg/kubectl/cmd"
11
21
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
12
22
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
13
23
"k8s.io/kubernetes/pkg/kubectl/util/term"
14
24
25
+ appsapi "github.com/openshift/origin/pkg/apps/apis/apps"
26
+ appsclientinternal "github.com/openshift/origin/pkg/apps/generated/internalclientset"
27
+ appsutil "github.com/openshift/origin/pkg/apps/util"
15
28
"github.com/openshift/origin/pkg/cmd/util"
16
29
)
17
30
@@ -145,7 +158,7 @@ func (o *RshOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []str
145
158
}
146
159
o .PodClient = client .Core ()
147
160
148
- o .PodName , err = f . PodForResource ( resource , time .Duration (o .Timeout )* time .Second )
161
+ o .PodName , err = podForResource ( f , resource , time .Duration (o .Timeout )* time .Second )
149
162
150
163
fullCmdName := ""
151
164
cmdParent := cmd .Parent ()
@@ -172,3 +185,146 @@ func (o *RshOptions) Run() error {
172
185
}
173
186
return o .ExecOptions .Run ()
174
187
}
188
+
189
+ func podForResource (f kcmdutil.Factory , resource string , timeout time.Duration ) (string , error ) {
190
+ sortBy := func (pods []* v1.Pod ) sort.Interface { return sort .Reverse (controller .ActivePods (pods )) }
191
+ namespace , _ , err := f .DefaultNamespace ()
192
+ if err != nil {
193
+ return "" , err
194
+ }
195
+ mapper , _ := f .Object ()
196
+ resourceType , name , err := util .ResolveResource (kapi .Resource ("pods" ), resource , mapper )
197
+ if err != nil {
198
+ return "" , err
199
+ }
200
+ clientConfig , err := f .ClientConfig ()
201
+ if err != nil {
202
+ return "" , err
203
+ }
204
+
205
+ switch resourceType {
206
+ case kapi .Resource ("pods" ):
207
+ return name , nil
208
+ case kapi .Resource ("replicationcontrollers" ):
209
+ kc , err := f .ClientSet ()
210
+ if err != nil {
211
+ return "" , err
212
+ }
213
+ rc , err := kc .Core ().ReplicationControllers (namespace ).Get (name , metav1.GetOptions {})
214
+ if err != nil {
215
+ return "" , err
216
+ }
217
+ selector := labels .SelectorFromSet (rc .Spec .Selector )
218
+ pod , _ , err := kcmdutil .GetFirstPod (kc .Core (), namespace , selector .String (), timeout , sortBy )
219
+ if err != nil {
220
+ return "" , err
221
+ }
222
+ return pod .Name , nil
223
+ case appsapi .Resource ("deploymentconfigs" ):
224
+ appsClient , err := appsclientinternal .NewForConfig (clientConfig )
225
+ if err != nil {
226
+ return "" , err
227
+ }
228
+ dc , err := appsClient .Apps ().DeploymentConfigs (namespace ).Get (name , metav1.GetOptions {})
229
+ if err != nil {
230
+ return "" , err
231
+ }
232
+ return podForResource (f , fmt .Sprintf ("rc/%s" , appsutil .LatestDeploymentNameForConfig (dc )), timeout )
233
+ case extensions .Resource ("daemonsets" ):
234
+ kc , err := f .ClientSet ()
235
+ if err != nil {
236
+ return "" , err
237
+ }
238
+ ds , err := kc .Extensions ().DaemonSets (namespace ).Get (name , metav1.GetOptions {})
239
+ if err != nil {
240
+ return "" , err
241
+ }
242
+ selector , err := metav1 .LabelSelectorAsSelector (ds .Spec .Selector )
243
+ if err != nil {
244
+ return "" , err
245
+ }
246
+ pod , _ , err := kcmdutil .GetFirstPod (kc .Core (), namespace , selector .String (), timeout , sortBy )
247
+ if err != nil {
248
+ return "" , err
249
+ }
250
+ return pod .Name , nil
251
+ case extensions .Resource ("deployments" ):
252
+ kc , err := f .ClientSet ()
253
+ if err != nil {
254
+ return "" , err
255
+ }
256
+ d , err := kc .Extensions ().Deployments (namespace ).Get (name , metav1.GetOptions {})
257
+ if err != nil {
258
+ return "" , err
259
+ }
260
+ selector , err := metav1 .LabelSelectorAsSelector (d .Spec .Selector )
261
+ if err != nil {
262
+ return "" , err
263
+ }
264
+ pod , _ , err := kcmdutil .GetFirstPod (kc .Core (), namespace , selector .String (), timeout , sortBy )
265
+ if err != nil {
266
+ return "" , err
267
+ }
268
+ return pod .Name , nil
269
+ case apps .Resource ("statefulsets" ):
270
+ kc , err := f .ClientSet ()
271
+ if err != nil {
272
+ return "" , err
273
+ }
274
+ s , err := kc .Apps ().StatefulSets (namespace ).Get (name , metav1.GetOptions {})
275
+ if err != nil {
276
+ return "" , err
277
+ }
278
+ selector , err := metav1 .LabelSelectorAsSelector (s .Spec .Selector )
279
+ if err != nil {
280
+ return "" , err
281
+ }
282
+ pod , _ , err := kcmdutil .GetFirstPod (kc .Core (), namespace , selector .String (), timeout , sortBy )
283
+ if err != nil {
284
+ return "" , err
285
+ }
286
+ return pod .Name , nil
287
+ case extensions .Resource ("replicasets" ):
288
+ kc , err := f .ClientSet ()
289
+ if err != nil {
290
+ return "" , err
291
+ }
292
+ rs , err := kc .Extensions ().ReplicaSets (namespace ).Get (name , metav1.GetOptions {})
293
+ if err != nil {
294
+ return "" , err
295
+ }
296
+ selector , err := metav1 .LabelSelectorAsSelector (rs .Spec .Selector )
297
+ if err != nil {
298
+ return "" , err
299
+ }
300
+ pod , _ , err := kcmdutil .GetFirstPod (kc .Core (), namespace , selector .String (), timeout , sortBy )
301
+ if err != nil {
302
+ return "" , err
303
+ }
304
+ return pod .Name , nil
305
+ case batch .Resource ("jobs" ):
306
+ kc , err := f .ClientSet ()
307
+ if err != nil {
308
+ return "" , err
309
+ }
310
+ job , err := kc .Batch ().Jobs (namespace ).Get (name , metav1.GetOptions {})
311
+ if err != nil {
312
+ return "" , err
313
+ }
314
+ return podNameForJob (job , kc , timeout , sortBy )
315
+ default :
316
+ return "" , fmt .Errorf ("remote shell for %s is not supported" , resourceType )
317
+ }
318
+ }
319
+
320
+ func podNameForJob (job * batch.Job , kc kclientset.Interface , timeout time.Duration , sortBy func (pods []* v1.Pod ) sort.Interface ) (string , error ) {
321
+ selector , err := metav1 .LabelSelectorAsSelector (job .Spec .Selector )
322
+ if err != nil {
323
+ return "" , err
324
+ }
325
+ pod , _ , err := kcmdutil .GetFirstPod (kc .Core (), job .Namespace , selector .String (), timeout , sortBy )
326
+ if err != nil {
327
+ return "" , err
328
+ }
329
+ return pod .Name , nil
330
+ }
0 commit comments