Skip to content

Commit

Permalink
Add new "resource" executable to create resources
Browse files Browse the repository at this point in the history
  • Loading branch information
jkeiser committed Mar 30, 2015
1 parent d219615 commit b5e6fcf
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 122 deletions.
20 changes: 20 additions & 0 deletions bin/resource
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env ruby
require 'cheffish/chef_run'

def post(resource_type, name, properties)
chef_run = Cheffish::ChefRun.new
begin
r = chef_run.client.build_resource(resource_type, name) do
properties.each { |attr, value| public_send(attr, value) }
end
chef_run.client.add_resource(r)
chef_run.converge
puts "CODE: #{chef_run.updated? ? 201 : 200}"
puts "STDOUT: #{chef_run.stdout}\nSTDERR: #{chef_run.stderr}\nLOGS: #{chef_run.logs}"
rescue
puts "CODE: #{400}"
puts "ERROR: #{$!}\nBACKTRACE: #{$!.backtrace}\nSTDOUT: #{chef_run.stdout}\nSTDERR: #{chef_run.stderr}\nLOGS: #{chef_run.logs}"
end
end

post(ARGV.shift, ARGV.shift, Hash[*ARGV])
131 changes: 131 additions & 0 deletions lib/cheffish/chef_run.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
require 'cheffish/basic_chef_client'

module Cheffish
class ChefRun
#
# @param chef_config A hash with symbol keys that looks suspiciously similar to `Chef::Config`.
# Some possible options:
# - stdout: <IO object> - where to stream stdout to
# - stderr: <IO object> - where to stream stderr to
# - log_level: :debug|:info|:warn|:error|:fatal
# - log_location: <path|IO object> - where to stream logs to
# - verbose_logging: true|false - true if you want verbose logging in :debug
#
def initialize(chef_config={})
@chef_config = chef_config || {}
end

attr_reader :chef_config

class StringIOTee < StringIO
def initialize(*streams)
super()
@streams = streams.flatten.select { |s| !s.nil? }
end

attr_reader :streams

def write(*args, &block)
super
streams.each { |s| s.write(*args, &block) }
end
end

def client
@client ||= begin
chef_config = self.chef_config.dup
chef_config[:log_level] ||= :debug if !chef_config.has_key?(:log_level)
chef_config[:verbose_logging] = false if !chef_config.has_key?(:verbose_logging)
chef_config[:stdout] = StringIOTee.new(chef_config[:stdout])
chef_config[:stderr] = StringIOTee.new(chef_config[:stderr])
chef_config[:log_location] = StringIOTee.new(chef_config[:log_location])
@client = ::Cheffish::BasicChefClient.new(nil,
[ event_sink, Chef::Formatters.new(:doc, chef_config[:stdout], chef_config[:stderr]) ],
chef_config
)
end
end

def event_sink
@event_sink ||= EventSink.new
end

#
# output
#
def stdout
@client ? client.chef_config[:stdout].string : nil
end
def stderr
@client ? client.chef_config[:stderr].string : nil
end
def logs
@client ? client.chef_config[:log_location].string : nil
end

def resources
client.resource_collection
end

def converge
client.converge
end

def reset
@client = nil
@converged = nil
@stdout = nil
@stderr = nil
@logs = nil
end

def converged?
@converged
end

def updated?
client.updated?
end

def up_to_date?
!client.updated?
end

def output_for_failure_message
message = ""
if stdout && !stdout.empty?
message << "--- ---\n"
message << "--- Chef Client Output ---\n"
message << "--- ---\n"
message << stdout
message << "\n" if !stdout.end_with?("\n")
end
if stderr && !stderr.empty?
message << "--- ---\n"
message << "--- Chef Client Error Output ---\n"
message << "--- ---\n"
message << stderr
message << "\n" if !stderr.end_with?("\n")
end
if logs && !logs.empty?
message << "--- ---\n"
message << "--- Chef Client Logs ---\n"
message << "--- ---\n"
message << logs
end
message
end

class EventSink
def initialize
@events = []
end

attr_reader :events

def method_missing(method, *args)
@events << [ method, *args ]
end
end
end
end
125 changes: 3 additions & 122 deletions lib/cheffish/rspec/chef_run_wrapper.rb
Original file line number Diff line number Diff line change
@@ -1,124 +1,5 @@
require 'cheffish/basic_chef_client'
require 'cheffish/chef_run'

module Cheffish
module RSpec
class ChefRunWrapper
def initialize(chef_config)
@chef_config = chef_config || {}
end

attr_reader :chef_config

class StringIOTee < StringIO
def initialize(*streams)
super()
@streams = streams.flatten.select { |s| !s.nil? }
end

attr_reader :streams

def write(*args, &block)
super
streams.each { |s| s.write(*args, &block) }
end
end

def client
@client ||= begin
chef_config = self.chef_config.dup
chef_config[:log_level] ||= :debug if !chef_config.has_key?(:log_level)
chef_config[:verbose_logging] = false if !chef_config.has_key?(:verbose_logging)
chef_config[:stdout] = StringIOTee.new(chef_config[:stdout])
chef_config[:stderr] = StringIOTee.new(chef_config[:stderr])
chef_config[:log_location] = StringIOTee.new(chef_config[:log_location])
@client = ::Cheffish::BasicChefClient.new(nil,
[ event_sink, Chef::Formatters.new(:doc, chef_config[:stdout], chef_config[:stderr]) ],
chef_config
)
end
end

def event_sink
@event_sink ||= EventSink.new
end

#
# output
#
def stdout
@client ? client.chef_config[:stdout].string : nil
end
def stderr
@client ? client.chef_config[:stderr].string : nil
end
def logs
@client ? client.chef_config[:log_location].string : nil
end

def resources
client.resource_collection
end

def converge
client.converge
end

def reset
@client = nil
@converged = nil
@stdout = nil
@stderr = nil
@logs = nil
end

def converged?
@converged
end

def updated?
client.updated?
end

def up_to_date?
!client.updated?
end

def output_for_failure_message
message = ""
if stdout && !stdout.empty?
message << "--- ---\n"
message << "--- Chef Client Output ---\n"
message << "--- ---\n"
message << stdout
message << "\n" if !stdout.end_with?("\n")
end
if stderr && !stderr.empty?
message << "--- ---\n"
message << "--- Chef Client Error Output ---\n"
message << "--- ---\n"
message << stderr
message << "\n" if !stderr.end_with?("\n")
end
if logs && !logs.empty?
message << "--- ---\n"
message << "--- Chef Client Logs ---\n"
message << "--- ---\n"
message << logs
end
message
end

class EventSink
def initialize
@events = []
end

attr_reader :events

def method_missing(method, *args)
@events << [ method, *args ]
end
end
end
end
module Cheffish::RSpec
ChefRunWrapper = Cheffish::ChefRun
end

0 comments on commit b5e6fcf

Please sign in to comment.