lambit 0.0.1
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 +7 -0
- data/.evnrc.example +1 -0
- data/.gitignore +18 -0
- data/.ruby-version.example +1 -0
- data/.travis.yml +0 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +11 -0
- data/LICENSE +20 -0
- data/README.md +74 -0
- data/Rakefile.rb +0 -0
- data/bin/lambit +91 -0
- data/lambit.gemspec +32 -0
- data/lambit.yml.example +96 -0
- data/lib/lambit.rb +6 -0
- data/lib/lambit/aws.rb +9 -0
- data/lib/lambit/aws/cloud_watch/alarm.rb +59 -0
- data/lib/lambit/aws/cloud_watch_events/rule.rb +62 -0
- data/lib/lambit/aws/lambda/function.rb +53 -0
- data/lib/lambit/aws/lambda/permission.rb +52 -0
- data/lib/lambit/aws/s3/bucket_notification_configuration.rb +81 -0
- data/lib/lambit/commands.rb +6 -0
- data/lib/lambit/commands/build.rb +128 -0
- data/lib/lambit/commands/common.rb +92 -0
- data/lib/lambit/commands/lambdas.rb +411 -0
- data/lib/lambit/commands/subcommand.rb +87 -0
- data/lib/lambit/common.rb +6 -0
- data/lib/lambit/common/config.rb +45 -0
- data/lib/lambit/common/hash_helper.rb +48 -0
- data/lib/lambit/common/logger.rb +24 -0
- data/lib/lambit/common/string_helper.rb +39 -0
- data/lib/lambit/version.rb +5 -0
- data/test/test_helper.rb +0 -0
- metadata +174 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Lambit
|
4
|
+
module Aws
|
5
|
+
module CloudWatchEvents
|
6
|
+
class Rule
|
7
|
+
OPTIONS = [
|
8
|
+
:name,
|
9
|
+
:rule,
|
10
|
+
:schedule_expression,
|
11
|
+
:event_pattern,
|
12
|
+
:state,
|
13
|
+
:description,
|
14
|
+
:role_arn,
|
15
|
+
:targets
|
16
|
+
].each { |option| attr_reader option }
|
17
|
+
|
18
|
+
attr_reader :client
|
19
|
+
attr_reader :options
|
20
|
+
|
21
|
+
def initialize(config)
|
22
|
+
@client = ::Aws::CloudWatchEvents::Client.new
|
23
|
+
|
24
|
+
OPTIONS.each do |option|
|
25
|
+
if config.has_key?(option)
|
26
|
+
instance_variable_set("@#{option}", config[option])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def options
|
32
|
+
options = {}
|
33
|
+
|
34
|
+
OPTIONS.each do |option|
|
35
|
+
value = self.send(option)
|
36
|
+
options[option] = value unless value.nil?
|
37
|
+
end
|
38
|
+
options
|
39
|
+
end
|
40
|
+
|
41
|
+
def put_rule
|
42
|
+
self.client.put_rule options
|
43
|
+
end
|
44
|
+
|
45
|
+
def delete_rule
|
46
|
+
opts = {name: options[:name]}
|
47
|
+
self.client.delete_rule opts
|
48
|
+
end
|
49
|
+
|
50
|
+
def put_targets
|
51
|
+
opts = {rule: options[:rule], targets: options[:targets]}
|
52
|
+
self.client.put_targets opts
|
53
|
+
end
|
54
|
+
|
55
|
+
def remove_targets
|
56
|
+
opts = {rule: options[:rule], ids: options[:targets].map{|i| i.map{|k,v| v if k == :id}.compact}.flatten}
|
57
|
+
self.client.remove_targets opts
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Lambit
|
4
|
+
module Aws
|
5
|
+
module Lambda
|
6
|
+
class Function
|
7
|
+
OPTIONS = [
|
8
|
+
:function_name,
|
9
|
+
:runtime,
|
10
|
+
:role,
|
11
|
+
:handler,
|
12
|
+
:code,
|
13
|
+
:description,
|
14
|
+
:timeout,
|
15
|
+
:memory_size,
|
16
|
+
:publish,
|
17
|
+
:vpc_config
|
18
|
+
].each { |option| attr_reader option }
|
19
|
+
|
20
|
+
attr_reader :client
|
21
|
+
|
22
|
+
def initialize(config)
|
23
|
+
@client = ::Aws::Lambda::Client.new
|
24
|
+
|
25
|
+
OPTIONS.each do |option|
|
26
|
+
if config.has_key?(option)
|
27
|
+
instance_variable_set("@#{option}", config[option])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def options
|
33
|
+
options = {}
|
34
|
+
|
35
|
+
OPTIONS.each do |option|
|
36
|
+
value = self.send(option)
|
37
|
+
options[option] = value unless value.nil?
|
38
|
+
end
|
39
|
+
options
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_function
|
43
|
+
self.client.create_function options
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete_function
|
47
|
+
opts = {function_name: options[:function_name]}
|
48
|
+
self.client.delete_function opts
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Lambit
|
4
|
+
module Aws
|
5
|
+
module Lambda
|
6
|
+
class Permission
|
7
|
+
OPTIONS = [
|
8
|
+
:function_name,
|
9
|
+
:statement_id,
|
10
|
+
:action,
|
11
|
+
:principal,
|
12
|
+
:source_arn,
|
13
|
+
:source_account,
|
14
|
+
:event_source_token,
|
15
|
+
:qualifier
|
16
|
+
].each { |option| attr_reader option }
|
17
|
+
|
18
|
+
attr_reader :client
|
19
|
+
attr_reader :options
|
20
|
+
|
21
|
+
def initialize(config)
|
22
|
+
@client = ::Aws::Lambda::Client.new
|
23
|
+
|
24
|
+
OPTIONS.each do |option|
|
25
|
+
if config.has_key?(option)
|
26
|
+
instance_variable_set("@#{option}", config[option])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def options
|
32
|
+
options = {}
|
33
|
+
|
34
|
+
OPTIONS.each do |option|
|
35
|
+
value = self.send(option)
|
36
|
+
options[option] = value unless value.nil?
|
37
|
+
end
|
38
|
+
options
|
39
|
+
end
|
40
|
+
|
41
|
+
def add
|
42
|
+
self.client.add_permission options
|
43
|
+
end
|
44
|
+
|
45
|
+
def remove
|
46
|
+
opts = {function_name: options[:function_name], statement_id: options[:statement_id]}
|
47
|
+
self.client.remove_permission opts
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
using Lambit::Common::HashHelper
|
4
|
+
|
5
|
+
module Lambit
|
6
|
+
module Aws
|
7
|
+
module S3
|
8
|
+
class BucketNotificationConfiguration
|
9
|
+
OPTIONS = [
|
10
|
+
:bucket,
|
11
|
+
:notification_configuration,
|
12
|
+
:use_accelerate_endpoint
|
13
|
+
].each { |option| attr_reader option }
|
14
|
+
|
15
|
+
attr_reader :client
|
16
|
+
attr_reader :options
|
17
|
+
|
18
|
+
def initialize(config)
|
19
|
+
@client = ::Aws::S3::Client.new
|
20
|
+
|
21
|
+
OPTIONS.each do |option|
|
22
|
+
if config.has_key?(option)
|
23
|
+
instance_variable_set("@#{option}", config[option])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def options
|
29
|
+
options = {}
|
30
|
+
|
31
|
+
OPTIONS.each do |option|
|
32
|
+
value = self.send(option)
|
33
|
+
options[option] = value unless value.nil?
|
34
|
+
end
|
35
|
+
options
|
36
|
+
end
|
37
|
+
|
38
|
+
def notification_configuration_types
|
39
|
+
types = [
|
40
|
+
:topic_configurations,
|
41
|
+
:lambda_function_configurations,
|
42
|
+
:queue_configurations
|
43
|
+
]
|
44
|
+
end
|
45
|
+
|
46
|
+
def add
|
47
|
+
config = self.client.get_bucket_notification_configuration(:bucket => options[:bucket])
|
48
|
+
|
49
|
+
notification_configuration_types.each do |type|
|
50
|
+
options_hash = options[:notification_configuration][type].to_a.map { |r| [r[:id], r] }.to_h
|
51
|
+
config_hash = config.send(type).to_a.map { |r| [r[:id], r.to_hash] }.to_h
|
52
|
+
options[:notification_configuration][type] = config_hash.merge(options_hash).values
|
53
|
+
end
|
54
|
+
|
55
|
+
put(options)
|
56
|
+
end
|
57
|
+
|
58
|
+
def remove
|
59
|
+
config = self.client.get_bucket_notification_configuration(:bucket => options[:bucket])
|
60
|
+
|
61
|
+
notification_configuration_types.each do |type|
|
62
|
+
options_hash = options[:notification_configuration][type].to_a.map { |r| [r[:id], r] }.to_h
|
63
|
+
config_hash = config.send(type).to_a.map { |r| [r[:id], r.to_hash] }.to_h
|
64
|
+
options[:notification_configuration][type] = config_hash.difference(options_hash).values
|
65
|
+
end
|
66
|
+
|
67
|
+
put(options)
|
68
|
+
end
|
69
|
+
|
70
|
+
def put(opts)
|
71
|
+
r = self.client.put_bucket_notification_configuration(opts)
|
72
|
+
notification_configuration_types.each do |type|
|
73
|
+
puts self.client.get_bucket_notification_configuration(:bucket => opts[:bucket]).send type
|
74
|
+
end if Lambit.is_debug?
|
75
|
+
|
76
|
+
r
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
using Lambit::Common::StringHelper
|
7
|
+
|
8
|
+
module Lambit::Commands
|
9
|
+
module Build
|
10
|
+
def self.run(cmd, opts, args)
|
11
|
+
handler = handler_for cmd
|
12
|
+
output, exitstatus = handler.run opts, args
|
13
|
+
|
14
|
+
# Send Subcommand output to STDOUT if :debug
|
15
|
+
if Lambit.is_debug?
|
16
|
+
puts output unless output.nil? || output.empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
# Return exit status
|
20
|
+
exitstatus
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.normalize_cmd(cmd)
|
24
|
+
cmd.to_s.downcase
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.handler_for(cmd)
|
28
|
+
if @handlers
|
29
|
+
@handlers[normalize_cmd(cmd)]
|
30
|
+
else
|
31
|
+
raise 'Uh Oh!'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.register_handler_for(cmd, handler=nil)
|
36
|
+
normalized_cmd = normalize_cmd(cmd)
|
37
|
+
handler = self.const_get(normalized_cmd.classify) if handler.nil?
|
38
|
+
|
39
|
+
@handlers ||= {}
|
40
|
+
@handlers[normalized_cmd] = handler
|
41
|
+
end
|
42
|
+
|
43
|
+
class PackageTemplatesCommand < Lambit::Commands::Common::Base
|
44
|
+
attr_reader :workspace
|
45
|
+
attr_reader :project_path
|
46
|
+
attr_reader :tmpl_name
|
47
|
+
attr_reader :tmpl_config
|
48
|
+
|
49
|
+
def initialize(opts, args)
|
50
|
+
super
|
51
|
+
@workspace = opts['workspace']
|
52
|
+
@project_path = opts['project_path']
|
53
|
+
@tmpl_name = args[0]
|
54
|
+
@tmpl_config = args[1]
|
55
|
+
end
|
56
|
+
|
57
|
+
def command
|
58
|
+
tmpl = JSON.parse(File.read("#{self.project_path}/templates/#{self.tmpl_name}"))
|
59
|
+
tmpl.merge!(self.tmpl_config) unless self.tmpl_config.nil?
|
60
|
+
|
61
|
+
begin
|
62
|
+
File.open("#{self.workspace}/#{self.tmpl_name}",'w') do |f|
|
63
|
+
f.write(tmpl.to_json)
|
64
|
+
end
|
65
|
+
@exitstatus = 0
|
66
|
+
rescue Exception => e
|
67
|
+
if Lambit.is_debug?
|
68
|
+
Lambit.logger.error e
|
69
|
+
else
|
70
|
+
Lambit.logger.error e.message
|
71
|
+
end
|
72
|
+
@exitstatus = 1
|
73
|
+
end
|
74
|
+
|
75
|
+
return '', self.exitstatus
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
register_handler_for :package_templates_command
|
80
|
+
|
81
|
+
class Base < Lambit::Commands::Subcommands::Base
|
82
|
+
attr_reader :workspace
|
83
|
+
|
84
|
+
def initialize(opts, args)
|
85
|
+
super
|
86
|
+
@workspace = opts['workspace']
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
class PackagePipCommand < Base
|
91
|
+
attr_reader :pip
|
92
|
+
|
93
|
+
def initialize(opts, args)
|
94
|
+
super
|
95
|
+
@pip = args[0]
|
96
|
+
end
|
97
|
+
|
98
|
+
def subcommand
|
99
|
+
@subcommand = "pip install #{self.pip} -q -t #{workspace}/."
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
register_handler_for :package_pip_command
|
104
|
+
|
105
|
+
class PackageSourceCommand < Base
|
106
|
+
attr_reader :project_path
|
107
|
+
|
108
|
+
def initialize(opts, args)
|
109
|
+
super
|
110
|
+
@project_path = opts['project_path']
|
111
|
+
end
|
112
|
+
|
113
|
+
def subcommand
|
114
|
+
@subcommand = "cp -r #{project_path}/function/* #{workspace}"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
register_handler_for :package_source_command
|
119
|
+
|
120
|
+
class CompressPackageCommand < Base
|
121
|
+
def subcommand
|
122
|
+
@subcommand = "cd #{workspace} && zip -r package.zip *"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
register_handler_for :compress_package_command
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
using Lambit::Common::StringHelper
|
6
|
+
|
7
|
+
module Lambit::Commands
|
8
|
+
module Common
|
9
|
+
def self.run(cmd, opts, args)
|
10
|
+
handler = handler_for cmd
|
11
|
+
output, exitstatus = handler.run opts, args
|
12
|
+
|
13
|
+
# Send Subcommand output to STDOUT if :debug
|
14
|
+
if Lambit.is_debug?
|
15
|
+
puts output unless output.nil? || output.empty?
|
16
|
+
end
|
17
|
+
|
18
|
+
# Return exit status
|
19
|
+
exitstatus
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.normalize_cmd(cmd)
|
23
|
+
cmd.to_s.downcase
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.handler_for(cmd)
|
27
|
+
if @handlers
|
28
|
+
@handlers[normalize_cmd(cmd)]
|
29
|
+
else
|
30
|
+
raise 'Uh Oh!'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.register_handler_for(cmd, handler=nil)
|
35
|
+
normalized_cmd = normalize_cmd(cmd)
|
36
|
+
handler = self.const_get(normalized_cmd.classify) if handler.nil?
|
37
|
+
|
38
|
+
@handlers ||= {}
|
39
|
+
@handlers[normalized_cmd] = handler
|
40
|
+
end
|
41
|
+
|
42
|
+
class Base
|
43
|
+
attr_reader :run
|
44
|
+
attr_reader :dry_run
|
45
|
+
attr_reader :exitstatus
|
46
|
+
|
47
|
+
def initialize(opts, args)
|
48
|
+
@dry_run = opts['dry-run']
|
49
|
+
@exitstatus = 1
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.run(opts, args)
|
53
|
+
output, exitstatus = self.new(opts, args).execute
|
54
|
+
return output, exitstatus
|
55
|
+
end
|
56
|
+
|
57
|
+
def command
|
58
|
+
return '', self.exitstatus
|
59
|
+
end
|
60
|
+
|
61
|
+
def execute
|
62
|
+
command
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class CreateWorkspaceCommand < Base
|
67
|
+
attr_reader :workspace
|
68
|
+
|
69
|
+
def initialize(opts, args)
|
70
|
+
super
|
71
|
+
@workspace = opts['workspace']
|
72
|
+
end
|
73
|
+
|
74
|
+
def command
|
75
|
+
begin
|
76
|
+
FileUtils.mkdir_p self.workspace
|
77
|
+
@exitstatus = 0
|
78
|
+
rescue Exception => e
|
79
|
+
if Lambit.is_debug?
|
80
|
+
Lambit.logger.error e
|
81
|
+
else
|
82
|
+
Lambit.logger.error e.message
|
83
|
+
end
|
84
|
+
@exitstatus = 1
|
85
|
+
end
|
86
|
+
return '', self.exitstatus
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
register_handler_for :create_workspace_command
|
91
|
+
end
|
92
|
+
end
|