Skip to content

Commit 833a6c3

Browse files
authored
Merge pull request #17225 from justinsb/automated-cherry-pick-of-#17154-release-1.31
Automated cherry pick of #17154: chore: refactor factory to accept a cluster
2 parents e1cb7e2 + 31df135 commit 833a6c3

19 files changed

+362
-182
lines changed

channels/cmd/channels/main.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,29 @@ limitations under the License.
1717
package main
1818

1919
import (
20+
"context"
2021
"fmt"
2122
"os"
2223

2324
"k8s.io/klog/v2"
25+
2426
"k8s.io/kops/channels/pkg/cmd"
25-
"k8s.io/kops/cmd/kops/util"
2627
)
2728

2829
func main() {
29-
klog.InitFlags(nil)
30-
31-
f := util.NewFactory(nil)
32-
if err := cmd.Execute(f, os.Stdout); err != nil {
30+
if err := run(context.Background()); err != nil {
3331
fmt.Fprintf(os.Stderr, "\n%v\n", err)
3432
os.Exit(1)
3533
}
3634
}
35+
36+
func run(ctx context.Context) error {
37+
klog.InitFlags(nil)
38+
39+
f := cmd.NewChannelsFactory()
40+
41+
if err := cmd.Execute(ctx, f, os.Stdout); err != nil {
42+
return err
43+
}
44+
return nil
45+
}

channels/pkg/cmd/apply.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"github.com/spf13/cobra"
2323
)
2424

