@@ -70,7 +70,6 @@ type InstallCmdFlags struct {
70
70
dataDir string
71
71
licenseFile string
72
72
localArtifactMirrorPort int
73
- guidedUI bool
74
73
assumeYes bool
75
74
overrides string
76
75
privateCAs []string
@@ -82,6 +81,10 @@ type InstallCmdFlags struct {
82
81
license * kotsv1beta1.License
83
82
proxy * ecv1beta1.ProxySpec
84
83
cidrCfg * newconfig.CIDRConfig
84
+
85
+ // guided UI flags
86
+ managerPort int
87
+ guidedUI bool
85
88
}
86
89
87
90
// InstallCmd returns a cobra command for installing the embedded cluster.
@@ -146,6 +149,9 @@ func InstallCmd(ctx context.Context, name string) *cobra.Command {
146
149
if err := addInstallAdminConsoleFlags (cmd , & flags ); err != nil {
147
150
panic (err )
148
151
}
152
+ if err := addGuidedUIFlags (cmd , & flags ); err != nil {
153
+ panic (err )
154
+ }
149
155
150
156
cmd .AddCommand (InstallRunPreflightsCmd (ctx , name ))
151
157
@@ -157,7 +163,6 @@ func addInstallFlags(cmd *cobra.Command, flags *InstallCmdFlags) error {
157
163
cmd .Flags ().StringVar (& flags .dataDir , "data-dir" , ecv1beta1 .DefaultDataDir , "Path to the data directory" )
158
164
cmd .Flags ().IntVar (& flags .localArtifactMirrorPort , "local-artifact-mirror-port" , ecv1beta1 .DefaultLocalArtifactMirrorPort , "Port on which the Local Artifact Mirror will be served" )
159
165
cmd .Flags ().StringVar (& flags .networkInterface , "network-interface" , "" , "The network interface to use for the cluster" )
160
- cmd .Flags ().BoolVarP (& flags .guidedUI , "guided-ui" , "g" , false , "Run the installation in guided UI mode." )
161
166
cmd .Flags ().BoolVarP (& flags .assumeYes , "yes" , "y" , false , "Assume yes to all prompts." )
162
167
cmd .Flags ().SetNormalizeFunc (normalizeNoPromptToYes )
163
168
@@ -199,6 +204,20 @@ func addInstallAdminConsoleFlags(cmd *cobra.Command, flags *InstallCmdFlags) err
199
204
return nil
200
205
}
201
206
207
+ func addGuidedUIFlags (cmd * cobra.Command , flags * InstallCmdFlags ) error {
208
+ cmd .Flags ().BoolVarP (& flags .guidedUI , "guided-ui" , "g" , false , "Run the installation in guided UI mode." )
209
+ cmd .Flags ().IntVar (& flags .managerPort , "manager-port" , ecv1beta1 .DefaultManagerPort , "Port on which the Manager will be served" )
210
+
211
+ if err := cmd .Flags ().MarkHidden ("guided-ui" ); err != nil {
212
+ return err
213
+ }
214
+ if err := cmd .Flags ().MarkHidden ("manager-port" ); err != nil {
215
+ return err
216
+ }
217
+
218
+ return nil
219
+ }
220
+
202
221
func preRunInstall (cmd * cobra.Command , flags * InstallCmdFlags ) error {
203
222
if os .Getuid () != 0 {
204
223
return fmt .Errorf ("install command must be run as root" )
@@ -235,19 +254,17 @@ func preRunInstall(cmd *cobra.Command, flags *InstallCmdFlags) error {
235
254
return err
236
255
}
237
256
238
- // TODO: implement guided UI
239
257
if flags .guidedUI {
240
258
configChan := make (chan * apitypes.InstallationConfig )
241
259
defer close (configChan )
242
260
243
- if err := preRunInstallAPI (cmd .Context (), flags .adminConsolePassword , configChan ); err != nil {
261
+ if err := preRunInstallAPI (cmd .Context (), flags .adminConsolePassword , flags . managerPort , configChan ); err != nil {
244
262
return fmt .Errorf ("unable to start install API: %w" , err )
245
263
}
246
264
247
- // TODO: fix this message to have the correct address
248
- logrus .Info ("" )
249
- logrus .Info ("Visit http://localhost:30080/ to configure your cluster" )
265
+ // TODO: fix this message
250
266
logrus .Info ("" )
267
+ logrus .Infof ("Visit %s to configure your cluster" , getManagerURL (flags .managerPort ))
251
268
252
269
installConfig , ok := <- configChan
253
270
if ! ok {
@@ -281,9 +298,6 @@ func preRunInstall(cmd *cobra.Command, flags *InstallCmdFlags) error {
281
298
flags .dataDir = installConfig .DataDirectory
282
299
flags .localArtifactMirrorPort = installConfig .LocalArtifactMirrorPort
283
300
284
- runtimeconfig .SetDataDir (installConfig .DataDirectory )
285
- runtimeconfig .SetLocalArtifactMirrorPort (installConfig .LocalArtifactMirrorPort )
286
- runtimeconfig .SetAdminConsolePort (installConfig .AdminConsolePort )
287
301
} else {
288
302
proxy , err := parseProxyFlags (cmd )
289
303
if err != nil {
@@ -310,9 +324,19 @@ func preRunInstall(cmd *cobra.Command, flags *InstallCmdFlags) error {
310
324
}
311
325
}
312
326
313
- runtimeconfig .ApplyFlags (cmd .Flags ())
327
+ if flags .localArtifactMirrorPort != 0 && flags .adminConsolePort != 0 {
328
+ if flags .localArtifactMirrorPort == flags .adminConsolePort {
329
+ return fmt .Errorf ("local artifact mirror port cannot be the same as admin console port" )
330
+ }
331
+ }
314
332
}
315
333
334
+ // TODO: validate that a single port isn't used for multiple services
335
+ runtimeconfig .SetDataDir (flags .dataDir )
336
+ runtimeconfig .SetManagerPort (flags .managerPort )
337
+ runtimeconfig .SetLocalArtifactMirrorPort (flags .localArtifactMirrorPort )
338
+ runtimeconfig .SetAdminConsolePort (flags .adminConsolePort )
339
+
316
340
os .Setenv ("KUBECONFIG" , runtimeconfig .PathToKubeConfig ()) // this is needed for restore as well since it shares this function
317
341
os .Setenv ("TMPDIR" , runtimeconfig .EmbeddedClusterTmpSubDir ())
318
342
@@ -336,13 +360,13 @@ func preRunInstall(cmd *cobra.Command, flags *InstallCmdFlags) error {
336
360
return nil
337
361
}
338
362
339
- func preRunInstallAPI (ctx context.Context , password string , configChan chan <- * apitypes.InstallationConfig ) error {
363
+ func preRunInstallAPI (ctx context.Context , password string , managerPort int , configChan chan <- * apitypes.InstallationConfig ) error {
340
364
logger , err := api .NewLogger ()
341
365
if err != nil {
342
366
logrus .Warnf ("Unable to setup API logging: %v" , err )
343
367
}
344
368
345
- listener , err := net .Listen ("tcp" , ":30080" ) // TODO: make this configurable
369
+ listener , err := net .Listen ("tcp" , fmt . Sprintf ( ":%d" , managerPort ))
346
370
if err != nil {
347
371
return fmt .Errorf ("unable to create listener: %w" , err )
348
372
}
@@ -548,7 +572,7 @@ func runInstall(ctx context.Context, name string, flags InstallCmdFlags, metrics
548
572
}
549
573
550
574
if flags .guidedUI {
551
- if err := markUIInstallComplete (ctx , flags .adminConsolePassword ); err != nil {
575
+ if err := markUIInstallComplete (flags . adminConsolePassword , flags .managerPort ); err != nil {
552
576
return fmt .Errorf ("unable to mark ui install complete: %w" , err )
553
577
}
554
578
} else {
@@ -560,8 +584,8 @@ func runInstall(ctx context.Context, name string, flags InstallCmdFlags, metrics
560
584
return nil
561
585
}
562
586
563
- func markUIInstallComplete (ctx context. Context , password string ) error {
564
- apiClient := apiclient .New ("http://localhost:30080" ) // TODO: make this configurable
587
+ func markUIInstallComplete (password string , managerPort int ) error {
588
+ apiClient := apiclient .New (fmt . Sprintf ( "http://localhost:%d" , managerPort ))
565
589
if err := apiClient .Login (password ); err != nil {
566
590
return fmt .Errorf ("unable to login: %w" , err )
567
591
}
@@ -1489,14 +1513,31 @@ func printSuccessMessage(license *kotsv1beta1.License, networkInterface string)
1489
1513
return nil
1490
1514
}
1491
1515
1516
+ func getManagerURL (port int ) string {
1517
+ ipaddr := runtimeconfig .TryDiscoverPublicIP ()
1518
+ if ipaddr == "" {
1519
+ if addr := os .Getenv ("EC_PUBLIC_ADDRESS" ); addr != "" {
1520
+ ipaddr = addr
1521
+ } else {
1522
+ logrus .Errorf ("Unable to determine node IP address" )
1523
+ ipaddr = "NODE-IP-ADDRESS"
1524
+ }
1525
+ }
1526
+ return fmt .Sprintf ("http://%s:%v" , ipaddr , port )
1527
+ }
1528
+
1492
1529
func getAdminConsoleURL (networkInterface string , port int ) string {
1493
1530
ipaddr := runtimeconfig .TryDiscoverPublicIP ()
1494
1531
if ipaddr == "" {
1495
1532
var err error
1496
1533
ipaddr , err = netutils .FirstValidAddress (networkInterface )
1497
1534
if err != nil {
1498
- logrus .Errorf ("Unable to determine node IP address: %v" , err )
1499
- ipaddr = "NODE-IP-ADDRESS"
1535
+ if addr := os .Getenv ("EC_PUBLIC_ADDRESS" ); addr != "" {
1536
+ ipaddr = addr
1537
+ } else {
1538
+ logrus .Errorf ("Unable to determine node IP address: %v" , err )
1539
+ ipaddr = "NODE-IP-ADDRESS"
1540
+ }
1500
1541
}
1501
1542
}
1502
1543
return fmt .Sprintf ("http://%s:%v" , ipaddr , port )
0 commit comments