chef-rundeck 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,31 @@
1
+ # chef-rundeck
2
+ [![Gem Version](https://badge.fury.io/rb/chef-rundeck.png)](http://badge.fury.io/rb/chef-rundeck)
3
+ [![Build Status](https://secure.travis-ci.org/oswaldlabs/chef-rundeck.png?branch=master)](http://travis-ci.org/oswaldlabs/chef-rundeck)
4
+ [![Dependency Status](https://gemnasium.com/oswaldlabs/chef-rundeck.png?travis)](https://gemnasium.com/oswaldlabs/chef-rundeck)
5
+ [![Code Climate](https://codeclimate.com/github/oswaldlabs/chef-rundeck.png)](https://codeclimate.com/github/oswaldlabs/chef-rundeck)
6
+
7
+ A simple Sinatra app that presents matching node results of a Chef search formatted as a RunDeck resource list.
8
+
9
+ ## Usage
10
+
11
+ Install the gem and fire up chef-rundeck. Point it at a Chef client config file (a knife config would be ideal) and provide the URI for your Chef server's web UI.
12
+
13
+ ## Configuration Notes
14
+
15
+ More to come.
16
+
17
+ ## Notes on Patches/Pull Requests
18
+
19
+ We want your cool additional feature. Here's how to give it to us:
20
+
21
+ * Fork the project.
22
+ * Make your feature addition or bug fix.
23
+ * Add tests for it. *THIS IS IMPORTANT* as it ensures no one else will break your feature accidentally somewhere down the line.
24
+ * If you're adding a feature, please also add documentation.
25
+ * *Exception:* Please don't change the Rakefile, version or history files!
26
+ * Commit your changes and push them to your GitHub repo. Bonus points for committing your changes to a named topic branch ("awesome_new_feature" > "master")
27
+ * Send us a pull request through the GitHub UI.
28
+
29
+ # Copyright
30
+
31
+ Original code © 2010 Adam Jacob. Released to the open source community under the Apache license in 2013. See the LICENSE file for details.
data/Rakefile CHANGED
@@ -23,6 +23,7 @@ rescue LoadError
23
23
  end
24
24
 
25
25
  require 'rspec/core/rake_task'
26
+ ENV['TRAVIS_BUILD_DIR'] = "." unless ENV.has_key?('TRAVIS_BUILD_DIR')
26
27
  RSpec::Core::RakeTask.new(:spec) do |spec|
27
28
  spec.rspec_opts = [ '-I', 'lib', '-I', 'spec' ]
28
29
  spec.pattern = FileList['spec/**/*_spec.rb']
@@ -34,8 +35,6 @@ RSpec::Core::RakeTask.new(:rcov) do |spec|
34
35
  spec.rcov = true
35
36
  end
36
37
 
37
- task :spec => :check_dependencies
38
-
39
38
  task :default => :spec
40
39
 
41
40
  begin
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 1.0.0
@@ -23,12 +23,22 @@ require 'mixlib/cli'
23
23
 
24
24
  class ChefRundeckCLI
25
25
  include Mixlib::CLI
26
+
27
+ option :api_url,
28
+ :short => "-a API_URL",
29
+ :long => "--api-url API_URL",
30
+ :description => "The base URL of the Chef REST API"
31
+
32
+ option :client_key,
33
+ :short => "-k KEYFILE",
34
+ :long => "--key-file KEYFILE",
35
+ :description => "The client.pem to sign requests"
26
36
 
27
37
  option :config_file,
28
- :short => "-c CONFIG",
29
- :long => "--config CONFIG",
30
- :default => 'config.rb',
31
- :description => "The Chef configuration file to use"
38
+ :short => "-c CONFIG",
39
+ :long => "--config CONFIG",
40
+ :default => 'config.rb',
41
+ :description => "The Chef configuration file to use"
32
42
 
33
43
  option :username,
34
44
  :short => "-u USERNAME",
@@ -39,13 +49,20 @@ class ChefRundeckCLI
39
49
  option :web_ui_url,
40
50
  :short => "-w WEB_UI_URL",
41
51
  :long => "--web-ui-url WEB_UI_URL",
42
- :description => "The base URL of the Chef Web UI"
52
+ :description => "The base URL of the Chef Web UI",
53
+ :default => "https://manage.opscode.com"
43
54
 
44
55
  option :port,
45
56
  :short => "-p PORT",
46
57
  :long => "--port PORT",
47
58
  :description => "The port to run on, default 9980",
48
59
  :default => 9980
60
+
61
+ option :pidfile,
62
+ :short => "-P FILE",
63
+ :long => "--pidfile FILE",
64
+ :description => "Prefix for our PID file, default: /var/run/chef-rundeck- ('PORT.pid' will be added)",
65
+ :default => "/var/run/chef-rundeck"
49
66
  end
50
67
 
51
68
  cli = ChefRundeckCLI.new
@@ -54,7 +71,18 @@ cli.parse_options
54
71
  ChefRundeck.config_file = cli.config[:config_file]
55
72
  ChefRundeck.username = cli.config[:username]
56
73
  ChefRundeck.web_ui_url = cli.config[:web_ui_url]
74
+ ChefRundeck.api_url = cli.config[:api_url]
75
+ ChefRundeck.client_key = cli.config[:client_key]
57
76
  ChefRundeck.configure
58
77
 
78
+ begin
79
+ pid = "#{cli.config[:pidfile]}-#{cli.config[:port]}.pid"
80
+ puts "Writing to #{pid}"
81
+ File.open(pid, 'w'){ |f| f.write(Process.pid) }
82
+ at_exit { File.delete(pid) if File.exist?(pid) }
83
+ rescue Exception => e
84
+ puts "== Error writing pid file #{pid}!"
85
+ end
86
+
59
87
  ChefRundeck.run! :host => 'localhost', :port => cli.config[:port]
60
88
 
@@ -1,12 +1,12 @@
1
1
  #
2
2
  # Copyright 2010, Opscode, Inc.
3
- #
3
+ #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
6
6
  # You may obtain a copy of the License at
7
- #
7
+ #
8
8
  # http://www.apache.org/licenses/LICENSE-2.0
9
- #
9
+ #
10
10
  # Unless required by applicable law or agreed to in writing, software
11
11
  # distributed under the License is distributed on an "AS IS" BASIS,
12
12
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -18,6 +18,7 @@ require 'sinatra/base'
18
18
  require 'chef'
19
19
  require 'chef/node'
20
20
  require 'chef/mixin/xml_escape'
21
+ require 'chef/rest'
21
22
 
22
23
  class ChefRundeck < Sinatra::Base
23
24
 
@@ -26,39 +27,51 @@ class ChefRundeck < Sinatra::Base
26
27
  class << self
27
28
  attr_accessor :config_file
28
29
  attr_accessor :username
30
+ attr_accessor :api_url
29
31
  attr_accessor :web_ui_url
32
+ attr_accessor :client_key
30
33
 
31
34
  def configure
32
35
  Chef::Config.from_file(ChefRundeck.config_file)
33
36
  Chef::Log.level = Chef::Config[:log_level]
37
+
38
+ unless ChefRundeck.api_url
39
+ ChefRundeck.api_url = Chef::Config[:chef_server_url]
40
+ end
41
+
42
+ unless ChefRundeck.client_key
43
+ ChefRundeck.client_key = Chef::Config[:client_key]
44
+ end
34
45
  end
35
46
  end
36
47
 
37
48
  get '/' do
38
49
  content_type 'text/xml'
39
50
  response = '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE project PUBLIC "-//DTO Labs Inc.//DTD Resources Document 1.0//EN" "project.dtd"><project>'
40
- Chef::Node.list(true).each do |node_array|
41
- node = node_array[1]
51
+ rest = Chef::REST.new(ChefRundeck.api_url, ChefRundeck.username, ChefRundeck.client_key)
52
+ nodes = rest.get_rest("/nodes/")
53
+
54
+ nodes.keys.each do |node_name|
55
+ node = rest.get_rest("/nodes/#{node_name}")
42
56
  #--
43
57
  # Certain features in Rundeck require the osFamily value to be set to 'unix' to work appropriately. - SRK
44
58
  #++
45
59
  os_family = node[:kernel][:os] =~ /windows/i ? 'windows' : 'unix'
46
60
  response << <<-EOH
47
- <node name="#{xml_escape(node[:fqdn])}"
48
- type="Node"
49
- description="#{xml_escape(node.name)}"
61
+ <node name="#{xml_escape(node[:fqdn])}"
62
+ type="Node"
63
+ description="#{xml_escape(node_name)}"
50
64
  osArch="#{xml_escape(node[:kernel][:machine])}"
51
65
  osFamily="#{xml_escape(os_family)}"
52
66
  osName="#{xml_escape(node[:platform])}"
53
67
  osVersion="#{xml_escape(node[:platform_version])}"
54
- tags="#{xml_escape([node.chef_environment, node.run_list.roles.join(',')].join(','))}"
68
+ tags="#{xml_escape([node.chef_environment, node[:tags].join(','), node.run_list.roles.join(',')].join(','))}"
55
69
  username="#{xml_escape(ChefRundeck.username)}"
56
70
  hostname="#{xml_escape(node[:fqdn])}"
57
- editUrl="#{xml_escape(ChefRundeck.web_ui_url)}/nodes/#{xml_escape(node.name)}/edit"/>
71
+ editUrl="#{xml_escape(ChefRundeck.web_ui_url)}/nodes/#{xml_escape(node_name)}/edit"/>
58
72
  EOH
59
73
  end
60
74
  response << "</project>"
61
75
  response
62
76
  end
63
77
  end
64
-
@@ -1,7 +1,20 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
1
+ require 'spec_helper'
2
+ require 'nokogiri'
2
3
 
3
- describe "ChefRundeck" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
4
+ describe 'ChefRundeck' do
5
+ before do
6
+ # setup for the following tests
7
+ ChefRundeck.config_file = "#{ENV['TRAVIS_BUILD_DIR']}/spec/support/client.rb"
8
+ ChefRundeck.username = ENV['USER']
9
+ ChefRundeck.web_ui_url = 'https://manage.opscode.com'
10
+ ChefRundeck.configure
11
+ end
12
+ it 'fetch to root should return 200' do
13
+ get '/'
14
+ last_response.should be_ok
15
+ end
16
+ it 'fetched document should be Nokogiri-parseable XML document' do
17
+ get '/'
18
+ Nokogiri::XML(last_response.body).document.should be_true
6
19
  end
7
20
  end
@@ -1,9 +1,21 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
3
  require 'chef-rundeck'
4
- require 'spec'
5
- require 'spec/autorun'
4
+ require 'sinatra'
5
+ require 'rspec'
6
+ require 'rspec/autorun'
7
+ require 'rack/test'
6
8
 
7
- Spec::Runner.configure do |config|
8
-
9
+
10
+ set :environment, :test
11
+ set :run, false
12
+ set :raise_errors, true
13
+ set :logging, false
14
+
15
+ def app
16
+ ChefRundeck.new
17
+ end
18
+
19
+ RSpec.configure do |config|
20
+ config.include Rack::Test::Methods
9
21
  end
metadata CHANGED
@@ -1,11 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-rundeck
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Adam Jacob
9
+ - Brian Scott
10
+ - Steven Wagner
9
11
  autorequire:
10
12
  bindir: bin
11
13
  cert_chain: []
@@ -13,7 +15,7 @@ date: 2011-11-07 00:00:00.000000000 Z
13
15
  dependencies:
14
16
  - !ruby/object:Gem::Dependency
15
17
  name: sinatra
16
- requirement: &70246891990460 !ruby/object:Gem::Requirement
18
+ requirement: !ruby/object:Gem::Requirement
17
19
  none: false
18
20
  requirements:
19
21
  - - ! '>='
@@ -21,10 +23,15 @@ dependencies:
21
23
  version: '0'
22
24
  type: :runtime
23
25
  prerelease: false
24
- version_requirements: *70246891990460
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
25
32
  - !ruby/object:Gem::Dependency
26
33
  name: chef
27
- requirement: &70246891989140 !ruby/object:Gem::Requirement
34
+ requirement: !ruby/object:Gem::Requirement
28
35
  none: false
29
36
  requirements:
30
37
  - - ! '>='
@@ -32,10 +39,15 @@ dependencies:
32
39
  version: '0'
33
40
  type: :runtime
34
41
  prerelease: false
35
- version_requirements: *70246891989140
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
36
48
  - !ruby/object:Gem::Dependency
37
49
  name: mixlib-cli
38
- requirement: &70246892003620 !ruby/object:Gem::Requirement
50
+ requirement: !ruby/object:Gem::Requirement
39
51
  none: false
40
52
  requirements:
41
53
  - - ! '>='
@@ -43,10 +55,15 @@ dependencies:
43
55
  version: '0'
44
56
  type: :runtime
45
57
  prerelease: false
46
- version_requirements: *70246892003620
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
47
64
  - !ruby/object:Gem::Dependency
48
65
  name: rspec
49
- requirement: &70246892000840 !ruby/object:Gem::Requirement
66
+ requirement: !ruby/object:Gem::Requirement
50
67
  none: false
51
68
  requirements:
52
69
  - - ! '>='
@@ -54,10 +71,15 @@ dependencies:
54
71
  version: 1.2.9
55
72
  type: :development
56
73
  prerelease: false
57
- version_requirements: *70246892000840
74
+ version_requirements: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: 1.2.9
58
80
  - !ruby/object:Gem::Dependency
59
81
  name: yard
60
- requirement: &70246891998520 !ruby/object:Gem::Requirement
82
+ requirement: !ruby/object:Gem::Requirement
61
83
  none: false
62
84
  requirements:
63
85
  - - ! '>='
@@ -65,29 +87,65 @@ dependencies:
65
87
  version: '0'
66
88
  type: :development
67
89
  prerelease: false
68
- version_requirements: *70246891998520
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rack-test
98
+ requirement: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: nokogiri
114
+ requirement: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
69
128
  description: Provides a resource endpoint for RunDeck from a Chef Server
70
- email: adam@opscode.com
129
+ email: brainscott@gmail.com
71
130
  executables:
72
131
  - chef-rundeck
73
132
  extensions: []
74
133
  extra_rdoc_files:
75
134
  - LICENSE
76
- - README.rdoc
135
+ - README.md
77
136
  files:
78
137
  - .document
79
138
  - LICENSE
80
139
  - NOTICE
81
- - README.rdoc
140
+ - README.md
82
141
  - Rakefile
83
142
  - VERSION
84
143
  - bin/chef-rundeck
85
- - chef-rundeck.gemspec
86
144
  - lib/chef-rundeck.rb
87
145
  - spec/chef-rundeck_spec.rb
88
146
  - spec/spec.opts
89
147
  - spec/spec_helper.rb
90
- homepage: http://github.com/opscode/chef-rundeck
148
+ homepage: http://github.com/oswaldlabs/chef-rundeck
91
149
  licenses: []
92
150
  post_install_message:
93
151
  rdoc_options: []
@@ -107,8 +165,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
165
  version: '0'
108
166
  requirements: []
109
167
  rubyforge_project:
110
- rubygems_version: 1.8.10
168
+ rubygems_version: 1.8.25
111
169
  signing_key:
112
170
  specification_version: 3
113
171
  summary: Integrates Chef with RunDeck
114
172
  test_files: []
173
+ has_rdoc:
@@ -1,19 +0,0 @@
1
- = chef-rundeck
2
-
3
- Integrates Chef with RunDeck.
4
-
5
- Install the gem and fire up chef-rundeck - point it at a Chef Client configuration file (the one you use for knife would be ideal), and provide the URI for your Chef Server Web UI.
6
-
7
- == Note on Patches/Pull Requests
8
-
9
- * Fork the project.
10
- * Make your feature addition or bug fix.
11
- * Add tests for it. This is important so I don't break it in a
12
- future version unintentionally.
13
- * Commit, do not mess with rakefile, version, or history.
14
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
15
- * Send me a pull request. Bonus points for topic branches.
16
-
17
- == Copyright
18
-
19
- Copyright (c) 2010 Adam Jacob. See LICENSE for details.
@@ -1,63 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = "chef-rundeck"
8
- s.version = "0.2.0"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Adam Jacob"]
12
- s.date = "2011-11-07"
13
- s.description = "Provides a resource endpoint for RunDeck from a Chef Server"
14
- s.email = "adam@opscode.com"
15
- s.executables = ["chef-rundeck"]
16
- s.extra_rdoc_files = [
17
- "LICENSE",
18
- "README.rdoc"
19
- ]
20
- s.files = [
21
- ".document",
22
- "LICENSE",
23
- "NOTICE",
24
- "README.rdoc",
25
- "Rakefile",
26
- "VERSION",
27
- "bin/chef-rundeck",
28
- "chef-rundeck.gemspec",
29
- "lib/chef-rundeck.rb",
30
- "spec/chef-rundeck_spec.rb",
31
- "spec/spec.opts",
32
- "spec/spec_helper.rb"
33
- ]
34
- s.homepage = "http://github.com/opscode/chef-rundeck"
35
- s.require_paths = ["lib"]
36
- s.rubygems_version = "1.8.10"
37
- s.summary = "Integrates Chef with RunDeck"
38
-
39
- if s.respond_to? :specification_version then
40
- s.specification_version = 3
41
-
42
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
- s.add_runtime_dependency(%q<sinatra>, [">= 0"])
44
- s.add_runtime_dependency(%q<chef>, [">= 0"])
45
- s.add_runtime_dependency(%q<mixlib-cli>, [">= 0"])
46
- s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
47
- s.add_development_dependency(%q<yard>, [">= 0"])
48
- else
49
- s.add_dependency(%q<sinatra>, [">= 0"])
50
- s.add_dependency(%q<chef>, [">= 0"])
51
- s.add_dependency(%q<mixlib-cli>, [">= 0"])
52
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
53
- s.add_dependency(%q<yard>, [">= 0"])
54
- end
55
- else
56
- s.add_dependency(%q<sinatra>, [">= 0"])
57
- s.add_dependency(%q<chef>, [">= 0"])
58
- s.add_dependency(%q<mixlib-cli>, [">= 0"])
59
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
60
- s.add_dependency(%q<yard>, [">= 0"])
61
- end
62
- end
63
-