chef-rundeck 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
-