Skip to content

Commit 2d3c4fb

Browse files
committed
Update set
1 parent 0c59375 commit 2d3c4fb

23 files changed

+1266
-1291
lines changed

pkg/oc/cli/cmd/helper.go

+13
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package cmd
22

33
import (
4+
"fmt"
45
"strings"
56

67
"github.com/golang/glog"
78
"github.com/spf13/cobra"
9+
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
810
)
911

1012
// parseNamespaceResourceName parses the value and returns namespace, resource and the
@@ -35,3 +37,14 @@ func getFlagStringArray(cmd *cobra.Command, flag string) []string {
3537
}
3638
return s
3739
}
40+
41+
func GetObjectName(info *resource.Info) string {
42+
if info.Mapping != nil {
43+
return fmt.Sprintf("%s/%s", info.Mapping.Resource.Resource, info.Name)
44+
}
45+
gvk := info.Object.GetObjectKind().GroupVersionKind()
46+
if len(gvk.Group) == 0 {
47+
return fmt.Sprintf("%s/%s", strings.ToLower(gvk.Kind), info.Name)
48+
}
49+
return fmt.Sprintf("%s.%s/%s\n", strings.ToLower(gvk.Kind), gvk.Group, info.Name)
50+
}

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

+96-108
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,22 @@ package set
22

33
import (
44
"fmt"
5-
"io"
6-
"os"
75

6+
"github.com/golang/glog"
87
"github.com/spf13/cobra"
8+
99
"k8s.io/apimachinery/pkg/api/meta"
10-
"k8s.io/apimachinery/pkg/runtime"
1110
"k8s.io/apimachinery/pkg/types"
11+
utilerrors "k8s.io/apimachinery/pkg/util/errors"
1212
"k8s.io/client-go/dynamic"
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/printers"
1617
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
1718

18-
buildapi "github.com/openshift/origin/pkg/build/apis/build"
19-
"github.com/openshift/origin/pkg/oc/cli/util/clientcmd"
19+
buildv1 "github.com/openshift/api/build/v1"
20+
"github.com/openshift/origin/pkg/oc/cli/cmd"
2021
"github.com/openshift/origin/pkg/oc/util/ocscheme"
2122
)
2223

@@ -52,126 +53,98 @@ var (
5253
)
5354

5455
type BuildHookOptions struct {
55-
Out io.Writer
56-
Err io.Writer
57-
58-
Builder *resource.Builder
59-
Infos []*resource.Info
60-
61-
Encoder runtime.Encoder
62-
63-
Filenames []string
64-
Selector string
65-
All bool
66-
Output string
67-
68-
Cmd *cobra.Command
69-
70-
Local bool
71-
ShortOutput bool
72-
Mapper meta.RESTMapper
73-
Client dynamic.Interface
74-
75-
PrintObject func([]*resource.Info) error
56+
PrintFlags *genericclioptions.PrintFlags
7657

58+
Selector string
59+
All bool
60+
Local bool
7761
Script string
7862
Entrypoint bool
7963
Remove bool
8064
PostCommit bool
8165

82-
Command []string
66+
Mapper meta.RESTMapper
67+
Client dynamic.Interface
68+
Printer printers.ResourcePrinter
69+
Builder func() *resource.Builder
70+
Namespace string
71+
ExplicitNamespace bool
72+
Command []string
73+
Resources []string
74+
DryRun bool
75+
76+
resource.FilenameOptions
77+
genericclioptions.IOStreams
78+
}
79+
80+
func NewBuildHookOptions(streams genericclioptions.IOStreams) *BuildHookOptions {
81+
return &BuildHookOptions{
82+
PrintFlags: genericclioptions.NewPrintFlags("hooks updated").WithTypeSetter(ocscheme.PrintingInternalScheme),
83+
IOStreams: streams,
84+
}
8385
}
8486

