Skip to content

feat: preflight storage needed to perform airgap install #2336

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 30 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
0b06490
Add airgap bundle size to Installation CRD
banjoh Jun 18, 2025
e270d49
Generate operator CRDs
banjoh Jun 18, 2025
d54331b
Create airgapinfo package to parse airgap bundle metadata
banjoh Jun 18, 2025
2143149
Store airgap bundle size in Installation custom resource
banjoh Jun 19, 2025
668b930
Add airgap storage space to host preflights for controller nodes
banjoh Jun 19, 2025
473f5e1
Add controller airgap storage space calculation
banjoh Jun 19, 2025
46ca2d3
Separate airgap storage space preflight for controller and worker nodes
banjoh Jun 19, 2025
b88f435
Extract airgap.yaml once
banjoh Jun 19, 2025
5e53eca
Fix failing tests
banjoh Jun 19, 2025
9911048
Add airgap bundle size to Installation CRD
banjoh Jun 18, 2025
3fff57f
Generate operator CRDs
banjoh Jun 18, 2025
a1e8816
Create airgapinfo package to parse airgap bundle metadata
banjoh Jun 18, 2025
a3d3847
Store airgap bundle size in Installation custom resource
banjoh Jun 19, 2025
367c093
Add airgap storage space to host preflights for controller nodes
banjoh Jun 19, 2025
69038ae
Add controller airgap storage space calculation
banjoh Jun 19, 2025
a1e0ee4
Separate airgap storage space preflight for controller and worker nodes
banjoh Jun 19, 2025
ee7964f
Extract airgap.yaml once
banjoh Jun 19, 2025
d93f5cf
Fix failing tests
banjoh Jun 19, 2025
8691b79
Merge branch 'evansmungai/sc-123579/take-airgap-bundle-size-into-acco…
banjoh Jun 19, 2025
fb4f1b5
Comment out CI jobs
banjoh Jun 19, 2025
05f7910
Fix imports
banjoh Jun 19, 2025
fc96cf4
Revert ci.yaml
banjoh Jun 19, 2025
30e78de
Pass airgap info to the api
banjoh Jun 20, 2025
f72e05c
Merge remote-tracking branch 'origin/main' into evansmungai/sc-123579…
banjoh Jun 23, 2025
5206aab
Move airgapInfo to preRunInstall
banjoh Jun 24, 2025
5235538
Merge remote-tracking branch 'origin/main' into evansmungai/sc-123579…
banjoh Jun 24, 2025
00f00dc
A few more refactorings
banjoh Jun 24, 2025
9f3562b
Pass airgap info to infra manager
banjoh Jun 24, 2025
a8f86ba
Merge remote-tracking branch 'origin/main' into evansmungai/sc-123579…
banjoh Jun 26, 2025
b263856
Commit missing changes
banjoh Jun 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 19 additions & 6 deletions api/controllers/install/hostpreflight.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,34 @@ import (
"github.com/replicatedhq/embedded-cluster/api/internal/managers/preflight"
"github.com/replicatedhq/embedded-cluster/api/pkg/utils"
"github.com/replicatedhq/embedded-cluster/api/types"
"github.com/replicatedhq/embedded-cluster/pkg-new/preflights"
"github.com/replicatedhq/embedded-cluster/pkg/airgap"
"github.com/replicatedhq/embedded-cluster/pkg/netutils"
)

