class Krane::TemplateSets::TemplateSet

private inner class

Attributes

render_erb[R]

Public Class Methods

new(template_dir:, file_whitelist: [], logger:, render_erb: true) click to toggle source
# File lib/krane/template_sets.rb, line 13
def initialize(template_dir:, file_whitelist: [], logger:, render_erb: true)
  @template_dir = template_dir
  @files = file_whitelist
  @logger = logger
  @render_erb = render_erb
end

Public Instance Methods

deploying_with_erb_files?() click to toggle source
# File lib/krane/template_sets.rb, line 71
def deploying_with_erb_files?
  @files.any? { |file| file.end_with?("erb") }
end
ejson_secrets_file() click to toggle source
# File lib/krane/template_sets.rb, line 35
def ejson_secrets_file
  @ejson_secrets_file ||= begin
    secret_file = @files.find { |f| f == EjsonSecretProvisioner::EJSON_SECRETS_FILE }
    File.join(@template_dir, secret_file) if secret_file
  end
end
validate() click to toggle source
# File lib/krane/template_sets.rb, line 42
def validate
  errors = []
  supported_extensions = if @render_erb
    TemplateSets::VALID_TEMPLATES
  else
    TemplateSets::VALID_TEMPLATES.reject { |extension| extension.include?('erb') }
  end

  if Dir.entries(@template_dir).none? do |filename|
       filename.end_with?(*supported_extensions) ||
       filename.end_with?(EjsonSecretProvisioner::EJSON_SECRETS_FILE)
     end
    return errors << "Template directory #{@template_dir} does not contain any valid templates (supported " \
        "suffixes: #{supported_extensions.join(', ')}, or #{EjsonSecretProvisioner::EJSON_SECRETS_FILE})"
  end

  @files.each do |filename|
    filename = File.join(@template_dir, filename)
    if !File.exist?(filename)
      errors << "File #{filename} does not exist"
    elsif !filename.end_with?(*supported_extensions) &&
          !filename.end_with?(EjsonSecretProvisioner::EJSON_SECRETS_FILE)
      errors << "File #{filename} does not have valid suffix (supported suffixes: " \
        "#{supported_extensions.join(', ')}, or #{EjsonSecretProvisioner::EJSON_SECRETS_FILE})"
    end
  end
  errors
end
with_resource_definitions_and_filename(current_sha: nil, bindings: nil, raw: false) { |r_def, filename| ... } click to toggle source
# File lib/krane/template_sets.rb, line 20
def with_resource_definitions_and_filename(current_sha: nil, bindings: nil, raw: false)
  if @render_erb
    @renderer = Renderer.new(
      template_dir: @template_dir,
      logger: @logger,
      current_sha: current_sha,
      bindings: bindings,
    )
  end
  with_delayed_exceptions(@files, Krane::InvalidTemplateError) do |filename|
    next if filename.end_with?(EjsonSecretProvisioner::EJSON_SECRETS_FILE)
    templates(filename: filename, raw: raw) { |r_def| yield r_def, filename }
  end
end

Private Instance Methods

templates(filename:, raw:) { |doc| ... } click to toggle source
# File lib/krane/template_sets.rb, line 77
def templates(filename:, raw:)
  file_content = File.read(File.join(@template_dir, filename))
  rendered_content = @renderer ? @renderer.render_template(filename, file_content) : file_content
  YAML.load_stream(rendered_content, "<rendered> #{filename}") do |doc|
    next if doc.blank?
    unless doc.is_a?(Hash)
      raise InvalidTemplateError.new("Template is not a valid Kubernetes manifest",
        filename: filename, content: doc)
    end
    yield doc unless raw
  end
  yield rendered_content if raw
rescue InvalidTemplateError => err
  err.filename ||= filename
  raise err
rescue Psych::SyntaxError => err
  raise InvalidTemplateError.new(err.message, filename: filename, content: rendered_content)
end