Skip to content

Commit 21f4438

Browse files
authored
chore(api): pass kubernetes configuration (#2376)
1 parent 87275e4 commit 21f4438

File tree

10 files changed

+799
-77
lines changed

10 files changed

+799
-77
lines changed

api/integration/hostpreflights_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,10 @@ func TestGetHostPreflightsStatusWithIgnoreFlag(t *testing.T) {
220220
// Create the API with allow ignore host preflights flag
221221
apiInstance, err := api.New(
222222
types.APIConfig{
223-
Password: "password",
224-
AllowIgnoreHostPreflights: tt.allowIgnoreHostPreflights,
223+
Password: "password",
224+
LinuxConfig: types.LinuxConfig{
225+
AllowIgnoreHostPreflights: tt.allowIgnoreHostPreflights,
226+
},
225227
},
226228
api.WithLinuxInstallController(installController),
227229
api.WithAuthController(&staticAuthController{"TOKEN"}),

api/types/api.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,32 @@ package types
22

33
import (
44
ecv1beta1 "github.com/replicatedhq/embedded-cluster/kinds/apis/v1beta1"
5+
"github.com/replicatedhq/embedded-cluster/pkg/kubernetesinstallation"
56
"github.com/replicatedhq/embedded-cluster/pkg/release"
67
"github.com/replicatedhq/embedded-cluster/pkg/runtimeconfig"
8+
"k8s.io/client-go/rest"
79
)
810

911
// APIConfig holds the configuration for the API server
1012
type APIConfig struct {
13+
Password string
14+
TLSConfig TLSConfig
15+
License []byte
16+
AirgapBundle string
17+
ConfigValues string
18+
ReleaseData *release.ReleaseData
19+
EndUserConfig *ecv1beta1.Config
20+
21+
LinuxConfig
22+
KubernetesConfig
23+
}
24+
25+
type LinuxConfig struct {
1126
RuntimeConfig runtimeconfig.RuntimeConfig
12-
Password string
13-
TLSConfig TLSConfig
14-
License []byte
15-
AirgapBundle string
16-
ConfigValues string
17-
ReleaseData *release.ReleaseData
18-
EndUserConfig *ecv1beta1.Config
1927
AllowIgnoreHostPreflights bool
2028
}
29+
30+
type KubernetesConfig struct {
31+
RESTConfig *rest.Config
32+
Installation kubernetesinstallation.Installation
33+
}

cmd/installer/cli/api.go

Lines changed: 13 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,44 +16,37 @@ import (
1616
"github.com/replicatedhq/embedded-cluster/api"
1717
apilogger "github.com/replicatedhq/embedded-cluster/api/pkg/logger"
1818
apitypes "github.com/replicatedhq/embedded-cluster/api/types"
19-
ecv1beta1 "github.com/replicatedhq/embedded-cluster/kinds/apis/v1beta1"
2019
"github.com/replicatedhq/embedded-cluster/pkg-new/cloudutils"
2120
"github.com/replicatedhq/embedded-cluster/pkg-new/tlsutils"
2221
"github.com/replicatedhq/embedded-cluster/pkg/metrics"
23-
"github.com/replicatedhq/embedded-cluster/pkg/release"
24-
"github.com/replicatedhq/embedded-cluster/pkg/runtimeconfig"
2522
"github.com/replicatedhq/embedded-cluster/web"
2623
"github.com/sirupsen/logrus"
2724
)
2825

2926
// apiOptions holds the configuration options for the API server
3027
type apiOptions struct {
31-
InstallTarget string
32-
RuntimeConfig runtimeconfig.RuntimeConfig
33-
Logger logrus.FieldLogger
34-
MetricsReporter metrics.ReporterInterface
35-
Password string
36-
TLSConfig apitypes.TLSConfig
37-
ManagerPort int
38-
License []byte
39-
AirgapBundle string
40-
ConfigValues string
41-
ReleaseData *release.ReleaseData
42-
EndUserConfig *ecv1beta1.Config
43-
AllowIgnoreHostPreflights bool
44-
WebAssetsFS fs.FS
28+
apitypes.APIConfig
29+
30+
ManagerPort int
31+
InstallTarget string
32+
33+
Logger logrus.FieldLogger
34+
MetricsReporter metrics.ReporterInterface
35+
WebAssetsFS fs.FS
4536
}
4637

47-
func startAPI(ctx context.Context, cert tls.Certificate, opts apiOptions) error {
38+
func startAPI(ctx context.Context, cert tls.Certificate, opts apiOptions, cancel context.CancelFunc) error {
4839
listener, err := net.Listen("tcp", fmt.Sprintf(":%d", opts.ManagerPort))
4940
if err != nil {
5041
return fmt.Errorf("unable to create listener: %w", err)
5142
}
5243

5344
go func() {
45+
// If the api exits, we want to exit the entire process
46+
defer cancel()
5447
if err := serveAPI(ctx, listener, cert, opts); err != nil {
5548
if !errors.Is(err, http.ErrServerClosed) {
56-
logrus.Errorf("api error: %v", err)
49+
logrus.Errorf("API server exited with error: %v", err)
5750
}
5851
}
5952
}()
@@ -81,20 +74,8 @@ func serveAPI(ctx context.Context, listener net.Listener, cert tls.Certificate,
8174
return fmt.Errorf("new api logger: %w", err)
8275
}
8376

84-
cfg := apitypes.APIConfig{
85-
RuntimeConfig: opts.RuntimeConfig,
86-
Password: opts.Password,
87-
TLSConfig: opts.TLSConfig,
88-
License: opts.License,
89-
AirgapBundle: opts.AirgapBundle,
90-
ConfigValues: opts.ConfigValues,
91-
ReleaseData: opts.ReleaseData,
92-
EndUserConfig: opts.EndUserConfig,
93-
AllowIgnoreHostPreflights: opts.AllowIgnoreHostPreflights,
94-
}
95-
9677
api, err := api.New(
97-
cfg,
78+
opts.APIConfig,
9879
api.WithLogger(logger),
9980
api.WithMetricsReporter(opts.MetricsReporter),
10081
)

cmd/installer/cli/api_test.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"time"
1313

1414
apilogger "github.com/replicatedhq/embedded-cluster/api/pkg/logger"
15+
apitypes "github.com/replicatedhq/embedded-cluster/api/types"
1516
"github.com/replicatedhq/embedded-cluster/pkg-new/tlsutils"
1617
"github.com/replicatedhq/embedded-cluster/pkg/release"
1718
kotsv1beta1 "github.com/replicatedhq/kotskinds/apis/kots/v1beta1"
@@ -55,15 +56,17 @@ func Test_serveAPI(t *testing.T) {
5556
require.NoError(t, err)
5657

5758
config := apiOptions{
58-
Logger: apilogger.NewDiscardLogger(),
59-
Password: "password",
60-
ManagerPort: portInt,
61-
WebAssetsFS: webAssetsFS,
62-
ReleaseData: &release.ReleaseData{
63-
Application: &kotsv1beta1.Application{
64-
Spec: kotsv1beta1.ApplicationSpec{},
59+
APIConfig: apitypes.APIConfig{
60+
Password: "password",
61+
ReleaseData: &release.ReleaseData{
62+
Application: &kotsv1beta1.Application{
63+
Spec: kotsv1beta1.ApplicationSpec{},
64+
},
6565
},
6666
},
67+
ManagerPort: portInt,
68+
Logger: apilogger.NewDiscardLogger(),
69+
WebAssetsFS: webAssetsFS,
6770
}
6871

6972
go func() {

cmd/installer/cli/install.go

Lines changed: 55 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/replicatedhq/embedded-cluster/pkg/extensions"
3535
"github.com/replicatedhq/embedded-cluster/pkg/helm"
3636
"github.com/replicatedhq/embedded-cluster/pkg/helpers"
37+
"github.com/replicatedhq/embedded-cluster/pkg/kubernetesinstallation"
3738
"github.com/replicatedhq/embedded-cluster/pkg/kubeutils"
3839
"github.com/replicatedhq/embedded-cluster/pkg/metrics"
3940
"github.com/replicatedhq/embedded-cluster/pkg/netutils"
@@ -102,7 +103,9 @@ func InstallCmd(ctx context.Context, name string) *cobra.Command {
102103
var flags InstallCmdFlags
103104

104105
ctx, cancel := context.WithCancel(ctx)
106+
105107
rc := runtimeconfig.New(nil)
108+
ki := kubernetesinstallation.New(nil)
106109

107110
short := fmt.Sprintf("Install %s", name)
108111
if os.Getenv("ENABLE_V3") == "1" {
@@ -121,7 +124,7 @@ func InstallCmd(ctx context.Context, name string) *cobra.Command {
121124
if err := verifyAndPrompt(ctx, name, flags, prompts.New()); err != nil {
122125
return err
123126
}
124-
if err := preRunInstall(cmd, &flags, rc); err != nil {
127+
if err := preRunInstall(cmd, &flags, rc, ki); err != nil {
125128
return err
126129
}
127130

@@ -133,7 +136,7 @@ func InstallCmd(ctx context.Context, name string) *cobra.Command {
133136
installReporter.ReportInstallationStarted(ctx)
134137

135138
if flags.enableManagerExperience {
136-
return runManagerExperienceInstall(ctx, flags, rc, installReporter)
139+
return runManagerExperienceInstall(ctx, flags, rc, ki, installReporter)
137140
}
138141

139142
_ = rc.SetEnv()
@@ -366,26 +369,26 @@ func addManagerExperienceFlags(cmd *cobra.Command, flags *InstallCmdFlags) error
366369
return nil
367370
}
368371

369-
func preRunInstall(cmd *cobra.Command, flags *InstallCmdFlags, rc runtimeconfig.RuntimeConfig) error {
372+
func preRunInstall(cmd *cobra.Command, flags *InstallCmdFlags, rc runtimeconfig.RuntimeConfig, ki kubernetesinstallation.Installation) error {
370373
if !slices.Contains([]string{"linux", "kubernetes"}, flags.target) {
371374
return fmt.Errorf(`invalid target (must be one of: "linux", "kubernetes")`)
372375
}
373376

374-
if err := preRunInstallCommon(cmd, flags, rc); err != nil {
377+
if err := preRunInstallCommon(cmd, flags, rc, ki); err != nil {
375378
return err
376379
}
377380

378381
switch flags.target {
379382
case "linux":
380383
return preRunInstallLinux(cmd, flags, rc)
381384
case "kubernetes":
382-
return preRunInstallKubernetes(cmd, flags)
385+
return preRunInstallKubernetes(cmd, flags, ki)
383386
}
384387

385388
return nil
386389
}
387390

388-
func preRunInstallCommon(cmd *cobra.Command, flags *InstallCmdFlags, rc runtimeconfig.RuntimeConfig) error {
391+
func preRunInstallCommon(cmd *cobra.Command, flags *InstallCmdFlags, rc runtimeconfig.RuntimeConfig, ki kubernetesinstallation.Installation) error {
389392
// license file can be empty for restore
390393
if flags.licenseFile != "" {
391394
b, err := os.ReadFile(flags.licenseFile)
@@ -415,6 +418,12 @@ func preRunInstallCommon(cmd *cobra.Command, flags *InstallCmdFlags, rc runtimec
415418

416419
flags.isAirgap = flags.airgapBundle != ""
417420

421+
if flags.managerPort != 0 && flags.adminConsolePort != 0 {
422+
if flags.managerPort == flags.adminConsolePort {
423+
return fmt.Errorf("manager port cannot be the same as admin console port")
424+
}
425+
}
426+
418427
proxy, err := proxyConfigFromCmd(cmd, flags.assumeYes)
419428
if err != nil {
420429
return err
@@ -427,8 +436,14 @@ func preRunInstallCommon(cmd *cobra.Command, flags *InstallCmdFlags, rc runtimec
427436
}
428437
}
429438

430-
// TODO: runtimeconfig is only relevant for linux installs
439+
rc.SetAdminConsolePort(flags.adminConsolePort)
440+
ki.SetAdminConsolePort(flags.adminConsolePort)
441+
442+
rc.SetManagerPort(flags.managerPort)
443+
ki.SetManagerPort(flags.managerPort)
444+
431445
rc.SetProxySpec(proxy)
446+
ki.SetProxySpec(proxy)
432447

433448
return nil
434449
}
@@ -485,14 +500,13 @@ func preRunInstallLinux(cmd *cobra.Command, flags *InstallCmdFlags, rc runtimeco
485500
// TODO: validate that a single port isn't used for multiple services
486501
rc.SetDataDir(flags.dataDir)
487502
rc.SetLocalArtifactMirrorPort(flags.localArtifactMirrorPort)
488-
rc.SetAdminConsolePort(flags.adminConsolePort)
489503
rc.SetHostCABundlePath(hostCABundlePath)
490504
rc.SetNetworkSpec(networkSpec)
491505

492506
return nil
493507
}
494508

495-
func preRunInstallKubernetes(_ *cobra.Command, flags *InstallCmdFlags) error {
509+
func preRunInstallKubernetes(_ *cobra.Command, flags *InstallCmdFlags, _ kubernetesinstallation.Installation) error {
496510
// If set, validate that the kubeconfig file exists and can be read
497511
if flags.kubernetesEnvSettings.KubeConfig != "" {
498512
if _, err := os.Stat(flags.kubernetesEnvSettings.KubeConfig); os.IsNotExist(err) {
@@ -545,7 +559,7 @@ func cidrConfigFromCmd(cmd *cobra.Command) (*newconfig.CIDRConfig, error) {
545559
return cidrCfg, nil
546560
}
547561

548-
func runManagerExperienceInstall(ctx context.Context, flags InstallCmdFlags, rc runtimeconfig.RuntimeConfig, installReporter *InstallReporter) (finalErr error) {
562+
func runManagerExperienceInstall(ctx context.Context, flags InstallCmdFlags, rc runtimeconfig.RuntimeConfig, ki kubernetesinstallation.Installation, installReporter *InstallReporter) (finalErr error) {
549563
// this is necessary because the api listens on all interfaces,
550564
// and we only know the interface to use when the user selects it in the ui
551565
ipAddresses, err := netutils.ListAllValidIPAddresses()
@@ -602,30 +616,44 @@ func runManagerExperienceInstall(ctx context.Context, flags InstallCmdFlags, rc
602616
}
603617

604618
apiConfig := apiOptions{
619+
APIConfig: apitypes.APIConfig{
620+
Password: flags.adminConsolePassword,
621+
TLSConfig: apitypes.TLSConfig{
622+
CertBytes: flags.tlsCertBytes,
623+
KeyBytes: flags.tlsKeyBytes,
624+
Hostname: flags.hostname,
625+
},
626+
License: flags.licenseBytes,
627+
AirgapBundle: flags.airgapBundle,
628+
ConfigValues: flags.configValues,
629+
ReleaseData: release.GetReleaseData(),
630+
EndUserConfig: eucfg,
631+
632+
LinuxConfig: apitypes.LinuxConfig{
633+
RuntimeConfig: rc,
634+
AllowIgnoreHostPreflights: flags.ignoreHostPreflights,
635+
},
636+
KubernetesConfig: apitypes.KubernetesConfig{
637+
RESTConfig: flags.installConfig.kubernetesRestConfig,
638+
Installation: ki,
639+
},
640+
},
641+
642+
ManagerPort: flags.managerPort,
605643
InstallTarget: flags.target,
606-
RuntimeConfig: rc,
607644
MetricsReporter: installReporter.reporter,
608-
Password: flags.adminConsolePassword,
609-
TLSConfig: apitypes.TLSConfig{
610-
CertBytes: flags.tlsCertBytes,
611-
KeyBytes: flags.tlsKeyBytes,
612-
Hostname: flags.hostname,
613-
},
614-
ManagerPort: flags.managerPort,
615-
License: flags.licenseBytes,
616-
AirgapBundle: flags.airgapBundle,
617-
ConfigValues: flags.configValues,
618-
ReleaseData: release.GetReleaseData(),
619-
EndUserConfig: eucfg,
620-
AllowIgnoreHostPreflights: flags.ignoreHostPreflights,
621645
}
622646

623-
if err := startAPI(ctx, flags.tlsCert, apiConfig); err != nil {
647+
ctx, cancel := context.WithCancel(ctx)
648+
defer cancel()
649+
650+
if err := startAPI(ctx, flags.tlsCert, apiConfig, cancel); err != nil {
624651
return fmt.Errorf("unable to start api: %w", err)
625652
}
626653

627-
// TODO: add app name to this message (e.g., App Name manager)
628-
logrus.Infof("\nVisit the manager to continue: %s\n", getManagerURL(flags.hostname, flags.managerPort))
654+
logrus.Infof("\nVisit the %s manager to continue: %s\n",
655+
runtimeconfig.BinaryName(),
656+
getManagerURL(flags.hostname, flags.managerPort))
629657
<-ctx.Done()
630658

631659
return nil

cmd/installer/cli/install_runpreflights.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/replicatedhq/embedded-cluster/pkg-new/hostutils"
1010
"github.com/replicatedhq/embedded-cluster/pkg-new/preflights"
11+
"github.com/replicatedhq/embedded-cluster/pkg/kubernetesinstallation"
1112
"github.com/replicatedhq/embedded-cluster/pkg/metrics"
1213
"github.com/replicatedhq/embedded-cluster/pkg/netutils"
1314
"github.com/replicatedhq/embedded-cluster/pkg/prompts"
@@ -23,14 +24,16 @@ var ErrPreflightsHaveFail = metrics.NewErrorNoFail(fmt.Errorf("host preflight fa
2324

2425
func InstallRunPreflightsCmd(ctx context.Context, name string) *cobra.Command {
2526
var flags InstallCmdFlags
27+
2628
rc := runtimeconfig.New(nil)
29+
ki := kubernetesinstallation.New(nil)
2730

2831
cmd := &cobra.Command{
2932
Use: "run-preflights",
3033
Short: "Run install host preflights",
3134
Hidden: true,
3235
PreRunE: func(cmd *cobra.Command, args []string) error {
33-
if err := preRunInstall(cmd, &flags, rc); err != nil {
36+
if err := preRunInstall(cmd, &flags, rc, ki); err != nil {
3437
return err
3538
}
3639

cmd/installer/cli/restore.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/replicatedhq/embedded-cluster/pkg/disasterrecovery"
3030
"github.com/replicatedhq/embedded-cluster/pkg/helm"
3131
"github.com/replicatedhq/embedded-cluster/pkg/helpers"
32+
"github.com/replicatedhq/embedded-cluster/pkg/kubernetesinstallation"
3233
"github.com/replicatedhq/embedded-cluster/pkg/kubeutils"
3334
"github.com/replicatedhq/embedded-cluster/pkg/netutils"
3435
"github.com/replicatedhq/embedded-cluster/pkg/prompts"
@@ -92,12 +93,13 @@ func RestoreCmd(ctx context.Context, name string) *cobra.Command {
9293
var skipStoreValidation bool
9394

9495
rc := runtimeconfig.New(nil)
96+
ki := kubernetesinstallation.New(nil)
9597

9698
cmd := &cobra.Command{
9799
Use: "restore",
98100
Short: fmt.Sprintf("Restore %s from a backup", name),
99101
PreRunE: func(cmd *cobra.Command, args []string) error {
100-
if err := preRunInstall(cmd, &flags, rc); err != nil {
102+
if err := preRunInstall(cmd, &flags, rc, ki); err != nil {
101103
return err
102104
}
103105

0 commit comments

Comments
 (0)