@@ -26,13 +26,20 @@ package command
2626
2727import  (
2828	"github.com/opencurve/curveadm/cli/cli" 
29+ 	comm "github.com/opencurve/curveadm/internal/common" 
2930	"github.com/opencurve/curveadm/internal/configure/topology" 
3031	"github.com/opencurve/curveadm/internal/errno" 
32+ 	"github.com/opencurve/curveadm/internal/playbook" 
33+ 	"github.com/opencurve/curveadm/internal/task/task/common" 
3134	"github.com/opencurve/curveadm/internal/tools" 
3235	"github.com/opencurve/curveadm/internal/utils" 
3336	"github.com/spf13/cobra" 
3437)
3538
39+ var  (
40+ 	ATTACH_LEADER_OR_RANDOM_CONTAINER  =  []int {playbook .ATTACH_LEADER_OR_RANDOM_CONTAINER }
41+ )
42+ 
3643type  enterOptions  struct  {
3744	id  string 
3845}
@@ -43,8 +50,11 @@ func NewEnterCommand(curveadm *cli.CurveAdm) *cobra.Command {
4350	cmd  :=  & cobra.Command {
4451		Use :   "enter ID" ,
4552		Short : "Enter service container" ,
46- 		Args :  utils .ExactArgs (1 ),
53+ 		Args :  utils .RequiresMaxArgs (1 ),
4754		PreRunE : func (cmd  * cobra.Command , args  []string ) error  {
55+ 			if  len (args ) ==  0  {
56+ 				return  nil 
57+ 			}
4858			options .id  =  args [0 ]
4959			return  curveadm .CheckId (options .id )
5060		},
@@ -57,32 +67,83 @@ func NewEnterCommand(curveadm *cli.CurveAdm) *cobra.Command {
5767	return  cmd 
5868}
5969
70+ func  genLeaderOrRandomPlaybook (curveadm  * cli.CurveAdm ,
71+ 	dcs  []* topology.DeployConfig ) (* playbook.Playbook , error ) {
72+ 	if  len (dcs ) ==  0  {
73+ 		return  nil , errno .ERR_NO_SERVICES_MATCHED 
74+ 	}
75+ 
76+ 	steps  :=  ATTACH_LEADER_OR_RANDOM_CONTAINER 
77+ 	pb  :=  playbook .NewPlaybook (curveadm )
78+ 	for  _ , step  :=  range  steps  {
79+ 		pb .AddStep (& playbook.PlaybookStep {
80+ 			Type :    step ,
81+ 			Configs : dcs ,
82+ 			ExecOptions : playbook.ExecOptions {
83+ 				SilentSubBar :  true ,
84+ 				SilentMainBar : true ,
85+ 				SkipError :     true ,
86+ 			},
87+ 		})
88+ 	}
89+ 	return  pb , nil 
90+ }
91+ 
92+ func  checkOrGetId (curveadm  * cli.CurveAdm , dcs  []* topology.DeployConfig , options  enterOptions ) (string , error ) {
93+ 	id  :=  options .id 
94+ 	if  id  !=  ""  {
95+ 		return  id , nil 
96+ 	}
97+ 	pb , err  :=  genLeaderOrRandomPlaybook (curveadm , dcs )
98+ 	if  err  !=  nil  {
99+ 		return  "" , err 
100+ 	}
101+ 	// run playground 
102+ 	err  =  pb .Run ()
103+ 	if  err  !=  nil  {
104+ 		return  "" , err 
105+ 	}
106+ 	// get leader or random container id 
107+ 	value  :=  curveadm .MemStorage ().Get (comm .LEADER_OR_RANDOM_ID )
108+ 	if  value  ==  nil  {
109+ 		return  "" , errno .ERR_NO_LEADER_OR_RANDOM_CONTAINER_FOUND 
110+ 	}
111+ 	id  =  value .(common.Leader0rRandom ).Id 
112+ 	return  id , nil 
113+ }
114+ 
60115func  runEnter (curveadm  * cli.CurveAdm , options  enterOptions ) error  {
61116	// 1) parse cluster topology 
62117	dcs , err  :=  curveadm .ParseTopology ()
63118	if  err  !=  nil  {
64119		return  err 
65120	}
66121
67- 	// 2) filter service 
122+ 	// 2) check id options 
123+ 	id , err  :=  checkOrGetId (curveadm , dcs , options )
124+ 	if  err  !=  nil  {
125+ 		return  err 
126+ 	}
127+ 
128+ 	// 3) filter service 
68129	dcs  =  curveadm .FilterDeployConfig (dcs , topology.FilterOption {
69- 		Id :   options . id ,
130+ 		Id :   id ,
70131		Role : "*" ,
71132		Host : "*" ,
72133	})
73134	if  len (dcs ) ==  0  {
74135		return  errno .ERR_NO_SERVICES_MATCHED 
75136	}
76137
77- 	// 3 ) get container id 
138+ 	// 4 ) get container id 
78139	dc  :=  dcs [0 ]
79140	serviceId  :=  curveadm .GetServiceId (dc .GetId ())
80141	containerId , err  :=  curveadm .GetContainerId (serviceId )
81142	if  err  !=  nil  {
82143		return  err 
83144	}
84145
85- 	// 4) attch  remote container 
146+ 	// 5) attach  remote container 
86147	home  :=  dc .GetProjectLayout ().ServiceRootDir 
87148	return  tools .AttachRemoteContainer (curveadm , dc .GetHost (), containerId , home )
88149}
0 commit comments