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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.vimproject +63 -7
  3. data/VERSION +1 -1
  4. data/lib/scout/aws/s3.rb +54 -12
  5. data/lib/scout/offsite/resource.rb +34 -0
  6. data/lib/scout/offsite/ssh.rb +2 -0
  7. data/lib/scout/offsite/sync.rb +2 -0
  8. data/lib/scout/terraform_dsl/util.rb +2 -2
  9. data/lib/scout/terraform_dsl.rb +58 -0
  10. data/lib/scout-camp.rb +1 -0
  11. data/scout-camp.gemspec +37 -4
  12. data/scout_commands/sync +33 -0
  13. data/scout_commands/terraform/lambda_task +9 -5
  14. data/scout_commands/terraform/list +11 -3
  15. data/scout_commands/terraform/outputs +33 -0
  16. data/share/aws/lambda_function.rb +34 -7
  17. data/share/terraform/aws/container_lambda/data.tf +15 -0
  18. data/share/terraform/aws/container_lambda/locals.tf +8 -0
  19. data/share/terraform/aws/container_lambda/main.tf +47 -0
  20. data/share/terraform/aws/container_lambda/variables.tf +44 -0
  21. data/share/terraform/aws/efs/data.tf +12 -0
  22. data/share/terraform/aws/efs/locals.tf +6 -0
  23. data/share/terraform/aws/efs/main.tf +14 -0
  24. data/share/terraform/aws/efs/output.tf +3 -0
  25. data/share/terraform/aws/efs/variables.tf +9 -0
  26. data/share/terraform/aws/efs_host/data.tf +11 -0
  27. data/share/terraform/aws/efs_host/locals.tf +8 -0
  28. data/share/terraform/aws/efs_host/main.tf +32 -0
  29. data/share/terraform/aws/efs_host/output.tf +3 -0
  30. data/share/terraform/aws/efs_host/variables.tf +28 -0
  31. data/share/terraform/aws/fargate/locals.tf +8 -0
  32. data/share/terraform/aws/fargate/main.tf +41 -0
  33. data/share/terraform/aws/fargate/variables.tf +84 -0
  34. data/share/terraform/aws/iam_instance_profile/main.tf +5 -0
  35. data/share/terraform/aws/iam_instance_profile/output.tf +15 -0
  36. data/share/terraform/aws/iam_instance_profile/variables.tf +9 -0
  37. data/share/terraform/aws/lambda/main.tf +1 -1
  38. data/share/terraform/aws/lambda/variables.tf +3 -4
  39. data/share/terraform/aws/network/data.tf +15 -0
  40. data/share/terraform/aws/network/main.tf +41 -0
  41. data/share/terraform/aws/network/output.tf +7 -0
  42. data/share/terraform/aws/network/variables.tf +0 -0
  43. data/share/terraform/aws/policy/main.tf +8 -0
  44. data/share/terraform/aws/policy/output.tf +15 -0
  45. data/share/terraform/aws/policy/variables.tf +12 -0
  46. data/share/terraform/aws/role/main.tf +1 -1
  47. data/share/terraform/aws/role/output.tf +1 -1
  48. data/share/terraform/aws/role/variables.tf +4 -1
  49. data/share/terraform/aws/role_policy/main.tf +9 -0
  50. data/share/terraform/aws/role_policy/variables.tf +16 -0
  51. data/test/scout/aws/test_s3.rb +14 -1
  52. data/test/scout/offsite/test_resource.rb +46 -0
  53. data/test/scout/offsite/test_sync.rb +1 -0
  54. metadata +36 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd5f35a6409cd8556f8fb6cb8641c28c36fb3b0dcc9110eeef8c8d9a5ea42594
4
- data.tar.gz: 7bb5e7f5b07ac7d9ca601909bc3c5632d6f9d1630020e308d901d8b3a771d0f5
3
+ metadata.gz: de2b027b60ec3f0c33cb643258e365f129b217368040cc49d6df0b7232d643f9
4
+ data.tar.gz: a89e3ed2424d5eb99f107314bab8f6406297b1e2961d6b7fb084f652abcb4705
5
5
  SHA512:
6
- metadata.gz: e460301e94edf73163f57309498db7d04b38b202c0437938dc0bf10cb0a31e1683f8d908309b0876fe106e781f2b69e24563656562eb57e0a759116bfb38f904
7
- data.tar.gz: 6a78670a91b259399cad19a95411c214f3382173c37bb2611f4b13deb8a32a1626d0f2dfb793e8462253e6322156b104816a0bc5f3f37ce9d0cf3017bf735adf
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
- cluster=cluster {
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
- host=host {
69
- locals.tf
123
+
124
+ cluster=cluster {
70
125
  main.tf
71
126
  output.tf
72
127
  variables.tf
73
128
  }
74
- fargate=fargate{
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.6
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
- source_bucket, source_key = parse_s3_uri(source)
140
- target_bucket, target_key = parse_s3_uri(target)
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
- s3 = Aws::S3::Client.new
143
- s3.copy_object({
144
- copy_source: "#{source_bucket}/#{source_key}",
145
- bucket: target_bucket,
146
- key: target_key
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.exists?(uri)
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
@@ -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
@@ -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
- STDOUT.puts("[#{prefix}] " + msg)
16
+ Log.info("[#{prefix}] " + msg)
17
17
  else
18
- STDOUT.puts(msg)
18
+ Log.info(msg)
19
19
  end
20
20
  end
21
21
 
@@ -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
@@ -4,3 +4,4 @@ require 'scout/resource'
4
4
  Path.add_path :scout_camp, File.join(Path.caller_lib_dir(__FILE__), "{TOPLEVEL}/{SUBPATH}")
5
5
  require 'scout/terraform_dsl'
6
6
  require 'scout/offsite'
7
+ require 'scout/aws/s3'
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.6 ruby lib
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.6".freeze
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-08"
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.5".freeze
115
+ s.rubygems_version = "3.6.6".freeze
83
116
  s.summary = "Deploy you scouts".freeze
84
117
 
85
118
  s.specification_version = 4
@@ -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["workflow"] = workflow
38
- payload["task_name"] = task_name
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
- puts Log.color(:title, name ) + "\t" + dir + "\t" + "Active"
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
+