faastruby 0.4.18 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -3
- data/Gemfile.lock +28 -4
- data/README.md +63 -5
- data/faastruby.gemspec +5 -1
- data/lib/faastruby.rb +1 -0
- data/lib/faastruby/api.rb +154 -6
- data/lib/faastruby/base.rb +3 -9
- data/lib/faastruby/cli.rb +39 -12
- data/lib/faastruby/cli/base_command.rb +66 -0
- data/lib/faastruby/cli/commands.rb +122 -59
- data/lib/faastruby/cli/commands/account/base_command.rb +10 -0
- data/lib/faastruby/cli/commands/account/confirm.rb +94 -0
- data/lib/faastruby/cli/commands/account/login.rb +86 -0
- data/lib/faastruby/cli/commands/account/logout.rb +59 -0
- data/lib/faastruby/cli/commands/account/signup.rb +76 -0
- data/lib/faastruby/cli/commands/{function.rb → function/base_command.rb} +2 -11
- data/lib/faastruby/cli/commands/function/build.rb +18 -11
- data/lib/faastruby/cli/commands/function/deploy_to.rb +100 -37
- data/lib/faastruby/cli/commands/function/new.rb +89 -36
- data/lib/faastruby/cli/commands/function/remove_from.rb +21 -6
- data/lib/faastruby/cli/commands/function/run.rb +15 -15
- data/lib/faastruby/cli/commands/function/test.rb +5 -4
- data/lib/faastruby/cli/commands/function/update_context.rb +10 -3
- data/lib/faastruby/cli/commands/function/upgrade.rb +62 -61
- data/lib/faastruby/cli/commands/help.rb +33 -20
- data/lib/faastruby/cli/commands/project/base_command.rb +14 -0
- data/lib/faastruby/cli/commands/project/deploy.rb +114 -0
- data/lib/faastruby/cli/commands/project/down.rb +58 -0
- data/lib/faastruby/cli/commands/project/new.rb +237 -0
- data/lib/faastruby/cli/commands/workspace/cp.rb +107 -0
- data/lib/faastruby/cli/commands/workspace/create.rb +35 -27
- data/lib/faastruby/cli/commands/workspace/destroy.rb +14 -7
- data/lib/faastruby/cli/commands/workspace/list.rb +15 -6
- data/lib/faastruby/cli/commands/workspace/migrate.rb +93 -0
- data/lib/faastruby/cli/commands/workspace/rm.rb +81 -0
- data/lib/faastruby/cli/commands/workspace/update.rb +62 -0
- data/lib/faastruby/cli/credentials.rb +58 -57
- data/lib/faastruby/cli/new_credentials.rb +63 -0
- data/lib/faastruby/cli/package.rb +1 -0
- data/lib/faastruby/cli/template.rb +7 -7
- data/lib/faastruby/local.rb +188 -0
- data/lib/faastruby/local/crystal_runtime.cr +170 -0
- data/lib/faastruby/local/functions.rb +7 -0
- data/lib/faastruby/local/functions/crystal.rb +64 -0
- data/lib/faastruby/local/functions/function.rb +173 -0
- data/lib/faastruby/local/functions/ruby.rb +28 -0
- data/lib/faastruby/local/listeners.rb +5 -0
- data/lib/faastruby/local/listeners/listener.rb +104 -0
- data/lib/faastruby/local/logger.rb +37 -0
- data/lib/faastruby/local/monkey_patch.rb +38 -0
- data/lib/faastruby/local/processors.rb +7 -0
- data/lib/faastruby/local/processors/function.rb +151 -0
- data/lib/faastruby/local/processors/processor.rb +116 -0
- data/lib/faastruby/local/processors/static_file.rb +48 -0
- data/lib/faastruby/local/static_files.rb +5 -0
- data/lib/faastruby/local/static_files/static_file.rb +59 -0
- data/lib/faastruby/server.rb +44 -3
- data/lib/faastruby/server/app.rb +107 -0
- data/lib/faastruby/server/concurrency_controller.rb +50 -50
- data/lib/faastruby/server/config.ru +2 -0
- data/lib/faastruby/server/event.rb +3 -0
- data/lib/faastruby/server/event_hub.rb +7 -6
- data/lib/faastruby/server/local.rb +22 -0
- data/lib/faastruby/server/logger.rb +50 -0
- data/lib/faastruby/server/project_config.rb +44 -0
- data/lib/faastruby/server/puma.rb +4 -0
- data/lib/faastruby/server/response.rb +40 -0
- data/lib/faastruby/server/runner.rb +116 -21
- data/lib/faastruby/server/runner_methods.rb +17 -16
- data/lib/faastruby/server/sentinel.rb +496 -0
- data/lib/faastruby/supported_runtimes.rb +8 -0
- data/lib/faastruby/user.rb +77 -0
- data/lib/faastruby/version.rb +1 -1
- data/lib/faastruby/workspace.rb +36 -3
- data/templates/crystal/example-blank/handler.cr +3 -0
- data/templates/crystal/example/spec/handler_spec.cr +11 -6
- data/templates/public-web/assets/images/background.png +0 -0
- data/templates/public-web/assets/images/ruby.png +0 -0
- data/templates/public-web/assets/javascripts/main.js +1 -0
- data/templates/public-web/assets/stylesheets/main.css +70 -0
- data/templates/public-web/favicon.ico +0 -0
- data/templates/ruby/api-404/handler.rb +6 -0
- data/templates/ruby/api-root/handler.rb +6 -0
- data/templates/ruby/example-blank/handler.rb +0 -23
- data/templates/ruby/web-404/404.html +36 -0
- data/templates/ruby/web-404/handler.rb +3 -0
- data/templates/ruby/web-root/handler.rb +10 -0
- data/templates/ruby/web-root/index.html.erb +37 -0
- data/templates/ruby/web-root/template.rb +13 -0
- metadata +102 -21
- data/exe/faastruby-server +0 -76
- data/lib/faastruby/cli/commands/credentials.rb +0 -11
- data/lib/faastruby/cli/commands/credentials/add.rb +0 -58
- data/lib/faastruby/cli/commands/credentials/list.rb +0 -58
- data/lib/faastruby/cli/commands/workspace.rb +0 -13
- data/lib/faastruby/cli/commands/workspace/deploy.rb +0 -50
- data/templates/crystal/example-blank/README.md +0 -22
- data/templates/crystal/example-blank/spec/handler_spec.cr +0 -8
- data/templates/crystal/example-blank/spec/spec_helper.cr +0 -4
- data/templates/crystal/example-blank/src/handler.cr +0 -25
- data/templates/ruby/example-blank/Gemfile +0 -7
- data/templates/ruby/example-blank/README.md +0 -22
- data/templates/ruby/example-blank/spec/handler_spec.rb +0 -16
- data/templates/ruby/example-blank/spec/spec_helper.rb +0 -3
|
@@ -1,22 +1,30 @@
|
|
|
1
1
|
module FaaStRuby
|
|
2
2
|
module Command
|
|
3
3
|
module Function
|
|
4
|
+
require 'faastruby/cli/commands/function/base_command'
|
|
5
|
+
require 'faastruby/cli/new_credentials'
|
|
4
6
|
class RemoveFrom < FunctionBaseCommand
|
|
5
7
|
def initialize(args)
|
|
6
8
|
@args = args
|
|
9
|
+
help
|
|
7
10
|
@missing_args = []
|
|
8
11
|
FaaStRuby::CLI.error(@missing_args, color: nil) if missing_args.any?
|
|
9
12
|
@workspace_name = @args.shift
|
|
10
|
-
load_yaml
|
|
11
|
-
@function_name = @yaml_config['name']
|
|
12
|
-
FaaStRuby::Credentials.load_for(@workspace_name)
|
|
13
13
|
parse_options
|
|
14
|
+
load_yaml
|
|
15
|
+
@function_name = @options['function_name'] || @yaml_config['name']
|
|
16
|
+
load_credentials
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def load_yaml
|
|
20
|
+
return true if @options['function_name']
|
|
21
|
+
super
|
|
14
22
|
end
|
|
15
23
|
|
|
16
24
|
def run
|
|
17
25
|
warning unless @options['force']
|
|
18
26
|
FaaStRuby::CLI.error("Cancelled") unless @options['force'] == 'y'
|
|
19
|
-
spinner = spin("Removing function from workspace '#{@workspace_name}'...")
|
|
27
|
+
spinner = spin("Removing function '#{@function_name}' from workspace '#{@workspace_name}'...")
|
|
20
28
|
workspace = FaaStRuby::Workspace.new(name: @workspace_name)
|
|
21
29
|
function = FaaStRuby::Function.new(name: @function_name, workspace: workspace)
|
|
22
30
|
function.destroy
|
|
@@ -28,11 +36,16 @@ module FaaStRuby
|
|
|
28
36
|
end
|
|
29
37
|
|
|
30
38
|
def self.help
|
|
31
|
-
"remove-from
|
|
39
|
+
"remove-from WORKSPACE_NAME [ARGS]"
|
|
32
40
|
end
|
|
33
41
|
|
|
34
42
|
def usage
|
|
35
|
-
"
|
|
43
|
+
puts "\nUsage: faastruby #{self.class.help}"
|
|
44
|
+
puts %(
|
|
45
|
+
-y,--yes # Don't prompt for confirmation
|
|
46
|
+
-f,--function FUNCTION_NAME # Pass the function name instead of attempting
|
|
47
|
+
# to read from the function's config file.
|
|
48
|
+
)
|
|
36
49
|
end
|
|
37
50
|
|
|
38
51
|
private
|
|
@@ -51,6 +64,8 @@ module FaaStRuby
|
|
|
51
64
|
case option
|
|
52
65
|
when '-y', '--yes'
|
|
53
66
|
@options['force'] = 'y'
|
|
67
|
+
when '--function', '-f'
|
|
68
|
+
@options['function_name'] = @args.shift
|
|
54
69
|
else
|
|
55
70
|
FaaStRuby::CLI.error(["Unknown argument: #{option}".red, usage], color: nil)
|
|
56
71
|
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
module FaaStRuby
|
|
2
2
|
module Command
|
|
3
3
|
module Function
|
|
4
|
+
require 'faastruby/cli/commands/function/base_command'
|
|
4
5
|
class Run < FunctionBaseCommand
|
|
5
6
|
def initialize(args)
|
|
6
7
|
@args = args
|
|
8
|
+
help
|
|
7
9
|
@missing_args = []
|
|
8
10
|
FaaStRuby::CLI.error(@missing_args, color: nil) if missing_args.any?
|
|
9
11
|
@options = {}
|
|
@@ -31,24 +33,22 @@ module FaaStRuby
|
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
def self.help
|
|
34
|
-
'run
|
|
35
|
-
<<-EOS
|
|
36
|
-
|
|
37
|
-
Options:
|
|
38
|
-
-b, --body 'DATA' # The request body
|
|
39
|
-
--stdin # Read the request body from STDIN
|
|
40
|
-
-m, --method METHOD # The request method
|
|
41
|
-
-h, --header 'Header: Value' # Set a header. Can be used multiple times.
|
|
42
|
-
-f, --form 'a=1&b=2' # Send form data and set header 'Content-Type: application/x-www-form-urlencoded'
|
|
43
|
-
-j, --json '{"a":"1"}' # Send JSON data and set header 'Content-Type: application/json'
|
|
44
|
-
-t, --time # Return function run time in the response
|
|
45
|
-
-q, --query 'foo=bar' # Set a query parameter for the request. Can be used multiple times.
|
|
46
|
-
--curl # Return the CURL command equivalent for the request
|
|
47
|
-
EOS
|
|
36
|
+
'run WORKSPACE_NAME [ARGS]'
|
|
48
37
|
end
|
|
49
38
|
|
|
50
39
|
def usage
|
|
51
|
-
"
|
|
40
|
+
puts "\nUsage: faastruby #{self.class.help}"
|
|
41
|
+
puts %(
|
|
42
|
+
-b,--body 'DATA' # The request body
|
|
43
|
+
--stdin # Read the request body from STDIN
|
|
44
|
+
-m,--method METHOD # The request method
|
|
45
|
+
-h,--header 'Header: Value' # Set a header. Can be used multiple times.
|
|
46
|
+
-f,--form 'a=1&b=2' # Send form data and set header 'Content-Type: application/x-www-form-urlencoded'
|
|
47
|
+
-j,--json '{"a":"1"}' # Send JSON data and set header 'Content-Type: application/json'
|
|
48
|
+
-t,--time # Return function run time in the response
|
|
49
|
+
-q,--query 'foo=bar' # Set a query parameter for the request. Can be used multiple times.
|
|
50
|
+
--curl # Return the CURL command equivalent for the request
|
|
51
|
+
)
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
private
|
|
@@ -2,6 +2,7 @@ require 'open3'
|
|
|
2
2
|
module FaaStRuby
|
|
3
3
|
module Command
|
|
4
4
|
module Function
|
|
5
|
+
require 'faastruby/cli/commands/function/base_command'
|
|
5
6
|
class Test < FunctionBaseCommand
|
|
6
7
|
def initialize(args)
|
|
7
8
|
@args = args
|
|
@@ -12,19 +13,19 @@ module FaaStRuby
|
|
|
12
13
|
|
|
13
14
|
def run(do_not_exit: false)
|
|
14
15
|
unless @test_command
|
|
15
|
-
puts "[skipped] You have no 'test_command' key/value in 'faastruby.yml'. Please consider using rspec!".yellow
|
|
16
|
+
# puts "[skipped tests] You have no 'test_command' key/value in 'faastruby.yml'. Please consider using rspec!".yellow
|
|
16
17
|
return true
|
|
17
18
|
end
|
|
18
|
-
puts "[test] Running tests"
|
|
19
|
+
# puts "[test] Running tests"
|
|
19
20
|
system(@test_command)
|
|
20
21
|
end
|
|
21
22
|
|
|
22
23
|
def self.help
|
|
23
|
-
'test'
|
|
24
|
+
'test'
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
def usage
|
|
27
|
-
"
|
|
28
|
+
"\nUsage: faastruby #{self.class.help}"
|
|
28
29
|
end
|
|
29
30
|
end
|
|
30
31
|
end
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
module FaaStRuby
|
|
2
2
|
module Command
|
|
3
3
|
module Function
|
|
4
|
+
require 'faastruby/cli/commands/function/base_command'
|
|
5
|
+
require 'faastruby/cli/new_credentials'
|
|
4
6
|
class UpdateContext < FunctionBaseCommand
|
|
5
7
|
def initialize(args)
|
|
6
8
|
@args = args
|
|
9
|
+
help
|
|
7
10
|
@missing_args = []
|
|
8
11
|
FaaStRuby::CLI.error(@missing_args, color: nil) if missing_args.any?
|
|
9
12
|
@workspace_name = @args.shift
|
|
10
13
|
load_yaml
|
|
11
14
|
@function_name = @yaml_config['name']
|
|
12
|
-
FaaStRuby::Credentials.load_for(@workspace_name)
|
|
13
15
|
parse_options(require_options: {'data' => 'context data'} )
|
|
16
|
+
load_credentials
|
|
14
17
|
end
|
|
15
18
|
|
|
16
19
|
def run
|
|
@@ -26,11 +29,15 @@ module FaaStRuby
|
|
|
26
29
|
end
|
|
27
30
|
|
|
28
31
|
def self.help
|
|
29
|
-
"update-context
|
|
32
|
+
"update-context WORKSPACE_NAME [ARGS]"
|
|
30
33
|
end
|
|
31
34
|
|
|
32
35
|
def usage
|
|
33
|
-
"
|
|
36
|
+
puts "\nUsage: faastruby #{self.class.help}"
|
|
37
|
+
puts %(
|
|
38
|
+
-d, --data 'STRING' # The context data. Must be quoted.
|
|
39
|
+
--stdin # Read context data from STDIN
|
|
40
|
+
)
|
|
34
41
|
end
|
|
35
42
|
|
|
36
43
|
private
|
|
@@ -1,69 +1,70 @@
|
|
|
1
|
-
module FaaStRuby
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
# module FaaStRuby
|
|
2
|
+
# module Command
|
|
3
|
+
# module Function
|
|
4
|
+
# require 'faastruby/cli/commands/function/base_command'
|
|
5
|
+
# class Upgrade < FunctionBaseCommand
|
|
6
|
+
# def initialize(args)
|
|
7
|
+
# @args = args
|
|
8
|
+
# end
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
# def run
|
|
11
|
+
# check_function_name
|
|
12
|
+
# set_yaml_content
|
|
13
|
+
# write_yaml
|
|
14
|
+
# write_gemfile
|
|
15
|
+
# copy_spec_folder
|
|
16
|
+
# puts "Upgrade complete. Please read the documentation at https://faastruby.io/tutorial.html to learn about the changes."
|
|
17
|
+
# puts "To deploy, run 'faastruby deploy-to WORKSPACE_NAME'."
|
|
18
|
+
# end
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
# def set_yaml_content
|
|
21
|
+
# @yaml_content = {
|
|
22
|
+
# 'name' => @function_name,
|
|
23
|
+
# 'test_command' => nil,
|
|
24
|
+
# 'abort_build_when_tests_fail' => false,
|
|
25
|
+
# 'abort_deploy_when_tests_fail' => false
|
|
26
|
+
# }
|
|
27
|
+
# end
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
# def check_function_name
|
|
30
|
+
# FaaStRuby::CLI.error('You need to run this command from the function directory') unless File.file?('handler.rb')
|
|
31
|
+
# @function_name = Dir.pwd.split('/').last
|
|
32
|
+
# unless @function_name
|
|
33
|
+
# puts "What's the name of this function? (accepts only letters, numbers, - or _)"
|
|
34
|
+
# print "Enter function name: "
|
|
35
|
+
# @function_name = STDIN.gets.chomp
|
|
36
|
+
# end
|
|
37
|
+
# FaaStRuby::CLI.error('You need to provide a valid function name (letters, numbers, - or _)') unless @function_name.match(/^[a-zA-Z\-_0-9]{1,}$/)
|
|
38
|
+
# end
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
# def write_yaml
|
|
41
|
+
# write_file("./faastruby.yml", @yaml_content.to_yaml)
|
|
42
|
+
# end
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
# def write_gemfile
|
|
45
|
+
# content = "\n# Added by 'faastruby upgrade'\ngroup :test do\n gem 'rspec'\nend\n"
|
|
46
|
+
# write_file("./Gemfile", content, 'a')
|
|
47
|
+
# end
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
49
|
+
# def copy_spec_folder
|
|
50
|
+
# @base_dir = '.'
|
|
51
|
+
# source = "#{Gem::Specification.find_by_name("faastruby").gem_dir}/example-blank"
|
|
52
|
+
# FileUtils.cp_r("#{source}/spec", "#{@base_dir}/")
|
|
53
|
+
# puts "+ d #{@base_dir}/spec".green
|
|
54
|
+
# puts "+ d #{@base_dir}/spec/helpers".green
|
|
55
|
+
# puts "+ f #{@base_dir}/spec/helpers/faastruby.rb".green
|
|
56
|
+
# puts "+ f #{@base_dir}/spec/handler_spec.rb".green
|
|
57
|
+
# puts "+ f #{@base_dir}/spec/spec_helper.rb".green
|
|
58
|
+
# end
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
# def self.help
|
|
61
|
+
# "upgrade"
|
|
62
|
+
# end
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
end
|
|
64
|
+
# def usage
|
|
65
|
+
# "Usage: faastruby #{self.class.help}"
|
|
66
|
+
# end
|
|
67
|
+
# end
|
|
68
|
+
# end
|
|
69
|
+
# end
|
|
70
|
+
# end
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
module FaaStRuby
|
|
2
2
|
module Command
|
|
3
|
+
require 'faastruby/cli/base_command'
|
|
3
4
|
class Help < BaseCommand
|
|
4
5
|
def initialize(args)
|
|
5
6
|
@args = args
|
|
@@ -7,31 +8,43 @@ module FaaStRuby
|
|
|
7
8
|
|
|
8
9
|
def run
|
|
9
10
|
puts "FaaStRuby CLI - Manage workspaces and functions hosted at faastruby.io"
|
|
11
|
+
puts "Version: #{FaaStRuby::VERSION}"
|
|
10
12
|
puts
|
|
11
|
-
puts "Usage: faastruby [--
|
|
13
|
+
puts "Usage: faastruby [OPTIONS] COMMAND [--help | -h] [ARGS]"
|
|
12
14
|
puts
|
|
15
|
+
puts "OPTIONS:"
|
|
13
16
|
puts 'help, -h, --help # Displays this help'
|
|
14
17
|
puts '-v # Print version and exit'
|
|
15
18
|
puts '--region tor1 # Specify a region. "tor1" (default) is the only region available'
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
19
|
+
puts "\nCOMMANDS:"
|
|
20
|
+
puts %(
|
|
21
|
+
Accounts:
|
|
22
|
+
signup
|
|
23
|
+
confirm-account # Send a token over email for account confirmation
|
|
24
|
+
login
|
|
25
|
+
logout
|
|
26
|
+
|
|
27
|
+
Functions:
|
|
28
|
+
new # Initialize a function in your local machine
|
|
29
|
+
deploy-to # Deploy a function to a cloud workspace
|
|
30
|
+
remove-from # Remove a function from a cloud workspace
|
|
31
|
+
run # Trigger the function via HTTP endpoint
|
|
32
|
+
update-context # Update the context data for a function
|
|
33
|
+
|
|
34
|
+
Projects:
|
|
35
|
+
new # Initialize a project in your local machine
|
|
36
|
+
deploy # Deploy all functions and static files of a project
|
|
37
|
+
|
|
38
|
+
Workspaces:
|
|
39
|
+
create-workspace # Create a cloud workspace
|
|
40
|
+
destroy-workspace # Erase a workspace from the cloud
|
|
41
|
+
list-workspace # List what's in a cloud workspace
|
|
42
|
+
cp # Copy a static file from your local machine to a cloud workspace
|
|
43
|
+
rm # Remove a static file from a cloud workspace
|
|
44
|
+
update-workspace # Update workspace settings
|
|
45
|
+
|
|
46
|
+
)
|
|
47
|
+
puts "Run faastruby COMMAND --help for more details."
|
|
35
48
|
end
|
|
36
49
|
end
|
|
37
50
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module FaaStRuby
|
|
2
|
+
module Command
|
|
3
|
+
module Project
|
|
4
|
+
PROJECT_YAML_FILE = 'project.yml'
|
|
5
|
+
PROJECT_SECRETS_FILE = 'secrets.yml'
|
|
6
|
+
PROJECT_CREDENTIALS_FILE = '.credentials.yml'
|
|
7
|
+
class ProjectBaseCommand < BaseCommand
|
|
8
|
+
def read_credentials_file
|
|
9
|
+
File.file?(PROJECT_CREDENTIALS_FILE)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
require 'open3'
|
|
2
|
+
module FaaStRuby
|
|
3
|
+
module Command
|
|
4
|
+
STDOUT_MUTEX = Mutex.new
|
|
5
|
+
module Project
|
|
6
|
+
require 'faastruby/cli/commands/project/base_command'
|
|
7
|
+
require 'faastruby/server/logger'
|
|
8
|
+
class Deploy < ProjectBaseCommand
|
|
9
|
+
extend FaaStRuby::Logger
|
|
10
|
+
def initialize(args)
|
|
11
|
+
@errors = []
|
|
12
|
+
@args = args
|
|
13
|
+
help
|
|
14
|
+
parse_options
|
|
15
|
+
@options['functions'] += find_functions unless @options['functions'].any?
|
|
16
|
+
@options['environment'] ||= 'stage'
|
|
17
|
+
@project_yaml = YAML.load(File.read(PROJECT_YAML_FILE))['project'] rescue FaaStRuby::CLI.error("Could not find file 'project.yml'. Are you running this command from the project's folder?")
|
|
18
|
+
@project_name = @project_yaml['name']
|
|
19
|
+
@project_identifier = "-#{@project_yaml['identifier']}" if @project_yaml['identifier']
|
|
20
|
+
@options['root_to'] ||= @project_yaml['root_to']
|
|
21
|
+
@options['catch_all'] ||= @project_yaml['catch_all']
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def puts(msg)
|
|
25
|
+
STDOUT_MUTEX.synchronize do
|
|
26
|
+
STDOUT.puts msg
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def run
|
|
31
|
+
result = []
|
|
32
|
+
errors = false
|
|
33
|
+
root_folder = Dir.pwd
|
|
34
|
+
jobs = []
|
|
35
|
+
workspace = "#{@project_name}-#{@options['environment']}#{@project_identifier}"
|
|
36
|
+
try_workspace(workspace)
|
|
37
|
+
spinner = spin("Deploying project '#{@project_name}'...")
|
|
38
|
+
@options['functions'].each do |function_path|
|
|
39
|
+
jobs << Thread.new do
|
|
40
|
+
# puts "[#{function_path}] Entering folder '#{function_path}'"
|
|
41
|
+
# Dir.chdir function_path
|
|
42
|
+
function_config = YAML.load(File.read("#{function_path}/faastruby.yml"))
|
|
43
|
+
function_name = function_config['name']
|
|
44
|
+
cmd = "cd #{function_path} && faastruby deploy-to #{workspace} --quiet"
|
|
45
|
+
cmd += " --set-root" if @options['root_to'] == function_name
|
|
46
|
+
cmd += " --set-catch-all" if @options['catch_all'] == function_name
|
|
47
|
+
Open3.popen2(cmd) do |stdin, stdout, status_thread|
|
|
48
|
+
stdout.each_line do |line|
|
|
49
|
+
puts line
|
|
50
|
+
end
|
|
51
|
+
FaaStRuby::CLI.error("* [#{function_path}] Deploy FAILED", color: nil) unless status_thread.value.success?
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
jobs.each{|thr| thr.join}
|
|
56
|
+
spinner.stop(" Done!")
|
|
57
|
+
puts "* Project URL: #{FaaStRuby.workspace_host_for(workspace)}\n\n".green
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def try_workspace(workspace)
|
|
61
|
+
try_to_create = Proc.new {system("faastruby create-workspace #{workspace} > /dev/null 2>&1")}
|
|
62
|
+
has_credentials = system("faastruby list-workspace #{workspace} > /dev/null 2>&1")
|
|
63
|
+
continue = has_credentials || try_to_create.call
|
|
64
|
+
unless continue
|
|
65
|
+
FaaStRuby::CLI.error("Unable to deploy project to workspace '#{workspace}'. Make sure you have the credentials, or try a different environment name.\nExample: faastruby deploy --deploy-env #{@options['environment']}-#{(rand * 100).to_i}")
|
|
66
|
+
end
|
|
67
|
+
true
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def find_functions
|
|
71
|
+
Dir.glob("**/faastruby.yml").map do |f|
|
|
72
|
+
path = f.split('/')
|
|
73
|
+
path.pop
|
|
74
|
+
path.join('/')
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def self.help
|
|
79
|
+
"deploy [ARGS]"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def usage
|
|
83
|
+
puts "Usage: faastruby #{self.class.help}"
|
|
84
|
+
puts %(
|
|
85
|
+
-f,--function FUNCTION_PATH # Specify the path to the function directory in your local machine.
|
|
86
|
+
# This argument can be repeated many times for multiple functions. Example:
|
|
87
|
+
# -f path/to/function1 -f path/to/function2
|
|
88
|
+
-e,--env ENVIRONMENT # ENVIRONMENT is added to the project name to compose the workspace name.
|
|
89
|
+
)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def parse_options
|
|
93
|
+
@options = {'functions' => []}
|
|
94
|
+
while @args.any?
|
|
95
|
+
option = @args.shift
|
|
96
|
+
case option
|
|
97
|
+
when '--root-to'
|
|
98
|
+
@options['root_to'] = @args.shift
|
|
99
|
+
when '--catch-all'
|
|
100
|
+
@options['catch_all'] = @args.shift
|
|
101
|
+
when '--function', '-f'
|
|
102
|
+
@options['functions'] << @args.shift
|
|
103
|
+
when '--env', '-e'
|
|
104
|
+
@options['environment'] = @args.shift
|
|
105
|
+
else
|
|
106
|
+
FaaStRuby::CLI.error("Unknown argument: #{option}")
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|