func (c *InstallController) RunHostPreflights(ctx context.Context, opts RunHostPreflightsOptions) error {
// Get the configured custom domains
ecDomains := utils.GetDomains(c.releaseData)

// Calculate airgap storage space requirement (2x uncompressed size for controller nodes)
var controllerAirgapStorageSpace string
if c.airgapBundle != "" {
airgapInfo, err := airgap.AirgapInfoFromPath(c.airgapBundle)
Copy link
Member

@emosbaugh emosbaugh Jun 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could we move this to the flag parsing code in preRunInstall so it is only run once and fails much earlier? Then make airgapInfo a property of InstallController like airgapBundle.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method gets called by postInstallRunHostPreflights which is a http request served by the controller. At which point does preRunInstall come in?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

preRunInstall is called in the cli and stores properties for later use in the InstallCmdFlags struct. You can add an airgapInfo property and pass this to the api server and store it as a property similar to airgapBundle on the API and InstallController structs.

if err != nil {
return fmt.Errorf("failed to get airgap info: %w", err)
}
controllerAirgapStorageSpace = preflights.CalculateAirgapStorageSpace(airgapInfo.Spec.UncompressedSize, true)
}

// Prepare host preflights
hpf, err := c.hostPreflightManager.PrepareHostPreflights(ctx, c.rc, preflight.PrepareHostPreflightOptions{
ReplicatedAppURL: netutils.MaybeAddHTTPS(ecDomains.ReplicatedAppDomain),
ProxyRegistryURL: netutils.MaybeAddHTTPS(ecDomains.ProxyRegistryDomain),
HostPreflightSpec: c.releaseData.HostPreflights,
EmbeddedClusterConfig: c.releaseData.EmbeddedClusterConfig,
IsAirgap: c.airgapBundle != "",
IsUI: opts.IsUI,
ReplicatedAppURL: netutils.MaybeAddHTTPS(ecDomains.ReplicatedAppDomain),
ProxyRegistryURL: netutils.MaybeAddHTTPS(ecDomains.ProxyRegistryDomain),
HostPreflightSpec: c.releaseData.HostPreflights,
EmbeddedClusterConfig: c.releaseData.EmbeddedClusterConfig,
IsAirgap: c.airgapBundle != "",
IsUI: opts.IsUI,
ControllerAirgapStorageSpace: controllerAirgapStorageSpace,
})
if err != nil {
return fmt.Errorf("failed to prepare host preflights: %w", err)
Expand Down
33 changes: 25 additions & 8 deletions api/internal/managers/infra/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,16 @@
}

func (m *infraManager) install(ctx context.Context, license *kotsv1beta1.License, rc runtimeconfig.RuntimeConfig) (finalErr error) {
// extract airgap info if airgap bundle is provided
var airgapInfo *kotsv1beta1.Airgap

Check failure on line 104 in api/internal/managers/infra/install.go

View workflow job for this annotation

GitHub Actions / Sanitize

undefined: airgap

Check failure on line 104 in api/internal/managers/infra/install.go

View workflow job for this annotation

GitHub Actions / Unit tests

undefined: airgap

Check failure on line 104 in api/internal/managers/infra/install.go

View workflow job for this annotation

GitHub Actions / Build previous k0s

undefined: airgap

Check failure on line 104 in api/internal/managers/infra/install.go

View workflow job for this annotation

GitHub Actions / Build current

undefined: airgap

Check failure on line 104 in api/internal/managers/infra/install.go

View workflow job for this annotation

GitHub Actions / Build upgrade

undefined: airgap
if m.airgapBundle != "" {
var err error
airgapInfo, err = airgap.AirgapInfoFromPath(m.airgapBundle)
if err != nil {
return fmt.Errorf("failed to get airgap info: %w", err)
}
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you follow the same pattern described here where you make airgapInfo a property of the manager and pass it with the function WithAirgapInfo?

defer func() {
if r := recover(); r != nil {
finalErr = fmt.Errorf("panic: %v: %s", r, string(debug.Stack()))
Expand Down Expand Up @@ -136,7 +146,7 @@
}
defer hcli.Close()

in, err := m.recordInstallation(ctx, kcli, license, rc)
in, err := m.recordInstallation(ctx, kcli, license, rc, airgapInfo)
if err != nil {
return fmt.Errorf("record installation: %w", err)
}
Expand Down Expand Up @@ -231,21 +241,28 @@
return k0sCfg, nil
}

func (m *infraManager) recordInstallation(ctx context.Context, kcli client.Client, license *kotsv1beta1.License, rc runtimeconfig.RuntimeConfig) (*ecv1beta1.Installation, error) {
func (m *infraManager) recordInstallation(ctx context.Context, kcli client.Client, license *kotsv1beta1.License, rc runtimeconfig.RuntimeConfig, airgapInfo *kotsv1beta1.Airgap) (*ecv1beta1.Installation, error) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this will no longer need to be an argument as infraManager will have a property airgapInfo

logFn := m.logFn("metadata")

// get the configured custom domains
ecDomains := utils.GetDomains(m.releaseData)

// extract airgap uncompressed size if airgap info is provided
var airgapUncompressedSize int64
if airgapInfo != nil {
airgapUncompressedSize = airgapInfo.Spec.UncompressedSize
}

// record the installation
logFn("recording installation")
in, err := kubeutils.RecordInstallation(ctx, kcli, kubeutils.RecordInstallationOptions{
IsAirgap: m.airgapBundle != "",
License: license,
ConfigSpec: m.getECConfigSpec(),
MetricsBaseURL: netutils.MaybeAddHTTPS(ecDomains.ReplicatedAppDomain),
RuntimeConfig: rc.Get(),
EndUserConfig: m.endUserConfig,
IsAirgap: m.airgapBundle != "",
License: license,
ConfigSpec: m.getECConfigSpec(),
MetricsBaseURL: netutils.MaybeAddHTTPS(ecDomains.ReplicatedAppDomain),
RuntimeConfig: rc.Get(),
EndUserConfig: m.endUserConfig,
AirgapUncompressedSize: airgapUncompressedSize,
})
if err != nil {
return nil, fmt.Errorf("record installation: %w", err)
Expand Down
52 changes: 28 additions & 24 deletions api/internal/managers/preflight/hostpreflight.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,16 @@ import (
)

type PrepareHostPreflightOptions struct {
ReplicatedAppURL string
ProxyRegistryURL string
HostPreflightSpec *troubleshootv1beta2.HostPreflightSpec
EmbeddedClusterConfig *ecv1beta1.Config
TCPConnectionsRequired []string
IsAirgap bool
IsJoin bool
IsUI bool
ReplicatedAppURL string
ProxyRegistryURL string
HostPreflightSpec *troubleshootv1beta2.HostPreflightSpec
EmbeddedClusterConfig *ecv1beta1.Config
TCPConnectionsRequired []string
IsAirgap bool
IsJoin bool
IsUI bool
ControllerAirgapStorageSpace string
WorkerAirgapStorageSpace string
}

type RunHostPreflightOptions struct {
Expand Down Expand Up @@ -76,22 +78,24 @@ func (m *hostPreflightManager) prepareHostPreflights(ctx context.Context, rc run

// Use the shared Prepare function to prepare host preflights
prepareOpts := preflights.PrepareOptions{
HostPreflightSpec: opts.HostPreflightSpec,
ReplicatedAppURL: opts.ReplicatedAppURL,
ProxyRegistryURL: opts.ProxyRegistryURL,
AdminConsolePort: rc.AdminConsolePort(),
LocalArtifactMirrorPort: rc.LocalArtifactMirrorPort(),
DataDir: rc.EmbeddedClusterHomeDirectory(),
K0sDataDir: rc.EmbeddedClusterK0sSubDir(),
OpenEBSDataDir: rc.EmbeddedClusterOpenEBSLocalSubDir(),
Proxy: rc.ProxySpec(),
PodCIDR: rc.PodCIDR(),
ServiceCIDR: rc.ServiceCIDR(),
NodeIP: nodeIP,
IsAirgap: opts.IsAirgap,
TCPConnectionsRequired: opts.TCPConnectionsRequired,
IsJoin: opts.IsJoin,
IsUI: opts.IsUI,
HostPreflightSpec: opts.HostPreflightSpec,
ReplicatedAppURL: opts.ReplicatedAppURL,
ProxyRegistryURL: opts.ProxyRegistryURL,
AdminConsolePort: rc.AdminConsolePort(),
LocalArtifactMirrorPort: rc.LocalArtifactMirrorPort(),
DataDir: rc.EmbeddedClusterHomeDirectory(),
K0sDataDir: rc.EmbeddedClusterK0sSubDir(),
OpenEBSDataDir: rc.EmbeddedClusterOpenEBSLocalSubDir(),
Proxy: rc.ProxySpec(),
PodCIDR: rc.PodCIDR(),
ServiceCIDR: rc.ServiceCIDR(),
NodeIP: nodeIP,
IsAirgap: opts.IsAirgap,
TCPConnectionsRequired: opts.TCPConnectionsRequired,
IsJoin: opts.IsJoin,
IsUI: opts.IsUI,
ControllerAirgapStorageSpace: opts.ControllerAirgapStorageSpace,
WorkerAirgapStorageSpace: opts.WorkerAirgapStorageSpace,
}
if cidr := rc.GlobalCIDR(); cidr != "" {
prepareOpts.GlobalCIDR = &cidr
Expand Down
60 changes: 34 additions & 26 deletions cmd/installer/cli/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,16 @@ func InstallCmd(ctx context.Context, name string) *cobra.Command {
cancel() // Cancel context when command completes
},
RunE: func(cmd *cobra.Command, args []string) error {
if err := verifyAndPrompt(ctx, name, flags, prompts.New()); err != nil {
var airgapInfo *kotsv1beta1.Airgap
if flags.airgapBundle != "" {
var err error
airgapInfo, err = airgap.AirgapInfoFromPath(flags.airgapBundle)
if err != nil {
return fmt.Errorf("failed to get airgap info: %w", err)
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason this is not in the preRunInstall function as suggested? That way it exists with the rest of the flag parsing code and will work for both install and install run-preflights command.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't InstallCmdFlags meant for CLI flags? That's why I did not move the new flag there.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll create a new flag like the rest


if err := verifyAndPrompt(ctx, name, flags, prompts.New(), airgapInfo); err != nil {
return err
}
if err := preRunInstall(cmd, &flags, rc); err != nil {
Expand All @@ -120,7 +129,7 @@ func InstallCmd(ctx context.Context, name string) *cobra.Command {
installReporter.ReportSignalAborted(ctx, sig)
})

if err := runInstall(cmd.Context(), flags, rc, installReporter); err != nil {
if err := runInstall(cmd.Context(), flags, rc, installReporter, airgapInfo); err != nil {
// Check if this is an interrupt error from the terminal
if errors.Is(err, terminal.InterruptErr) {
installReporter.ReportSignalAborted(ctx, syscall.SIGINT)
Expand Down Expand Up @@ -435,7 +444,7 @@ func runManagerExperienceInstall(ctx context.Context, flags InstallCmdFlags, rc
return nil
}

func runInstall(ctx context.Context, flags InstallCmdFlags, rc runtimeconfig.RuntimeConfig, installReporter *InstallReporter) (finalErr error) {
func runInstall(ctx context.Context, flags InstallCmdFlags, rc runtimeconfig.RuntimeConfig, installReporter *InstallReporter, airgapInfo *kotsv1beta1.Airgap) (finalErr error) {
if flags.enableManagerExperience {
return nil
}
Expand Down Expand Up @@ -470,7 +479,7 @@ func runInstall(ctx context.Context, flags InstallCmdFlags, rc runtimeconfig.Run
errCh := kubeutils.WaitForKubernetes(ctx, kcli)
defer logKubernetesErrors(errCh)

in, err := recordInstallation(ctx, kcli, flags, rc, flags.license)
in, err := recordInstallation(ctx, kcli, flags, rc, flags.license, airgapInfo)
if err != nil {
return fmt.Errorf("unable to record installation: %w", err)
}
Expand Down Expand Up @@ -571,7 +580,7 @@ func getAddonInstallOpts(flags InstallCmdFlags, rc runtimeconfig.RuntimeConfig,
return opts, nil
}

func verifyAndPrompt(ctx context.Context, name string, flags InstallCmdFlags, prompt prompts.Prompt) error {
func verifyAndPrompt(ctx context.Context, name string, flags InstallCmdFlags, prompt prompts.Prompt, airgapInfo *kotsv1beta1.Airgap) error {
logrus.Debugf("checking if k0s is already installed")
err := verifyNoInstallation(name, "reinstall")
if err != nil {
Expand All @@ -588,9 +597,9 @@ func verifyAndPrompt(ctx context.Context, name string, flags InstallCmdFlags, pr
if err != nil {
return err
}
if flags.isAirgap {
if airgapInfo != nil {
logrus.Debugf("checking airgap bundle matches binary")
if err := checkAirgapMatches(flags.airgapBundle); err != nil {
if err := checkAirgapMatches(airgapInfo); err != nil {
return err // we want the user to see the error message without a prefix
}
}
Expand Down Expand Up @@ -885,23 +894,15 @@ func installExtensions(ctx context.Context, hcli helm.Client) error {
return nil
}

func checkAirgapMatches(airgapBundle string) error {
func checkAirgapMatches(airgapInfo *kotsv1beta1.Airgap) error {
rel := release.GetChannelRelease()
if rel == nil {
return fmt.Errorf("airgap bundle provided but no release was found in binary, please rerun without the airgap-bundle flag")
}

// read file from path
rawfile, err := os.Open(airgapBundle)
if err != nil {
return fmt.Errorf("failed to open airgap file: %w", err)
}
defer rawfile.Close()

appSlug, channelID, airgapVersion, err := airgap.ChannelReleaseMetadata(rawfile)
if err != nil {
return fmt.Errorf("failed to get airgap bundle versions: %w", err)
}
appSlug := airgapInfo.Spec.AppSlug
channelID := airgapInfo.Spec.ChannelID
airgapVersion := airgapInfo.Spec.VersionLabel

// Check if the airgap bundle matches the application version data
if rel.AppSlug != appSlug {
Expand Down Expand Up @@ -1047,7 +1048,7 @@ func waitForNode(ctx context.Context) error {
}

func recordInstallation(
ctx context.Context, kcli client.Client, flags InstallCmdFlags, rc runtimeconfig.RuntimeConfig, license *kotsv1beta1.License,
ctx context.Context, kcli client.Client, flags InstallCmdFlags, rc runtimeconfig.RuntimeConfig, license *kotsv1beta1.License, airgapInfo *kotsv1beta1.Airgap,
) (*ecv1beta1.Installation, error) {
// get the embedded cluster config
cfg := release.GetEmbeddedClusterConfig()
Expand All @@ -1062,14 +1063,21 @@ func recordInstallation(
return nil, fmt.Errorf("process overrides file: %w", err)
}

// extract airgap uncompressed size if airgap info is provided
var airgapUncompressedSize int64
if airgapInfo != nil {
airgapUncompressedSize = airgapInfo.Spec.UncompressedSize
}

// record the installation
installation, err := kubeutils.RecordInstallation(ctx, kcli, kubeutils.RecordInstallationOptions{
IsAirgap: flags.isAirgap,
License: license,
ConfigSpec: cfgspec,
MetricsBaseURL: replicatedAppURL(),
RuntimeConfig: rc.Get(),
EndUserConfig: eucfg,
IsAirgap: flags.isAirgap,
License: license,
ConfigSpec: cfgspec,
MetricsBaseURL: replicatedAppURL(),
RuntimeConfig: rc.Get(),
EndUserConfig: eucfg,
AirgapUncompressedSize: airgapUncompressedSize,
})
if err != nil {
return nil, fmt.Errorf("record installation: %w", err)
Expand Down
55 changes: 39 additions & 16 deletions cmd/installer/cli/install_runpreflights.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ import (

"github.com/replicatedhq/embedded-cluster/pkg-new/hostutils"
"github.com/replicatedhq/embedded-cluster/pkg-new/preflights"
"github.com/replicatedhq/embedded-cluster/pkg/airgap"
"github.com/replicatedhq/embedded-cluster/pkg/metrics"
"github.com/replicatedhq/embedded-cluster/pkg/netutils"
"github.com/replicatedhq/embedded-cluster/pkg/prompts"
"github.com/replicatedhq/embedded-cluster/pkg/release"
"github.com/replicatedhq/embedded-cluster/pkg/runtimeconfig"
kotsv1beta1 "github.com/replicatedhq/kotskinds/apis/kots/v1beta1"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
Expand Down Expand Up @@ -41,7 +43,16 @@ func InstallRunPreflightsCmd(ctx context.Context, name string) *cobra.Command {
rc.Cleanup()
},
RunE: func(cmd *cobra.Command, args []string) error {
if err := runInstallRunPreflights(cmd.Context(), name, flags, rc); err != nil {
var airgapInfo *kotsv1beta1.Airgap
if flags.airgapBundle != "" {
var err error
airgapInfo, err = airgap.AirgapInfoFromPath(flags.airgapBundle)
if err != nil {
return fmt.Errorf("failed to get airgap info: %w", err)
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this to preRunInstall


if err := runInstallRunPreflights(cmd.Context(), name, flags, rc, airgapInfo); err != nil {
return err
}

Expand All @@ -59,8 +70,8 @@ func InstallRunPreflightsCmd(ctx context.Context, name string) *cobra.Command {
return cmd
}

func runInstallRunPreflights(ctx context.Context, name string, flags InstallCmdFlags, rc runtimeconfig.RuntimeConfig) error {
if err := verifyAndPrompt(ctx, name, flags, prompts.New()); err != nil {
func runInstallRunPreflights(ctx context.Context, name string, flags InstallCmdFlags, rc runtimeconfig.RuntimeConfig, airgapInfo *kotsv1beta1.Airgap) error {
if err := verifyAndPrompt(ctx, name, flags, prompts.New(), airgapInfo); err != nil {
return err
}

Expand Down Expand Up @@ -94,20 +105,32 @@ func runInstallPreflights(ctx context.Context, flags InstallCmdFlags, rc runtime
return fmt.Errorf("unable to find first valid address: %w", err)
}

// Calculate airgap storage space requirement (2x uncompressed size for controller nodes)
var controllerAirgapStorageSpace string
if flags.airgapBundle != "" {
airgapInfo, err := airgap.AirgapInfoFromPath(flags.airgapBundle)
if err != nil {
return fmt.Errorf("failed to get airgap info: %w", err)
}
// The first installed node is always a controller
controllerAirgapStorageSpace = preflights.CalculateAirgapStorageSpace(airgapInfo.Spec.UncompressedSize, true)
}

opts := preflights.PrepareOptions{
HostPreflightSpec: release.GetHostPreflights(),
ReplicatedAppURL: replicatedAppURL,
ProxyRegistryURL: proxyRegistryURL,
AdminConsolePort: rc.AdminConsolePort(),
LocalArtifactMirrorPort: rc.LocalArtifactMirrorPort(),
DataDir: rc.EmbeddedClusterHomeDirectory(),
K0sDataDir: rc.EmbeddedClusterK0sSubDir(),
OpenEBSDataDir: rc.EmbeddedClusterOpenEBSLocalSubDir(),
Proxy: rc.ProxySpec(),
PodCIDR: rc.PodCIDR(),
ServiceCIDR: rc.ServiceCIDR(),
NodeIP: nodeIP,
IsAirgap: flags.isAirgap,
HostPreflightSpec: release.GetHostPreflights(),
ReplicatedAppURL: replicatedAppURL,
ProxyRegistryURL: proxyRegistryURL,
AdminConsolePort: rc.AdminConsolePort(),
LocalArtifactMirrorPort: rc.LocalArtifactMirrorPort(),
DataDir: rc.EmbeddedClusterHomeDirectory(),
K0sDataDir: rc.EmbeddedClusterK0sSubDir(),
OpenEBSDataDir: rc.EmbeddedClusterOpenEBSLocalSubDir(),
Proxy: rc.ProxySpec(),
PodCIDR: rc.PodCIDR(),
ServiceCIDR: rc.ServiceCIDR(),
NodeIP: nodeIP,
IsAirgap: flags.isAirgap,
ControllerAirgapStorageSpace: controllerAirgapStorageSpace,
}
if globalCIDR := rc.GlobalCIDR(); globalCIDR != "" {
opts.GlobalCIDR = &globalCIDR
Expand Down
Loading
Loading