Skip to content

Commit 70c7679

Browse files
committed
switch logs to externals
1 parent 3f9f93f commit 70c7679

File tree

3 files changed

+159
-79
lines changed

3 files changed

+159
-79
lines changed

pkg/oc/cli/logs/logs.go

Lines changed: 56 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,13 @@ import (
1313
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
1414
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
1515
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
16+
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
1617
"k8s.io/kubernetes/pkg/kubectl/scheme"
1718

18-
"github.com/openshift/api/apps"
19-
"github.com/openshift/api/build"
20-
appsapi "github.com/openshift/origin/pkg/apps/apis/apps"
19+
appsv1 "github.com/openshift/api/apps/v1"
20+
buildapiv1 "github.com/openshift/api/build/v1"
21+
buildv1client "github.com/openshift/client-go/build/clientset/versioned/typed/build/v1"
2122
buildapi "github.com/openshift/origin/pkg/build/apis/build"
22-
buildclientinternal "github.com/openshift/origin/pkg/build/generated/internalclientset"
23-
buildclient "github.com/openshift/origin/pkg/build/generated/internalclientset/typed/build/internalversion"
2423
buildutil "github.com/openshift/origin/pkg/build/util"
2524
)
2625

@@ -68,11 +67,15 @@ type LogsOptions struct {
6867
KubeLogOptions *kcmd.LogsOptions
6968
// Client enables access to the Build object when processing
7069
// build logs for Jenkins Pipeline Strategy builds
71-
Client buildclient.BuildsGetter
70+
Client buildv1client.BuildV1Interface
7271
// Namespace is a required parameter when accessing the Build object when processing
7372
// build logs for Jenkins Pipeline Strategy builds
7473
Namespace string
75-
Version int64
74+
75+
Builder func() *resource.Builder
76+
Resources []string
77+
78+
Version int64
7679

7780
genericclioptions.IOStreams
7881
}
@@ -105,9 +108,9 @@ func NewCmdLogs(name, baseName string, f kcmdutil.Factory, streams genericcliopt
105108
return cmd
106109
}
107110

