Skip to content

Commit b27cda5

Browse files
committed
move extraneous factory methods to point of use
1 parent 8a37659 commit b27cda5

File tree

4 files changed

+198
-193
lines changed

4 files changed

+198
-193
lines changed

pkg/oc/cli/cmd/extract.go

+19-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"k8s.io/apimachinery/pkg/runtime"
1414
"k8s.io/apimachinery/pkg/util/sets"
15+
kapi "k8s.io/kubernetes/pkg/apis/core"
1516
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
1617
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
1718
"k8s.io/kubernetes/pkg/kubectl/resource"
@@ -89,7 +90,7 @@ func NewCmdExtract(fullName string, f kcmdutil.Factory, in io.Reader, out, errOu
8990
}
9091

9192
func (o *ExtractOptions) Complete(f kcmdutil.Factory, in io.Reader, out io.Writer, cmd *cobra.Command, args []string) error {
92-
o.ExtractFileContentsFn = f.ExtractFileContents
93+
o.ExtractFileContentsFn = extractFileContents
9394

9495
cmdNamespace, explicit, err := f.DefaultNamespace()
9596
if err != nil {
@@ -194,3 +195,20 @@ func writeToDisk(path string, data []byte, overwrite bool, out io.Writer) error
194195
fmt.Fprintf(out, "%s\n", path)
195196
return nil
196197
}
198+
199+
// ExtractFileContents returns a map of keys to contents, false if the object cannot support such an
200+
// operation, or an error.
201+
func extractFileContents(obj runtime.Object) (map[string][]byte, bool, error) {
202+
switch t := obj.(type) {
203+
case *kapi.Secret:
204+
return t.Data, true, nil
205+
case *kapi.ConfigMap:
206+
out := make(map[string][]byte)
207+
for k, v := range t.Data {
208+
out[k] = []byte(v)
209+
}
210+
return out, true, nil
211+
default:
212+
return nil, false, nil
213+
}
214+
}

pkg/oc/cli/cmd/rsh.go

+157-1
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,28 @@ package cmd
33
import (
44
"fmt"
55
"io"
6+
"sort"
67
"time"
78

89
"github.com/spf13/cobra"
910

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"
1020
kubecmd "k8s.io/kubernetes/pkg/kubectl/cmd"
1121
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
1222
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
1323
"k8s.io/kubernetes/pkg/kubectl/util/term"
1424

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"
1528
"github.com/openshift/origin/pkg/cmd/util"
1629
)
1730

@@ -145,7 +158,7 @@ func (o *RshOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []str
145158
}
146159
o.PodClient = client.Core()
147160

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)
149162

150163
fullCmdName := ""
151164
cmdParent := cmd.Parent()
@@ -172,3 +185,146 @@ func (o *RshOptions) Run() error {
172185
}
173186
return o.ExecOptions.Run()
174187
}
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+
}

pkg/oc/cli/cmd/set/env.go

+22-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
2222
"k8s.io/kubernetes/pkg/kubectl/resource"
2323

24+
buildapi "github.com/openshift/origin/pkg/build/apis/build"
2425
cmdutil "github.com/openshift/origin/pkg/cmd/util"
2526
"github.com/openshift/origin/pkg/oc/cli/util/clientcmd"
2627
utilenv "github.com/openshift/origin/pkg/oc/util/env"
@@ -406,7 +407,7 @@ func (o *EnvOptions) RunEnv(f kcmdutil.Factory) error {
406407
}))
407408
if !ok {
408409
// This is a fallback function for objects that don't have pod spec.
409-
ok, err = f.UpdateObjectEnvironment(info.Object, func(vars *[]kapi.EnvVar) error {
410+
ok, err = updateObjectEnvironment(info.Object, func(vars *[]kapi.EnvVar) error {
410411
if vars == nil {
411412
return fmt.Errorf("no environment variables provided")
412413
}
@@ -495,3 +496,23 @@ updates:
495496
}
496497
return nil
497498
}
499+
500+
// UpdateObjectEnvironment update the environment variables in object specification.
501+
func updateObjectEnvironment(obj runtime.Object, fn func(*[]kapi.EnvVar) error) (bool, error) {
502+
switch t := obj.(type) {
503+
case *buildapi.BuildConfig:
504+
if t.Spec.Strategy.CustomStrategy != nil {
505+
return true, fn(&t.Spec.Strategy.CustomStrategy.Env)
506+
}
507+
if t.Spec.Strategy.SourceStrategy != nil {
508+
return true, fn(&t.Spec.Strategy.SourceStrategy.Env)
509+
}
510+
if t.Spec.Strategy.DockerStrategy != nil {
511+
return true, fn(&t.Spec.Strategy.DockerStrategy.Env)
512+
}
513+
if t.Spec.Strategy.JenkinsPipelineStrategy != nil {
514+
return true, fn(&t.Spec.Strategy.JenkinsPipelineStrategy.Env)
515+
}
516+
}
517+
return false, fmt.Errorf("object does not contain any environment variables")
518+
}

0 commit comments

Comments
 (0)