class Krane::TemplateSets::TemplateSet

private inner class

Public Class Methods

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

Public Instance Methods

ejson_secrets_file() click to toggle source
# File lib/krane/template_sets.rb, line 33
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 40
def validate
  errors = []
  if Dir.entries(@template_dir).none? do |filename|
       filename.end_with?(*TemplateSets::VALID_TEMPLATES) ||
       filename.end_with?(EjsonSecretProvisioner::EJSON_SECRETS_FILE)
     end
    return errors << "Template directory #{@template_dir} does not contain any valid templates"
  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?(*TemplateSets::VALID_TEMPLATES) &&
          !filename.end_with?(EjsonSecretProvisioner::EJSON_SECRETS_FILE)
      errors << "File #{filename} does not have valid suffix (supported suffixes: " \
        "#{TemplateSets::VALID_TEMPLATES.join(', ')}, or #{EjsonSecretProvisioner::EJSON_SECRETS_FILE})"
    end
  end
  errors
end
with_resource_definitions_and_filename(render_erb: false, current_sha: nil, bindings: nil, raw: false) { |r_def, filename| ... } click to toggle source
# File lib/krane/template_sets.rb, line 18
def with_resource_definitions_and_filename(render_erb: false, 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 64
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