committed by
Soam Vasani
parent
0207d13b23
commit
a8e7ec534b
@@ -0,0 +1,16 @@
|
||||
FROM ruby:2.4.1
|
||||
|
||||
RUN apt-get update -qq && apt-get install -y build-essential
|
||||
|
||||
RUN mkdir /app
|
||||
WORKDIR /app
|
||||
ADD Gemfile /app/Gemfile
|
||||
ADD Gemfile.lock /app/Gemfile.lock
|
||||
RUN bundle install
|
||||
|
||||
COPY . /app
|
||||
|
||||
EXPOSE 8888
|
||||
|
||||
ENTRYPOINT ["ruby"]
|
||||
CMD ["server.rb"]
|
||||
@@ -0,0 +1,4 @@
|
||||
# frozen_string_literal: true
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "rack"
|
||||
@@ -0,0 +1,13 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
rack (2.0.3)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
rack
|
||||
|
||||
BUNDLED WITH
|
||||
1.15.1
|
||||
@@ -0,0 +1,41 @@
|
||||
# Fission: Ruby Environment
|
||||
|
||||
This is the Ruby environment for Fission.
|
||||
|
||||
It's a Docker image containing a Ruby 2.4.1 runtime, along with a
|
||||
dynamic loader. A few common dependencies are included in the
|
||||
Gemfile.
|
||||
|
||||
## Customizing this image
|
||||
|
||||
To add package dependencies, edit Gemfile to add what you
|
||||
need, and rebuild this image (instructions below).
|
||||
|
||||
## Rebuilding and pushing the image
|
||||
|
||||
You'll need access to a Docker registry to push the image: you can
|
||||
sign up for Docker hub at hub.docker.com, or use registries from
|
||||
gcr.io, quay.io, etc. Let's assume you're using a docker hub account
|
||||
called USER. Build and push the image to the the registry:
|
||||
|
||||
```
|
||||
docker build -t USER/ruby-env . && docker push USER/ruby-env
|
||||
```
|
||||
|
||||
## Using the image in fission
|
||||
|
||||
You can add this customized image to fission with "fission env
|
||||
create":
|
||||
|
||||
```
|
||||
fission env create --name ruby --image USER/ruby-env
|
||||
```
|
||||
|
||||
Or, if you already have an environment, you can update its image:
|
||||
|
||||
```
|
||||
fission env update --name ruby --image USER/ruby-env
|
||||
```
|
||||
|
||||
After this, fission functions that have the env parameter set to the
|
||||
same environment name as this command will use this environment.
|
||||
@@ -0,0 +1,66 @@
|
||||
# frozen_string_literal: true
|
||||
require 'rack'
|
||||
|
||||
CODEPATH = '/userfunc/user'
|
||||
|
||||
module Fission
|
||||
class Request < Rack::Request
|
||||
def headers
|
||||
Hash[
|
||||
*env.select { |k,v| k.start_with?('HTTP_') }
|
||||
.map { |k,v| [k.sub(/\AHTTP_/, '').split('_').map(&:capitalize).join('-'), v] }
|
||||
.sort
|
||||
.flatten
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
class Context
|
||||
attr_reader :env
|
||||
|
||||
def initialize(env)
|
||||
@env = env
|
||||
end
|
||||
|
||||
def request
|
||||
@request ||= Request.new(env)
|
||||
end
|
||||
end
|
||||
|
||||
module Specializer
|
||||
def self.call(env)
|
||||
load CODEPATH
|
||||
Rack::Response.new([], 201).finish
|
||||
rescue
|
||||
Rack::Response.new(['500 Internal Server Error'], 500, {}).finish
|
||||
end
|
||||
end
|
||||
|
||||
module Handler
|
||||
def self.call(env)
|
||||
response = if method(:handler).arity > 0
|
||||
handler(Context.new(env))
|
||||
else
|
||||
handler
|
||||
end
|
||||
|
||||
response.is_a?(Array) ? response : Rack::Response.new([response]).finish
|
||||
rescue
|
||||
Rack::Response.new(['500 Internal Server Error'], 500, {}).finish
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
app = Rack::Builder.new do
|
||||
use Rack::CommonLogger, $stderr
|
||||
|
||||
map "/specialize" do
|
||||
run Fission::Specializer
|
||||
end
|
||||
|
||||
map "/" do
|
||||
run Fission::Handler
|
||||
end
|
||||
end
|
||||
|
||||
Rack::Handler::WEBrick.run app, Host: '0.0.0.0', Port: 8888
|
||||
@@ -0,0 +1,33 @@
|
||||
# frozen_string_literal: true
|
||||
require 'net/http'
|
||||
require 'uri'
|
||||
require 'json'
|
||||
|
||||
SLACK_BASE_URL = 'https://hooks.slack.com/'
|
||||
SLACK_WEBHOOK_PATH = 'YOUR RELATIVE PATH HERE' # Something like "/services/XXX/YYY/zZz123"
|
||||
|
||||
def send_slack_message(message)
|
||||
uri = URI.join(SLACK_BASE_URL, SLACK_WEBHOOK_PATH)
|
||||
data = "{'channel': '#hackdays-serverless', 'username': 'fissionbot', 'text': \"#{message}\", 'icon_emoji': ':fission:'}"
|
||||
res = Net::HTTP.post_form(uri, payload: data)
|
||||
res.success?
|
||||
end
|
||||
|
||||
def handler(context)
|
||||
request = context.request
|
||||
|
||||
event_type = request.headers['X-Kubernetes-Event-Type']
|
||||
object_type = request.headers['X-Kubernetes-Object-Type']
|
||||
|
||||
object = JSON.parse(request.body.read)
|
||||
object_name = object.dig('metadata', 'name')
|
||||
object_namespace = object.dig('metadata', 'namespace')
|
||||
|
||||
message = "#{event_type} #{object_type} #{object_namespace}/#{object_name}"
|
||||
|
||||
if send_slack_message(message)
|
||||
"Slack message sent - #{message}"
|
||||
else
|
||||
Rack::Response.new(["Failed to send Slack message - #{message}"], 500).finish
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
# frozen_string_literal: true
|
||||
def handler
|
||||
"Hello, world!\n"
|
||||
end
|
||||
@@ -0,0 +1,19 @@
|
||||
# frozen_string_literal: true
|
||||
def handler(context)
|
||||
request = context.request
|
||||
msg = <<~MSG
|
||||
---ENV---
|
||||
#{request.env.map { |h| h.join('=') }.join("\n") }
|
||||
|
||||
---HEADERS---
|
||||
#{request.headers.map { |h| h.join(': ') }.join("\n") }
|
||||
|
||||
---PARAMS---
|
||||
#{request.params.map { |h| h.join('=') }.join("\n") }
|
||||
|
||||
--BODY--
|
||||
#{request.body.read}
|
||||
MSG
|
||||
|
||||
Rack::Response.new([msg]).finish
|
||||
end
|
||||
Reference in New Issue
Block a user