Module: Lono::Template::Helper

Included in:
Context, Dsl::Builder, Dsl::Builder::Base
Defined in:
lib/lono/template/helper.rb

Overview

This is included into Lono::Template::Context. It has access to the original thor CLI options via @options.

Instance Method Summary collapse

Instance Method Details

#current_regionObject



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/lono/template/helper.rb', line 111

def current_region
  region = Aws.config[:region]
  region ||= ENV['AWS_REGION']
  return region if region

  default_region = 'us-east-1' # fallback if default not found in ~/.aws/config
  if ENV['AWS_PROFILE']
    path = "#{ENV['HOME']}/.aws/config"
    if File.exist?(path)
      lines = IO.readlines(path)
      capture_default, capture_current = false, false
      lines.each do | line|
        if line.include?('[default]')
          capture_default = true # next line
          next
        end
        if capture_default && line.match(/region = /)
          # over default from above
          default_region = line.split(' = ').last.strip
          capture_default = false
        end

        md = line.match(/\[profile (.*)\]/)
        if md && md[1] == ENV['AWS_PROFILE']
          capture_current = true
          next
        end
        if capture_current && line.match(/region = /)
          region = line.split(' = ').last.strip
          capture_current = false
        end
      end
    end

    region ||= default_region
    return region if region
  end

  'us-east-1' # default
end

#extract_scripts(options = {}) ⇒ Object

Bash code that is meant to included in user-data



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/lono/template/helper.rb', line 11

def extract_scripts(options={})
  settings = setting.data["extract_scripts"] || {}
  options = settings.merge(options)
  # defaults also here in case they are removed from settings
  to = options[:to] || "/opt"
  user = options[:as] || "ec2-user"

  if Dir.glob("#{Lono.config.scripts_path}/*").empty?
    puts "WARN: you are using the extract_scripts helper method but you do not have any app/scripts.".color(:yellow)
    calling_line = caller[0].split(':')[0..1].join(':')
    puts "Called from: #{calling_line}"
    return ""
  end

  <<-BASH_CODE
# Generated from the lono extract_scripts helper.
# Downloads scripts from s3, extract them, and setup.
mkdir -p #{to}
aws s3 cp #{scripts_s3_path} #{to}/
(
cd #{to}
tar zxf #{to}/#{scripts_name}
chmod -R a+x #{to}/scripts
chown -R #{user}:#{user} #{to}/scripts
)
BASH_CODE
end

#indent(text, indentation_amount) ⇒ Object

add indentation



99
100
101
102
103
# File 'lib/lono/template/helper.rb', line 99

def indent(text, indentation_amount)
  text.split("\n").map do |line|
    " " * indentation_amount + line
  end.join("\n")
end

#partial(path, vars = {}, options = {}) ⇒ Object

The partial’s path is a relative path.

Example: Given file in app/partials/iam/docker.yml

<%= partial("iam/docker", {}, indent: 10) %>
<%= partial("iam/docker.yml", {}, indent: 10) %>

If the user specifies the extension then use that instead of auto-adding the detected format.



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/lono/template/helper.rb', line 85

def partial(path,vars={}, options={})
  path = options[:user_data] ?
            user_data_path_for(path) :
            partial_path_for(path)
  path = auto_add_format(path)

  instance_variables!(vars)
  result = render_path(path)

  result = indent(result, options[:indent]) if options[:indent]
  result + "\n"
end

#partial_exist?(path) ⇒ Boolean

Returns:

  • (Boolean)


105
106
107
108
109
# File 'lib/lono/template/helper.rb', line 105

def partial_exist?(path)
  path = partial_path_for(path)
  path = auto_add_format(path)
  path && File.exist?(path)
end

#scripts_nameObject



39
40
41
# File 'lib/lono/template/helper.rb', line 39

def scripts_name
  File.basename(scripts_s3_path)
end

#scripts_s3_pathObject



43
44
45
46
# File 'lib/lono/template/helper.rb', line 43

def scripts_s3_path
  upload = Lono::Script::Upload.new(@blueprint)
  upload.s3_dest
end

#template_params(param_name) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/lono/template/helper.rb', line 55

def template_params(param_name)
  generator_options = {
    allow_not_exists: true
  }.merge(@options)
  generator_options["param"] = param_name
  generator = Lono::Param::Generator.new(@blueprint, generator_options)
  # do not generate because lono cfn calling logic already generated it we only need the values
  params = generator.params    # Returns Array in underscore keys format
  # convert Array to simplified hash structure
  params.inject({}) do |h, param|
    h.merge(param[:parameter_key] => param[:parameter_value])
  end
end

#template_s3_path(template_name) ⇒ Object



48
49
50
51
52
53
# File 'lib/lono/template/helper.rb', line 48

def template_s3_path(template_name)
  # high jacking Upload for useful s3_https_url method
  template_path = "output/#{@blueprint}/templates/#{template_name}.yml"
  upload = Lono::Template::Upload.new(@blueprint, @options)
  upload.s3_https_url(template_path)
end

#user_data(path, vars = {}, options = {}) ⇒ Object

Adjust the partial path so that it will use app/user_data



70
71
72
73
# File 'lib/lono/template/helper.rb', line 70

def user_data(path,vars={}, options={})
  options.merge!(user_data: true)
  partial(path,vars, options)
end