8587
// NewCmdBuildHook implements the set build-hook command
8688
func NewCmdBuildHook(fullName string, f kcmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
87-
options := &BuildHookOptions{
88-
Out: streams.Out,
89-
Err: streams.ErrOut,
90-
}
89+
o := NewBuildHookOptions(streams)
9190
cmd := &cobra.Command{
9291
Use: "build-hook BUILDCONFIG --post-commit [--command] [--script] -- CMD",
9392
Short: "Update a build hook on a build config",
9493
Long: buildHookLong,
9594
Example: fmt.Sprintf(buildHookExample, fullName),
9695
Run: func(cmd *cobra.Command, args []string) {
97-
kcmdutil.CheckErr(options.Complete(f, cmd, args))
98-
kcmdutil.CheckErr(options.Validate())
99-
if err := options.Run(); err != nil {
100-
// TODO: move me to kcmdutil
101-
if err == kcmdutil.ErrExit {
102-
os.Exit(1)
103-
}
104-
kcmdutil.CheckErr(err)
105-
}
96+
kcmdutil.CheckErr(o.Complete(f, cmd, args))
97+
kcmdutil.CheckErr(o.Validate())
98+
kcmdutil.CheckErr(o.Run())
10699
},
107100
}
108-
109-
kcmdutil.AddPrinterFlags(cmd)
110-
cmd.Flags().StringVarP(&options.Selector, "selector", "l", options.Selector, "Selector (label query) to filter build configs")
111-
cmd.Flags().BoolVar(&options.All, "all", options.All, "If true, select all build configs in the namespace")
112-
cmd.Flags().StringSliceVarP(&options.Filenames, "filename", "f", options.Filenames, "Filename, directory, or URL to file to use to edit the resource.")
113-
114-
cmd.Flags().BoolVar(&options.PostCommit, "post-commit", options.PostCommit, "If true, set the post-commit build hook on a build config")
115-
cmd.Flags().BoolVar(&options.Entrypoint, "command", options.Entrypoint, "If true, set the entrypoint of the hook container to the given command")
116-
cmd.Flags().StringVar(&options.Script, "script", options.Script, "Specify a script to run for the build-hook")
117-
cmd.Flags().BoolVar(&options.Remove, "remove", options.Remove, "If true, remove the build hook.")
118-
cmd.Flags().BoolVar(&options.Local, "local", false, "If true, set image will NOT contact api-server but run locally.")
119-
120-
cmd.MarkFlagFilename("filename", "yaml", "yml", "json")
101+
usage := "to use to edit the resource"
102+
kcmdutil.AddFilenameOptionFlags(cmd, &o.FilenameOptions, usage)
103+
cmd.Flags().StringVarP(&o.Selector, "selector", "l", o.Selector, "Selector (label query) to filter build configs")
104+
cmd.Flags().BoolVar(&o.All, "all", o.All, "If true, select all build configs in the namespace")
105+
cmd.Flags().BoolVar(&o.PostCommit, "post-commit", o.PostCommit, "If true, set the post-commit build hook on a build config")
106+
cmd.Flags().BoolVar(&o.Entrypoint, "command", o.Entrypoint, "If true, set the entrypoint of the hook container to the given command")
107+
cmd.Flags().StringVar(&o.Script, "script", o.Script, "Specify a script to run for the build-hook")
108+
cmd.Flags().BoolVar(&o.Remove, "remove", o.Remove, "If true, remove the build hook.")
109+
cmd.Flags().BoolVar(&o.Local, "local", o.Local, "If true, set image will NOT contact api-server but run locally.")
110+
111+
o.PrintFlags.AddFlags(cmd)
121112
kcmdutil.AddDryRunFlag(cmd)
122113

123114
return cmd
124115
}
125116

