scout-camp 0.1.4 → 0.1.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc2855face5f3cb3ced365171398295b656f378fc681da6f0cd530c2c2977ea6
4
- data.tar.gz: baacce8525b32344f5391d9fa61b62dbb639a91bbddb2ca392a8f7ac8ce762f3
3
+ metadata.gz: 225a937ec9eac0522929e3da409bed070cf387a725d8c8cc5e4041832746fee5
4
+ data.tar.gz: 5d88f8bc6d5d382b0de9b1765a5cf95e688708dfdbe67cb4372055876fcc5f4c
5
5
  SHA512:
6
- metadata.gz: c4e5de039eaba61b854f1b0af3a41172d95bbd872f64750d8bd9775b6321bcc0cbe174adbdf684a14ff836195b6cc840be06d97ddd4803ceb2b56cb032302d91
7
- data.tar.gz: ca4e6b9e69160ba22e57b3b2cadc9a669f628fdf47b20ea696cf2678b998f686bb6eebc6abcc9aba03369356a5257175b701f080dafd9bb464b3f71cbcceb779
6
+ metadata.gz: 7008e9b2ae08a9f6c8fdef48e913d09a6d07eb42825c246bd6182b23868798c1d5227fbcd8acf9147dc1918e0b920d90851539c6a8d74cae481e1cc65afce22a
7
+ data.tar.gz: 9cfc47356b2225417cceab5625e43a047df912011b655ff6754f770d6cdf9beca85dd6cddfe266ffe6a4018ba5ee52728d7a199051dfcfa4a026aa7248801f10
data/.vimproject CHANGED
@@ -27,11 +27,13 @@ scout-camp=/$PWD filter="*" {
27
27
  terraform=terraform{
28
28
  list
29
29
  add
30
+ fargate
30
31
  status
31
32
  apply
32
33
  plan
33
34
  destroy
34
35
  remove
36
+ task
35
37
  }
36
38
  }
37
39
  share=share {
@@ -66,12 +68,20 @@ scout-camp=/$PWD filter="*" {
66
68
  output.tf
67
69
  variables.tf
68
70
  }
71
+ fargate=fargate{
72
+ locals.tf
73
+ main.tf
74
+ variables.tf
75
+ }
69
76
  provider=provider {
70
77
  data.tf
71
78
  output.tf
72
79
  }
73
80
  }
74
81
  }
82
+ aws=aws{
83
+ lambda_function.rb
84
+ }
75
85
  }
76
86
  test=test {
77
87
  test_helper.rb
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.1.5
data/lib/scout/aws/s3.rb CHANGED
@@ -69,8 +69,13 @@ module Open
69
69
 
70
70
  resp.contents.each do |object|
71
71
  key = object.key
72
- remaining = key[prefix.length..-1] || ''
73
- remaining = remaining.sub(%r{^/}, '') if prefix.empty? # Handle root-level keys with leading slash
72
+
73
+ if prefix.empty?
74
+ remaining = key.sub(%r{^/}, '')
75
+ else
76
+ remaining = key[prefix.length..-1] || ''
77
+ remaining = remaining.sub(%r{^/}, '')
78
+ end
74
79
 
75
80
  if File.fnmatch?(pattern, remaining, File::FNM_PATHNAME)
76
81
  matches << "s3://#{bucket}/#{key}"
@@ -143,6 +148,8 @@ module Open
143
148
  Open::S3.write(path, content)
144
149
  end
145
150
 
151
+ def self.mkdir(path)
152
+ end
146
153
  end
147
154
  end
148
155
 
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.4 ruby lib
5
+ # stub: scout-camp 0.1.5 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "scout-camp".freeze
9
- s.version = "0.1.4".freeze
9
+ s.version = "0.1.5".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-03-25"
14
+ s.date = "2025-03-31"
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]
@@ -45,6 +45,8 @@ Gem::Specification.new do |s|
45
45
  "scout_commands/terraform/plan",
46
46
  "scout_commands/terraform/remove",
47
47
  "scout_commands/terraform/status",
48
+ "scout_commands/terraform/task",
49
+ "share/aws/lambda_function.rb",
48
50
  "share/terraform/aws/bucket/main.tf",
49
51
  "share/terraform/aws/bucket/output.tf",
50
52
  "share/terraform/aws/bucket/variables.tf",
@@ -14,6 +14,7 @@ $ #{$0} [<options>] <name>
14
14
  -w--workflows* Workflows to provision
15
15
  -w--dependencies* Workflows to provision
