From 6eb9c49c22f7d9e3c724574bb81bd5b25ed8725f Mon Sep 17 00:00:00 2001 From: Roberto Alsina Date: Fri, 5 Jul 2024 00:13:13 -0300 Subject: [PATCH] Return success/failure in commands uniformly --- src/commands/build.cr | 5 +++-- src/commands/export.cr | 3 ++- src/commands/new.cr | 26 ++++++++++++++++++++------ src/commands/scale.cr | 12 +++++++----- src/commands/secret.cr | 10 ++++++---- src/commands/status.cr | 10 ++++++---- src/main.cr | 15 +++++++++------ 7 files changed, 53 insertions(+), 28 deletions(-) diff --git a/src/commands/build.cr b/src/commands/build.cr index d06b19f..405e310 100644 --- a/src/commands/build.cr +++ b/src/commands/build.cr @@ -2,7 +2,7 @@ module Faaso module Commands # Build images for one or more funkos from source struct Build - def run(options, folders : Array(String)) + def run(options, folders : Array(String)) : Int32 funkos = Funko::Funko.from_paths(folders) if options["--local"] @@ -58,10 +58,11 @@ module Faaso body = JSON.parse(ex.response.body) Log.info { body["stdout"] } Log.error { body["stderr"] } - exit 1 + return 1 end end end + 0 end end end diff --git a/src/commands/export.cr b/src/commands/export.cr index a9ae80d..15183ad 100644 --- a/src/commands/export.cr +++ b/src/commands/export.cr @@ -1,7 +1,7 @@ module Faaso module Commands struct Export - def run(options, source : String, destination : String) + def run(options, source : String, destination : String) : Int32 funko = Funko::Funko.from_paths([source])[0] # Create temporary build location dst_path = destination @@ -12,6 +12,7 @@ module Faaso Log.info { "Exporting #{funko.path} to #{dst_path}" } Dir.mkdir_p(dst_path) funko.prepare_build Path[dst_path] + 0 end end end diff --git a/src/commands/new.cr b/src/commands/new.cr index 9c31307..44b6e57 100644 --- a/src/commands/new.cr +++ b/src/commands/new.cr @@ -7,17 +7,31 @@ module Faaso @@known : Array(String) = {{`find ./runtimes -type d -mindepth 1`.split('\n').reject(&.empty?)}} @@filelist : Array(String) = {{`find ./runtimes -type f -mindepth 1`.split('\n').reject(&.empty?)}} - def run(options, folder) - Log.debug { "@@known: #{@@known}"} - Log.debug { "@@filelist: #{@@filelist}"} - if options["-r"].as(String) == "list" + def run(options, folder) : Int32 + Log.debug { "@@known: #{@@known}" } + Log.debug { "@@filelist: #{@@filelist}" } + + runtime = options["-r"].as(String) + # Give a list of known runtimes + if runtime == "list" Log.info { "Crystal has some included runtimes:\n" } - @@known.each do |runtime| - Log.info { " * #{Path[runtime].basename}" } + @@known.each do |i| + Log.info { " * #{Path[i].basename}" } end Log.info { "\nOr if you have your own, use a folder name" } return 0 end + + # Create folder with a preconfigured funko for this runtime + if @@known.includes? "./runtimes/#{runtime}" + Log.info { "Using known runtime #{runtime}" } + elsif File.exists? runtime + Log.info { "Using directory #{runtime} as runtime" } + else + Log.error { "Can't find runtime #{runtime}" } + return 1 + end + 0 end end end diff --git a/src/commands/scale.cr b/src/commands/scale.cr index 0128e06..bef35ea 100644 --- a/src/commands/scale.cr +++ b/src/commands/scale.cr @@ -10,7 +10,7 @@ module Faaso # In both cases stopped instances after the required # scale is reached are deleted. struct Scale - def local(options, name, scale) + def local(options, name, scale) : Int32 funko = Funko::Funko.from_names([name])[0] # Asked about scale if !scale @@ -20,12 +20,13 @@ module Faaso # Asked to set scale if funko.image_history.empty? Log.error { "Error: no images available for #{funko.name}:latest" } - exit 1 + return 1 end funko.scale(scale.as(String).to_i) + 0 end - def remote(options, name, scale) + def remote(options, name, scale) : Int32 if !scale response = Crest.get( "#{FAASO_SERVER}funkos/#{name}/scale/", \ @@ -37,14 +38,15 @@ module Faaso end body = JSON.parse(response.body) Log.info { body["output"] } + 0 rescue ex : Crest::InternalServerError Log.error { "Error scaling funko #{name}" } body = JSON.parse(ex.response.body) Log.info { body["output"] } - exit 1 + 1 end - def run(options, name, scale) + def run(options, name, scale) : Int32 if options["--local"] return local(options, name, scale) end diff --git a/src/commands/secret.cr b/src/commands/secret.cr index 9015ab5..6e1aca7 100644 --- a/src/commands/secret.cr +++ b/src/commands/secret.cr @@ -1,7 +1,7 @@ module Faaso module Commands struct Secret - def local(options, funko, name, secret) + def local(options, funko, name, secret) : Int32 if options["--add"] dst_dir = "secrets/#{funko}" Dir.mkdir_p(dst_dir) unless Dir.exists?(dst_dir) @@ -9,9 +9,10 @@ module Faaso elsif options["--delete"] File.delete("secrets/#{funko}/#{name}") end + 0 end - def remote(options, funko, name, secret) + def remote(options, funko, name, secret) : Int32 if options["--add"] Crest.post( "#{FAASO_SERVER}secrets/", @@ -26,12 +27,13 @@ module Faaso "#{FAASO_SERVER}secrets/#{funko}/#{name}", user: "admin", password: "admin") end + 0 rescue ex : Crest::RequestFailed Log.error { "Error #{ex.response.status_code}" } - exit 1 + 1 end - def run(options, funko, name) + def run(options, funko, name) : Int32 if options["--add"] Log.info { "Enter the secret, end with Ctrl-D" } if STDIN.tty? secret = STDIN.gets_to_end diff --git a/src/commands/status.cr b/src/commands/status.cr index 038eac4..ab802d3 100644 --- a/src/commands/status.cr +++ b/src/commands/status.cr @@ -1,7 +1,7 @@ module Faaso module Commands struct Status - def local(options, name) + def local(options, name) : Int32 funko = Funko::Funko.from_names([name])[0] status = funko.docker_status @@ -17,22 +17,24 @@ module Faaso status.images.each do |image| Log.info { " #{image.repo_tags} #{Time.unix(image.created)}" } end + 0 end - def remote(options, name) + def remote(options, name) : Int32 response = Crest.get( "#{FAASO_SERVER}funkos/#{name}/status/", \ user: "admin", password: "admin") body = JSON.parse(response.body) Log.info { body["output"] } + 0 rescue ex : Crest::InternalServerError Log.error { "Error scaling funko #{name}" } body = JSON.parse(ex.response.body) Log.info { body["output"] } - exit 1 + 1 end - def run(options, name) + def run(options, name) : Int32 if options["--local"] return local(options, name) end diff --git a/src/main.cr b/src/main.cr index 4b9372a..ce239e6 100644 --- a/src/main.cr +++ b/src/main.cr @@ -67,17 +67,20 @@ ans = Docopt.docopt(doc, ARGV) LogFormat.setup(ans["-v"].to_s.to_i) Log.debug { ans } +status : Int32 = 0 case ans when .fetch("build", false) - Faaso::Commands::Build.new.run(ans, ans["FOLDER"].as(Array(String))) + status = Faaso::Commands::Build.new.run(ans, ans["FOLDER"].as(Array(String))) when .fetch("export", false) - Faaso::Commands::Export.new.run(ans, ans["SOURCE"].as(String), ans["DESTINATION"].as(String)) + status = Faaso::Commands::Export.new.run(ans, ans["SOURCE"].as(String), ans["DESTINATION"].as(String)) when .fetch("new", false) - Faaso::Commands::New.new.run(ans, ans["FOLDER"].as(Array(String))[0]) + status = Faaso::Commands::New.new.run(ans, ans["FOLDER"].as(Array(String))[0]) when .fetch("scale", false) - Faaso::Commands::Scale.new.run(ans, ans["FUNKO"].as(String), ans["SCALE"]) + status = Faaso::Commands::Scale.new.run(ans, ans["FUNKO"].as(String), ans["SCALE"]) when .fetch("secret", false) - Faaso::Commands::Secret.new.run(ans, ans["FUNKO"].as(String), ans["SECRET"].as(String)) + status = Faaso::Commands::Secret.new.run(ans, ans["FUNKO"].as(String), ans["SECRET"].as(String)) when .fetch("status", false) - Faaso::Commands::Status.new.run(ans, ans["FUNKO"].as(String)) + status = Faaso::Commands::Status.new.run(ans, ans["FUNKO"].as(String)) end + +exit(status)