@@ -51,12 +51,25 @@ var (
5151 Short : "Retry a failed upgrade of an ArangoDB deployment to a new version" ,
5252 Run : cmdRetryUpgradeRun ,
5353 }
54+ cmdAbort = & cobra.Command {
55+ Use : "abort" ,
56+ Short : "Abort an operation" ,
57+ Run : cmdShowUsage ,
58+ }
59+ cmdAbortUpgrade = & cobra.Command {
60+ Use : "upgrade" ,
61+ Short : "Abort (or remove) an upgrade of an ArangoDB deployment to a new version" ,
62+ Run : cmdAbortUpgradeRun ,
63+ }
5464 upgradeOptions struct {
5565 starterEndpoint string
5666 }
5767 retryUpgradeOptions struct {
5868 starterEndpoint string
5969 }
70+ abortUpgradeOptions struct {
71+ starterEndpoint string
72+ }
6073)
6174
6275func init () {
@@ -66,9 +79,14 @@ func init() {
6679 f = cmdRetryUpgrade .Flags ()
6780 f .StringVar (& retryUpgradeOptions .starterEndpoint , "starter.endpoint" , "" , "The endpoint of the starter to connect to. E.g. http://localhost:8528" )
6881
82+ f = cmdAbortUpgrade .Flags ()
83+ f .StringVar (& abortUpgradeOptions .starterEndpoint , "starter.endpoint" , "" , "The endpoint of the starter to connect to. E.g. http://localhost:8528" )
84+
6985 cmdMain .AddCommand (cmdUpgrade )
7086 cmdMain .AddCommand (cmdRetry )
7187 cmdRetry .AddCommand (cmdRetryUpgrade )
88+ cmdMain .AddCommand (cmdAbort )
89+ cmdAbort .AddCommand (cmdAbortUpgrade )
7290}
7391
7492func cmdUpgradeRun (cmd * cobra.Command , args []string ) {
@@ -79,25 +97,30 @@ func cmdRetryUpgradeRun(cmd *cobra.Command, args []string) {
7997 runUpgrade (retryUpgradeOptions .starterEndpoint , false , true )
8098}
8199
82- func runUpgrade ( starterEndpoint string , force , retry bool ) {
100+ func cmdAbortUpgradeRun ( cmd * cobra. Command , args [] string ) {
83101 // Setup logging
84102 consoleOnly := true
85103 configureLogging (consoleOnly )
86104
87- // Check options
88- if starterEndpoint == "" {
89- log .Fatal ().Msg ("--starter.endpoint must be set" )
90- }
91- ep , err := url .Parse (starterEndpoint )
92- if err != nil {
93- log .Fatal ().Err (err ).Msg ("--starter.endpoint is invalid" )
105+ // Create starter client
106+ c := mustCreateStarterClient (abortUpgradeOptions .starterEndpoint )
107+ ctx := context .Background ()
108+ if err := c .AbortDatabaseUpgrade (ctx ); client .IsNotFound (err ) {
109+ log .Fatal ().Msg ("Database automatic upgrade plan does not exist" )
110+ } else if err != nil {
111+ log .Fatal ().Err (err ).Msg ("Failed to abort database automatic upgrade" )
112+ } else {
113+ log .Info ().Msg ("Database automatic upgrade plan has been removed" )
94114 }
115+ }
116+
117+ func runUpgrade (starterEndpoint string , force , retry bool ) {
118+ // Setup logging
119+ consoleOnly := true
120+ configureLogging (consoleOnly )
95121
96122 // Create starter client
97- c , err := client .NewArangoStarterClient (* ep )
98- if err != nil {
99- log .Fatal ().Err (err ).Msg ("Failed to create Starter client" )
100- }
123+ c := mustCreateStarterClient (starterEndpoint )
101124 ctx := context .Background ()
102125 if retry {
103126 if err := c .RetryDatabaseUpgrade (ctx ); err != nil {
@@ -116,21 +139,30 @@ func runUpgrade(starterEndpoint string, force, retry bool) {
116139 finished := ""
117140 for {
118141 status , err := c .UpgradeStatus (ctx )
119- if err != nil {
120- log .Error ().Err (err ).Msg ("Failed to fetch upgrade status" )
121- }
122- if status .Failed {
123- log .Error ().Str ("reason" , status .Reason ).Msg ("Database upgrade has failed" )
124- return
125- }
126- if status .Ready {
127- log .Info ().Msg ("Database upgrade has finished" )
142+ if client .IsNotFound (err ) {
143+ // Upgrade plan is gone
144+ log .Error ().Msg ("Upgrade plan is gone." )
128145 return
129- }
130- r , f := formatServerStatusList (status .ServersRemaining ), formatServerStatusList (status .ServersUpgraded )
131- if remaining != r || finished != f {
132- remaining , finished = r , f
133- log .Info ().Msgf ("Servers upgraded: %s, remaining servers: %s" , finished , remaining )
146+ } else if err != nil {
147+ log .Error ().Err (err ).Msg ("Failed to fetch upgrade status" )
148+ } else {
149+ if status .Failed {
150+ log .Error ().Str ("reason" , status .Reason ).Msg ("Database upgrade has failed" )
151+ return
152+ }
153+ if status .Ready {
154+ log .Info ().Msg ("Database upgrade has finished" )
155+ // Let's remove the plan now
156+ if err := c .AbortDatabaseUpgrade (ctx ); err != nil {
157+ log .Warn ().Err (err ).Msg ("Failed to remove upgrade plan" )
158+ }
159+ return
160+ }
161+ r , f := formatServerStatusList (status .ServersRemaining ), formatServerStatusList (status .ServersUpgraded )
162+ if remaining != r || finished != f {
163+ remaining , finished = r , f
164+ log .Info ().Msgf ("Servers upgraded: %s, remaining servers: %s" , finished , remaining )
165+ }
134166 }
135167 time .Sleep (time .Second )
136168 }
@@ -161,3 +193,23 @@ func formatServerStatusList(list []client.UpgradeStatusServer) string {
161193 })
162194 return strings .Join (strList , ", " )
163195}
196+
197+ // mustCreateStarterClient creates a client for a starter at the given endpoint.
198+ // Any errors cause the process to exit.
199+ func mustCreateStarterClient (endpoint string ) client.API {
200+ // Check options
201+ if endpoint == "" {
202+ log .Fatal ().Msg ("--starter.endpoint must be set" )
203+ }
204+ ep , err := url .Parse (endpoint )
205+ if err != nil {
206+ log .Fatal ().Err (err ).Msg ("--starter.endpoint is invalid" )
207+ }
208+
209+ // Create starter client
210+ c , err := client .NewArangoStarterClient (* ep )
211+ if err != nil {
212+ log .Fatal ().Err (err ).Msg ("Failed to create Starter client" )
213+ }
214+ return c
215+ }
0 commit comments