@@ -31,6 +31,7 @@ import (
31
31
"github.com/ava-labs/avalanche-cli/pkg/utils"
32
32
"github.com/ava-labs/avalanche-cli/pkg/ux"
33
33
"github.com/ava-labs/avalanche-cli/pkg/vm"
34
+ sdkUtils "github.com/ava-labs/avalanche-cli/sdk/utils"
34
35
"github.com/ava-labs/avalanchego/ids"
35
36
"github.com/ava-labs/avalanchego/staking"
36
37
"github.com/ava-labs/avalanchego/utils/logging"
@@ -661,7 +662,6 @@ func createNodes(cmd *cobra.Command, args []string) error {
661
662
}
662
663
return fmt .Errorf ("failed to provision node(s) %s" , failedHosts .GetNodeList ())
663
664
}
664
- ux .Logger .PrintToUser ("Starting bootstrap process on the newly created Avalanche node(s)..." )
665
665
wg := sync.WaitGroup {}
666
666
wgResults := models.NodeResults {}
667
667
spinSession := ux .NewUserSpinner ()
@@ -672,6 +672,7 @@ func createNodes(cmd *cobra.Command, args []string) error {
672
672
}
673
673
startTime := time .Now ()
674
674
if addMonitoring {
675
+ spinSession := ux .NewUserSpinner ()
675
676
if len (monitoringHosts ) != 1 {
676
677
return fmt .Errorf ("expected only one monitoring host, found %d" , len (monitoringHosts ))
677
678
}
@@ -682,116 +683,91 @@ func createNodes(cmd *cobra.Command, args []string) error {
682
683
go func (nodeResults * models.NodeResults , monitoringHost * models.Host ) {
683
684
defer wg .Done ()
684
685
if err := monitoringHost .Connect (0 ); err != nil {
685
- nodeResults .AddResult (monitoringHost .NodeID , nil , err )
686
+ nodeResults .AddResult (monitoringHost .IP , nil , err )
686
687
return
687
688
}
688
- spinner := spinSession .SpinToUser (utils .ScriptLog (monitoringHost .NodeID , "Setup Monitoring" ))
689
+ spinner := spinSession .SpinToUser (utils .ScriptLog (monitoringHost .IP , "Setup Monitoring" ))
689
690
if err = app .SetupMonitoringEnv (); err != nil {
690
- nodeResults .AddResult (monitoringHost .NodeID , nil , err )
691
+ nodeResults .AddResult (monitoringHost .IP , nil , err )
691
692
ux .SpinFailWithError (spinner , "" , err )
692
693
return
693
694
}
694
695
if err = ssh .RunSSHSetupDockerService (monitoringHost ); err != nil {
695
- nodeResults .AddResult (monitoringHost .NodeID , nil , err )
696
+ nodeResults .AddResult (monitoringHost .IP , nil , err )
696
697
ux .SpinFailWithError (spinner , "" , err )
697
698
return
698
699
}
699
700
ux .Logger .Info ("SetupMonitoringEnv RunSSHSetupDockerService completed" )
700
701
if err = ssh .RunSSHSetupMonitoringFolders (monitoringHost ); err != nil {
701
- nodeResults .AddResult (monitoringHost .NodeID , nil , err )
702
+ nodeResults .AddResult (monitoringHost .IP , nil , err )
702
703
ux .SpinFailWithError (spinner , "" , err )
703
704
return
704
705
}
705
706
ux .Logger .Info ("RunSSHSetupMonitoringFolders completed" )
706
707
if err := ssh .RunSSHCopyMonitoringDashboards (monitoringHost , app .GetMonitoringDashboardDir ()+ "/" ); err != nil {
707
- nodeResults .AddResult (monitoringHost .NodeID , nil , err )
708
+ nodeResults .AddResult (monitoringHost .IP , nil , err )
708
709
ux .SpinFailWithError (spinner , "" , err )
709
710
return
710
711
}
711
712
ux .Logger .Info ("RunSSHCopyMonitoringDashboards completed" )
712
713
if err := ssh .RunSSHSetupPrometheusConfig (monitoringHost , avalancheGoPorts , machinePorts , ltPorts ); err != nil {
713
- nodeResults .AddResult (monitoringHost .NodeID , nil , err )
714
+ nodeResults .AddResult (monitoringHost .IP , nil , err )
714
715
ux .SpinFailWithError (spinner , "" , err )
715
716
return
716
717
}
717
718
ux .Logger .Info ("RunSSHSetupPrometheusConfig completed" )
718
719
if err := ssh .RunSSHSetupLokiConfig (monitoringHost , constants .AvalancheGoLokiPort ); err != nil {
719
- nodeResults .AddResult (monitoringHost .NodeID , nil , err )
720
+ nodeResults .AddResult (monitoringHost .IP , nil , err )
720
721
ux .SpinFailWithError (spinner , "" , err )
721
722
return
722
723
}
723
724
ux .Logger .Info ("RunSSHSetupLokiConfig completed" )
724
725
if err := docker .ComposeSSHSetupMonitoring (monitoringHost ); err != nil {
725
- nodeResults .AddResult (monitoringHost .NodeID , nil , err )
726
+ nodeResults .AddResult (monitoringHost .IP , nil , err )
726
727
ux .SpinFailWithError (spinner , "" , err )
727
728
return
728
729
}
729
730
ux .Logger .Info ("ComposeSSHSetupMonitoring completed" )
730
731
ux .SpinComplete (spinner )
731
732
}(& wgResults , monitoringHost )
732
733
}
734
+ wg .Wait ()
735
+ spinSession .Stop ()
733
736
}
734
737
for _ , host := range hosts {
735
- wg .Add (1 )
736
- go func (nodeResults * models.NodeResults , host * models.Host ) {
737
- defer wg .Done ()
738
- if err := host .Connect (0 ); err != nil {
739
- nodeResults .AddResult (host .NodeID , nil , err )
740
- return
741
- }
742
- if err := provideStakingCertAndKey (host ); err != nil {
743
- nodeResults .AddResult (host .NodeID , nil , err )
744
- return
745
- }
746
- spinner := spinSession .SpinToUser (utils .ScriptLog (host .NodeID , "Setup Node" ))
747
- if err := ssh .RunSSHSetupNode (host , app .Conf .GetConfigPath ()); err != nil {
748
- nodeResults .AddResult (host .NodeID , nil , err )
749
- ux .SpinFailWithError (spinner , "" , err )
750
- return
751
- }
752
- if err := ssh .RunSSHSetupDockerService (host ); err != nil {
753
- nodeResults .AddResult (host .NodeID , nil , err )
754
- ux .SpinFailWithError (spinner , "" , err )
755
- return
756
- }
757
- ux .SpinComplete (spinner )
758
- if addMonitoring {
759
- cloudID := host .GetCloudID ()
760
- nodeID , err := getNodeID (app .GetNodeInstanceDirPath (cloudID ))
761
- if err != nil {
762
- nodeResults .AddResult (host .NodeID , nil , err )
763
- ux .SpinFailWithError (spinner , "" , err )
764
- return
765
- }
766
- if err = ssh .RunSSHSetupPromtailConfig (host , monitoringNodeConfig .PublicIPs [0 ], constants .AvalancheGoLokiPort , cloudID , nodeID .String (), "" ); err != nil {
767
- nodeResults .AddResult (host .NodeID , nil , err )
768
- ux .SpinFailWithError (spinner , "" , err )
769
- return
738
+ publicAccessToHTTPPort := slices .Contains (cloudConfigMap .GetAllAPIInstanceIDs (), host .GetCloudID ()) || publicHTTPPortAccess
739
+ host .APINode = publicAccessToHTTPPort
740
+ }
741
+ if err = setup (hosts , avalancheGoVersion , network ); err != nil {
742
+ return err
743
+ }
744
+ if addMonitoring {
745
+ spinSession := ux .NewUserSpinner ()
746
+ for _ , host := range hosts {
747
+ wg .Add (1 )
748
+ go func (nodeResults * models.NodeResults , host * models.Host ) {
749
+ defer wg .Done ()
750
+ spinner := spinSession .SpinToUser (utils .ScriptLog (host .IP , "Add Monitoring" ))
751
+ if addMonitoring {
752
+ cloudID := host .GetCloudID ()
753
+ nodeID , err := getNodeID (app .GetNodeInstanceDirPath (cloudID ))
754
+ if err != nil {
755
+ nodeResults .AddResult (host .IP , nil , err )
756
+ ux .SpinFailWithError (spinner , "" , err )
757
+ return
758
+ }
759
+ if err = ssh .RunSSHSetupPromtailConfig (host , monitoringNodeConfig .PublicIPs [0 ], constants .AvalancheGoLokiPort , cloudID , nodeID .String (), "" ); err != nil {
760
+ nodeResults .AddResult (host .IP , nil , err )
761
+ ux .SpinFailWithError (spinner , "" , err )
762
+ return
763
+ }
764
+ ux .SpinComplete (spinner )
770
765
}
771
- ux .SpinComplete (spinner )
772
- }
773
- spinner = spinSession .SpinToUser (utils .ScriptLog (host .NodeID , "Setup AvalancheGo" ))
774
- // check if host is a API host
775
- publicAccessToHTTPPort := slices .Contains (cloudConfigMap .GetAllAPIInstanceIDs (), host .GetCloudID ()) || publicHTTPPortAccess
776
- if err := docker .ComposeSSHSetupNode (host ,
777
- network ,
778
- avalancheGoVersion ,
779
- bootstrapIDs ,
780
- bootstrapIPs ,
781
- partialSync ,
782
- genesisPath ,
783
- upgradePath ,
784
- addMonitoring ,
785
- publicAccessToHTTPPort ,
786
- ); err != nil {
787
- nodeResults .AddResult (host .NodeID , nil , err )
788
- ux .SpinFailWithError (spinner , "" , err )
789
- return
790
- }
791
- ux .SpinComplete (spinner )
792
- }(& wgResults , host )
766
+ }(& wgResults , host )
767
+ }
768
+ wg .Wait ()
769
+ spinSession .Stop ()
793
770
}
794
- wg .Wait ()
795
771
ux .Logger .Info ("Create and setup nodes time took: %s" , time .Since (startTime ))
796
772
spinSession .Stop ()
797
773
if network .Kind == models .Devnet {
@@ -800,8 +776,8 @@ func createNodes(cmd *cobra.Command, args []string) error {
800
776
}
801
777
}
802
778
for _ , node := range hosts {
803
- if wgResults .HasNodeIDWithError (node .NodeID ) {
804
- ux .Logger .RedXToUser ("Node %s is ERROR with error: %s" , node .NodeID , wgResults .GetErrorHostMap ()[node .NodeID ])
779
+ if wgResults .HasIDWithError (node .IP ) {
780
+ ux .Logger .RedXToUser ("Node %s is ERROR with error: %s" , node .IP , wgResults .GetErrorHostMap ()[node .IP ])
805
781
}
806
782
}
807
783
@@ -1033,18 +1009,38 @@ func generateNodeCertAndKeys(stakerCertFilePath, stakerKeyFilePath, blsKeyFilePa
1033
1009
}
1034
1010
1035
1011
func provideStakingCertAndKey (host * models.Host ) error {
1036
- instanceID := host .GetCloudID ()
1037
- keyPath := filepath .Join (app .GetNodesDir (), instanceID )
1012
+ keyPath := app .GetNodeStakingDir (host .IP )
1013
+ if sdkUtils .DirExists (keyPath ) && ! overrideExisting {
1014
+ yes , err := app .Prompt .CaptureNoYes (fmt .Sprintf ("Directory %s alreday exists. Do you want to override it?" , keyPath ))
1015
+ if err != nil {
1016
+ return err
1017
+ }
1018
+ if ! yes {
1019
+ return nil
1020
+ }
1021
+ }
1038
1022
nodeID , err := generateNodeCertAndKeys (
1039
1023
filepath .Join (keyPath , constants .StakerCertFileName ),
1040
1024
filepath .Join (keyPath , constants .StakerKeyFileName ),
1041
1025
filepath .Join (keyPath , constants .BLSKeyFileName ),
1042
1026
)
1043
1027
if err != nil {
1044
- ux .Logger .PrintToUser ("Failed to generate staking keys for host %s" , instanceID )
1028
+ ux .Logger .PrintToUser ("Failed to generate staking keys for host %s" , host . IP )
1045
1029
return err
1046
1030
} else {
1047
- ux .Logger .GreenCheckmarkToUser ("Generated staking keys for host %s[%s] " , instanceID , nodeID .String ())
1031
+ ux .Logger .GreenCheckmarkToUser ("Generated staking keys for host %s[%s] " , host .IP , nodeID .String ())
1032
+ }
1033
+ instanceID := host .GetCloudID ()
1034
+ if instanceID != "" {
1035
+ if err := utils .FileCopy (filepath .Join (keyPath , constants .StakerCertFileName ), filepath .Join (app .GetNodesDir (), instanceID , constants .StakerCertFileName )); err != nil {
1036
+ return err
1037
+ }
1038
+ if err := utils .FileCopy (filepath .Join (keyPath , constants .StakerKeyFileName ), filepath .Join (app .GetNodesDir (), instanceID , constants .StakerKeyFileName )); err != nil {
1039
+ return err
1040
+ }
1041
+ if err := utils .FileCopy (filepath .Join (keyPath , constants .BLSKeyFileName ), filepath .Join (app .GetNodesDir (), instanceID , constants .BLSKeyFileName )); err != nil {
1042
+ return err
1043
+ }
1048
1044
}
1049
1045
return ssh .RunSSHUploadStakingFiles (host , keyPath )
1050
1046
}
@@ -1214,9 +1210,9 @@ func waitForHosts(hosts []*models.Host) *models.NodeResults {
1214
1210
createdWaitGroup .Add (1 )
1215
1211
go func (nodeResults * models.NodeResults , host * models.Host ) {
1216
1212
defer createdWaitGroup .Done ()
1217
- spinner := spinSession .SpinToUser (utils .ScriptLog (host .NodeID , "Waiting for instance response" ))
1213
+ spinner := spinSession .SpinToUser (utils .ScriptLog (host .IP , "Waiting for instance response" ))
1218
1214
if err := host .WaitForSSHShell (constants .SSHServerStartTimeout ); err != nil {
1219
- nodeResults .AddResult (host .NodeID , nil , err )
1215
+ nodeResults .AddResult (host .IP , nil , err )
1220
1216
ux .SpinFailWithError (spinner , "" , err )
1221
1217
return
1222
1218
}
0 commit comments