16
16
  -b--bucket* Bucket to connect
17
+ --pkg* Pkgdir, scout or rbbt (defaults to scout)
17
18
  EOF
18
19
  if options[:help]
19
20
  if defined? scout_usage
@@ -31,37 +32,20 @@ deployments = Scout.var.deployments.glob_all("*").collect(&:basename)
31
32
  raise "Deployment clash" if deployments.include? name
32
33
  dir = Scout.var.deployments[name]
33
34
 
34
- IndiferentHash.add_defaults options, workflows: '', dependencies: 'scout-gear,scout-camp', bucket: 'scout.var'
35
+ IndiferentHash.add_defaults options, workflows: '', dependencies: 'scout-gear,scout-camp', bucket: 'scout.var', pkg: 'scout'
35
36
 
36
37
  workflows = options[:workflows].split(",")
37
38
  dependencies = options[:dependencies].split(",")
39
+ dependencies.push 'scout-camp' unless dependencies.include?('scout-camp')
40
+ pkg = options[:pkg]
38
41
 
39
- code =<<-'EOF'
40
- def lambda_handler(event:, context:)
41
- require 'scout'
42
- Path.path_maps[:bucket] = "s3://#{ENV["AWS_BUCKET"]}/{TOPLEVEL}/{SUBPATH}"
43
- Path.path_maps[:default] = :bucket
44
-
45
- require 'scout/workflow'
46
- require 'scout/aws/s3'
47
-
48
- workflow, task_name, jobname, inputs = IndiferentHash.process_options event,
49
- :workflow, :task_name, :jobname, :inputs
50
-
51
- wf = Workflow.require_workflow workflow
52
-
53
- job = wf.job(task_name, jobname, inputs)
54
- job.run
55
- end
56
- EOF
57
-
58
- def lambda_package(dependencies, workflows, code)
42
+ def lambda_package(dependencies, workflows, function_file, pkg)
59
43
  TmpFile.with_path do |dir|
60
- dir["lambda_function.rb"].write code
44
+ Open.cp function_file, dir["lambda_function.rb"]
61
45
  dir["Gemfile"].write "source 'https://rubygems.org'\n" + dependencies.collect{|d| "gem '#{d}'"}*"\n"
62
46
  workflows.each do |workflow|
63
- Open.mkdir dir[".scout"].workflows
64
- Open.cp Scout.workflows[workflow], dir[".scout"].workflows[workflow]
47
+ Open.mkdir dir[".#{pkg}"].workflows
48
+ Open.ln_s Scout.workflows[workflow], dir[".#{pkg}"].workflows[workflow]
65
49
  end
66
50
  Misc.in_dir dir do
67
51
  `bundle config set path 'vendor/bundle'`
@@ -69,19 +53,18 @@ def lambda_package(dependencies, workflows, code)
69
53
  `rm -Rf vendor/bundle/ruby/*/cache`
70
54
  `rm -Rf vendor/bundle/ruby/*/gems/RubyInline*`
71
55
  TmpFile.with_file nil, extension: :zip do |zip|
72
- `zip -r "#{zip}" vendor/bundle lambda_function.rb .scout`
56
+ `zip -r "#{zip}" vendor/bundle lambda_function.rb .#{pkg}`
73
57
  yield zip
74
58
  end
75
59
  end
76
60
  end
77
61
  end
78
62
 
79
- require 'aws-sdk'
80
- lambda_package dependencies, workflows, code do |file|
81
- terraform = TerraformDSL.new
63
+ lambda_package dependencies, workflows, Scout.share.aws.lambda_function.set_extension('rb'), options[:pkg] do |file|
82
64
  filename = 'lambda_package.zip'
83
65
  Open.cp file, dir[filename]
84
66
 
67
+ terraform = TerraformDSL.new
85
68
  role = terraform.add :aws, :role, role_name: "lambda_execution_role", principal: {Service: ["lambda.amazonaws.com"]}
86
69
 
87
70
  terraform.add :aws, :policy_attachment, name: "exec_policy", policy_name: "lamda_basic_execution",
