faastruby 0.4.18 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|