126117
func (o *BuildHookOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []string) error {
127-
resources := args
118+
o.Resources = args
128119
if i := cmd.ArgsLenAtDash(); i != -1 {
129-
resources = args[:i]
120+
o.Resources = args[:i]
130121
o.Command = args[i:]
131122
}
132123
if len(o.Filenames) == 0 && len(args) < 1 {
133124
return kcmdutil.UsageErrorf(cmd, "one or more build configs must be specified as <name> or <resource>/<name>")
134125
}
135126

136-
cmdNamespace, explicit, err := f.ToRawKubeConfigLoader().Namespace()
127+
var err error
128+
o.Namespace, o.ExplicitNamespace, err = f.ToRawKubeConfigLoader().Namespace()
137129
if err != nil {
138130
return err
139131
}
140132

141-
o.Cmd = cmd
142-
143-
mapper, err := f.ToRESTMapper()
133+
o.Mapper, err = f.ToRESTMapper()
144134
if err != nil {
145135
return err
146136
}
147-
o.Builder = f.NewBuilder().
148-
WithScheme(ocscheme.ReadingInternalScheme).
149-
LocalParam(o.Local).
150-
ContinueOnError().
151-
NamespaceParam(cmdNamespace).DefaultNamespace().
152-
FilenameParam(explicit, &resource.FilenameOptions{Recursive: false, Filenames: o.Filenames}).
153-
LabelSelectorParam(o.Selector).
154-
ResourceNames("buildconfigs", resources...).
155-
Flatten()
137+
o.Builder = f.NewBuilder
156138

157-
if !o.Local {
158-
o.Builder = o.Builder.
159-
LabelSelectorParam(o.Selector).
160-
ResourceNames("buildconfigs", resources...)
161-
if o.All {
162-
o.Builder.ResourceTypes("buildconfigs").SelectAllParam(o.All)
163-
}
139+
o.DryRun = kcmdutil.GetDryRunFlag(cmd)
140+
if o.DryRun {
141+
o.PrintFlags.Complete("%s (dry run)")
164142
}
165-
166-
o.Output = kcmdutil.GetFlagString(cmd, "output")
167-
o.PrintObject = func(infos []*resource.Info) error {
168-
return clientcmd.PrintResourceInfos(cmd, infos, o.Out)
143+
o.Printer, err = o.PrintFlags.ToPrinter()
144+
if err != nil {
145+
return err
169146
}
170147

171-
o.Encoder = kcmdutil.InternalVersionJSONEncoder()
172-
o.ShortOutput = kcmdutil.GetFlagString(cmd, "output") == "name"
173-
o.Mapper = mapper
174-
175148
clientConfig, err := f.ToRESTConfig()
176149
if err != nil {
177150
return err
@@ -185,7 +158,6 @@ func (o *BuildHookOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args
185158
}
186159

187160
func (o *BuildHookOptions) Validate() error {
188-
189161
if !o.PostCommit {
190162
return fmt.Errorf("you must specify a type of hook to set")
191163
}
@@ -212,18 +184,32 @@ func (o *BuildHookOptions) Validate() error {
212184
}
213185

214186
func (o *BuildHookOptions) Run() error {
215-
infos := o.Infos
216-
singleItemImplied := len(o.Infos) <= 1
217-
if o.Builder != nil {
218-
loaded, err := o.Builder.Do().IntoSingleItemImplied(&singleItemImplied).Infos()
219-
if err != nil {
220-
return err
187+
b := o.Builder().
188+
WithScheme(ocscheme.ReadingInternalScheme, ocscheme.ReadingInternalScheme.PrioritizedVersionsAllGroups()...).
189+
LocalParam(o.Local).
190+
ContinueOnError().
191+
NamespaceParam(o.Namespace).DefaultNamespace().
192+
FilenameParam(o.ExplicitNamespace, &o.FilenameOptions).
193+
Flatten()
194+
195+
if !o.Local {
196+
b = b.
197+
LabelSelectorParam(o.Selector).
198+
ResourceNames("buildconfigs", o.Resources...).
199+
Latest()
200+
if o.All {
201+
b = b.ResourceTypes("buildconfigs").SelectAllParam(o.All)
221202
}
222-
infos = loaded
223203
}
224204

225-
patches := CalculatePatches(infos, o.Encoder, func(info *resource.Info) (bool, error) {
226-
bc, ok := info.Object.(*buildapi.BuildConfig)
205+
singleItemImplied := false
206+
infos, err := b.Do().IntoSingleItemImplied(&singleItemImplied).Infos()
207+
if err != nil {
208+
return err
209+
}
210+
211+
patches := CalculatePatchesExternal(infos, func(info *resource.Info) (bool, error) {
212+
bc, ok := info.Object.(*buildv1.BuildConfig)
227213
if !ok {
228214
return false, nil
229215
}
@@ -235,39 +221,41 @@ func (o *BuildHookOptions) Run() error {
235221
return fmt.Errorf("%s/%s is not a build config", infos[0].Mapping.Resource, infos[0].Name)
236222
}
237223

238-
if len(o.Output) > 0 || o.Local || kcmdutil.GetDryRunFlag(o.Cmd) {
239-
return o.PrintObject(infos)
240-
}
241-
242-
failed := false
224+
allErrs := []error{}
243225
for _, patch := range patches {
244226
info := patch.Info
227+
name := cmd.GetObjectName(info)
245228
if patch.Err != nil {
246-
fmt.Fprintf(o.Err, "error: %s/%s %v\n", info.Mapping.Resource, info.Name, patch.Err)
229+
allErrs = append(allErrs, fmt.Errorf("error: %s %v\n", name, patch.Err))
247230
continue
248231
}
249232

250233
if string(patch.Patch) == "{}" || len(patch.Patch) == 0 {
251-
fmt.Fprintf(o.Err, "info: %s %q was not changed\n", info.Mapping.Resource, info.Name)
234+
glog.V(1).Infof("info: %s was not changed\n", name)
235+
continue
236+
}
237+
238+
if o.Local || o.DryRun {
239+
if err := o.Printer.PrintObj(info.Object, o.Out); err != nil {
240+
allErrs = append(allErrs, err)
241+
}
252242
continue
253243
}
254244

255245
actual, err := o.Client.Resource(info.Mapping.Resource).Namespace(info.Namespace).Patch(info.Name, types.StrategicMergePatchType, patch.Patch)
256246
if err != nil {
257-
fmt.Fprintf(o.Err, "error: %v\n", err)
258-
failed = true
247+
allErrs = append(allErrs, fmt.Errorf("failed to patch build hook: %v\n", err))
259248
continue
260249
}
261250

262-
kcmdutil.PrintSuccess(o.ShortOutput, o.Out, actual, false, "updated")
263-
}
264-
if failed {
265-
return kcmdutil.ErrExit
251+
if err := o.Printer.PrintObj(actual, o.Out); err != nil {
252+
allErrs = append(allErrs, err)
253+
}
266254
}
267-
return nil
255+
return utilerrors.NewAggregate(allErrs)
268256
}
269257

270-
func (o *BuildHookOptions) updateBuildConfig(bc *buildapi.BuildConfig) {
258+
func (o *BuildHookOptions) updateBuildConfig(bc *buildv1.BuildConfig) {
271259
if o.Remove {
272260
bc.Spec.PostCommit.Args = nil
273261
bc.Spec.PostCommit.Command = nil

0 commit comments

Comments
 (0)