25-
func NewCmdApply(f Factory, out io.Writer) *cobra.Command {
25+
func NewCmdApply(f *ChannelsFactory, out io.Writer) *cobra.Command {
2626
cmd := &cobra.Command{
2727
Use: "apply",
2828
Short: "apply resources from a channel",

channels/pkg/cmd/apply_channel.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,27 @@ import (
2525

2626
"github.com/blang/semver/v4"
2727
"github.com/cert-manager/cert-manager/pkg/client/clientset/versioned"
28+
certmanager "github.com/cert-manager/cert-manager/pkg/client/clientset/versioned"
2829
"github.com/spf13/cobra"
2930
"go.uber.org/multierr"
3031
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32+
"k8s.io/cli-runtime/pkg/genericclioptions"
3133
"k8s.io/client-go/dynamic"
3234
"k8s.io/client-go/kubernetes"
3335
"k8s.io/client-go/restmapper"
36+
3437
"k8s.io/kops/channels/pkg/channels"
3538
"k8s.io/kops/util/pkg/tables"
3639
"k8s.io/kops/util/pkg/vfs"
3740
)
3841

3942
type ApplyChannelOptions struct {
4043
Yes bool
44+
45+
configFlags genericclioptions.ConfigFlags
4146
}
4247

43-
func NewCmdApplyChannel(f Factory, out io.Writer) *cobra.Command {
48+
func NewCmdApplyChannel(f *ChannelsFactory, out io.Writer) *cobra.Command {
4449
var options ApplyChannelOptions
4550

4651
cmd := &cobra.Command{
@@ -57,20 +62,29 @@ func NewCmdApplyChannel(f Factory, out io.Writer) *cobra.Command {
5762
return cmd
5863
}
5964

60-
func RunApplyChannel(ctx context.Context, f Factory, out io.Writer, options *ApplyChannelOptions, args []string) error {
61-
k8sClient, err := f.KubernetesClient()
65+
func RunApplyChannel(ctx context.Context, f *ChannelsFactory, out io.Writer, options *ApplyChannelOptions, args []string) error {
66+
restConfig, err := f.RESTConfig()
6267
if err != nil {
6368
return err
6469
}
65-
66-
cmClient, err := f.CertManagerClient()
70+
httpClient, err := f.HTTPClient()
6771
if err != nil {
6872
return err
6973
}
7074

75+
k8sClient, err := kubernetes.NewForConfigAndClient(restConfig, httpClient)
76+
if err != nil {
77+
return fmt.Errorf("building kube client: %w", err)
78+
}
79+
80+
cmClient, err := certmanager.NewForConfigAndClient(restConfig, httpClient)
81+
if err != nil {
82+
return fmt.Errorf("building cert manager client: %w", err)
83+
}
84+
7185
dynamicClient, err := f.DynamicClient()
7286
if err != nil {
73-
return err
87+
return fmt.Errorf("building dynamic client: %w", err)
7488
}
7589

7690
restMapper, err := f.RESTMapper()
@@ -92,7 +106,7 @@ func RunApplyChannel(ctx context.Context, f Factory, out io.Writer, options *App
92106
kubernetesVersion.Pre = nil
93107

94108
if len(args) != 1 {
95-
return fmt.Errorf("unexpected number of arguments. Only one channel may be processed at the same time.")
109+
return fmt.Errorf("unexpected number of arguments. Only one channel may be processed at the same time")
96110
}
97111

98112
channelLocation := args[0]

channels/pkg/cmd/factory.go

Lines changed: 90 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,101 @@ limitations under the License.
1717
package cmd
1818

1919
import (
20+
"fmt"
21+
"net/http"
22+
23+
"k8s.io/cli-runtime/pkg/genericclioptions"
2024
"k8s.io/client-go/dynamic"
21-
"k8s.io/client-go/kubernetes"
25+
"k8s.io/client-go/rest"
2226
"k8s.io/client-go/restmapper"
2327
"k8s.io/kops/util/pkg/vfs"
2428

2529
_ "k8s.io/client-go/plugin/pkg/client/auth"
26-
27-
certmanager "github.com/cert-manager/cert-manager/pkg/client/clientset/versioned"
2830
)
2931

30-
type Factory interface {
31-
VFSContext() *vfs.VFSContext
32-
KubernetesClient() (kubernetes.Interface, error)
33-
CertManagerClient() (certmanager.Interface, error)
34-
RESTMapper() (*restmapper.DeferredDiscoveryRESTMapper, error)
35-
DynamicClient() (dynamic.Interface, error)
32+
type ChannelsFactory struct {
33+
configFlags genericclioptions.ConfigFlags
34+
cachedRESTConfig *rest.Config
35+
cachedHTTPClient *http.Client
36+
vfsContext *vfs.VFSContext
37+
restMapper *restmapper.DeferredDiscoveryRESTMapper
38+
dynamicClient dynamic.Interface
39+
}
40+
41+
func NewChannelsFactory() *ChannelsFactory {
42+
return &ChannelsFactory{}
43+
}
44+
45+
func (f *ChannelsFactory) RESTConfig() (*rest.Config, error) {
46+
if f.cachedRESTConfig == nil {
47+
clientGetter := genericclioptions.NewConfigFlags(true)
48+
49+
restConfig, err := clientGetter.ToRESTConfig()
50+
if err != nil {
51+
return nil, fmt.Errorf("cannot load kubecfg settings: %w", err)
52+
}
53+
54+
restConfig.UserAgent = "kops"
55+
restConfig.Burst = 50
56+
restConfig.QPS = 20
57+
f.cachedRESTConfig = restConfig
58+
}
59+
return f.cachedRESTConfig, nil
60+
}
61+
62+
func (f *ChannelsFactory) HTTPClient() (*http.Client, error) {
63+
if f.cachedHTTPClient == nil {
64+
restConfig, err := f.RESTConfig()
65+
if err != nil {
66+
return nil, err
67+
}
68+
httpClient, err := rest.HTTPClientFor(restConfig)
69+
if err != nil {
70+
return nil, fmt.Errorf("getting http client: %w", err)
71+
}
72+
f.cachedHTTPClient = httpClient
73+
}
74+
return f.cachedHTTPClient, nil
75+
}
76+
77+
func (f *ChannelsFactory) RESTMapper() (*restmapper.DeferredDiscoveryRESTMapper, error) {
78+
if f.restMapper == nil {
79+
discoveryClient, err := f.configFlags.ToDiscoveryClient()
80+
if err != nil {
81+
return nil, err
82+
}
83+
84+
restMapper := restmapper.NewDeferredDiscoveryRESTMapper(discoveryClient)
85+
86+
f.restMapper = restMapper
87+
}
88+
89+
return f.restMapper, nil
90+
}
91+
92+
func (f *ChannelsFactory) DynamicClient() (dynamic.Interface, error) {
93+
if f.dynamicClient == nil {
94+
restConfig, err := f.RESTConfig()
95+
if err != nil {
96+
return nil, err
97+
}
98+
httpClient, err := f.HTTPClient()
99+
if err != nil {
100+
return nil, err
101+
}
102+
dynamicClient, err := dynamic.NewForConfigAndClient(restConfig, httpClient)
103+
if err != nil {
104+
return nil, err
105+
}
106+
f.dynamicClient = dynamicClient
107+
}
108+
return f.dynamicClient, nil
109+
}
110+
111+
func (f *ChannelsFactory) VFSContext() *vfs.VFSContext {
112+
if f.vfsContext == nil {
113+
// TODO vfs.NewVFSContext()
114+
f.vfsContext = vfs.Context
115+
}
116+
return f.vfsContext
36117
}

channels/pkg/cmd/get.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"github.com/spf13/cobra"
2323
)
2424

25-
func NewCmdGet(f Factory, out io.Writer) *cobra.Command {
25+
func NewCmdGet(f *ChannelsFactory, out io.Writer) *cobra.Command {
2626
cmd := &cobra.Command{
2727
Use: "get",
2828
SuggestFor: []string{"list"},

channels/pkg/cmd/get_addons.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,14 @@ import (
4141
"github.com/spf13/cobra"
4242
v1 "k8s.io/api/core/v1"
4343
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
44+
"k8s.io/client-go/kubernetes"
4445
"k8s.io/kops/channels/pkg/channels"
4546
"k8s.io/kops/util/pkg/tables"
4647
)
4748

4849
type GetAddonsOptions struct{}
4950

50-
func NewCmdGetAddons(f Factory, out io.Writer) *cobra.Command {
51+
func NewCmdGetAddons(f *ChannelsFactory, out io.Writer) *cobra.Command {
5152
var options GetAddonsOptions
5253

5354
cmd := &cobra.Command{
@@ -70,11 +71,20 @@ type addonInfo struct {
7071
Namespace *v1.Namespace
7172
}
7273

73-
func RunGetAddons(ctx context.Context, f Factory, out io.Writer, options *GetAddonsOptions) error {
74-
k8sClient, err := f.KubernetesClient()
74+
func RunGetAddons(ctx context.Context, f *ChannelsFactory, out io.Writer, options *GetAddonsOptions) error {
75+
restConfig, err := f.RESTConfig()
7576
if err != nil {
7677
return err
7778
}
79+
httpClient, err := f.HTTPClient()
80+
if err != nil {
81+
return err
82+
}
83+
84+
k8sClient, err := kubernetes.NewForConfigAndClient(restConfig, httpClient)
85+
if err != nil {
86+
return fmt.Errorf("building kube client: %w", err)
87+
}
7888

7989
namespaces, err := k8sClient.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
8090
if err != nil {

channels/pkg/cmd/root.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package cmd
1818

1919
import (
20+
"context"
2021
goflag "flag"
2122
"fmt"
2223
"io"
@@ -29,17 +30,17 @@ type CmdRootOptions struct {
2930
configFile string
3031
}
3132

32-
func Execute(f Factory, out io.Writer) error {
33+
func Execute(ctx context.Context, f *ChannelsFactory, out io.Writer) error {
3334
cobra.OnInitialize(initConfig)
3435

3536
cmd := NewCmdRoot(f, out)
3637

3738
goflag.Set("logtostderr", "true")
3839
goflag.CommandLine.Parse([]string{})
39-
return cmd.Execute()
40+
return cmd.ExecuteContext(ctx)
4041
}
4142

42-
func NewCmdRoot(f Factory, out io.Writer) *cobra.Command {
43+
func NewCmdRoot(f *ChannelsFactory, out io.Writer) *cobra.Command {
4344
options := &CmdRootOptions{}
4445

4546
cmd := &cobra.Command{

0 commit comments

Comments
 (0)