Initial template and merge code

This commit is contained in:
Roberto Alsina 2024-06-28 16:24:52 -03:00
parent 25da2b2e5b
commit 9fb4d7cd04
10 changed files with 35 additions and 68 deletions

View File

@ -32,11 +32,11 @@ It should:
* Start/reload/configure the proxy as needed
* Periodically check the functions are still running
Intentionally: No HA yet, no multiple instances of functions, no
Intentionally: No HA yet, no multiple instances of functions, no
up/downscaling, no multiple versions routed by header.
# Implementation Ideas
* caddy for proxy? It's simple, fast, API-configurable.
* Local docker registry for images? See https://www.docker.com/blog/how-to-use-your-own-registry-2/
* Maybe grip for crystal template? Maybe kemal?
* Maybe grip for crystal template? Maybe kemal?

View File

@ -0,0 +1,3 @@
get "/" do
"Hello World!"
end

View File

@ -1,4 +1,6 @@
require "commander"
require "file_utils"
require "uuid"
# TODO: Write documentation for `Faaso`
module Faaso
@ -19,7 +21,15 @@ module Faaso
puts "Building function... #{arg}"
# A function is a folder with stuff in it
# TODO: decide template based on file extensions or other metadata
template = "templates/crystal"
# TODO: copy template and add function files to it
tmp_dir = "tmp/#{UUID.random}"
Dir.mkdir_p("tmp") unless File.exists? "tmp"
FileUtils.cp_r(template, tmp_dir)
Dir.glob(arg + "/**/*").each do |file|
FileUtils.cp(file, tmp_dir)
end
# TODO: build Docker image
# TODO: push Docker image to registry
# TODO: return image name for testing

View File

@ -1,12 +0,0 @@
require "http/request"
require "http/headers"
class Handler
def run(request : HTTP::Request)
{
body: "Hello, Crystal. You said: #{request.body.try(&.gets_to_end)}",
status_code: 200,
headers: HTTP::Headers{"Content-Type" => "text/plain"},
}
end
end

View File

@ -1,2 +0,0 @@
name: crystal-http-template
version: 0.1.0

View File

@ -1,41 +0,0 @@
require "http/server"
require "./function/handler"
server = HTTP::Server.new do |context|
response_triple : NamedTuple(body: String, headers: HTTP::Headers, status_code: Int32) |
NamedTuple(body: String, headers: HTTP::Headers) |
NamedTuple(body: String, status_code: Int32) |
NamedTuple(body: String) |
NamedTuple(headers: HTTP::Headers, status_code: Int32) |
NamedTuple(headers: HTTP::Headers) |
NamedTuple(status_code: Int32)
handler = Handler.new
response_triple = handler.run(context.request)
if response_triple.is_a?(NamedTuple(body: String, headers: HTTP::Headers, status_code: Int32) |
NamedTuple(body: String, status_code: Int32) |
NamedTuple(headers: HTTP::Headers, status_code: Int32) |
NamedTuple(status_code: Int32))
context.response.status_code = response_triple[:status_code]
end
if response_triple.is_a?(NamedTuple(body: String, headers: HTTP::Headers, status_code: Int32) |
NamedTuple(body: String, headers: HTTP::Headers) |
NamedTuple(headers: HTTP::Headers, status_code: Int32) |
NamedTuple(headers: HTTP::Headers))
response_triple[:headers].each do |key, value|
context.response.headers[key] = value
end
end
if response_triple.is_a?(NamedTuple(body: String, headers: HTTP::Headers, status_code: Int32) |
NamedTuple(body: String, headers: HTTP::Headers) |
NamedTuple(body: String, status_code: Int32) |
NamedTuple(body: String))
context.response.print(response_triple[:body])
end
end
server.bind_tcp "0.0.0.0", 5000
server.listen

View File

@ -1,6 +0,0 @@
language: crystal
fprocess: ./handler
welcome_message: |
You have created a new function which uses crystal 1.0.0.
To include third-party dependencies, use a vendoring tool like shards:
shards documentation: https://github.com/crystal-lang/shards

View File

@ -1,10 +1,6 @@
FROM --platform=${TARGETPLATFORM:-linux/amd64} ghcr.io/openfaas/of-watchdog:0.9.10 as watchdog
FROM --platform=${TARGETPLATFORM:-linux/amd64} alpine as build
ARG ADDITIONAL_PACKAGE
COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
RUN apk update && apk upgrade && apk add crystal shards openssl-dev ${ADDITIONAL_PACKAGE} && apk cache clean
RUN apk update && apk upgrade && apk add crystal shards openssl-dev && apk cache clean
WORKDIR /home/app

View File

@ -0,0 +1,4 @@
require "kemal"
require "./function.cr"
Kemal.run

View File

@ -0,0 +1,15 @@
name: function
version: 0.1.0
targets:
function:
main: main.cr
dependencies:
kemal:
github: kemalcr/kemal
# development_dependencies:
# webmock:
# github: manastech/webmock.cr