scout-camp 0.1.6 → 0.1.10
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/.vimproject +63 -7
- data/VERSION +1 -1
- data/lib/scout/aws/s3.rb +54 -12
- data/lib/scout/offsite/resource.rb +34 -0
- data/lib/scout/offsite/ssh.rb +2 -0
- data/lib/scout/offsite/sync.rb +2 -0
- data/lib/scout/terraform_dsl/util.rb +2 -2
- data/lib/scout/terraform_dsl.rb +58 -0
- data/lib/scout-camp.rb +1 -0
- data/scout-camp.gemspec +37 -4
- data/scout_commands/sync +33 -0
- data/scout_commands/terraform/lambda_task +9 -5
- data/scout_commands/terraform/list +11 -3
- data/scout_commands/terraform/outputs +33 -0
- data/share/aws/lambda_function.rb +34 -7
- data/share/terraform/aws/container_lambda/data.tf +15 -0
- data/share/terraform/aws/container_lambda/locals.tf +8 -0
- data/share/terraform/aws/container_lambda/main.tf +47 -0
- data/share/terraform/aws/container_lambda/variables.tf +44 -0
- data/share/terraform/aws/efs/data.tf +12 -0
- data/share/terraform/aws/efs/locals.tf +6 -0
- data/share/terraform/aws/efs/main.tf +14 -0
- data/share/terraform/aws/efs/output.tf +3 -0
- data/share/terraform/aws/efs/variables.tf +9 -0
- data/share/terraform/aws/efs_host/data.tf +11 -0
- data/share/terraform/aws/efs_host/locals.tf +8 -0
- data/share/terraform/aws/efs_host/main.tf +32 -0
- data/share/terraform/aws/efs_host/output.tf +3 -0
- data/share/terraform/aws/efs_host/variables.tf +28 -0
- data/share/terraform/aws/fargate/locals.tf +8 -0
- data/share/terraform/aws/fargate/main.tf +41 -0
- data/share/terraform/aws/fargate/variables.tf +84 -0
- data/share/terraform/aws/iam_instance_profile/main.tf +5 -0
- data/share/terraform/aws/iam_instance_profile/output.tf +15 -0
- data/share/terraform/aws/iam_instance_profile/variables.tf +9 -0
- data/share/terraform/aws/lambda/main.tf +1 -1
- data/share/terraform/aws/lambda/variables.tf +3 -4
- data/share/terraform/aws/network/data.tf +15 -0
- data/share/terraform/aws/network/main.tf +41 -0
- data/share/terraform/aws/network/output.tf +7 -0
- data/share/terraform/aws/network/variables.tf +0 -0
- data/share/terraform/aws/policy/main.tf +8 -0
- data/share/terraform/aws/policy/output.tf +15 -0
- data/share/terraform/aws/policy/variables.tf +12 -0
- data/share/terraform/aws/role/main.tf +1 -1
- data/share/terraform/aws/role/output.tf +1 -1
- data/share/terraform/aws/role/variables.tf +4 -1
- data/share/terraform/aws/role_policy/main.tf +9 -0
- data/share/terraform/aws/role_policy/variables.tf +16 -0
- data/test/scout/aws/test_s3.rb +14 -1
- data/test/scout/offsite/test_resource.rb +46 -0
- data/test/scout/offsite/test_sync.rb +1 -0
- metadata +36 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de2b027b60ec3f0c33cb643258e365f129b217368040cc49d6df0b7232d643f9
|
4
|
+
data.tar.gz: a89e3ed2424d5eb99f107314bab8f6406297b1e2961d6b7fb084f652abcb4705
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30a2f0f6b5f1c28dfb6b2c364c78e8efa10c1dca04ad5a53ca651c62607c41ec74981a4729e885b778954e67dd5be4fcd6c27b12ea976bfc71854c55f97a15f7
|
7
|
+
data.tar.gz: 5c598b2cc4295153b2c2ad8cd7105c7d9b4dfb37b6a176065520523159e8de67167b5a211d06bcdef8322bd3f59b3414734ef1ac380fd80996ebf1fe07a49600
|
data/.vimproject
CHANGED
@@ -19,19 +19,24 @@ scout-camp=/$PWD filter="*" {
|
|
19
19
|
ssh.rb
|
20
20
|
step.rb
|
21
21
|
sync.rb
|
22
|
+
resource.rb
|
22
23
|
}
|
23
24
|
}
|
24
25
|
}
|
25
26
|
scout_commands=scout_commands {
|
26
27
|
offsite
|
28
|
+
sync
|
29
|
+
|
27
30
|
terraform=terraform{
|
28
31
|
list
|
29
32
|
add=add{
|
30
|
-
lambda
|
31
33
|
relay
|
34
|
+
lambda
|
35
|
+
host
|
36
|
+
fargate
|
32
37
|
}
|
33
|
-
add
|
34
38
|
status
|
39
|
+
outputs
|
35
40
|
apply
|
36
41
|
plan
|
37
42
|
destroy
|
@@ -42,38 +47,89 @@ scout-camp=/$PWD filter="*" {
|
|
42
47
|
share=share {
|
43
48
|
terraform=terraform {
|
44
49
|
aws=aws {
|
50
|
+
fargate=fargate{
|
51
|
+
main.tf
|
52
|
+
variables.tf
|
53
|
+
locals.tf
|
54
|
+
}
|
55
|
+
|
56
|
+
efs_host=efs_host{
|
57
|
+
main.tf
|
58
|
+
variables.tf
|
59
|
+
locals.tf
|
60
|
+
data.tf
|
61
|
+
output.tf
|
62
|
+
}
|
63
|
+
|
64
|
+
efs=efs{
|
65
|
+
main.tf
|
66
|
+
variables.tf
|
67
|
+
data.tf
|
68
|
+
locals.tf
|
69
|
+
output.tf
|
70
|
+
}
|
71
|
+
|
72
|
+
network=network{
|
73
|
+
data.tf
|
74
|
+
main.tf
|
75
|
+
variables.tf
|
76
|
+
output.tf
|
77
|
+
}
|
78
|
+
|
45
79
|
bucket=bucket {
|
46
80
|
main.tf
|
47
81
|
output.tf
|
48
82
|
variables.tf
|
49
83
|
}
|
84
|
+
|
50
85
|
lambda=lambda {
|
51
86
|
main.tf
|
52
87
|
variables.tf
|
53
88
|
}
|
89
|
+
|
90
|
+
container_lambda=container_lambda{
|
91
|
+
main.tf
|
92
|
+
locals.tf
|
93
|
+
variables.tf
|
94
|
+
}
|
95
|
+
|
54
96
|
role=role{
|
55
97
|
main.tf
|
56
98
|
variables.tf
|
57
99
|
output.tf
|
58
100
|
}
|
101
|
+
|
102
|
+
policy=policy{
|
103
|
+
main.tf
|
104
|
+
variables.tf
|
105
|
+
output.tf
|
106
|
+
}
|
107
|
+
|
108
|
+
role_policy=role_policy{
|
109
|
+
main.tf
|
110
|
+
variables.tf
|
111
|
+
}
|
112
|
+
|
59
113
|
policy_attachment=policy_attachment {
|
60
114
|
main.tf
|
61
115
|
variables.tf
|
62
116
|
}
|
63
|
-
|
117
|
+
|
118
|
+
iam_instance_profile=iam_instance_profile{
|
64
119
|
main.tf
|
65
|
-
output.tf
|
66
120
|
variables.tf
|
121
|
+
output.tf
|
67
122
|
}
|
68
|
-
|
69
|
-
|
123
|
+
|
124
|
+
cluster=cluster {
|
70
125
|
main.tf
|
71
126
|
output.tf
|
72
127
|
variables.tf
|
73
128
|
}
|
74
|
-
|
129
|
+
host=host {
|
75
130
|
locals.tf
|
76
131
|
main.tf
|
132
|
+
output.tf
|
77
133
|
variables.tf
|
78
134
|
}
|
79
135
|
provider=provider {
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.10
|
data/lib/scout/aws/s3.rb
CHANGED
@@ -59,12 +59,20 @@ module Open
|
|
59
59
|
s3.put_object(bucket: bucket, key: key, body: content)
|
60
60
|
end
|
61
61
|
|
62
|
+
def self.touch(uri)
|
63
|
+
if self.exists?(uri)
|
64
|
+
else
|
65
|
+
self.cp(uri, uri)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
62
69
|
def self.glob(uri, pattern="**/*")
|
63
70
|
bucket, prefix = parse_s3_uri(uri)
|
64
71
|
s3 = Aws::S3::Client.new
|
65
72
|
matches = []
|
66
73
|
continuation_token = nil
|
67
74
|
|
75
|
+
Log.debug "Glob: #{uri} #{pattern}"
|
68
76
|
loop do
|
69
77
|
resp = s3.list_objects_v2(
|
70
78
|
bucket: bucket,
|
@@ -82,8 +90,19 @@ module Open
|
|
82
90
|
remaining = remaining.sub(%r{^/}, '')
|
83
91
|
end
|
84
92
|
|
93
|
+
Log.debug "Glob: #{remaining}"
|
94
|
+
|
85
95
|
if File.fnmatch?(pattern, remaining, File::FNM_PATHNAME)
|
86
96
|
matches << "s3://#{bucket}/#{key}"
|
97
|
+
else
|
98
|
+
dir = File.dirname(remaining)
|
99
|
+
while dir
|
100
|
+
if File.fnmatch?(pattern, dir, File::FNM_PATHNAME)
|
101
|
+
matches << "s3://#{bucket}/#{File.join(prefix,dir)}"
|
102
|
+
end
|
103
|
+
break if dir == File.dirname(dir)
|
104
|
+
dir = File.dirname(dir)
|
105
|
+
end
|
87
106
|
end
|
88
107
|
end
|
89
108
|
|
@@ -136,18 +155,22 @@ module Open
|
|
136
155
|
end
|
137
156
|
|
138
157
|
def self.cp(source, target)
|
139
|
-
|
140
|
-
|
158
|
+
if is_s3?(target)
|
159
|
+
source_bucket, source_key = parse_s3_uri(source)
|
160
|
+
target_bucket, target_key = parse_s3_uri(target)
|
141
161
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
162
|
+
s3 = Aws::S3::Client.new
|
163
|
+
s3.copy_object({
|
164
|
+
copy_source: "#{source_bucket}/#{source_key}",
|
165
|
+
bucket: target_bucket,
|
166
|
+
key: target_key
|
167
|
+
})
|
168
|
+
else
|
169
|
+
Open.sensible_write(target, get_stream(source))
|
170
|
+
end
|
148
171
|
end
|
149
172
|
|
150
|
-
def self.
|
173
|
+
def self.file_exists?(uri)
|
151
174
|
bucket, key = parse_s3_uri(uri)
|
152
175
|
return false if key.empty? # Can't check existence of bucket this way
|
153
176
|
|
@@ -157,6 +180,28 @@ module Open
|
|
157
180
|
rescue Aws::S3::Errors::NotFound, Aws::S3::Errors::NoSuchBucket
|
158
181
|
false
|
159
182
|
end
|
183
|
+
|
184
|
+
def self.directory?(uri)
|
185
|
+
bucket, key = parse_s3_uri(uri)
|
186
|
+
return false if key.empty? # Can't check existence of bucket this way
|
187
|
+
|
188
|
+
s3 = Aws::S3::Client.new
|
189
|
+
response = s3.list_objects_v2({
|
190
|
+
bucket: bucket,
|
191
|
+
prefix: key,
|
192
|
+
max_keys: 1
|
193
|
+
})
|
194
|
+
|
195
|
+
!response.contents.empty?
|
196
|
+
end
|
197
|
+
|
198
|
+
def self.exists?(uri)
|
199
|
+
begin
|
200
|
+
file_exists?(uri) || directory?(uri)
|
201
|
+
rescue
|
202
|
+
false
|
203
|
+
end
|
204
|
+
end
|
160
205
|
|
161
206
|
self.singleton_class.alias_method :exist?, :exists?
|
162
207
|
|
@@ -202,6 +247,3 @@ end
|
|
202
247
|
|
203
248
|
Hook.apply(Open::S3, Open)
|
204
249
|
Hook.apply(Path::S3, Path)
|
205
|
-
|
206
|
-
|
207
|
-
#$ ask -t code --file /home/miki/git/scout-camp/lib/scout/aws/s3.rb extend this file [[...]] to include a function called self.exists? that determines if a uri exists {{{
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'scout/resource'
|
2
|
+
require_relative 'sync'
|
3
|
+
module Resource
|
4
|
+
def self.sync(path, map = nil, source: nil, target: nil, resource: nil, **kwargs)
|
5
|
+
map = 'user' if map.nil?
|
6
|
+
|
7
|
+
if source
|
8
|
+
paths = [path]
|
9
|
+
real_paths, identified_paths = SSHLine.locate(source, paths)
|
10
|
+
else
|
11
|
+
resource = path.pkgdir if resource.nil? and path.is_a?(Path) and path.pkgdir.is_a?(Resource)
|
12
|
+
resource = Resource.default_resource if resource.nil?
|
13
|
+
|
14
|
+
if File.exist?(path)
|
15
|
+
real_paths = [path]
|
16
|
+
else
|
17
|
+
path = Path.setup(path, pkgdir: resource) unless path.is_a?(Path)
|
18
|
+
real_paths = path.directory? ? path.find_all : path.glob_all
|
19
|
+
end
|
20
|
+
|
21
|
+
identified_paths = real_paths.collect{|path| resource.identify(path) }
|
22
|
+
end
|
23
|
+
|
24
|
+
if target
|
25
|
+
target_paths = SSHLine.locate(target, identified_paths, map: map)
|
26
|
+
else
|
27
|
+
target_paths = identified_paths.collect{|p| p.find(map) }
|
28
|
+
end
|
29
|
+
|
30
|
+
real_paths.zip(target_paths).each do |source_path,target_path|
|
31
|
+
Open.sync(source_path, target_path, kwargs.merge(source: source, target: target))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/scout/offsite/ssh.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'net/ssh'
|
2
|
+
require 'scout/persist'
|
2
3
|
require_relative 'exceptions'
|
3
4
|
|
4
5
|
class SSHLine
|
@@ -90,6 +91,7 @@ class SSHLine
|
|
90
91
|
def scout(script)
|
91
92
|
scout_script =<<-EOF
|
92
93
|
require 'scout'
|
94
|
+
require 'scout/offsite/ssh'
|
93
95
|
SSHLine.run_local do
|
94
96
|
#{script.strip}
|
95
97
|
end
|
data/lib/scout/offsite/sync.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require_relative 'ssh'
|
1
2
|
class SSHLine
|
2
3
|
def self.locate(server, paths, map: :user)
|
3
4
|
SSHLine.scout server, <<-EOF
|
@@ -5,6 +6,7 @@ map = :#{map}
|
|
5
6
|
paths = [#{paths.collect{|p| "'" + p + "'" } * ", " }]
|
6
7
|
located = paths.collect{|p| Path.setup(p).find(map) }
|
7
8
|
identified = paths.collect{|p| Resource.identify(p) }
|
9
|
+
located = located.collect{|path| path << "/" if path.directory? }
|
8
10
|
[located, identified]
|
9
11
|
EOF
|
10
12
|
end
|
@@ -13,9 +13,9 @@ class TerraformDSL
|
|
13
13
|
# @param prefix [nil,String] Optional prefix to prepend
|
14
14
|
def self.log(msg, prefix = nil)
|
15
15
|
if prefix
|
16
|
-
|
16
|
+
Log.info("[#{prefix}] " + msg)
|
17
17
|
else
|
18
|
-
|
18
|
+
Log.info(msg)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
data/lib/scout/terraform_dsl.rb
CHANGED
@@ -80,7 +80,17 @@ class TerraformDSL
|
|
80
80
|
def to_json(*_args)
|
81
81
|
['module', @name].join('.')
|
82
82
|
end
|
83
|
+
end
|
84
|
+
|
85
|
+
module DirectReference
|
86
|
+
def to_json(*_args)
|
87
|
+
self
|
88
|
+
end
|
83
89
|
|
90
|
+
def method_missing(elem)
|
91
|
+
new = self + '.' + elem.to_s
|
92
|
+
new.extend DirectReference
|
93
|
+
end
|
84
94
|
end
|
85
95
|
|
86
96
|
MODULES_DIR = Scout.share.terraform
|
@@ -129,6 +139,8 @@ class TerraformDSL
|
|
129
139
|
|
130
140
|
if value.is_a?(String) && (m = value.match(/^module\.(.*)\.(.*)/))
|
131
141
|
value = Module::Output.new m[1], m[2]
|
142
|
+
elsif value.is_a?(Symbol)
|
143
|
+
value = variables[value]
|
132
144
|
end
|
133
145
|
|
134
146
|
acc << " #{name} = #{value.to_json}"
|
@@ -180,6 +192,52 @@ class TerraformDSL
|
|
180
192
|
nil
|
181
193
|
end
|
182
194
|
|
195
|
+
# Add a backend template file without using modules.
|
196
|
+
#
|
197
|
+
# @param variables [Hash] variables for the backend:
|
198
|
+
# :bucket, :key & :region
|
199
|
+
def backend(type, variables = {})
|
200
|
+
variables = variables.dup
|
201
|
+
|
202
|
+
text =<<~EOF
|
203
|
+
terraform {
|
204
|
+
backend "#{type}" {
|
205
|
+
#{variable_block(variables)}
|
206
|
+
}
|
207
|
+
}
|
208
|
+
EOF
|
209
|
+
|
210
|
+
element_file = ['backend_config', type.to_s].join('.')
|
211
|
+
|
212
|
+
custom(element_file, text)
|
213
|
+
|
214
|
+
nil
|
215
|
+
end
|
216
|
+
|
217
|
+
# Connect to a remote state through a backend
|
218
|
+
#
|
219
|
+
# @param variables [Hash] variables for the backend:
|
220
|
+
# :bucket, :key & :region
|
221
|
+
def remote(type, key, variables = {})
|
222
|
+
variables = variables.dup
|
223
|
+
variables[:key] = key unless variables.include?(:key)
|
224
|
+
|
225
|
+
text =<<~EOF
|
226
|
+
data "terraform_remote_state" "#{key}" {
|
227
|
+
backend = "#{type}"
|
228
|
+
config = {
|
229
|
+
#{variable_block(variables)}
|
230
|
+
}
|
231
|
+
}
|
232
|
+
EOF
|
233
|
+
|
234
|
+
element_file = ['remote', type.to_s, key.to_s].join('.')
|
235
|
+
|
236
|
+
custom(element_file, text)
|
237
|
+
|
238
|
+
"data.terraform_remote_state.#{key}".extend DirectReference
|
239
|
+
end
|
240
|
+
|
183
241
|
# Add a provider template file without using modules.
|
184
242
|
# Defining providers in modules is problematic when providers
|
185
243
|
# are not managed by Hashicorp. Hopefully we can
|
data/lib/scout-camp.rb
CHANGED
data/scout-camp.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: scout-camp 0.1.
|
5
|
+
# stub: scout-camp 0.1.10 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "scout-camp".freeze
|
9
|
-
s.version = "0.1.
|
9
|
+
s.version = "0.1.10".freeze
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Miguel Vazquez".freeze]
|
14
|
-
s.date = "2025-04-
|
14
|
+
s.date = "2025-04-16"
|
15
15
|
s.description = "Functionalities to deploy and use scouts in remote servers like AWS".freeze
|
16
16
|
s.email = "mikisvaz@gmail.com".freeze
|
17
17
|
s.executables = ["scout-camp".freeze]
|
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/scout/aws/s3.rb",
|
31
31
|
"lib/scout/offsite.rb",
|
32
32
|
"lib/scout/offsite/exceptions.rb",
|
33
|
+
"lib/scout/offsite/resource.rb",
|
33
34
|
"lib/scout/offsite/ssh.rb",
|
34
35
|
"lib/scout/offsite/step.rb",
|
35
36
|
"lib/scout/offsite/sync.rb",
|
@@ -38,12 +39,14 @@ Gem::Specification.new do |s|
|
|
38
39
|
"lib/scout/terraform_dsl/util.rb",
|
39
40
|
"scout-camp.gemspec",
|
40
41
|
"scout_commands/offsite",
|
42
|
+
"scout_commands/sync",
|
41
43
|
"scout_commands/terraform/add/lambda",
|
42
44
|
"scout_commands/terraform/add/relay",
|
43
45
|
"scout_commands/terraform/apply",
|
44
46
|
"scout_commands/terraform/destroy",
|
45
47
|
"scout_commands/terraform/lambda_task",
|
46
48
|
"scout_commands/terraform/list",
|
49
|
+
"scout_commands/terraform/outputs",
|
47
50
|
"scout_commands/terraform/plan",
|
48
51
|
"scout_commands/terraform/remove",
|
49
52
|
"scout_commands/terraform/status",
|
@@ -55,12 +58,39 @@ Gem::Specification.new do |s|
|
|
55
58
|
"share/terraform/aws/cluster/main.tf",
|
56
59
|
"share/terraform/aws/cluster/output.tf",
|
57
60
|
"share/terraform/aws/cluster/variables.tf",
|
61
|
+
"share/terraform/aws/container_lambda/data.tf",
|
62
|
+
"share/terraform/aws/container_lambda/locals.tf",
|
63
|
+
"share/terraform/aws/container_lambda/main.tf",
|
64
|
+
"share/terraform/aws/container_lambda/variables.tf",
|
65
|
+
"share/terraform/aws/efs/data.tf",
|
66
|
+
"share/terraform/aws/efs/locals.tf",
|
67
|
+
"share/terraform/aws/efs/main.tf",
|
68
|
+
"share/terraform/aws/efs/output.tf",
|
69
|
+
"share/terraform/aws/efs/variables.tf",
|
70
|
+
"share/terraform/aws/efs_host/data.tf",
|
71
|
+
"share/terraform/aws/efs_host/locals.tf",
|
72
|
+
"share/terraform/aws/efs_host/main.tf",
|
73
|
+
"share/terraform/aws/efs_host/output.tf",
|
74
|
+
"share/terraform/aws/efs_host/variables.tf",
|
75
|
+
"share/terraform/aws/fargate/locals.tf",
|
76
|
+
"share/terraform/aws/fargate/main.tf",
|
77
|
+
"share/terraform/aws/fargate/variables.tf",
|
58
78
|
"share/terraform/aws/host/locals.tf",
|
59
79
|
"share/terraform/aws/host/main.tf",
|
60
80
|
"share/terraform/aws/host/output.tf",
|
61
81
|
"share/terraform/aws/host/variables.tf",
|
82
|
+
"share/terraform/aws/iam_instance_profile/main.tf",
|
83
|
+
"share/terraform/aws/iam_instance_profile/output.tf",
|
84
|
+
"share/terraform/aws/iam_instance_profile/variables.tf",
|
62
85
|
"share/terraform/aws/lambda/main.tf",
|
63
86
|
"share/terraform/aws/lambda/variables.tf",
|
87
|
+
"share/terraform/aws/network/data.tf",
|
88
|
+
"share/terraform/aws/network/main.tf",
|
89
|
+
"share/terraform/aws/network/output.tf",
|
90
|
+
"share/terraform/aws/network/variables.tf",
|
91
|
+
"share/terraform/aws/policy/main.tf",
|
92
|
+
"share/terraform/aws/policy/output.tf",
|
93
|
+
"share/terraform/aws/policy/variables.tf",
|
64
94
|
"share/terraform/aws/policy_attachment/main.tf",
|
65
95
|
"share/terraform/aws/policy_attachment/variables.tf",
|
66
96
|
"share/terraform/aws/provider/data.tf",
|
@@ -68,9 +98,12 @@ Gem::Specification.new do |s|
|
|
68
98
|
"share/terraform/aws/role/main.tf",
|
69
99
|
"share/terraform/aws/role/output.tf",
|
70
100
|
"share/terraform/aws/role/variables.tf",
|
101
|
+
"share/terraform/aws/role_policy/main.tf",
|
102
|
+
"share/terraform/aws/role_policy/variables.tf",
|
71
103
|
"share/terraform/ssh/cmd/main.tf",
|
72
104
|
"share/terraform/ssh/cmd/variables.tf",
|
73
105
|
"test/scout/aws/test_s3.rb",
|
106
|
+
"test/scout/offsite/test_resource.rb",
|
74
107
|
"test/scout/offsite/test_ssh.rb",
|
75
108
|
"test/scout/offsite/test_step.rb",
|
76
109
|
"test/scout/offsite/test_sync.rb",
|
@@ -79,7 +112,7 @@ Gem::Specification.new do |s|
|
|
79
112
|
]
|
80
113
|
s.homepage = "http://github.com/mikisvaz/scout-camp".freeze
|
81
114
|
s.licenses = ["MIT".freeze]
|
82
|
-
s.rubygems_version = "3.6.
|
115
|
+
s.rubygems_version = "3.6.6".freeze
|
83
116
|
s.summary = "Deploy you scouts".freeze
|
84
117
|
|
85
118
|
s.specification_version = 4
|
data/scout_commands/sync
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'scout'
|
4
|
+
require 'scout/offsite/resource'
|
5
|
+
|
6
|
+
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
7
|
+
|
8
|
+
options = SOPT.setup <<EOF
|
9
|
+
|
10
|
+
Sync to resources between path maps or between hosts
|
11
|
+
|
12
|
+
$ #{$0} [<options>] <path> [<path_map>]
|
13
|
+
|
14
|
+
Path map defaults to :user
|
15
|
+
|
16
|
+
-h--help Print this help
|
17
|
+
-s--source* Host of source path
|
18
|
+
-t--target* Host of target path
|
19
|
+
EOF
|
20
|
+
if options[:help]
|
21
|
+
if defined? scout_usage
|
22
|
+
scout_usage
|
23
|
+
else
|
24
|
+
puts SOPT.doc
|
25
|
+
end
|
26
|
+
exit 0
|
27
|
+
end
|
28
|
+
|
29
|
+
path, path_map = ARGV
|
30
|
+
|
31
|
+
raise MissingParameterException, :path if path.nil?
|
32
|
+
|
33
|
+
Resource.sync(Path.setup(path.dup), path_map, **options)
|
@@ -12,6 +12,7 @@ $ #{$0} [<options>] <workflow> <task> [<other|->]*
|
|
12
12
|
|
13
13
|
-h--help Print this help
|
14
14
|
--prefix* Prefix, defaults to Scout
|
15
|
+
--queue Queue job
|
15
16
|
--clean Clean job
|
16
17
|
--recursive_clean Clean job recursively
|
17
18
|
EOF
|
@@ -28,14 +29,14 @@ end
|
|
28
29
|
|
29
30
|
raise ParamterException, "No workflow specified" if workflow.nil?
|
30
31
|
|
31
|
-
prefix, clean, recursive_clean = IndiferentHash.process_options options, :prefix, :clean, :recursive_clean,
|
32
|
+
prefix, clean, recursive_clean, queue = IndiferentHash.process_options options, :prefix, :clean, :recursive_clean, :queue,
|
32
33
|
prefix: "Scout"
|
33
34
|
|
34
35
|
require 'aws-sdk-lambda'
|
35
36
|
|
36
37
|
payload = {}
|
37
|
-
payload[
|
38
|
-
payload[
|
38
|
+
payload[:workflow] = workflow
|
39
|
+
payload[:task_name] = task_name
|
39
40
|
|
40
41
|
if clean
|
41
42
|
payload["clean"] = true
|
@@ -43,10 +44,13 @@ elsif recursive_clean
|
|
43
44
|
payload["clean"] = 'recursive'
|
44
45
|
end
|
45
46
|
|
47
|
+
payload["queue"] = true if queue
|
48
|
+
|
46
49
|
lambda_handler = "#{prefix}Job"
|
47
50
|
|
48
51
|
def aws_lambda(name, payload)
|
49
52
|
client = Aws::Lambda::Client.new
|
53
|
+
Log.debug "Sending Lambda #{name} #{Log.fingerprint payload}"
|
50
54
|
resp = client.invoke({
|
51
55
|
function_name: name,
|
52
56
|
payload: payload.to_json,
|
@@ -64,7 +68,7 @@ def SOPT_str(task_info)
|
|
64
68
|
boolean = type.to_sym == :boolean
|
65
69
|
|
66
70
|
sopt_options << "-#{shortcut}--#{name}#{boolean ? "" : "*"}"
|
67
|
-
end
|
71
|
+
end if task_info[:inputs]
|
68
72
|
|
69
73
|
sopt_options * ":"
|
70
74
|
end
|
@@ -81,7 +85,7 @@ def get_SOPT(task_info)
|
|
81
85
|
if job_options.include?(name) && (! Open.exist?(job_options[name]) || type.to_s.include?('file') || type.to_s.include?('path'))
|
82
86
|
job_options[name] = job_options[name].split(",")
|
83
87
|
end
|
84
|
-
end
|
88
|
+
end if task_info[:inputs]
|
85
89
|
job_options
|
86
90
|
end
|
87
91
|
|
@@ -25,12 +25,20 @@ end
|
|
25
25
|
deployments = Scout.var.deployments.glob_all("*")
|
26
26
|
|
27
27
|
deployments.each do |dir|
|
28
|
+
next unless File.directory?(dir)
|
28
29
|
name = File.basename dir
|
29
30
|
deployment = TerraformDSL::Deployment.new dir
|
30
|
-
active = options[:active] && deployment.provisioned_elements.any?
|
31
|
+
#active = options[:active] && deployment.provisioned_elements.any?
|
31
32
|
|
32
|
-
if active
|
33
|
-
|
33
|
+
if options[:active]
|
34
|
+
Log.with_severity 5 do
|
35
|
+
print Log.color(:title, name ) + "\t" + dir + "\t"
|
36
|
+
if deployment.provisioned_elements.any?
|
37
|
+
puts Log.color :present, "Active"
|
38
|
+
else
|
39
|
+
puts Log.color :missing, "Inactive"
|
40
|
+
end
|
41
|
+
end
|
34
42
|
else
|
35
43
|
puts Log.color(:title, name) + "\t" + dir
|
36
44
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'scout'
|
4
|
+
|
5
|
+
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
6
|
+
|
7
|
+
options = SOPT.setup <<EOF
|
8
|
+
|
9
|
+
Work with deployment
|
10
|
+
|
11
|
+
$ #{$0} [<options>] <name>
|
12
|
+
|
13
|
+
-h--help Print this help
|
14
|
+
EOF
|
15
|
+
if options[:help]
|
16
|
+
if defined? scout_usage
|
17
|
+
scout_usage
|
18
|
+
else
|
19
|
+
puts SOPT.doc
|
20
|
+
end
|
21
|
+
exit 0
|
22
|
+
end
|
23
|
+
|
24
|
+
name = ARGV.shift
|
25
|
+
raise MissingParameterException, :name if name.nil?
|
26
|
+
|
27
|
+
dir = Scout.var.deployments.glob_all(name).first
|
28
|
+
|
29
|
+
deployment = TerraformDSL::Deployment.new dir
|
30
|
+
deployment.provisioned_elements.each do |element|
|
31
|
+
ppp deployment.element_state(element)
|
32
|
+
end
|
33
|
+
|