@@ -0,0 +1,92 @@
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
+ Call a task on AWS
10
+
11
+ $ #{$0} [<options>] <workflow> <task> [<other|->]*
12
+
13
+ -h--help Print this help
14
+ --prefix* Prefix, defaults to Scout
15
+ EOF
16
+ if options[:help]
17
+ if defined? scout_usage
18
+ scout_usage
19
+ else
20
+ puts SOPT.doc
21
+ end
22
+ exit 0
23
+ end
24
+
25
+ workflow, task_name = ARGV
26
+
27
+ raise ParamterException, "No workflow specified" if workflow.nil?
28
+
29
+ prefix = IndiferentHash.process_options options, :prefix, prefix: "Scout"
30
+ require 'aws-sdk-lambda'
31
+ payload = {}
32
+ payload["workflow"] = workflow
33
+ payload["task_name"] = task_name
34
+ lambda_handler = "#{prefix}Job"
35
+
36
+ def aws_lambda(name, payload)
37
+ client = Aws::Lambda::Client.new
38
+ resp = client.invoke({
39
+ function_name: name,
40
+ payload: payload.to_json,
41
+ })
42
+
43
+ JSON.load(resp.payload)
44
+ end
45
+
46
+ def SOPT_str(task_info)
47
+ sopt_options = []
48
+ task_info[:inputs].each do |name|
49
+ options = task_info[:input_options][name]
50
+ type = task_info[:input_types][name]
51
+ shortcut = (options && options[:shortcut]) || name.to_s.slice(0,1)
52
+ boolean = type.to_sym == :boolean
53
+
54
+ sopt_options << "-#{shortcut}--#{name}#{boolean ? "" : "*"}"
55
+ end
56
+
57
+ sopt_options * ":"
58
+ end
59
+
60
+ def get_SOPT(task_info)
61
+ IndiferentHash.setup task_info
62
+ sopt_option_string = self.SOPT_str(task_info)
63
+ job_options = SOPT.get sopt_option_string
64
+
65
+ task_info[:inputs].each do |name|
66
+ options = task_info[:input_options][name]
67
+ type = task_info[:input_types][name]
68
+ next unless type.to_s.include?('array')
69
+ if job_options.include?(name) && (! Open.exist?(job_options[name]) || type.to_s.include?('file') || type.to_s.include?('path'))
70
+ job_options[name] = job_options[name].split(",")
71
+ end
72
+ end
73
+ job_options
74
+ end
75
+
76
+ res = case task_name
77
+ when nil
78
+ aws_lambda(lambda_handler, payload)
79
+ else
80
+ task_info = aws_lambda(lambda_handler, payload.merge(task_name: "info", inputs: {task_name: task_name}))
81
+
82
+ payload["inputs"] = get_SOPT(task_info)
83
+
84
+ aws_lambda(lambda_handler, payload)
85
+ end
86
+
87
+ if res["errorMessage"]
88
+ Log.error res["errorMessage"]
89
+ Log.stack res["stackTrace"]
90
+ else
91
+ iii res
92
+ end
@@ -0,0 +1,27 @@
1
+ def lambda_handler(event:, context:)
2
+ require 'scout'
3
+
4
+ Path.path_maps[:bucket] = "s3://#{ENV["AWS_BUCKET"]}/{TOPLEVEL}/{SUBPATH}"
5
+ Path.path_maps[:default] = :bucket
6
+
7
+ require 'scout/workflow'
8
+ require 'scout/aws/s3'
9
+
10
+ workflow, task_name, jobname, inputs = IndiferentHash.process_options event,
11
+ :workflow, :task_name, :jobname, :inputs
12
+
13
+ raise ParamterException, "No workflow specified" if workflow.nil?
14
+
15
+ workflow = Workflow.require_workflow workflow
16
+
17
+ case task_name
18
+ when nil
19
+ return {tasks: workflow.tasks.keys, documentation: workflow.documentation}
20
+ when "info"
21
+ raise ParamterException, "No task_name specified" if task_name.nil?
22
+ return workflow.task_info(inputs["task_name"])
23
+ else
24
+ job = workflow.job(task_name, jobname, inputs)
25
+ job.run
26
+ end
27
+ end
@@ -1,4 +1,3 @@
1
-
2
1
  variable "ami" {
3
2
  description = "AMI id for host"
4
3
  type = string
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scout-camp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-25 00:00:00.000000000 Z
10
+ date: 2025-03-31 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: scout-essentials
@@ -57,6 +57,8 @@ files:
57
57
  - scout_commands/terraform/plan
58
58
  - scout_commands/terraform/remove
59
59
  - scout_commands/terraform/status
60
+ - scout_commands/terraform/task
61
+ - share/aws/lambda_function.rb
60
62
  - share/terraform/aws/bucket/main.tf
61
63
  - share/terraform/aws/bucket/output.tf
62
64
  - share/terraform/aws/bucket/variables.tf