itamae-spec 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +7 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +42 -0
  7. data/Rakefile +47 -0
  8. data/bin/itamae-spec +4 -0
  9. data/itamae-spec.gemspec +36 -0
  10. data/lib/itamae-spec.rb +10 -0
  11. data/lib/itamae-spec/cli.rb +19 -0
  12. data/lib/itamae-spec/generators.rb +20 -0
  13. data/lib/itamae-spec/generators/cookbook.rb +10 -0
  14. data/lib/itamae-spec/generators/project.rb +10 -0
  15. data/lib/itamae-spec/generators/templates/cookbook/attributes/.keep +0 -0
  16. data/lib/itamae-spec/generators/templates/cookbook/recipes/default.rb +0 -0
  17. data/lib/itamae-spec/generators/templates/cookbook/recipes/files/.keep +0 -0
  18. data/lib/itamae-spec/generators/templates/cookbook/recipes/templates/.keep +0 -0
  19. data/lib/itamae-spec/generators/templates/cookbook/spec/default_spec.rb +0 -0
  20. data/lib/itamae-spec/generators/templates/project/.rspec +2 -0
  21. data/lib/itamae-spec/generators/templates/project/Gemfile +3 -0
  22. data/lib/itamae-spec/generators/templates/project/Project.json +1 -0
  23. data/lib/itamae-spec/generators/templates/project/Rakefile +9 -0
  24. data/lib/itamae-spec/generators/templates/project/cookbooks/sample/attributes/.keep +0 -0
  25. data/lib/itamae-spec/generators/templates/project/cookbooks/sample/attributes/default.json +5 -0
  26. data/lib/itamae-spec/generators/templates/project/cookbooks/sample/recipes/default.rb +7 -0
  27. data/lib/itamae-spec/generators/templates/project/cookbooks/sample/recipes/files/.keep +0 -0
  28. data/lib/itamae-spec/generators/templates/project/cookbooks/sample/recipes/templates/.keep +0 -0
  29. data/lib/itamae-spec/generators/templates/project/cookbooks/sample/spec/default_spec.rb +9 -0
  30. data/lib/itamae-spec/generators/templates/project/environments/.keep +0 -0
  31. data/lib/itamae-spec/generators/templates/project/environments/sample.json +7 -0
  32. data/lib/itamae-spec/generators/templates/project/keys/.keep +0 -0
  33. data/lib/itamae-spec/generators/templates/project/nodes/.keep +0 -0
  34. data/lib/itamae-spec/generators/templates/project/nodes/sample.json +10 -0
  35. data/lib/itamae-spec/generators/templates/project/roles/.keep +0 -0
  36. data/lib/itamae-spec/generators/templates/project/roles/sample.json +5 -0
  37. data/lib/itamae-spec/generators/templates/project/spec/spec_helper.rb +41 -0
  38. data/lib/itamae-spec/generators/templates/project/tmp-nodes/.keep +0 -0
  39. data/lib/itamae-spec/logger.rb +76 -0
  40. data/lib/itamae-spec/resource.rb +2 -0
  41. data/lib/itamae-spec/resource/http_request.rb +71 -0
  42. data/lib/itamae-spec/resource/s3_file.rb +31 -0
  43. data/lib/itamae-spec/task/base.rb +90 -0
  44. data/lib/itamae-spec/task/base_task.rb +148 -0
  45. data/lib/itamae-spec/task/itamae_task.rb +112 -0
  46. data/lib/itamae-spec/task/local_itamae_task.rb +84 -0
  47. data/lib/itamae-spec/task/local_serverspec_task.rb +125 -0
  48. data/lib/itamae-spec/task/serverspec_task.rb +111 -0
  49. data/lib/itamae-spec/version.rb +3 -0
  50. data/lib/itamae-spec/version.txt +1 -0
  51. data/spec/integration/Vagrantfile +35 -0
  52. data/spec/integration/default_spec.rb +226 -0
  53. data/spec/integration/recipes/default.rb +423 -0
  54. data/spec/integration/recipes/default2.rb +6 -0
  55. data/spec/integration/recipes/define/default.rb +6 -0
  56. data/spec/integration/recipes/define/files/remote_file_in_definition +1 -0
  57. data/spec/integration/recipes/dry_run.rb +6 -0
  58. data/spec/integration/recipes/files/remote_file_auto +1 -0
  59. data/spec/integration/recipes/hello.erb +6 -0
  60. data/spec/integration/recipes/hello.txt +1 -0
  61. data/spec/integration/recipes/included.rb +9 -0
  62. data/spec/integration/recipes/node.json +3 -0
  63. data/spec/integration/recipes/redefine.rb +20 -0
  64. data/spec/integration/recipes/templates/template_auto.erb +6 -0
  65. data/spec/integration/spec_helper.rb +42 -0
  66. data/spec/unit/lib/itamae/backend_spec.rb +95 -0
  67. data/spec/unit/lib/itamae/handler/base_spec.rb +34 -0
  68. data/spec/unit/lib/itamae/handler/fluentd_spec.rb +19 -0
  69. data/spec/unit/lib/itamae/handler_proxy_spec.rb +38 -0
  70. data/spec/unit/lib/itamae/handler_spec.rb +11 -0
  71. data/spec/unit/lib/itamae/node_spec.rb +14 -0
  72. data/spec/unit/lib/itamae/recipe_spec.rb +6 -0
  73. data/spec/unit/lib/itamae/resource/base_spec.rb +127 -0
  74. data/spec/unit/lib/itamae/resource_spec.rb +23 -0
  75. data/spec/unit/lib/itamae/runner_spec.rb +32 -0
  76. data/spec/unit/spec_helper.rb +23 -0
  77. metadata +315 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 32c0a5e4298c6d97786f447e64e6edea3071ed874f8f347532e33bfa92330fdf
4
+ data.tar.gz: d69af9290654e7d104d9decb50ff9f6c8afb80587af0189ab1e933264abec152
5
+ SHA512:
6
+ metadata.gz: 1234cfda80bca59a5e53251046f7c743587d692097f80a63033c9bbe150eb18dcc161b703bd3019d416527c327703e02ea8065b486f0f7ab44beca652f46343a
7
+ data.tar.gz: a3a82b93122ab5b95eddb874f09b14fb0c919e888008b834d32e501a6bb7ad070cefb88bdc11fb2cee752c75b5cda54174d7ec394cc8824cce32442de312c4c3
@@ -0,0 +1,14 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ Gemfile.lock
6
+ Gemfile.local
7
+ pkg
8
+ rdoc
9
+ spec/reports
10
+ test/tmp
11
+ test/version_tmp
12
+ tmp
13
+ .vagrant
14
+ logs
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ -fd
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in itamae-spec.gemspec
4
+ gemspec
5
+
6
+ path = Pathname.new("Gemfile.local")
7
+ eval(path.read) if path.exist?
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2018 kammy1231
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.
@@ -0,0 +1,42 @@
1
+ [![Gem Version](https://badge.fury.io/rb/itamae-spec.svg)](http://badge.fury.io/rb/itamae-spec)
2
+
3
+ Customized version of Itamae
4
+
5
+ ## Concept
6
+
7
+ - Integration with Serverspec
8
+ - Attributes are defined by: Nodes, Environments, and Recipes
9
+ - Support for some AWS Resources
10
+ - Running on the RakeTask
11
+
12
+ ## Installation
13
+
14
+ ```
15
+ $ gem install itamae-spec
16
+ $ itamae-spec init your-project-name
17
+ ```
18
+
19
+ ## If you want to use the AWS Resources
20
+ ```
21
+ $ aws configure
22
+ ```
23
+
24
+ ## Getting Started
25
+ - [Getting Started](https://github.com/kammy1231/itamae-spec/wiki/Getting-Started)
26
+
27
+ ## Usage AWS Resource
28
+ - [Customized Resources](https://github.com/kammy1231/itamae-spec/wiki/Customized-Resources)
29
+
30
+ ## Reference
31
+ - [itamae](https://github.com/itamae-kitchen/itamae)
32
+ - [Serverspec](https://github.com/mizzy/serverspec)
33
+
34
+ ## Contributing
35
+
36
+ If you have a problem, please [create an issue](https://github.com/kammy1231/itamae-spec) or a pull request.
37
+
38
+ 1. Fork it
39
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
40
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
41
+ 4. Push to the branch (`git push origin my-new-feature`)
42
+ 5. Create new Pull Request
@@ -0,0 +1,47 @@
1
+ # coding: utf-8
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+
5
+ require 'rake/extensiontask'
6
+ require 'rake/packagetask'
7
+ begin
8
+ require 'bundler/gem_tasks'
9
+ rescue LoadError
10
+ puts 'If you want to create gem, You must install Bundler'
11
+ end
12
+
13
+ require './lib/itamae-spec/version.rb'
14
+ def version
15
+ ItamaeSpec::VERSION
16
+ end
17
+
18
+ Rake::ExtensionTask.new do |ext|
19
+ ext.name = 'itamae-spec'
20
+ ext.ext_dir = 'ext/'
21
+ ext.lib_dir = 'lib/'
22
+ end
23
+
24
+ Rake::PackageTask.new('itamae-spec', "#{version}") do |t|
25
+ t.need_tar_gz = true
26
+ t.package_files.include `git ls-files`.split("\n")
27
+ end
28
+
29
+ namespace :release do
30
+ desc "Bump up version and commit"
31
+ task :version_up do
32
+ version_file = File.expand_path("lib/itamae-spec/version.txt")
33
+ current_version = File.read(version_file).strip
34
+
35
+ if /\A(.+?)(\d+)\z/ =~ current_version
36
+ next_version = "#{$1}#{$2.to_i + 1}"
37
+ else
38
+ raise "Invalid version"
39
+ end
40
+
41
+ open(version_file, "w") do |f|
42
+ f.write next_version
43
+ end
44
+ system "git add #{version_file}"
45
+ system "git commit -m 'Bump up version'"
46
+ end
47
+ end
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "itamae-spec/cli"
4
+ ItamaeSpec::CLI.start
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'itamae-spec/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "itamae-spec"
8
+ spec.version = ItamaeSpec::VERSION
9
+ spec.authors = ["kammy1231"]
10
+ spec.email = ["akihiro.vamps@gmail.com"]
11
+ spec.summary = %q{Customized version of Itamae.
12
+ Integration with Serverspec.
13
+ It can be provisioning using itamae's some AWS resources.}
14
+ spec.homepage = "https://github.com/kammy1231/itamae-spec"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files`.split($/)
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.0")
22
+
23
+ spec.add_runtime_dependency "aws-sdk", "~> 2"
24
+ spec.add_runtime_dependency "serverspec", "~> 2.1"
25
+ spec.add_runtime_dependency "itamae", "1.9.11"
26
+ spec.add_runtime_dependency "rake"
27
+ spec.add_runtime_dependency "multi_json"
28
+ spec.add_runtime_dependency "bundler"
29
+ spec.add_runtime_dependency "highline"
30
+
31
+ spec.add_development_dependency "rake-compiler"
32
+ spec.add_development_dependency "rspec", "~> 3.0"
33
+ spec.add_development_dependency "pry-byebug"
34
+ spec.add_development_dependency "docker-api", "~> 1.20"
35
+ spec.add_development_dependency "fakefs"
36
+ end
@@ -0,0 +1,10 @@
1
+ require 'itamae'
2
+ require 'itamae-spec/cli'
3
+ require 'itamae-spec/version'
4
+ require 'itamae-spec/resource'
5
+ require 'itamae-spec/logger'
6
+ require 'itamae-spec/generators'
7
+
8
+ module ItamaeSpec
9
+ # Your code goes here
10
+ end
@@ -0,0 +1,19 @@
1
+ require 'itamae-spec'
2
+
3
+ module ItamaeSpec
4
+ class CLI < Itamae::CLI
5
+ # Support for password authentication
6
+ option :password, type: :string, desc: 'input ssh password'
7
+
8
+ def initialize(*)
9
+ super
10
+
11
+ Itamae.logger.level = ::Logger.const_get(options[:log_level].upcase) if options[:log_level]
12
+ Itamae.logger.formatter.colored = options[:color] if options[:color]
13
+ end
14
+
15
+ def version
16
+ puts "Itamae-Spec v#{ItamaeSpec::VERSION}"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ require "itamae-spec/generators/project"
2
+ require "itamae-spec/generators/cookbook"
3
+
4
+ module Itamae
5
+ module Generators
6
+ def self.find(target)
7
+ case target
8
+ when 'cookbook'
9
+ Cookbook
10
+ when 'project'
11
+ Project
12
+ when 'role'
13
+ puts 'Not support generate role. Do nothing.'
14
+ exit 1
15
+ else
16
+ raise "Unexpected target: #{target}"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,10 @@
1
+
2
+ module Itamae
3
+ module Generators
4
+ class Cookbook
5
+ def self.source_root
6
+ File.expand_path('../templates/cookbook', __FILE__)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+
2
+ module Itamae
3
+ module Generators
4
+ class Project
5
+ def self.source_root
6
+ File.dirname(__FILE__) + '/templates/project'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'itamae-spec'
@@ -0,0 +1,9 @@
1
+ ### Itamae task
2
+ require 'itamae-spec/task/itamae_task'
3
+
4
+ ### Serverspec task
5
+ require 'itamae-spec/task/serverspec_task'
6
+
7
+ ### Local Mode
8
+ # require 'itamae-spec/task/local_itamae_task'
9
+ # require 'itamae-spec/task/local_serverspec_task'
@@ -0,0 +1,7 @@
1
+
2
+ file "/tmp/sample" do
3
+ user "root"
4
+ group "root"
5
+ mode "755"
6
+ content "This is a sample."
7
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe file('/tmp/sample') do
4
+ it { should be_file }
5
+ it { should be_mode 755 }
6
+ it { should be_owned_by 'root' }
7
+ it { should be_grouped_into 'root' }
8
+ its(:content) { should match /This is a sample./ }
9
+ end
@@ -0,0 +1,7 @@
1
+ {
2
+ "environments": {
3
+ "ssh_port": "22",
4
+ "ssh_user": "ec2-user",
5
+ "ssh_key": "sample.pem"
6
+ }
7
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "run_list": [
3
+ "recipe[sample]",
4
+ "role[sample]"
5
+ ],
6
+ "environments": {
7
+ "set": "sample",
8
+ "hostname": "sample"
9
+ }
10
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "run_list": [
3
+ "recipe[sample]"
4
+ ]
5
+ }
@@ -0,0 +1,41 @@
1
+ require 'serverspec'
2
+ require 'net/ssh'
3
+ require 'specinfra/helper/set'
4
+ require 'json'
5
+ include Specinfra::Helper::Set
6
+
7
+ if ENV['LOCAL_MODE']
8
+ set :backend, :exec
9
+ else
10
+ set :backend, :ssh
11
+ end
12
+
13
+ if ENV['ASK_SUDO_PASSWORD']
14
+ begin
15
+ require 'highline/import'
16
+ rescue LoadError
17
+ fail "highline is not available. Try installing it."
18
+ end
19
+ set :sudo_password, ask("Enter sudo password: ") { |q| q.echo = false }
20
+ else
21
+ set :sudo_password, ENV['SUDO_PASSWORD']
22
+ end
23
+
24
+ host = ENV['TARGET_HOST']
25
+ node_file = ENV['NODE_FILE']
26
+ attributes = JSON.parse(File.read(node_file), symbolize_names: true)
27
+ set_property attributes
28
+
29
+ unless ENV['LOCAL_MODE']
30
+ options = Net::SSH::Config.for(host)
31
+ options[:user] = ENV['SSH_USER']
32
+ options[:password] = ENV['SSH_PASSWORD']
33
+ options[:keys] = ENV['SSH_KEY']
34
+ options[:port] = ENV['SSH_PORT']
35
+
36
+ set :host, options[:host_name] || host
37
+ set :shell, '/bin/bash'
38
+ set :ssh_options, options
39
+ end
40
+
41
+ set :request_pty, true
@@ -0,0 +1,76 @@
1
+
2
+ module Itamae
3
+ module Logger
4
+ class FileFormatter < Formatter
5
+ def call(severity, datetime, progname, msg)
6
+ log = "%s : %s" % ["%5s" % severity, msg2str(msg)]
7
+ Time.now.strftime('%F %T %z').to_s + log + "\n"
8
+ end
9
+ end
10
+
11
+ def self.broadcast(logger)
12
+ Module.new do
13
+ define_method(:add) do |*args, &block|
14
+ logger.add(*args, &block)
15
+ super(*args, &block)
16
+ end
17
+
18
+ define_method(:<<) do |x|
19
+ logger << x
20
+ super(x)
21
+ end
22
+
23
+ define_method(:close) do
24
+ logger.close
25
+ super()
26
+ end
27
+
28
+ define_method(:progname=) do |name|
29
+ logger.progname = name
30
+ super(name)
31
+ end
32
+
33
+ define_method(:formatter=) do |formatter|
34
+ logger.formatter = formatter
35
+ super(formatter)
36
+ end
37
+
38
+ define_method(:level=) do |level|
39
+ logger.level = level
40
+ super(level)
41
+ end
42
+
43
+ define_method(:local_level=) do |level|
44
+ logger.local_level = level if logger.respond_to?(:local_level=)
45
+ super(level) if respond_to?(:local_level=)
46
+ end
47
+
48
+ define_method(:silence) do |level = Logger::ERROR, &block|
49
+ if logger.respond_to?(:silence)
50
+ logger.silence(level) do
51
+ if defined?(super)
52
+ super(level, &block)
53
+ else
54
+ block.call(self)
55
+ end
56
+ end
57
+ else
58
+ if defined?(super)
59
+ super(level, &block)
60
+ else
61
+ block.call(self)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ if Dir.exist?('logs')
70
+ @file_logger = ::Logger.new('logs/itamae.log', 'daily').tap do |l|
71
+ l.formatter = Itamae::Logger::FileFormatter.new
72
+ end.extend(Itamae::Logger::Helper)
73
+
74
+ @logger.extend Itamae::Logger.broadcast(@file_logger)
75
+ end
76
+ end