scout-camp 0.1.3 → 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: 91e19b9f83e8b15a04642fa32d87a0af095b382a9698c169c454edffda2cdc1f
4
- data.tar.gz: 92f2e5d29ed614db92ed7bfe3cdb25a55f2d64b2c8ab91bc12dda8939dfb76db
3
+ metadata.gz: 225a937ec9eac0522929e3da409bed070cf387a725d8c8cc5e4041832746fee5
4
+ data.tar.gz: 5d88f8bc6d5d382b0de9b1765a5cf95e688708dfdbe67cb4372055876fcc5f4c
5
5
  SHA512:
6
- metadata.gz: 4dab11e3e250669b167f0f8f49e16fba9b8b55b66a4b6254f1815d4e04282e257442e25e72368616a33ac9a2bfcf471b32466d01833de94328cd2138ad7522c3
7
- data.tar.gz: f3c21f33ee76f8fc8a90d231e46a620262647eac1941d34adf3aba3fc4100d2f77d3b390a339ed43e379cb95fd3378fd7d25df891e9f4799221f4f97aac75995
6
+ metadata.gz: 7008e9b2ae08a9f6c8fdef48e913d09a6d07eb42825c246bd6182b23868798c1d5227fbcd8acf9147dc1918e0b920d90851539c6a8d74cae481e1cc65afce22a
7
+ data.tar.gz: 9cfc47356b2225417cceab5625e43a047df912011b655ff6754f770d6cdf9beca85dd6cddfe266ffe6a4018ba5ee52728d7a199051dfcfa4a026aa7248801f10
data/.vimproject CHANGED
@@ -27,10 +27,13 @@ scout-camp=/$PWD filter="*" {
27
27
  terraform=terraform{
28
28
  list
29
29
  add
30
+ fargate
30
31
  status
31
32
  apply
33
+ plan
32
34
  destroy
33
35
  remove
36
+ task
34
37
  }
35
38
  }
36
39
  share=share {
@@ -41,6 +44,19 @@ scout-camp=/$PWD filter="*" {
41
44
  output.tf
42
45
  variables.tf
43
46
  }
47
+ lambda=lambda {
48
+ main.tf
49
+ variables.tf
50
+ }
51
+ role=role{
52
+ main.tf
53
+ variables.tf
54
+ output.tf
55
+ }
56
+ policy_attachment=policy_attachment {
57
+ main.tf
58
+ variables.tf
59
+ }
44
60
  cluster=cluster {
45
61
  main.tf
46
62
  output.tf
@@ -52,7 +68,8 @@ scout-camp=/$PWD filter="*" {
52
68
  output.tf
53
69
  variables.tf
54
70
  }
55
- lambda=lambda {
71
+ fargate=fargate{
72
+ locals.tf
56
73
  main.tf
57
74
  variables.tf
58
75
  }
@@ -62,6 +79,9 @@ scout-camp=/$PWD filter="*" {
62
79
  }
63
80
  }
64
81
  }
82
+ aws=aws{
83
+ lambda_function.rb
84
+ }
65
85
  }
66
86
  test=test {
67
87
  test_helper.rb
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.5
data/lib/scout/aws/s3.rb CHANGED
@@ -18,10 +18,15 @@ module Open
18
18
  end
19
19
 
20
20
  def self.claim(uri, ...)
21
- is_s3? uri
21
+ if Path === uri and not uri.located?
22
+ is_s3? uri.find
23
+ else
24
+ is_s3? uri
25
+ end
22
26
  end
23
27
 
24
28
  def self.parse_s3_uri(uri)
29
+ uri = uri.find if Path === uri and not uri.located?
25
30
  uri = uri.sub(%r{^s3://}, '')
26
31
  bucket, *key_parts = uri.split('/', -1)
27
32
  key = key_parts.join('/').sub(%r{^/}, '')
@@ -64,8 +69,13 @@ module Open
64
69
 
65
70
  resp.contents.each do |object|
66
71
  key = object.key
67
- remaining = key[prefix.length..-1] || ''
68
- 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
69
79
 
70
80
  if File.fnmatch?(pattern, remaining, File::FNM_PATHNAME)
71
81
  matches << "s3://#{bucket}/#{key}"
@@ -138,6 +148,8 @@ module Open
138
148
  Open::S3.write(path, content)
139
149
  end
140
150
 
151
+ def self.mkdir(path)
152
+ end
141
153
  end
142
154
  end
143
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.3 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.3".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]
@@ -42,8 +42,11 @@ Gem::Specification.new do |s|
42
42
  "scout_commands/terraform/apply",
43
43
  "scout_commands/terraform/destroy",
44
44
  "scout_commands/terraform/list",
45
+ "scout_commands/terraform/plan",
45
46
  "scout_commands/terraform/remove",
46
47
  "scout_commands/terraform/status",
48
+ "scout_commands/terraform/task",
49
+ "share/aws/lambda_function.rb",
47
50
  "share/terraform/aws/bucket/main.tf",
48
51
  "share/terraform/aws/bucket/output.tf",
49
52
  "share/terraform/aws/bucket/variables.tf",
@@ -56,8 +59,13 @@ Gem::Specification.new do |s|
56
59
  "share/terraform/aws/host/variables.tf",
57
60
  "share/terraform/aws/lambda/main.tf",
58
61
  "share/terraform/aws/lambda/variables.tf",
62
+ "share/terraform/aws/policy_attachment/main.tf",
63
+ "share/terraform/aws/policy_attachment/variables.tf",
59
64
  "share/terraform/aws/provider/data.tf",
60
65
  "share/terraform/aws/provider/output.tf",
66
+ "share/terraform/aws/role/main.tf",
67
+ "share/terraform/aws/role/output.tf",
68
+ "share/terraform/aws/role/variables.tf",
61
69
  "test/scout/aws/test_s3.rb",
62
70
  "test/scout/offsite/test_ssh.rb",
63
71
  "test/scout/offsite/test_step.rb",
@@ -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,24 +53,34 @@ 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
 
85
- terraform.add :aws, :lambda, function_name: "#{name}Job", filename: filename,
67
+ terraform = TerraformDSL.new
68
+ role = terraform.add :aws, :role, role_name: "lambda_execution_role", principal: {Service: ["lambda.amazonaws.com"]}
69
+
70
+ terraform.add :aws, :policy_attachment, name: "exec_policy", policy_name: "lamda_basic_execution",
71
+ roles: [role.id],
72
+ policy_arn: "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
73
+
74
+ terraform.add :aws, :policy_attachment, name: "s3_policy", policy_name: "lamda_s3_full_access",
75
+ roles: [role.id],
76
+ policy_arn: "arn:aws:iam::aws:policy/AmazonS3FullAccess"
77
+
78
+ terraform.add :aws, :lambda, function_name: "#{name}Job", filename: filename, role: role.arn,
86
79
  environment_variables: {
87
80
  HOME: '.',
88
81
  HOSTNAME: "aws_lambda",
89
82
  AWS_BUCKET: options[:bucket],
83
+ SCOUT_NOCOLOR: "true"
90
84
  }
91
85
 
92
86
  terraform.config dir
@@ -0,0 +1,31 @@
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.plan
31
+
@@ -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
@@ -1,40 +1,13 @@
1
- provider "aws" {
2
- region = "eu-west-2"
3
- }
4
-
5
1
  resource "aws_lambda_function" "this" {
6
2
  function_name = var.function_name
7
- role = aws_iam_role.lambda_role.arn
8
3
  handler = "lambda_function.lambda_handler"
9
4
  runtime = var.runtime
10
5
  filename = var.filename
11
6
  source_code_hash = filebase64sha256(var.filename)
12
7
  timeout = var.timeout
8
+ role = var.role
13
9
 
14
10
  environment {
15
11
  variables = var.environment_variables
16
12
  }
17
13
  }
18
-
19
- resource "aws_iam_role" "lambda_role" {
20
- name = "lambda_execution_role"
21
-
22
- assume_role_policy = jsonencode({
23
- Version = "2012-10-17"
24
- Statement = [
25
- {
26
- Action = "sts:AssumeRole"
27
- Effect = "Allow"
28
- Principal = {
29
- Service = "lambda.amazonaws.com"
30
- }
31
- }
32
- ]
33
- })
34
- }
35
-
36
- resource "aws_iam_policy_attachment" "lambda_basic" {
37
- name = "lambda_basic"
38
- roles = [aws_iam_role.lambda_role.name]
39
- policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
40
- }
@@ -21,3 +21,7 @@ variable "environment_variables" {
21
21
  description = "A map of environment variables to pass to the resource"
22
22
  default = {}
23
23
  }
24
+ variable "role" {
25
+ description = "Role to assume"
26
+ type = string
27
+ }
@@ -0,0 +1,5 @@
1
+ resource "aws_iam_policy_attachment" "this" {
2
+ name = var.policy_name
3
+ roles = var.roles
4
+ policy_arn = var.policy_arn
5
+ }
@@ -0,0 +1,12 @@
1
+ variable "policy_arn" {
2
+ description = "Policy arn"
3
+ type = string
4
+ }
5
+ variable "policy_name" {
6
+ description = "Policy name"
7
+ type = string
8
+ }
9
+ variable "roles" {
10
+ description = "Roles to which to attach policy"
11
+ type = set(string)
12
+ }
@@ -0,0 +1,14 @@
1
+ resource "aws_iam_role" "this" {
2
+ name = var.role_name
3
+
4
+ assume_role_policy = jsonencode({
5
+ Version = "2012-10-17"
6
+ Statement = [
7
+ {
8
+ Action = "sts:AssumeRole"
9
+ Effect = "Allow"
10
+ Principal = var.principal
11
+ }
12
+ ]
13
+ })
14
+ }
@@ -0,0 +1,15 @@
1
+ output "arn" {
2
+ description = "Role arn"
3
+ value = aws_iam_role.this.arn
4
+ }
5
+
6
+ output "name" {
7
+ description = "Role name"
8
+ value = aws_iam_role.this.name
9
+ }
10
+
11
+ output "id" {
12
+ description = "Role id"
13
+ value = aws_iam_role.this.id
14
+ }
15
+
@@ -0,0 +1,11 @@
1
+ variable "role_name" {
2
+ description = "Role name"
3
+ type = string
4
+ }
5
+
6
+ variable "principal" {
7
+ description = "Principal that can assume the role"
8
+ type = map(any)
9
+ }
10
+
11
+
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.3
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
@@ -54,8 +54,11 @@ files:
54
54
  - scout_commands/terraform/apply
55
55
  - scout_commands/terraform/destroy
56
56
  - scout_commands/terraform/list
57
+ - scout_commands/terraform/plan
57
58
  - scout_commands/terraform/remove
58
59
  - scout_commands/terraform/status
60
+ - scout_commands/terraform/task
61
+ - share/aws/lambda_function.rb
59
62
  - share/terraform/aws/bucket/main.tf
60
63
  - share/terraform/aws/bucket/output.tf
61
64
  - share/terraform/aws/bucket/variables.tf
@@ -68,8 +71,13 @@ files:
68
71
  - share/terraform/aws/host/variables.tf
69
72
  - share/terraform/aws/lambda/main.tf
70
73
  - share/terraform/aws/lambda/variables.tf
74
+ - share/terraform/aws/policy_attachment/main.tf
75
+ - share/terraform/aws/policy_attachment/variables.tf
71
76
  - share/terraform/aws/provider/data.tf
72
77
  - share/terraform/aws/provider/output.tf
78
+ - share/terraform/aws/role/main.tf
79
+ - share/terraform/aws/role/output.tf
80
+ - share/terraform/aws/role/variables.tf
73
81
  - test/scout/aws/test_s3.rb
74
82
  - test/scout/offsite/test_ssh.rb
75
83
  - test/scout/offsite/test_step.rb