108-
func isPipelineBuild(obj runtime.Object) (bool, *buildapi.BuildConfig, bool, *buildapi.Build, bool) {
109-
bc, isBC := obj.(*buildapi.BuildConfig)
110-
build, isBld := obj.(*buildapi.Build)
111+
func isPipelineBuild(obj runtime.Object) (bool, *buildapiv1.BuildConfig, bool, *buildapiv1.Build, bool) {
112+
bc, isBC := obj.(*buildapiv1.BuildConfig)
113+
build, isBld := obj.(*buildapiv1.Build)
111114
isPipeline := false
112115
switch {
113116
case isBC:
@@ -135,17 +138,49 @@ func (o *LogsOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []st
135138
if err != nil {
136139
return err
137140
}
138-
client, err := buildclientinternal.NewForConfig(clientConfig)
141+
o.Client, err = buildv1client.NewForConfig(clientConfig)
139142
if err != nil {
140143
return err
141144
}
142-
o.Client = client.Build()
143145

146+
o.Builder = f.NewBuilder
147+
o.Resources = args
148+
149+
return nil
150+
}
151+
152+
// Validate runs the upstream validation for the logs command and then it
153+
// will validate any OpenShift-specific log options.
154+
func (o *LogsOptions) Validate() error {
155+
if err := o.KubeLogOptions.Validate(); err != nil {
156+
return err
157+
}
158+
if o.Options == nil {
159+
return nil
160+
}
161+
switch t := o.Options.(type) {
162+
case *buildapiv1.BuildLogOptions:
163+
if t.Previous && t.Version != nil {
164+
return errors.New("cannot use both --previous and --version")
165+
}
166+
case *appsv1.DeploymentLogOptions:
167+
if t.Previous && t.Version != nil {
168+
return errors.New("cannot use both --previous and --version")
169+
}
170+
default:
171+
return errors.New("invalid log options object provided")
172+
}
173+
return nil
174+
}
175+
176+
// RunLog will run the upstream logs command and may use an OpenShift
177+
// logOptions object.
178+
func (o *LogsOptions) RunLog() error {
144179
podLogOptions := o.KubeLogOptions.Options.(*kapi.PodLogOptions)
145-
infos, err := f.NewBuilder().
180+
infos, err := o.Builder().
146181
WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...).
147182
NamespaceParam(o.Namespace).DefaultNamespace().
148-
ResourceNames("pods", args...).
183+
ResourceNames("pods", o.Resources...).
149184
SingleResourceType().RequireObject(false).
150185
Do().Infos()
151186
if err != nil {
@@ -157,9 +192,9 @@ func (o *LogsOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []st
157192

158193
// TODO: podLogOptions should be included in our own logOptions objects.
159194
switch gr := infos[0].Mapping.Resource.GroupResource(); gr {
160-
case build.Resource("builds"),
161-
build.Resource("buildconfigs"):
162-
bopts := &buildapi.BuildLogOptions{
195+
case buildapiv1.Resource("builds"),
196+
buildapiv1.Resource("buildconfigs"):
197+
bopts := &buildapiv1.BuildLogOptions{
163198
Follow: podLogOptions.Follow,
164199
Previous: podLogOptions.Previous,
165200
SinceSeconds: podLogOptions.SinceSeconds,
@@ -173,8 +208,8 @@ func (o *LogsOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []st
173208
}
174209
o.Options = bopts
175210

176-
case apps.Resource("deploymentconfigs"):
177-
dopts := &appsapi.DeploymentLogOptions{
211+
case appsv1.Resource("deploymentconfigs"):
212+
dopts := &appsv1.DeploymentLogOptions{
178213
Container: podLogOptions.Container,
179214
Follow: podLogOptions.Follow,
180215
Previous: podLogOptions.Previous,
@@ -192,36 +227,10 @@ func (o *LogsOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []st
192227
o.Options = nil
193228
}
194229

195-
return nil
196-
}
197-
198-
// Validate runs the upstream validation for the logs command and then it
199-
// will validate any OpenShift-specific log options.
200-
func (o *LogsOptions) Validate() error {
201-
if err := o.KubeLogOptions.Validate(); err != nil {
202-
return err
203-
}
204-
if o.Options == nil {
205-
return nil
206-
}
207-
switch t := o.Options.(type) {
208-
case *buildapi.BuildLogOptions:
209-
if t.Previous && t.Version != nil {
210-
return errors.New("cannot use both --previous and --version")
211-
}
212-
case *appsapi.DeploymentLogOptions:
213-
if t.Previous && t.Version != nil {
214-
return errors.New("cannot use both --previous and --version")
215-
}
216-
default:
217-
return errors.New("invalid log options object provided")
218-
}
219-
return nil
230+
return o.runLogPipeline()
220231
}
221232

222-
// RunLog will run the upstream logs command and may use an OpenShift
223-
// logOptions object.
224-
func (o *LogsOptions) RunLog() error {
233+
func (o *LogsOptions) runLogPipeline() error {
225234
if o.Options != nil {
226235
// Use our own options object.
227236
o.KubeLogOptions.Options = o.Options

pkg/oc/cli/logs/logs_test.go

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ import (
1212
kcmd "k8s.io/kubernetes/pkg/kubectl/cmd"
1313
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
1414

15+
buildv1 "github.com/openshift/api/build/v1"
16+
buildfake "github.com/openshift/client-go/build/clientset/versioned/fake"
1517
appsapi "github.com/openshift/origin/pkg/apps/apis/apps"
1618
buildapi "github.com/openshift/origin/pkg/build/apis/build"
17-
buildfake "github.com/openshift/origin/pkg/build/generated/internalclientset/fake"
1819
)
1920

2021
// TestLogsFlagParity makes sure that our copied flags don't slip during rebases
@@ -46,16 +47,16 @@ func (f *fakeWriter) Write(p []byte) (n int, err error) {
4647
}
4748

4849
func TestRunLogForPipelineStrategy(t *testing.T) {
49-
bld := buildapi.Build{
50+
bld := buildv1.Build{
5051
ObjectMeta: metav1.ObjectMeta{
5152
Name: "foo-0",
5253
Namespace: "foo",
5354
Annotations: map[string]string{buildapi.BuildJenkinsBlueOceanLogURLAnnotation: "https://foo"},
5455
},
55-
Spec: buildapi.BuildSpec{
56-
CommonSpec: buildapi.CommonSpec{
57-
Strategy: buildapi.BuildStrategy{
58-
JenkinsPipelineStrategy: &buildapi.JenkinsPipelineBuildStrategy{},
56+
Spec: buildv1.BuildSpec{
57+
CommonSpec: buildv1.CommonSpec{
58+
Strategy: buildv1.BuildStrategy{
59+
JenkinsPipelineStrategy: &buildv1.JenkinsPipelineBuildStrategy{},
5960
},
6061
},
6162
},
@@ -71,15 +72,15 @@ func TestRunLogForPipelineStrategy(t *testing.T) {
7172
o: &bld,
7273
},
7374
{
74-
o: &buildapi.BuildConfig{
75+
o: &buildv1.BuildConfig{
7576
ObjectMeta: metav1.ObjectMeta{
7677
Namespace: "foo",
7778
Name: "foo",
7879
},
79-
Spec: buildapi.BuildConfigSpec{
80-
CommonSpec: buildapi.CommonSpec{
81-
Strategy: buildapi.BuildStrategy{
82-
JenkinsPipelineStrategy: &buildapi.JenkinsPipelineBuildStrategy{},
80+
Spec: buildv1.BuildConfigSpec{
81+
CommonSpec: buildv1.CommonSpec{
82+
Strategy: buildv1.BuildStrategy{
83+
JenkinsPipelineStrategy: &buildv1.JenkinsPipelineBuildStrategy{},
8384
},
8485
},
8586
},
@@ -91,12 +92,13 @@ func TestRunLogForPipelineStrategy(t *testing.T) {
9192
o := &LogsOptions{
9293
IOStreams: streams,
9394
KubeLogOptions: &kcmd.LogsOptions{
95+
IOStreams: streams,
9496
Object: tc.o,
9597
Namespace: "foo",
9698
},
9799
Client: fakebc.Build(),
98100
}
99-
if err := o.RunLog(); err != nil {
101+
if err := o.runLogPipeline(); err != nil {
100102
t.Errorf("%#v: RunLog error %v", tc.o, err)
101103
}
102104
if !strings.Contains(out.String(), "https://foo") {
@@ -112,47 +114,47 @@ func TestIsPipelineBuild(t *testing.T) {
112114
isPipeline bool
113115
}{
114116
{
115-
o: &buildapi.Build{
116-
Spec: buildapi.BuildSpec{
117-
CommonSpec: buildapi.CommonSpec{
118-
Strategy: buildapi.BuildStrategy{
119-
JenkinsPipelineStrategy: &buildapi.JenkinsPipelineBuildStrategy{},
117+
o: &buildv1.Build{
118+
Spec: buildv1.BuildSpec{
119+
CommonSpec: buildv1.CommonSpec{
120+
Strategy: buildv1.BuildStrategy{
121+
JenkinsPipelineStrategy: &buildv1.JenkinsPipelineBuildStrategy{},
120122
},
121123
},
122124
},
123125
},
124126
isPipeline: true,
125127
},
126128
{
127-
o: &buildapi.Build{
128-
Spec: buildapi.BuildSpec{
129-
CommonSpec: buildapi.CommonSpec{
130-
Strategy: buildapi.BuildStrategy{
131-
SourceStrategy: &buildapi.SourceBuildStrategy{},
129+
o: &buildv1.Build{
130+
Spec: buildv1.BuildSpec{
131+
CommonSpec: buildv1.CommonSpec{
132+
Strategy: buildv1.BuildStrategy{
133+
SourceStrategy: &buildv1.SourceBuildStrategy{},
132134
},
133135
},
134136
},
135137
},
136138
isPipeline: false,
137139
},
138140
{
139-
o: &buildapi.BuildConfig{
140-
Spec: buildapi.BuildConfigSpec{
141-
CommonSpec: buildapi.CommonSpec{
142-
Strategy: buildapi.BuildStrategy{
143-
JenkinsPipelineStrategy: &buildapi.JenkinsPipelineBuildStrategy{},
141+
o: &buildv1.BuildConfig{
142+
Spec: buildv1.BuildConfigSpec{
143+
CommonSpec: buildv1.CommonSpec{
144+
Strategy: buildv1.BuildStrategy{
145+
JenkinsPipelineStrategy: &buildv1.JenkinsPipelineBuildStrategy{},
144146
},
145147
},
146148
},
147149
},
148150
isPipeline: true,
149151
},
150152
{
151-
o: &buildapi.BuildConfig{
152-
Spec: buildapi.BuildConfigSpec{
153-
CommonSpec: buildapi.CommonSpec{
154-
Strategy: buildapi.BuildStrategy{
155-
DockerStrategy: &buildapi.DockerBuildStrategy{},
153+
o: &buildv1.BuildConfig{
154+
Spec: buildv1.BuildConfigSpec{
155+
CommonSpec: buildv1.CommonSpec{
156+
Strategy: buildv1.BuildStrategy{
157+
DockerStrategy: &buildv1.DockerBuildStrategy{},
156158
},
157159
},
158160
},

pkg/oc/originpolymorphichelpers/logsforobject.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,18 @@ import (
1212
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
1313
"k8s.io/kubernetes/pkg/kubectl/polymorphichelpers"
1414

15+
appsv1 "github.com/openshift/api/apps/v1"
16+
buildv1 "github.com/openshift/api/build/v1"
17+
appsv1client "github.com/openshift/client-go/apps/clientset/versioned/typed/apps/v1"
18+
buildv1client "github.com/openshift/client-go/build/clientset/versioned/typed/build/v1"
1519
appsapi "github.com/openshift/origin/pkg/apps/apis/apps"
1620
appsmanualclient "github.com/openshift/origin/pkg/apps/client/internalversion"
21+
appsmanualclientv1 "github.com/openshift/origin/pkg/apps/client/v1"
1722
appsclientinternal "github.com/openshift/origin/pkg/apps/generated/internalclientset"
1823
buildapi "github.com/openshift/origin/pkg/build/apis/build"
24+
buildapiv1 "github.com/openshift/origin/pkg/build/apis/build/v1"
1925
buildmanualclient "github.com/openshift/origin/pkg/build/client/internalversion"
26+
buildmanualclientv1 "github.com/openshift/origin/pkg/build/client/v1"
2027
buildclientinternal "github.com/openshift/origin/pkg/build/generated/internalclientset"
2128
buildutil "github.com/openshift/origin/pkg/build/util"
2229
ocbuildapihelpers "github.com/openshift/origin/pkg/oc/lib/buildapihelpers"
@@ -40,6 +47,68 @@ func NewLogsForObjectFn(delegate polymorphichelpers.LogsForObjectFunc) polymorph
4047
return nil, err
4148
}
4249
return appsmanualclient.NewRolloutLogClient(appsClient.Apps().RESTClient(), t.Namespace).Logs(t.Name, *dopts), nil
50+
case *appsv1.DeploymentConfig:
51+
dopts, ok := options.(*appsv1.DeploymentLogOptions)
52+
if !ok {
53+
return nil, errors.New("provided options object is not a DeploymentLogOptions")
54+
}
55+
appsClient, err := appsv1client.NewForConfig(clientConfig)
56+
if err != nil {
57+
return nil, err
58+
}
59+
return appsmanualclientv1.NewRolloutLogClient(appsClient.RESTClient(), t.Namespace).Logs(t.Name, *dopts), nil
60+
case *buildv1.Build:
61+
bopts, ok := options.(*buildv1.BuildLogOptions)
62+
if !ok {
63+
return nil, errors.New("provided options object is not a v1.BuildLogOptions")
64+
}
65+
if bopts.Version != nil {
66+
return nil, errors.New("cannot specify a version and a build")
67+
}
68+
buildClient, err := buildv1client.NewForConfig(clientConfig)
69+
if err != nil {
70+
return nil, err
71+
}
72+
return buildmanualclientv1.NewBuildLogClient(buildClient.RESTClient(), t.Namespace).Logs(t.Name, *bopts), nil
73+
case *buildv1.BuildConfig:
74+
bopts, ok := options.(*buildv1.BuildLogOptions)
75+
if !ok {
76+
return nil, errors.New("provided options object is not a v1.BuildLogOptions")
77+
}
78+
if bopts.Version != nil {
79+
return nil, errors.New("cannot specify a version and a build")
80+
}
81+
buildClient, err := buildv1client.NewForConfig(clientConfig)
82+
if err != nil {
83+
return nil, err
84+
}
85+
logClient := buildmanualclientv1.NewBuildLogClient(buildClient.RESTClient(), t.Namespace)
86+
builds, err := buildClient.Builds(t.Namespace).List(metav1.ListOptions{})
87+
if err != nil {
88+
return nil, err
89+
}
90+
91+
// convert to internal in order to filter
92+
internalBuildItems := []buildapi.Build{}
93+
for _, external := range builds.Items {
94+
internal := &buildapi.Build{}
95+
if err := buildapiv1.Convert_v1_Build_To_build_Build(&external, internal, nil); err != nil {
96+
return nil, err
97+
}
98+
internalBuildItems = append(internalBuildItems, *internal)
99+
}
100+
101+
filteredInternalBuildItems := ocbuildapihelpers.FilterBuilds(internalBuildItems, ocbuildapihelpers.ByBuildConfigPredicate(t.Name))
102+
if len(filteredInternalBuildItems) == 0 {
103+
return nil, fmt.Errorf("no builds found for %q", t.Name)
104+
}
105+
if bopts.Version != nil {
106+
// If a version has been specified, try to get the logs from that build.
107+
desired := buildutil.BuildNameForConfigVersion(t.Name, int(*bopts.Version))
108+
return logClient.Logs(desired, *bopts), nil
109+
}
110+
sort.Sort(sort.Reverse(ocbuildapihelpers.BuildSliceByCreationTimestamp(filteredInternalBuildItems)))
111+
return logClient.Logs(filteredInternalBuildItems[0].Name, *bopts), nil
43112
case *buildapi.Build:
44113
bopts, ok := options.(*buildapi.BuildLogOptions)
45114
if !ok {

0 commit comments

Comments
 (0)