From 62d66a528673f333e07a0a5dfaabdd31bd813f12 Mon Sep 17 00:00:00 2001 From: Roberto Alsina Date: Mon, 8 Jul 2024 11:46:33 -0300 Subject: [PATCH] Faaso deploy command --- src/commands/deploy.cr | 33 +++++++++++++++++++++++++++------ src/daemon/funko.cr | 5 +++++ src/funko.cr | 16 +++++++++++++--- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/commands/deploy.cr b/src/commands/deploy.cr index 3151863..aafe262 100644 --- a/src/commands/deploy.cr +++ b/src/commands/deploy.cr @@ -1,9 +1,7 @@ module Faaso module Commands struct Deploy - # FIXME: local only for now - def run(options, funko_name : String) : Int32 - Log.info { "Deploying #{funko_name}" } + def local(options, funko_name : String) : Int32 funko = Funko::Funko.from_names([funko_name])[0] # Get scale, check for out-of-date containers current_scale = funko.scale @@ -22,9 +20,9 @@ module Faaso # Failed to start, rollback Log.error(exception: ex) { "Failed to scale, rolling back" } docker_api = Docr::API.new(Docr::Client.new) - new_containers.each do |container| - docker_api.containers.stop(container.id) - docker_api.containers.delete(container.id) + new_containers.each do |container_id| + docker_api.containers.stop(container_id) + docker_api.containers.delete(container_id) end return 1 end @@ -36,6 +34,29 @@ module Faaso Log.info { "Deployed #{funko_name}" } 0 end + + def remote(options, funko_name : String) : Int32 + user, password = Config.auth + Faaso.check_version + Crest.get( + "#{Config.server}funkos/#{funko_name}/deploy/", \ + user: user, password: password) do |response| + loop do + Log.info { response.body_io.gets } + break if response.body_io.closed? + end + end + 0 + end + + def run(options, funko_name : String) : Int32 + Log.info { "Deploying #{funko_name}" } + if options["--local"] + local(options, funko_name) + else + remote(options, funko_name) + end + end end end end diff --git a/src/daemon/funko.cr b/src/daemon/funko.cr index 6973293..8c3bde4 100644 --- a/src/daemon/funko.cr +++ b/src/daemon/funko.cr @@ -24,6 +24,11 @@ module Funko run_faaso(["scale", name, scale], env) end + get "/funkos/:name/deploy" do |env| + name = env.params.url["name"] + run_faaso(["deploy", name], env) + end + # Build image for funko received as "funko.tgz" # TODO: This may take a while, consider using something like # mosquito-cr/mosquito to make it a job queue diff --git a/src/funko.cr b/src/funko.cr index ec26d4f..6f42621 100644 --- a/src/funko.cr +++ b/src/funko.cr @@ -221,12 +221,22 @@ module Funko spawn do loop do if healthy - channel.send(nil) if containers.count { |container| + channel.send(nil) if containers.select { |container| begin - container = docker_api.containers.inspect(container.@id) - channel.send(nil) if !container.nil? && (container.state.health.status == "healthy") + details = docker_api.containers.inspect(container.@id) + if details.nil? + false + elsif details.state.nil? + false + elsif details.state.as(Docr::Types::ContainerState).health.nil? + false + elsif details.state.as(Docr::Types::ContainerState).health.as(Docr::Types::Health).status == "healthy" + true + end + false rescue ex : Docr::Errors::DockerAPIError Log.error { "#{ex}" } unless ex.status_code == 304 # This just happens + false end } == new_scale else