Skip to content

Commit 677c93e

Browse files
Merge pull request #14 from itdove/dry_run
Implement --dry-run / --output-file
2 parents d552779 + 4fa0910 commit 677c93e

File tree

21 files changed

+314
-162
lines changed

21 files changed

+314
-162
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ test/unit/coverage
1313
test/unit/tmp
1414
test/functional/tmp
1515
test/out
16+
/bin
1617

1718
# Output of the go coverage tool, specifically when used with LiteIDE
1819
*.out

Makefile

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ deps:
2727
build:
2828
go install ./cmd/clusteradm.go
2929

30+
.PHONY:
31+
build-bin:
32+
@mkdir -p bin
33+
GOOS=darwin GOARCH=amd64 go build -o bin/clusteradm_darwin_amd64 ./cmd/clusteradm.go
34+
GOOS=linux GOARCH=amd64 go build -o bin/clusteradm_linux_amd64 ./cmd/clusteradm.go
35+
GOOS=linux GOARCH=arm64 go build -o bin/clusteradm_linux_arm64 ./cmd/clusteradm.go
36+
GOOS=linux GOARCH=ppc64le go build -o bin/clusteradm_linux_ppc64le ./cmd/clusteradm.go
37+
GOOS=linux GOARCH=s390x go build -o bin/clusteradm_linux_s390x ./cmd/clusteradm.go
38+
GOOS=windows GOARCH=amd64 go build -o bin/clusteradm_windows_amd64.exe ./cmd/clusteradm.go
39+
3040
.PHONY: install
3141
install: build
3242

build/run-functional-tests.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ else
4949
echo "join command result: " $CMDJOINRESULT
5050
fi
5151

52-
echo "Sleep 2 min to stabilize"
52+
echo "Sleep 4 min to stabilize"
5353
# we need to wait 2 min but once we will have watch status monitor
5454
# we will not need to sleep anymore
55-
sleep 120
55+
sleep 240
5656

5757
CMDACCEPT=`echo $CMDJOINRESULT | cut -d ':' -f2`
5858
CMDACCEPT="$CMDACCEPT c1"

cmd/clusteradm.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package main
44

