Created
July 12, 2019 17:25
-
-
Save Magisus/7fd9268c55de66e8e9a6e0170c8a4b39 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'puppet/server/master' | |
require 'securerandom' | |
require 'json' | |
require 'uri' | |
class PuppetServerHelper | |
# alternatively: load 'spec/lib/puppet_spec/handler'; profiler = PuppetSpec::HandlerProfiler.new ???? | |
NullProfiler = Struct.new("Profiler") do | |
def start(*args); end | |
def finish(*args); end | |
def shutdown(*args); end | |
end | |
NullRegistry = Struct.new("Registry") do | |
def register_environment(env); end | |
def is_expired?(env); true; end | |
def remove_environment(env); end | |
def evicted(env); end | |
end | |
attr_accessor :root_dir, :servername, :clientname, | |
:profiler, :env_registry, :metric_registry | |
def initialize | |
@root_dir = ENV['HOME'] + '/.puppetlabs' | |
@servername = @clientname = 'localhost' | |
@profiler = Puppet::Server::JvmProfiler.new(NullProfiler.new) | |
@env_registry = NullRegistry.new | |
import com.codahale.metrics.MetricRegistry | |
@metric_registry = Java::ComCodahaleMetrics::MetricRegistry.new | |
end | |
def default_puppet_config(overrides = {}) | |
{ | |
"codedir" => @root_dir + '/etc/code', | |
"confdir" => @root_dir + '/etc/puppet', | |
"vardir" => @root_dir + '/opt/puppet/cache', | |
"rundir" => @root_dir + '/var/run', | |
"logdir" => @root_dir + '/var/log' | |
}.merge(overrides) | |
end | |
def default_server_config(overrides = {}) | |
{ | |
"metric_registry" => @metric_registry, | |
"use_legacy_auth_conf" => false, | |
"environment_registry" => @env_registry, | |
"http_connect_timeout_milliseconds" => 120000, | |
"http_idle_timeout_milliseconds" => 1200000, | |
"profiler" => @profiler, | |
"server_id" => @servername, | |
}.merge(overrides) | |
end | |
def load_puppet_server! | |
puppet_config = default_puppet_config | |
puppet_server_config = default_server_config | |
Puppet::Server::Master.new(puppet_config, puppet_server_config) | |
end | |
def create_facts(values = { 'my_fact' => 'fact_value' }, name = clientname) | |
{ | |
'name' => name, | |
'values' => values, | |
'timestamp' => Time.now.iso8601 | |
} | |
end | |
def compile_params(facts: create_facts, env: 'maggie') | |
{ "certname"=>"localhost", | |
"facts"=>facts, | |
"trusted_facts"=>{"values"=>{"my_trusted"=>"trusted_value"}}, | |
"environment"=>env, | |
"options"=>{"capture_logs"=>true, "log_level"=>"debug"}, | |
"variables"=>{"values"=>{"foo"=>"bar"}}, | |
"code_ast"=> | |
"{\"__ptype\":\"Puppet::AST::Program\",\"locator\":{\"__ptype\":\"Puppet::AST::Locator\",\"string\":\"notify { \\\"${lookup('hiera_key')}\\\": }\",\"file\":null,\"line_index\":[0]},\"body\":{\"__ptype\":\"Puppet::AST::ResourceExpression\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":0,\"length\":36,\"type_name\":{\"__ptype\":\"Puppet::AST::QualifiedName\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":0,\"length\":6,\"value\":\"notify\"},\"form\":\"regular\",\"bodies\":[{\"__ptype\":\"Puppet::AST::ResourceBody\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":0,\"length\":0,\"title\":{\"__ptype\":\"Puppet::AST::ConcatenatedString\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":9,\"length\":24,\"segments\":[{\"__ptype\":\"Puppet::AST::TextExpression\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":9,\"length\":0,\"expr\":{\"__ptype\":\"Puppet::AST::CallNamedFunctionExpression\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":12,\"length\":19,\"functor_expr\":{\"__ptype\":\"Puppet::AST::QualifiedName\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":12,\"length\":6,\"value\":\"lookup\"},\"rval_required\":true,\"arguments\":[{\"__ptype\":\"Puppet::AST::LiteralString\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":19,\"length\":11,\"value\":\"hiera_key\"}]}}]}}]}}" | |
} | |
end | |
def create_cert(cert_path = root_dir + '/etc/puppet/ssl/certs/' + clientname + '.pem') | |
import com.puppetlabs.ssl_utils.SSLUtils | |
pem = File.read(cert_path) | |
reader = Java::JavaIo::StringReader.new(pem) | |
Java::ComPuppetlabsSsl_utils::SSLUtils.pemToCert(reader) | |
end | |
def basic_compile_request(params = create_params, | |
cert = create_cert, | |
client = clientname, | |
server = servername) | |
{ | |
"authenticated" => true, | |
"params" => [], | |
"remote-addr" => "0:0:0:0:0:0:0:1", | |
"client-cert-cn" => client, | |
"client-cert" => cert, | |
"body" => URI.encode(JSON.dump(params)), | |
"request-method" => "POST", | |
"uri" => "/puppet/v3/compile", | |
"headers" => { | |
"accept" => "application/json, application/x-msgpack, text/pson", | |
"x-puppet-version" => "6.5.0", | |
"user-agent" => "Puppet/6.5.0 Ruby/2.5.1 (x86_64-darwin16)", | |
"host" => server + ":8140", | |
"accept-encoding" => "gzip;q=1.0,deflate; q=0.6,identity;q=0.3", | |
"content-length" => "7278", | |
"content-type" => "application/x-www-form-urlencoded" | |
} | |
} | |
end | |
def catalog_params(certname: 'localhost', environment: 'production') | |
{"certname"=>certname,"persistence"=>{"facts"=>false,"catalog"=>false},"job_id"=>"12345","facts"=>{"values"=>{"foo"=>"fact_value"}},"trusted_facts"=>{"values"=>{"trusted"=>"trust_value"}},"environment"=>environment, "options"=>{"log_level"=>"debug","capture_logs"=>true}} | |
end | |
def response_to_hash(java_res) | |
{ | |
body: java_res.getBody, | |
status: java_res.getStatus, | |
content_type: java_res.getContentType, | |
puppet_version: java_res.getPuppetVersion | |
} | |
end | |
end | |
@helper = PuppetServerHelper.new | |
@server = @helper.load_puppet_server! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment