knife-attribute 0.0.1

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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,8 @@
1
+ ## Contributing
2
+
3
+ 1. Fork it
4
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
5
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
6
+ 4. Push to the branch (`git push origin my-new-feature`)
7
+ 5. Create new Pull Request
8
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in knife-attribute.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Peter Fern
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # knife-attribute
2
+
3
+ Manipulate Chef attributes via Knife
4
+
5
+ ## Installation
6
+
7
+ Install via rubygems:
8
+
9
+ ```bash
10
+ gem install knife-attribute
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ In this initial release, only `node attribute set` is implemented, more to
16
+ follow in the near future.
17
+
18
+ To work with attributes of type `default`, `normal`, `override` or `automatic`,
19
+ use the `-t TYPE` flag (default if unspecified is `normal`).
20
+
21
+ ### node attribute set
22
+
23
+ Setting node attributes may be achieved as follows:
24
+
25
+ ```bash
26
+ knife node attribute set foo.example.org tz 'Australia/Melbourne'
27
+ ```
28
+
29
+ The above would set the `foo.example.org` node's `normal` attribute `tz` to the
30
+ string `Austraila/Melbourne`.
31
+
32
+ You may specify either a regular string, or a JSON structure, ie:
33
+
34
+ ```bash
35
+ knife node attribute set foo.example.org apache.listen_ports '["80", "443"]' -t override
36
+ ```
37
+
38
+ The above would set the `foo.example.org` node's `override` attribute
39
+ `['apache']['listen_ports']` to the array `["80", "443"]`.
40
+
41
+
42
+ ## TODO
43
+ - Implement attribute get/delete for nodes
44
+ - Implement attribute get/set/delete for roles
45
+ - Implement attribute get/set/delete for environments
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'knife-attribute/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'knife-attribute'
8
+ spec.version = KnifeAttribute::VERSION
9
+ spec.authors = ['Peter Fern']
10
+ spec.email = ['ruby@0xc0dedbad.com']
11
+ spec.description = %q{Manipulate (currently only set) Chef attributes (currently only for nodes) via Knife}
12
+ spec.summary = %q{Manipulate Chef attributes via Knife}
13
+ spec.homepage = 'https://github.com/pdf/knife-attribute'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'chef', '>= 0.11'
22
+ spec.add_development_dependency 'bundler', '~> 1.3'
23
+ spec.add_development_dependency 'rake'
24
+ end
@@ -0,0 +1 @@
1
+ require 'knife-attribute'
@@ -0,0 +1,7 @@
1
+ require 'chef/knife'
2
+ require 'knife-attribute/version'
3
+ require 'knife-attribute/attribute_types'
4
+ require 'knife-attribute/helpers'
5
+ require 'knife-attribute/common_options'
6
+ require 'knife-attribute/node/helpers'
7
+ require 'knife-attribute/node/set'
@@ -0,0 +1,4 @@
1
+ module KnifeAttribute
2
+ ATTRIBUTE_TYPES = %w{default normal override automatic}
3
+ end
4
+
@@ -0,0 +1,20 @@
1
+ module KnifeAttribute
2
+ module CommonOptions
3
+ def self.included(base)
4
+ base.class_eval do
5
+ option :attribute_type,
6
+ short: '-t TYPE',
7
+ long: '--type TYPE',
8
+ default: 'normal',
9
+ description: "Attribute type to set, one of: #{KnifeAttribute::ATTRIBUTE_TYPES} (default: 'normal')"
10
+ end
11
+ end
12
+
13
+ def check_type
14
+ if config[:attribute_type] and !KnifeAttribute::ATTRIBUTE_TYPES.include?(config[:attribute_type])
15
+ show_usage
16
+ ui.fatal("Invalid attribute type: '#{config[:attribute_type]}'")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ module KnifeAttribute
2
+ module Helpers
3
+ def mapped_config
4
+ @mapped_config ||= config[:attribute_type] == 'normal' ? {} : {all_attributes: true}
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,32 @@
1
+ module KnifeAttribute
2
+ module Node
3
+ module Helpers
4
+ include KnifeAttribute::Helpers
5
+
6
+ def self.included(base)
7
+ base.class_eval do
8
+ deps do
9
+ require 'chef/node'
10
+ require 'chef/json_compat'
11
+ end
12
+ end
13
+ end
14
+
15
+ def node_name
16
+ @node_name ||= @name_args[0]
17
+ end
18
+
19
+ def attribute
20
+ @attribute ||= @name_args[1]
21
+ end
22
+
23
+ def value
24
+ @value ||= @name_args[2]
25
+ end
26
+
27
+ def node
28
+ @node ||= Chef::Node.load(node_name)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,65 @@
1
+ module KnifeAttribute
2
+ module Node
3
+ class NodeAttributeSet < Chef::Knife
4
+ include KnifeAttribute::CommonOptions
5
+ include KnifeAttribute::Node::Helpers
6
+
7
+ banner 'knife node attribute set NODE PERIOD.SEPARATED.KEY STRING_OR_JSON_VALUE (options)'
8
+
9
+ def run
10
+ check_arguments
11
+
12
+ case config[:attribute_type]
13
+ when 'default'
14
+ set_attribute(node.default_attrs)
15
+ when 'override'
16
+ set_attribute(node.override_attrs)
17
+ when 'automatic'
18
+ set_attribute(node.automatic_attrs)
19
+ when 'normal', nil
20
+ set_attribute(node.normal_attrs)
21
+ end
22
+ end
23
+
24
+ private
25
+ def check_arguments
26
+ if node_name.nil?
27
+ show_usage
28
+ ui.fatal('You must specify a node name')
29
+ exit 1
30
+ end
31
+
32
+ if attribute.nil?
33
+ show_usage
34
+ ui.fatal('You must specify an attribute')
35
+ exit 1
36
+ end
37
+
38
+ if value.nil?
39
+ show_usage
40
+ ui.fatal('You must specify a value')
41
+ exit 1
42
+ end
43
+
44
+ check_type
45
+ end
46
+
47
+ def set_attribute(target)
48
+ begin
49
+ new_value = Chef::JSONCompat.from_json(value)
50
+ rescue JSON::ParserError, Yajl::ParseError
51
+ new_value = value
52
+ end
53
+ new_attribute = attribute.split('.').reverse.inject(new_value) { |result, key| { key => result } }
54
+ target.merge!(new_attribute)
55
+
56
+ if node.save
57
+ ui.info("Successfully set node #{ui.color(node_name, :cyan)} attribute #{ui.color(attribute, :cyan)} to: #{ui.color(new_value.inspect, :green)}")
58
+ else
59
+ ui.fatal("Failed updating node #{ui.color(node_name, :magenta)} attribute #{ui.color(new_attribute, :magenta)}")
60
+ exit 1
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,3 @@
1
+ module KnifeAttribute
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: knife-attribute
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Peter Fern
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-11-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: chef
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0.11'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0.11'
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.3'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Manipulate (currently only set) Chef attributes (currently only for nodes)
63
+ via Knife
64
+ email:
65
+ - ruby@0xc0dedbad.com
66
+ executables: []
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - .gitignore
71
+ - CONTRIBUTING.md
72
+ - Gemfile
73
+ - LICENSE.txt
74
+ - README.md
75
+ - Rakefile
76
+ - knife-attribute.gemspec
77
+ - lib/chef/knife/attribute.rb
78
+ - lib/knife-attribute.rb
79
+ - lib/knife-attribute/attribute_types.rb
80
+ - lib/knife-attribute/common_options.rb
81
+ - lib/knife-attribute/helpers.rb
82
+ - lib/knife-attribute/node/helpers.rb
83
+ - lib/knife-attribute/node/set.rb
84
+ - lib/knife-attribute/version.rb
85
+ homepage: https://github.com/pdf/knife-attribute
86
+ licenses:
87
+ - MIT
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ segments:
99
+ - 0
100
+ hash: -1403468226480289841
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ segments:
108
+ - 0
109
+ hash: -1403468226480289841
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 1.8.25
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: Manipulate Chef attributes via Knife
116
+ test_files: []