Skip to content

Commit 04e7357

Browse files
sgalsalehlaverya
andauthored
Run host preflights as part of the install2 command (#1578)
* Run host preflights as part of the install2 command --------- Co-authored-by: Andrew Lavery <[email protected]>
1 parent dcf0031 commit 04e7357

File tree

20 files changed

+412
-216
lines changed

20 files changed

+412
-216
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,11 +278,11 @@ vet: static
278278

279279
.PHONY: e2e-tests
280280
e2e-tests: embedded-release
281-
go test -timeout 60m -ldflags="$(LD_FLAGS)" -parallel 1 -failfast -v ./e2e
281+
go test -tags exclude_graphdriver_btrfs -timeout 60m -ldflags="$(LD_FLAGS)" -parallel 1 -failfast -v ./e2e
282282

283283
.PHONY: e2e-test
284284
e2e-test:
285-
go test -timeout 60m -ldflags="$(LD_FLAGS)" -v ./e2e -run ^$(TEST_NAME)$$
285+
go test -tags exclude_graphdriver_btrfs -timeout 60m -ldflags="$(LD_FLAGS)" -v ./e2e -run ^$(TEST_NAME)$$
286286

287287
.PHONY: dryrun-tests
288288
dryrun-tests: export DRYRUN_MATCH = Test

cmd/installer/cli/cidr.go

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,29 +35,45 @@ func validateCIDRFlags(cmd *cobra.Command) error {
3535
return nil
3636
}
3737

38-
// getPODAndServiceCIDR determines, based on the command line flags,
39-
// what are the pod and service CIDRs to be used for the cluster. If both
40-
// --pod-cidr and --service-cidr have been set, they are used. Otherwise,
38+
type CIDRConfig struct {
39+
PodCIDR string
40+
ServiceCIDR string
41+
GlobalCIDR *string
42+
}
43+
44+
// getCIDRConfig determines, based on the command line flags,
45+
// what are the pod and service CIDRs to be used for the cluster. If either
46+
// of --pod-cidr or --service-cidr have been set, they are used. Otherwise,
4147
// the cidr flag is split into pod and service CIDRs.
42-
func getPODAndServiceCIDR(cmd *cobra.Command) (string, string, error) {
48+
func getCIDRConfig(cmd *cobra.Command) (*CIDRConfig, error) {
4349
if cmd.Flags().Changed("pod-cidr") || cmd.Flags().Changed("service-cidr") {
44-
podCIDRFlag, err := cmd.Flags().GetString("pod-cidr")
50+
podCIDR, err := cmd.Flags().GetString("pod-cidr")
4551
if err != nil {
46-
return "", "", fmt.Errorf("unable to get pod-cidr flag: %w", err)
52+
return nil, fmt.Errorf("unable to get pod-cidr flag: %w", err)
4753
}
48-
serviceCIDRFlag, err := cmd.Flags().GetString("service-cidr")
54+
serviceCIDR, err := cmd.Flags().GetString("service-cidr")
4955
if err != nil {
50-
return "", "", fmt.Errorf("unable to get service-cidr flag: %w", err)
56+
return nil, fmt.Errorf("unable to get service-cidr flag: %w", err)
5157
}
52-
return podCIDRFlag, serviceCIDRFlag, nil
58+
return &CIDRConfig{
59+
PodCIDR: podCIDR,
60+
ServiceCIDR: serviceCIDR,
61+
}, nil
5362
}
5463

55-
cidrFlag, err := cmd.Flags().GetString("cidr")
64+
globalCIDR, err := cmd.Flags().GetString("cidr")
5665
if err != nil {
57-
return "", "", fmt.Errorf("unable to get cidr flag: %w", err)
66+
return nil, fmt.Errorf("unable to get cidr flag: %w", err)
5867
}
59-
60-
return netutils.SplitNetworkCIDR(cidrFlag)
68+
podCIDR, serviceCIDR, err := netutils.SplitNetworkCIDR(globalCIDR)
69+
if err != nil {
70+
return nil, fmt.Errorf("unable to split cidr flag: %w", err)
71+
}
72+
return &CIDRConfig{
73+
PodCIDR: podCIDR,
74+
ServiceCIDR: serviceCIDR,
75+
GlobalCIDR: &globalCIDR,
76+
}, nil
6177
}
6278

6379
// cleanCIDR returns a `.0/x` subnet instead of a `.2/x` etc subnet

cmd/installer/cli/install.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,12 @@ func InstallCmd(ctx context.Context, name string) *cobra.Command {
204204
proxyRegistryURL = fmt.Sprintf("https://%s", runtimeconfig.ProxyRegistryAddress)
205205
}
206206

207-
fromCIDR, toCIDR, err := getPODAndServiceCIDR(cmd)
207+
cidrCfg, err := getCIDRConfig(cmd)
208208
if err != nil {
209209
return fmt.Errorf("unable to determine pod and service CIDRs: %w", err)
210210
}
211211

212-
if err := RunHostPreflights(cmd, applier, replicatedAPIURL, proxyRegistryURL, isAirgap, proxy, fromCIDR, toCIDR, assumeYes); err != nil {
212+
if err := RunHostPreflights(cmd, applier, replicatedAPIURL, proxyRegistryURL, isAirgap, proxy, cidrCfg, assumeYes); err != nil {
213213
metrics.ReportApplyFinished(cmd.Context(), licenseFile, nil, err)
214214
if err == ErrPreflightsHaveFail {
215215
return ErrNothingElseToAdd
@@ -643,12 +643,12 @@ func ensureK0sConfig(cmd *cobra.Command, applier *addons.Applier) (*k0sconfig.Cl
643643
cfg.Spec.API.Address = address
644644
cfg.Spec.Storage.Etcd.PeerAddress = address
645645

646-
podCIDR, serviceCIDR, err := getPODAndServiceCIDR(cmd)
646+
cidrCfg, err := getCIDRConfig(cmd)
647647
if err != nil {
648648
return nil, fmt.Errorf("unable to determine pod and service CIDRs: %w", err)
649649
}
650-
cfg.Spec.Network.PodCIDR = podCIDR
651-
cfg.Spec.Network.ServiceCIDR = serviceCIDR
650+
cfg.Spec.Network.PodCIDR = cidrCfg.PodCIDR
651+
cfg.Spec.Network.ServiceCIDR = cidrCfg.ServiceCIDR
652652
if err := config.UpdateHelmConfigs(applier, cfg); err != nil {
653653
return nil, fmt.Errorf("unable to update helm configs: %w", err)
654654
}

cmd/installer/cli/install2.go

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,7 @@ type Install2CmdFlags struct {
4444

4545
license *kotsv1beta1.License
4646
proxy *ecv1beta1.ProxySpec
47-
48-
// cidr flags are deprecated, but these values are still
49-
// used. if the --cidr flag is passed, the values will be
50-
// calculated
51-
podCIDR string
52-
serviceCIDR string
47+
cidrCfg *CIDRConfig
5348
}
5449

5550
// Install2Cmd returns a cobra command for installing the embedded cluster.
@@ -84,12 +79,11 @@ func Install2Cmd(ctx context.Context, name string) *cobra.Command {
8479
}
8580

8681
// parse the various cidr flags to make sure we have exactly what we want
87-
pod, svc, err := getPODAndServiceCIDR(cmd)
82+
cidrCfg, err := getCIDRConfig(cmd)
8883
if err != nil {
8984
return fmt.Errorf("unable to determine pod and service CIDRs: %w", err)
9085
}
91-
flags.podCIDR = pod
92-
flags.serviceCIDR = svc
86+
flags.cidrCfg = cidrCfg
9387

9488
// if a network interface flag was not provided, attempt to discover it
9589
if flags.networkInterface == "" {
@@ -179,8 +173,19 @@ func runInstall2(cmd *cobra.Command, args []string, name string, flags Install2C
179173
}
180174

181175
logrus.Debugf("running host preflights")
182-
if err := runInstallPreflights(cmd.Context(), flags.license, flags.proxy, flags.podCIDR, flags.serviceCIDR); err != nil {
183-
return err
176+
if err := preflights.PrepareAndRun(cmd.Context(), preflights.PrepareAndRunOptions{
177+
License: flags.license,
178+
Proxy: flags.proxy,
179+
PodCIDR: flags.cidrCfg.PodCIDR,
180+
ServiceCIDR: flags.cidrCfg.ServiceCIDR,
181+
GlobalCIDR: flags.cidrCfg.GlobalCIDR,
182+
PrivateCAs: flags.privateCAs,
183+
IsAirgap: flags.airgapBundle != "",
184+
SkipHostPreflights: flags.skipHostPreflights,
185+
IgnoreHostPreflights: flags.ignoreHostPreflights,
186+
AssumeYes: flags.assumeYes,
187+
}); err != nil {
188+
return fmt.Errorf("unable to prepare and run preflights: %w", err)
184189
}
185190

186191
logrus.Debugf("configuring sysctl")
@@ -193,7 +198,7 @@ func runInstall2(cmd *cobra.Command, args []string, name string, flags Install2C
193198
return fmt.Errorf("unable to configure network manager: %w", err)
194199
}
195200

196-
clusterConfig, err := installAndStartCluster(cmd.Context(), flags.networkInterface, flags.airgapBundle, flags.license, flags.proxy, flags.podCIDR, flags.serviceCIDR, flags.overrides)
201+
clusterConfig, err := installAndStartCluster(cmd.Context(), flags.networkInterface, flags.airgapBundle, flags.license, flags.proxy, flags.cidrCfg, flags.overrides)
197202
if err != nil {
198203
metrics.ReportApplyFinished(cmd.Context(), "", flags.license, err)
199204
return err
@@ -324,27 +329,13 @@ func runInstallVerifyAndPrompt(ctx context.Context, name string, flags *Install2
324329
return nil
325330
}
326331

327-
func runInstallPreflights(ctx context.Context, license *kotsv1beta1.License, proxy *ecv1beta1.ProxySpec, podCIDR string, serviceCIDR string) error {
328-
preflightOptions := preflights.PrepareAndRunOptions{
329-
License: license,
330-
Proxy: proxy,
331-
ConnectivityFromCIDR: podCIDR,
332-
ConnectivityToCIDR: serviceCIDR,
333-
}
334-
if err := preflights.PrepareAndRun(ctx, preflightOptions); err != nil {
335-
return fmt.Errorf("unable to prepare and run preflights: %w", err)
336-
}
337-
338-
return nil
339-
}
340-
341-
func installAndStartCluster(ctx context.Context, networkInterface string, airgapBundle string, license *kotsv1beta1.License, proxy *ecv1beta1.ProxySpec, podCIDR string, serviceCIDR string, overrides string) (*k0sconfig.ClusterConfig, error) {
332+
func installAndStartCluster(ctx context.Context, networkInterface string, airgapBundle string, license *kotsv1beta1.License, proxy *ecv1beta1.ProxySpec, cidrCfg *CIDRConfig, overrides string) (*k0sconfig.ClusterConfig, error) {
342333
loading := spinner.Start()
343334
defer loading.Close()
344335
loading.Infof("Installing %s node", runtimeconfig.BinaryName())
345336
logrus.Debugf("creating k0s configuration file")
346337

347-
cfg, err := k0s.WriteK0sConfig(ctx, networkInterface, airgapBundle, podCIDR, serviceCIDR, overrides)
338+
cfg, err := k0s.WriteK0sConfig(ctx, networkInterface, airgapBundle, cidrCfg.PodCIDR, cidrCfg.ServiceCIDR, overrides)
348339
if err != nil {
349340
err := fmt.Errorf("unable to create config file: %w", err)
350341
metrics.ReportApplyFinished(ctx, "", license, err)

cmd/installer/cli/install_runpreflights.go

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/replicatedhq/embedded-cluster/pkg/helpers"
1818
"github.com/replicatedhq/embedded-cluster/pkg/metrics"
1919
"github.com/replicatedhq/embedded-cluster/pkg/preflights"
20+
preflightstypes "github.com/replicatedhq/embedded-cluster/pkg/preflights/types"
2021
"github.com/replicatedhq/embedded-cluster/pkg/prompts"
2122
"github.com/replicatedhq/embedded-cluster/pkg/release"
2223
"github.com/replicatedhq/embedded-cluster/pkg/runtimeconfig"
@@ -120,12 +121,12 @@ func InstallRunPreflightsCmd(ctx context.Context, name string) *cobra.Command {
120121
proxyRegistryURL = fmt.Sprintf("https://%s", runtimeconfig.ProxyRegistryAddress)
121122
}
122123

123-
fromCIDR, toCIDR, err := getPODAndServiceCIDR(cmd)
124+
cidrCfg, err := getCIDRConfig(cmd)
124125
if err != nil {
125126
return fmt.Errorf("unable to determine pod and service CIDRs: %w", err)
126127
}
127128

128-
if err := RunHostPreflights(cmd, applier, replicatedAPIURL, proxyRegistryURL, isAirgap, proxy, fromCIDR, toCIDR, assumeYes); err != nil {
129+
if err := RunHostPreflights(cmd, applier, replicatedAPIURL, proxyRegistryURL, isAirgap, proxy, cidrCfg, assumeYes); err != nil {
129130
if err == ErrPreflightsHaveFail {
130131
return ErrNothingElseToAdd
131132
}
@@ -329,15 +330,15 @@ func getAddonsApplier(cmd *cobra.Command, opts addonsApplierOpts, adminConsolePw
329330
// RunHostPreflights runs the host preflights we found embedded in the binary
330331
// on all configured hosts. We attempt to read HostPreflights from all the
331332
// embedded Helm Charts and from the Kots Application Release files.
332-
func RunHostPreflights(cmd *cobra.Command, applier *addons.Applier, replicatedAPIURL, proxyRegistryURL string, isAirgap bool, proxy *ecv1beta1.ProxySpec, fromCIDR, toCIDR string, assumeYes bool) error {
333+
func RunHostPreflights(cmd *cobra.Command, applier *addons.Applier, replicatedAPIURL, proxyRegistryURL string, isAirgap bool, proxy *ecv1beta1.ProxySpec, cidrCfg *CIDRConfig, assumeYes bool) error {
333334
hpf, err := applier.HostPreflights()
334335
if err != nil {
335336
return fmt.Errorf("unable to read host preflights: %w", err)
336337
}
337338

338339
privateCAs := getPrivateCAPath(cmd)
339340

340-
data, err := preflights.TemplateData{
341+
data, err := preflightstypes.TemplateData{
341342
ReplicatedAPIURL: replicatedAPIURL,
342343
ProxyRegistryURL: proxyRegistryURL,
343344
IsAirgap: isAirgap,
@@ -348,9 +349,9 @@ func RunHostPreflights(cmd *cobra.Command, applier *addons.Applier, replicatedAP
348349
OpenEBSDataDir: runtimeconfig.EmbeddedClusterOpenEBSLocalSubDir(),
349350
PrivateCA: privateCAs,
350351
SystemArchitecture: runtime.GOARCH,
351-
FromCIDR: fromCIDR,
352-
ToCIDR: toCIDR,
353-
}.WithCIDRData(getCIDRs(cmd))
352+
FromCIDR: cidrCfg.PodCIDR,
353+
ToCIDR: cidrCfg.ServiceCIDR,
354+
}.WithCIDRData(cidrCfg.PodCIDR, cidrCfg.ServiceCIDR, cidrCfg.GlobalCIDR)
354355

355356
if err != nil {
356357
return fmt.Errorf("unable to get host preflights data: %w", err)
@@ -525,26 +526,3 @@ func getPrivateCAPath(cmd *cobra.Command) string {
525526
}
526527
return privateCA
527528
}
528-
529-
// getCIDRs returns the CIDRs in use based on the provided cli flags.
530-
func getCIDRs(cmd *cobra.Command) (string, string, string) {
531-
podCIDRFlag, err := cmd.Flags().GetString("pod-cidr")
532-
if err != nil {
533-
return "", "", ""
534-
}
535-
536-
serviceCIDRFlag, err := cmd.Flags().GetString("service-cidr")
537-
if err != nil {
538-
return "", "", ""
539-
}
540-
541-
cidrFlag, err := cmd.Flags().GetString("cidr")
542-
if err != nil {
543-
return "", "", ""
544-
}
545-
546-
if podCIDRFlag != "" || serviceCIDRFlag != "" {
547-
return podCIDRFlag, serviceCIDRFlag, ""
548-
}
549-
return "", "", cidrFlag
550-
}

cmd/installer/cli/join.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,24 +160,29 @@ func JoinCmd(ctx context.Context, name string) *cobra.Command {
160160
return fmt.Errorf("unable to configure sysctl: %w", err)
161161
}
162162

163-
fromCIDR, toCIDR, err := netutils.SplitNetworkCIDR(ecv1beta1.DefaultNetworkCIDR)
163+
podCIDR, serviceCIDR, err := netutils.SplitNetworkCIDR(ecv1beta1.DefaultNetworkCIDR)
164164
if err != nil {
165165
return fmt.Errorf("unable to split default network CIDR: %w", err)
166166
}
167167

168168
if jcmd.InstallationSpec.Network != nil {
169169
if jcmd.InstallationSpec.Network.PodCIDR != "" {
170-
fromCIDR = jcmd.InstallationSpec.Network.PodCIDR
170+
podCIDR = jcmd.InstallationSpec.Network.PodCIDR
171171
}
172172
if jcmd.InstallationSpec.Network.ServiceCIDR != "" {
173-
toCIDR = jcmd.InstallationSpec.Network.ServiceCIDR
173+
serviceCIDR = jcmd.InstallationSpec.Network.ServiceCIDR
174174
}
175175
}
176176

177+
cidrCfg := &CIDRConfig{
178+
PodCIDR: podCIDR,
179+
ServiceCIDR: serviceCIDR,
180+
}
181+
177182
// jcmd.InstallationSpec.MetricsBaseURL is the replicated.app endpoint url
178183
replicatedAPIURL := jcmd.InstallationSpec.MetricsBaseURL
179184
proxyRegistryURL := fmt.Sprintf("https://%s", runtimeconfig.ProxyRegistryAddress)
180-
if err := RunHostPreflights(cmd, applier, replicatedAPIURL, proxyRegistryURL, isAirgap, jcmd.InstallationSpec.Proxy, fromCIDR, toCIDR, assumeYes); err != nil {
185+
if err := RunHostPreflights(cmd, applier, replicatedAPIURL, proxyRegistryURL, isAirgap, jcmd.InstallationSpec.Proxy, cidrCfg, assumeYes); err != nil {
181186
metrics.ReportJoinFailed(cmd.Context(), jcmd.InstallationSpec.MetricsBaseURL, jcmd.ClusterID, err)
182187
if err == ErrPreflightsHaveFail {
183188
return ErrNothingElseToAdd

cmd/installer/cli/join_runpreflights.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,24 +100,29 @@ func JoinRunPreflightsCmd(ctx context.Context, name string) *cobra.Command {
100100
return err
101101
}
102102

103-
fromCIDR, toCIDR, err := netutils.SplitNetworkCIDR(ecv1beta1.DefaultNetworkCIDR)
103+
podCIDR, serviceCIDR, err := netutils.SplitNetworkCIDR(ecv1beta1.DefaultNetworkCIDR)
104104
if err != nil {
105105
return fmt.Errorf("unable to split default network CIDR: %w", err)
106106
}
107107

108108
if jcmd.InstallationSpec.Network != nil {
109109
if jcmd.InstallationSpec.Network.PodCIDR != "" {
110-
fromCIDR = jcmd.InstallationSpec.Network.PodCIDR
110+
podCIDR = jcmd.InstallationSpec.Network.PodCIDR
111111
}
112112
if jcmd.InstallationSpec.Network.ServiceCIDR != "" {
113-
toCIDR = jcmd.InstallationSpec.Network.ServiceCIDR
113+
serviceCIDR = jcmd.InstallationSpec.Network.ServiceCIDR
114114
}
115115
}
116116

117+
cidrCfg := &CIDRConfig{
118+
PodCIDR: podCIDR,
119+
ServiceCIDR: serviceCIDR,
120+
}
121+
117122
logrus.Debugf("running host preflights")
118123
replicatedAPIURL := jcmd.InstallationSpec.MetricsBaseURL
119124
proxyRegistryURL := fmt.Sprintf("https://%s", runtimeconfig.ProxyRegistryAddress)
120-
if err := RunHostPreflights(cmd, applier, replicatedAPIURL, proxyRegistryURL, isAirgap, jcmd.InstallationSpec.Proxy, fromCIDR, toCIDR, assumeYes); err != nil {
125+
if err := RunHostPreflights(cmd, applier, replicatedAPIURL, proxyRegistryURL, isAirgap, jcmd.InstallationSpec.Proxy, cidrCfg, assumeYes); err != nil {
121126
if err == ErrPreflightsHaveFail {
122127
return ErrNothingElseToAdd
123128
}

cmd/installer/cli/proxy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ func combineNoProxySuppliedValuesAndDefaults(cmd *cobra.Command, proxy *ecv1beta
9696
noProxy := strings.Split(proxy.ProvidedNoProxy, ",")
9797
if len(noProxy) > 0 || proxy.HTTPProxy != "" || proxy.HTTPSProxy != "" {
9898
noProxy = append(runtimeconfig.DefaultNoProxy, noProxy...)
99-
podnet, svcnet, err := getPODAndServiceCIDR(cmd)
99+
cidrCfg, err := getCIDRConfig(cmd)
100100
if err != nil {
101101
return fmt.Errorf("unable to determine pod and service CIDRs: %w", err)
102102
}
103-
noProxy = append(noProxy, podnet, svcnet)
103+
noProxy = append(noProxy, cidrCfg.PodCIDR, cidrCfg.ServiceCIDR)
104104
proxy.NoProxy = strings.Join(noProxy, ",")
105105
}
106106
return nil

cmd/installer/cli/restore.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -751,13 +751,13 @@ func ensureK0sConfigForRestore(cmd *cobra.Command, applier *addons.Applier) (*k0
751751
cfg.Spec.API.Address = address
752752
cfg.Spec.Storage.Etcd.PeerAddress = address
753753

754-
podCIDR, serviceCIDR, err := getPODAndServiceCIDR(cmd)
754+
cidrCfg, err := getCIDRConfig(cmd)
755755
if err != nil {
756756
return nil, fmt.Errorf("unable to determine pod and service CIDRs: %w", err)
757757
}
758758

759-
cfg.Spec.Network.PodCIDR = podCIDR
760-
cfg.Spec.Network.ServiceCIDR = serviceCIDR
759+
cfg.Spec.Network.PodCIDR = cidrCfg.PodCIDR
760+
cfg.Spec.Network.ServiceCIDR = cidrCfg.ServiceCIDR
761761

762762
if err := config.UpdateHelmConfigsForRestore(applier, cfg); err != nil {
763763
return nil, fmt.Errorf("unable to update helm configs: %w", err)

0 commit comments

Comments
 (0)