55
import (
6+
"flag"
67
"os"
78

89
"github.com/spf13/cobra"
@@ -19,13 +20,15 @@ import (
1920
acceptclusters "open-cluster-management.io/clusteradm/pkg/cmd/accept"
2021
inithub "open-cluster-management.io/clusteradm/pkg/cmd/init"
2122
joinhub "open-cluster-management.io/clusteradm/pkg/cmd/join"
23+
genericclioptionsclusteradm "open-cluster-management.io/clusteradm/pkg/genericclioptions"
2224
)
2325

2426
func main() {
2527
streams := genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}
2628
configFlags := genericclioptions.NewConfigFlags(true).WithDeprecatedPasswordFlag()
2729
matchVersionKubeConfigFlags := cmdutil.NewMatchVersionFlags(configFlags)
2830
f := cmdutil.NewFactory(matchVersionKubeConfigFlags)
31+
clusteradmFlags := genericclioptionsclusteradm.NewClusteradmFlags(f)
2932

3033
root :=
3134
&cobra.Command{
@@ -41,6 +44,9 @@ func main() {
4144
root.SetGlobalNormalizationFunc(cliflag.WarnWordSepNormalizeFunc)
4245

4346
configFlags.AddFlags(flags)
47+
clusteradmFlags.AddFlags(flags)
48+
flags.AddGoFlagSet(flag.CommandLine)
49+
4450
root.AddCommand(cmdconfig.NewCmdConfig(f, clientcmd.NewDefaultPathOptions(), streams))
4551
root.AddCommand(options.NewCmdOptions(streams.Out))
4652
//enable plugin functionality: all `os.Args[0]-<binary>` in the $PATH will be available for plugin
@@ -51,15 +57,15 @@ func main() {
5157
{
5258
Message: "General commands:",
5359
Commands: []*cobra.Command{
54-
version.NewCmd(f, streams),
60+
version.NewCmd(clusteradmFlags, streams),
5561
},
5662
},
5763
{
5864
Message: "Registration commands:",
5965
Commands: []*cobra.Command{
60-
inithub.NewCmd(f, streams),
61-
joinhub.NewCmd(f, streams),
62-
acceptclusters.NewCmd(f, streams),
66+
inithub.NewCmd(clusteradmFlags, streams),
67+
joinhub.NewCmd(clusteradmFlags, streams),
68+
acceptclusters.NewCmd(clusteradmFlags, streams),
6369
},
6470
},
6571
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ require (
2121
github.com/onsi/gomega v1.10.2 // indirect
2222
github.com/openshift/library-go v0.0.0-20210521084623-7392ea9b02ca
2323
github.com/spf13/cobra v1.1.3
24+
github.com/spf13/pflag v1.0.5
2425
google.golang.org/appengine v1.6.6 // indirect
2526
k8s.io/api v0.21.1
2627
k8s.io/apiextensions-apiserver v0.21.1

pkg/cmd/accept/cmd.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ package accept
44
import (
55
"fmt"
66

7+
genericclioptionsclusteradm "open-cluster-management.io/clusteradm/pkg/genericclioptions"
78
"open-cluster-management.io/clusteradm/pkg/helpers"
89

910
"github.com/spf13/cobra"
1011
"k8s.io/cli-runtime/pkg/genericclioptions"
11-
cmdutil "k8s.io/kubectl/pkg/cmd/util"
1212
)
1313

1414
var example = `
@@ -17,14 +17,17 @@ var example = `
1717
`
1818

1919
// NewCmd ...
20-
func NewCmd(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
21-
o := newOptions(f, streams)
20+
func NewCmd(clusteradmFlags *genericclioptionsclusteradm.ClusteradmFlags, streams genericclioptions.IOStreams) *cobra.Command {
21+
o := newOptions(clusteradmFlags, streams)
2222

2323
cmd := &cobra.Command{
2424
Use: "accept",
2525
Short: "accept a list of clusters",
2626
Example: fmt.Sprintf(example, helpers.GetExampleHeader()),
2727
SilenceUsage: true,
28+
PreRun: func(c *cobra.Command, args []string) {
29+
helpers.DryRunMessage(o.ClusteradmFlags.DryRun)
30+
},
2831
RunE: func(c *cobra.Command, args []string) error {
2932
if err := o.complete(c, args); err != nil {
3033
return err

pkg/cmd/accept/exec.go

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ func (o *Options) validate() error {
4646
}
4747

4848
func (o *Options) run() error {
49-
kubeClient, err := o.factory.KubernetesClientSet()
49+
kubeClient, err := o.ClusteradmFlags.KubectlFactory.KubernetesClientSet()
5050
if err != nil {
5151
return err
5252
}
53-
restConfig, err := o.factory.ToRESTConfig()
53+
restConfig, err := o.ClusteradmFlags.KubectlFactory.ToRESTConfig()
5454
if err != nil {
5555
return err
5656
}
@@ -105,27 +105,28 @@ func (o *Options) runWithClient(kubeClient *kubernetes.Clientset, clusterClient
105105
}
106106

107107
if csr != nil {
108-
if csr.Status.Conditions == nil {
109-
csr.Status.Conditions = make([]certificatesv1.CertificateSigningRequestCondition, 0)
110-
}
111-
112-
csr.Status.Conditions = append(csr.Status.Conditions, certificatesv1.CertificateSigningRequestCondition{
113-
Status: corev1.ConditionTrue,
114-
Type: certificatesv1.CertificateApproved,
115-
Reason: fmt.Sprintf("%sApprove", helpers.GetExampleHeader()),
116-
Message: fmt.Sprintf("This CSR was approved by %s certificate approve.", helpers.GetExampleHeader()),
117-
LastUpdateTime: metav1.Now(),
118-
})
108+
if !o.ClusteradmFlags.DryRun {
109+
if csr.Status.Conditions == nil {
110+
csr.Status.Conditions = make([]certificatesv1.CertificateSigningRequestCondition, 0)
111+
}
119112

120-
kubeClient, err := o.factory.KubernetesClientSet()
121-
if err != nil {
122-
return err
123-
}
124-
signingRequest := kubeClient.CertificatesV1().CertificateSigningRequests()
125-
if _, err := signingRequest.UpdateApproval(context.TODO(), csr.Name, csr, metav1.UpdateOptions{}); err != nil {
126-
return err
113+
csr.Status.Conditions = append(csr.Status.Conditions, certificatesv1.CertificateSigningRequestCondition{
114+
Status: corev1.ConditionTrue,
115+
Type: certificatesv1.CertificateApproved,
116+
Reason: fmt.Sprintf("%sApprove", helpers.GetExampleHeader()),
117+
Message: fmt.Sprintf("This CSR was approved by %s certificate approve.", helpers.GetExampleHeader()),
118+
LastUpdateTime: metav1.Now(),
119+
})
120+
121+
kubeClient, err := o.ClusteradmFlags.KubectlFactory.KubernetesClientSet()
122+
if err != nil {
123+
return err
124+
}
125+
signingRequest := kubeClient.CertificatesV1().CertificateSigningRequests()
126+
if _, err := signingRequest.UpdateApproval(context.TODO(), csr.Name, csr, metav1.UpdateOptions{}); err != nil {
127+
return err
128+
}
127129
}
128-
129130
fmt.Printf("CSR %s approved\n", csr.Name)
130131
} else {
131132
fmt.Printf("no CSR to approve for cluster %s\n", clusterName)
@@ -138,16 +139,17 @@ func (o *Options) runWithClient(kubeClient *kubernetes.Clientset, clusterClient
138139
return err
139140
}
140141
if !mc.Spec.HubAcceptsClient {
141-
mc.Spec.HubAcceptsClient = true
142-
_, err = clusterClient.ClusterV1().ManagedClusters().Update(context.TODO(), mc, metav1.UpdateOptions{})
143-
if err != nil {
144-
return err
142+
if !o.ClusteradmFlags.DryRun {
143+
mc.Spec.HubAcceptsClient = true
144+
_, err = clusterClient.ClusterV1().ManagedClusters().Update(context.TODO(), mc, metav1.UpdateOptions{})
145+
if err != nil {
146+
return err
147+
}
145148
}
146149
fmt.Printf("set httpAcceptsClient to true for cluster %s\n", clusterName)
147150
} else {
148151
fmt.Printf("httpAcceptsClient already set for cluster %s\n", clusterName)
149152
}
150153
}
151154
return nil
152-
153155
}

pkg/cmd/accept/options.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22
package accept
33

44
import (
5-
cmdutil "k8s.io/kubectl/pkg/cmd/util"
6-
75
"k8s.io/cli-runtime/pkg/genericclioptions"
6+
genericclioptionsclusteradm "open-cluster-management.io/clusteradm/pkg/genericclioptions"
87
)
98

109
type Options struct {
11-
//ConfigFlags: The generic options from the kubernetes cli-runtime.
12-
ConfigFlags *genericclioptions.ConfigFlags
13-
factory cmdutil.Factory
10+
//ClusteradmFlags: The generic optiosn from the clusteradm cli-runtime.
11+
ClusteradmFlags *genericclioptionsclusteradm.ClusteradmFlags
1412
//A list of comma separated cluster names
1513
clusters string
1614
values Values
@@ -21,9 +19,8 @@ type Values struct {
2119
clusters []string
2220
}
2321

24-
func newOptions(f cmdutil.Factory, streams genericclioptions.IOStreams) *Options {
22+
func newOptions(clusteradmFlags *genericclioptionsclusteradm.ClusteradmFlags, streams genericclioptions.IOStreams) *Options {
2523
return &Options{
26-
ConfigFlags: genericclioptions.NewConfigFlags(true),
27-
factory: f,
24+
ClusteradmFlags: clusteradmFlags,
2825
}
2926
}

pkg/cmd/init/cmd.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88

99
"github.com/spf13/cobra"
1010
"k8s.io/cli-runtime/pkg/genericclioptions"
11-
cmdutil "k8s.io/kubectl/pkg/cmd/util"
11+
genericclioptionsclusteradm "open-cluster-management.io/clusteradm/pkg/genericclioptions"
1212
)
1313

1414
var example = `
@@ -17,14 +17,17 @@ var example = `
1717
`
1818

1919
// NewCmd ...
20-
func NewCmd(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
21-
o := newOptions(f, streams)
20+
func NewCmd(clusteradmFlags *genericclioptionsclusteradm.ClusteradmFlags, streams genericclioptions.IOStreams) *cobra.Command {
21+
o := newOptions(clusteradmFlags, streams)
2222

2323
cmd := &cobra.Command{
2424
Use: "init",
2525
Short: "init the hub",
2626
Example: fmt.Sprintf(example, helpers.GetExampleHeader()),
2727
SilenceUsage: true,
28+
PreRun: func(c *cobra.Command, args []string) {
29+
helpers.DryRunMessage(o.ClusteradmFlags.DryRun)
30+
},
2831
RunE: func(c *cobra.Command, args []string) error {
2932
if err := o.complete(c, args); err != nil {
3033
return err
@@ -40,5 +43,7 @@ func NewCmd(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Comma
4043
},
4144
}
4245

46+
cmd.Flags().StringVar(&o.outputFile, "output-file", "", "The generated resources will be copied in the specified file")
47+
4348
return cmd
4449
}

pkg/cmd/init/exec.go

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,19 @@ func (o *Options) validate() error {
3232
}
3333

3434
func (o *Options) run() error {
35+
output := make([]string, 0)
3536
reader := scenario.GetScenarioResourcesReader()
3637

37-
kubeClient, err := o.factory.KubernetesClientSet()
38+
kubeClient, err := o.ClusteradmFlags.KubectlFactory.KubernetesClientSet()
3839
if err != nil {
3940
return err
4041
}
41-
dynamicClient, err := o.factory.DynamicClient()
42+
dynamicClient, err := o.ClusteradmFlags.KubectlFactory.DynamicClient()
4243
if err != nil {
4344
return err
4445
}
4546

46-
restConfig, err := o.factory.ToRESTConfig()
47+
restConfig, err := o.ClusteradmFlags.KubectlFactory.ToRESTConfig()
4748
if err != nil {
4849
return err
4950
}
@@ -69,35 +70,40 @@ func (o *Options) run() error {
6970
"init/service_account.yaml",
7071
}
7172

72-
err = apply.ApplyDirectly(clientHolder, reader, o.values, "", files...)
73+
out, err := apply.ApplyDirectly(clientHolder, reader, o.values, o.ClusteradmFlags.DryRun, "", files...)
7374
if err != nil {
7475
return err
7576
}
77+
output = append(output, out...)
7678

77-
err = apply.ApplyDeployment(kubeClient, reader, o.values, "", "init/operator.yaml")
79+
out, err = apply.ApplyDeployments(kubeClient, reader, o.values, o.ClusteradmFlags.DryRun, "", "init/operator.yaml")
7880
if err != nil {
7981
return err
8082
}
81-
82-
b := retry.DefaultBackoff
83-
b.Duration = 100 * time.Millisecond
84-
err = helpers.WaitCRDToBeReady(*apiExtensionsClient, "clustermanagers.operator.open-cluster-management.io", b)
85-
if err != nil {
86-
return err
83+
output = append(output, out...)
84+
85+
if !o.ClusteradmFlags.DryRun {
86+
b := retry.DefaultBackoff
87+
b.Duration = 100 * time.Millisecond
88+
err = helpers.WaitCRDToBeReady(*apiExtensionsClient, "clustermanagers.operator.open-cluster-management.io", b)
89+
if err != nil {
90+
return err
91+
}
8792
}
8893

8994
discoveryClient := discovery.NewDiscoveryClientForConfigOrDie(restConfig)
90-
err = apply.ApplyCustomResouces(dynamicClient, discoveryClient, reader, o.values, "", "init/clustermanagers.cr.yaml")
95+
out, err = apply.ApplyCustomResouces(dynamicClient, discoveryClient, reader, o.values, o.ClusteradmFlags.DryRun, "", "init/clustermanagers.cr.yaml")
9196
if err != nil {
9297
return err
9398
}
99+
output = append(output, out...)
94100

95-
fmt.Printf("login into the cluster and run: %s join --hub-token %s.%s --hub-apiserver %s --cluster-name <cluster_name>\n",
101+
fmt.Printf("please log on spoke and run:\n%s join --hub-token %s.%s --hub-apiserver %s --cluster-name <cluster_name>\n",
96102
helpers.GetExampleHeader(),
97103
o.values.Hub.TokenID,
98104
o.values.Hub.TokenSecret,
99105
restConfig.Host,
100106
)
101107

102-
return nil
108+
return apply.WriteOutput(o.outputFile, output)
103109
}

0 commit comments

Comments
 (0)