class Porkadot::Assets::EtcdNode

def etcd_cert(refresh=false)

def etcd_cert(refresh=false)
  return @etcd_cert if defined?(@etcd_cert)
  if File.file?(config.etcd_crt_path) and !refresh
    self.logger.debug("--> Etcd cert already exists, skipping: #{config.etcd_cert_path}")
    @etcd_cert = OpenSSL::X509::Certificate.new(File.read(config.etcd_cert_path))
  else
    ca_key = self.certs.ca_key
    ca_cert = self.certs.ca_cert(false)
    @etcd_cert = certs.unsigned_cert(
      "/O=porkadot:etcd-servers/CN=#{config.member_name}",
      self.etcd_key, ca_cert,
      1 * 365 * 24 * 60 * 60
    )
    ef = OpenSSL::X509::ExtensionFactory.new
    ef.subject_certificate = @etcd_cert
    ef.issuer_certificate = ca_cert
    @etcd_cert.add_extension(ef.create_extension("basicConstraints","CA:FALSE",true))
    @etcd_cert.add_extension(ef.create_extension("keyUsage","nonRepudiation, digitalSignature, keyEncipherment", true))
    @etcd_cert.add_extension(ef.create_extension("extendedKeyUsage","clientAuth, serverAuth",true))
    @etcd_cert.add_extension(ef.create_extension("subjectAltName", self.config.additional_sans.join(','), true))
    @etcd_cert.sign(ca_key, OpenSSL::Digest::SHA256.new)
    File.open config.etcd_crt_path, 'wb' do |f|
      f.write @etcd_cert.to_pem
    end
  end
  return @etcd_cert
end

def etcd_key

def etcd_key
  @etcd_key ||= certs.private_key(config.etcd_key_path)
  return @etcd_key
end

def initialize config

def initialize config
  @config = config
  @logger = config.logger
  @global_config = config.config
  @certs = Porkadot::Assets::Certs::Etcd.new(global_config)
end

def render

def render
  logger.info "--> Rendering #{config.name} node"
  unless File.directory?(config.target_path)
    FileUtils.mkdir_p(config.target_path)
  end
  unless File.directory?(config.target_secrets_path)
    FileUtils.mkdir_p(config.target_secrets_path)
  end
  render_ca_crt
  render_etcd_crt
  render_erb 'etcd-server.yaml', etcd: global_config.etcd
  render_erb 'etcd.env', etcd: global_config.etcd
  render_erb 'install.sh', etcd: global_config.etcd
end

def render_ca_crt

def render_ca_crt
  logger.info "----> ca.crt"
  open(config.ca_crt_path, 'w') do |out|
    out.write self.certs.ca_cert(false).to_pem
  end
end

def render_etcd_crt

def render_etcd_crt
  logger.info "----> etcd.crt"
  self.etcd_key
  self.etcd_cert(true)
end