dtk-common 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ODUwNmVmZjNkNDZiMzdhOGEyZGM0Y2QyN2FjNzdmNjkzYTBmMzg5ZA==
5
- data.tar.gz: !binary |-
6
- OWM5ZGEwOWQ5NzNlNWIzNmNkMGE4M2I0NDhjNjcxYTJiOGEyZjc2MA==
2
+ SHA1:
3
+ metadata.gz: 1ac08df1794efde0192217d1c31ac6085b50b8e7
4
+ data.tar.gz: 59890da1e2a0e361e54309aebd24d926e349db5b
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MzY0YTFmN2FmNDJkNTkxODc1NmNkNzgxOTc0ZGI2OTc0NTM1ZTgyNDkwMTNk
10
- MmYxMjZmMTc4ZDQzNGViY2E0NTYxNTc4Yzg2MWM4NmQzNDAxODYyYmRhNGZi
11
- NDg1YjFlMzIxZDM3YmU0ZmZkODU5OTk2MjgyYmFjMDdjNGYxOTE=
12
- data.tar.gz: !binary |-
13
- MzhlNTUwNGQ3ZjcyMDExNzhiOWM5NWQ5ZDIwZTVmZTgwOWI5OWU2OGExODZk
14
- ZWExZWM3MmE0NTk5ZWEyY2QzNGY0NWI5Yzc4OTliY2M1ODA1NDYwNDIxYzZi
15
- ZGFkMWM2OTM0YTE5ZDVlNDczNDA5NmU3OTM3ZDUwOGQ2ZmQ4OWM=
6
+ metadata.gz: 32d2291226dc4058ea6c296153010467409ea5d5f0de4a862f750461b2dd26a24e2fc9e29142e6a176964fb22b913626db52768cb45bb1d79ae30dc86b27adf1
7
+ data.tar.gz: cf093c3e581738e15d9722b1db0436fb35f99713b417262602ad4d755c0f7131bc370bdf62c051e1221057289d5f49ac64e1303d54512383ecf1d679447bd658
data/Gemfile.lock CHANGED
@@ -1,12 +1,35 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dtk-common (0.1.10)
4
+ dtk-common (0.9.0)
5
+ colorize (~> 0.5.8)
6
+ docker-api (~> 1.26)
7
+ dtk-common-core (= 0.9.0)
8
+ erubis (~> 2.7)
9
+ grit (~> 2.5)
5
10
  rugged (~> 0.17.0.b7)
6
11
 
7
12
  GEM
8
13
  remote: http://rubygems.org/
9
14
  specs:
15
+ colorize (0.5.8)
16
+ diff-lcs (1.2.5)
17
+ docker-api (1.26.2)
18
+ excon (>= 0.38.0)
19
+ json
20
+ dtk-common-core (0.9.0)
21
+ rest-client (= 1.6.7)
22
+ erubis (2.7.0)
23
+ excon (0.45.4)
24
+ grit (2.5.0)
25
+ diff-lcs (~> 1.1)
26
+ mime-types (~> 1.15)
27
+ posix-spawn (~> 0.3.6)
28
+ json (1.8.3)
29
+ mime-types (1.25.1)
30
+ posix-spawn (0.3.8)
31
+ rest-client (1.6.7)
32
+ mime-types (>= 1.16)
10
33
  rugged (0.17.0.b7)
11
34
 
12
35
  PLATFORMS
@@ -14,3 +37,6 @@ PLATFORMS
14
37
 
15
38
  DEPENDENCIES
16
39
  dtk-common!
40
+
41
+ BUNDLED WITH
42
+ 1.10.6
data/dtk-common.gemspec CHANGED
@@ -18,6 +18,9 @@ Gem::Specification.new do |gem|
18
18
  gem.add_dependency 'rugged','~> 0.17.0.b7'
19
19
  gem.add_dependency 'dtk-common-core','0.9.0'
20
20
  gem.add_dependency 'colorize','~> 0.5.8'
21
+ gem.add_dependency 'docker-api', '~> 1.26'
22
+ gem.add_dependency 'grit', '~> 2.5'
23
+ gem.add_dependency 'erubis', '~> 2.7'
21
24
  # gem.add_dependency 'sequel','~> 3.40.0'
22
25
  # gem.add_dependency 'rdoc','~> 3.12'
23
26
  end
@@ -0,0 +1,98 @@
1
+ require 'docker'
2
+ require File.expand_path('../utils/open3.rb', File.dirname(__FILE__))
3
+
4
+ module DTK
5
+ module Docker
6
+ class Commander
7
+
8
+ include Common::Open3
9
+
10
+ def initialize(docker_image, docker_command, puppet_manifest, execution_type, dockerfile, workdir = '/usr/share/dtk/docker-worker')
11
+ @docker_image = docker_image
12
+ @docker_command = docker_command
13
+ @dockerfile = dockerfile
14
+ @puppet_manifest = puppet_manifest
15
+ @execution_type = execution_type
16
+ @workdir = workdir
17
+
18
+ unless ::Docker::Image.exist?(docker_image) && !@dockerfile
19
+ Log.info "Getting docker image '#{docker_image}', this may take a while"
20
+ ::Docker::Image.create('fromImage' => docker_image)
21
+ end
22
+
23
+ # build required docker image if requested
24
+ if @dockerfile
25
+ Log.info "Building docker image: #{docker_image}"
26
+ image = ::Docker::Image.build(@dockerfile)
27
+ image.tag('repo' => docker_image, 'force' => true)
28
+ end
29
+ end
30
+
31
+ def run
32
+ # require 'debugger'; debugger
33
+ docker_container_name = "dtk#{Time.now.to_i}"
34
+ output_dir = "#{@workdir}/#{docker_container_name}"
35
+ output_dir_tmp = "#{output_dir}/tmp"
36
+ output_dir_container = "/host_volume"
37
+ output_file = "#{output_dir}/report.yml"
38
+ puppet_modules_dir = '/usr/share/dtk/puppet-modules'
39
+
40
+
41
+ FileUtils.mkdir_p output_dir_tmp
42
+ # make sure dtkyaml reporter is available to puppet
43
+ FileUtils.ln_sf '/usr/share/dtk/dtk-arbiter/dtkyaml', '/etc/puppet/modules/dtkyaml' unless File.exist? '/etc/puppet/modules/dtkyaml'
44
+ # write puppet manifest
45
+ File.open("#{output_dir}/manifest.pp", 'w') { |file| file.write(@puppet_manifest) }
46
+ # make sure r8 module is available
47
+ FileUtils.cp_r "/etc/puppet/modules/r8", puppet_modules_dir unless File.exist? "#{puppet_modules_dir}/r8"
48
+
49
+ docker_cli_cmd = "docker run --name #{docker_container_name} -v #{output_dir}:#{output_dir_container} -v #{output_dir}/tmp:/tmp" +
50
+ ((@execution_type.eql? 'puppet') ? " -v #{puppet_modules_dir}:/etc/puppet/modules" : "") + " #{@docker_image} #{@docker_command}"
51
+
52
+ Log.info "Starting Docker container..."
53
+
54
+ docker_run_stdout, docker_run_stderr, exit_status, results = capture3_with_timeout(docker_cli_cmd)
55
+
56
+ if @execution_type.eql? 'puppet'
57
+ begin
58
+ docker_puppet_report = Hash.new
59
+ docker_puppet_report = YAML.load_file(output_file) if File.exist? output_file
60
+ rescue Exception => e
61
+ Log.error("Docker (puppet) report error: #{e.message}", e.backtrace)
62
+ end
63
+ end
64
+
65
+ container = ::Docker::Container.get(docker_container_name)
66
+
67
+ @results = Hash.new
68
+
69
+ @results[:puppet_report] = docker_puppet_report ||= ''
70
+ @results[:stdout] = docker_run_stdout
71
+ @results[:stderr] = docker_run_stderr
72
+ @results[:status] = exit_status.exitstatus
73
+ @results[:dynamic_attributes] = read_dynamic_attributes(output_dir_tmp)
74
+
75
+ # cleanup
76
+ Log.info("Deleting container and doing cleanup")
77
+ container.delete(:force => true)
78
+
79
+ # http://unix.stackexchange.com/a/117848
80
+ system("find #{output_dir} -depth -type f -exec shred -n 1 -z -u {} \\;")
81
+ FileUtils.rm_rf(output_dir)
82
+ end
83
+
84
+ def results
85
+ @results
86
+ end
87
+
88
+ private
89
+
90
+ def read_dynamic_attributes(path, identifier = 'dtk_exported_variables')
91
+ full_path = File.join(path, identifier)
92
+ return nil unless File.exists?(full_path)
93
+ Marshal.load(File.read(full_path))
94
+ end
95
+
96
+ end
97
+ end
98
+ end
@@ -16,5 +16,5 @@
16
16
  # limitations under the License.
17
17
  #
18
18
  module DtkCommon
19
- VERSION="0.9.0"
19
+ VERSION="0.9.1"
20
20
  end
data/lib/gitolite/repo.rb CHANGED
@@ -54,10 +54,8 @@ module Gitolite
54
54
 
55
55
  end
56
56
 
57
- def initialize(repo_name, configuration_, logger_, gitolite_path, gitolite_branch="master")
58
- # IMPORTANT! Tenants user are always included with each module
59
-
60
- @rights_hash = { 'R' => [], 'W' => [], 'RW' => ['@tenants'], 'RW+' => []}
57
+ def initialize(repo_name, configuration_, logger_, gitolite_path, gitolite_branch = 'master')
58
+ @rights_hash = { 'R' => [], 'W' => [], 'RW' => [], 'RW+' => []}
61
59
  @repo_name = repo_name
62
60
  @user_groups = []
63
61
  @commit_messages = []
@@ -0,0 +1,103 @@
1
+ require 'timeout'
2
+ require 'open3'
3
+
4
+ module DTK
5
+ module Common
6
+ module Open3
7
+
8
+ STREAM_TIMEOUT = 5
9
+
10
+ # Running puppet directly on system and from ruby process has proven different. Following is set of environment variables
11
+ # that assures proper execution from bundler / rvm ruby
12
+ AGNOSTIC_PUPPET_VARS = {
13
+ "BUNDLE_GEMFILE" => nil,
14
+ "BUNDLE_BIN_PATH" => nil,
15
+ "RUBYOPT" => nil,
16
+ "rvm_" => nil,
17
+ "RACK_ENV" => nil,
18
+ "RAILS_ENV" => nil
19
+ }
20
+
21
+ ##
22
+ # Open3 method extended with timeout, more info https://gist.github.com/pasela/9392115
23
+ #
24
+
25
+ def capture3_with_timeout(*cmd)
26
+ spawn_opts = Hash === cmd.last ? cmd.pop.dup : {}
27
+ opts = {
28
+ :stdin_data => "",
29
+ :timeout => @timeout || 0,
30
+ :signal => :TERM,
31
+ :kill_after => nil,
32
+ }
33
+
34
+ in_r, in_w = IO.pipe
35
+ out_r, out_w = IO.pipe
36
+ err_r, err_w = IO.pipe
37
+ in_w.sync = true
38
+
39
+ spawn_opts[:in] = in_r
40
+ spawn_opts[:out] = out_w
41
+ spawn_opts[:err] = err_w
42
+
43
+ result = {
44
+ :pid => nil,
45
+ :status => nil,
46
+ :stdout => nil,
47
+ :stderr => nil,
48
+ :timeout => false,
49
+ }
50
+
51
+ out_reader = nil
52
+ err_reader = nil
53
+ wait_thr = nil
54
+
55
+ begin
56
+ Timeout.timeout(opts[:timeout]) do
57
+ result[:pid] = spawn(AGNOSTIC_PUPPET_VARS, *cmd, spawn_opts)
58
+ wait_thr = Process.detach(result[:pid])
59
+ in_r.close
60
+ out_w.close
61
+ err_w.close
62
+
63
+ out_reader = Thread.new { out_r.read }
64
+ err_reader = Thread.new { err_r.read }
65
+
66
+ in_w.close
67
+
68
+ result[:status] = wait_thr.value
69
+ end
70
+ rescue Timeout::Error
71
+ result[:timeout] = true
72
+ pid = result[:pid]
73
+ Process.kill(opts[:signal], pid)
74
+ if opts[:kill_after]
75
+ unless wait_thr.join(opts[:kill_after])
76
+ Process.kill(:KILL, pid)
77
+ end
78
+ end
79
+ ensure
80
+ result[:status] = wait_thr.value if wait_thr
81
+ begin
82
+ # there is a bug where there is infinite leg on out_reader (e.g. hohup) commands
83
+ Timeout.timeout(STREAM_TIMEOUT) do
84
+ result[:stdout] = out_reader.value if out_reader
85
+ result[:stderr] = err_reader.value if err_reader
86
+ end
87
+ rescue Timeout::Error
88
+ result[:stdout] ||= ''
89
+ result[:stderr] ||= ''
90
+ end
91
+ out_r.close unless out_r.closed?
92
+ err_r.close unless err_r.closed?
93
+ end
94
+
95
+ result[:stdout] = result[:stdout].gsub(/\e\[([;\d]+)?m/, '') if result[:stdout]
96
+ result[:stderr] = result[:stderr].gsub(/\e\[([;\d]+)?m/, '') if result[:stderr]
97
+
98
+ [result[:stdout], result[:stderr], result[:status], result]
99
+ end
100
+
101
+ end
102
+ end
103
+ end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dtk-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rich PELAVIN
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-10 00:00:00.000000000 Z
11
+ date: 2016-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rugged
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.17.0.b7
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.17.0.b7
27
27
  - !ruby/object:Gem::Dependency
@@ -42,16 +42,58 @@ dependencies:
42
42
  name: colorize
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 0.5.8
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.5.8
55
+ - !ruby/object:Gem::Dependency
56
+ name: docker-api
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.26'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.26'
69
+ - !ruby/object:Gem::Dependency
70
+ name: grit
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.5'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: erubis
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.7'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.7'
55
97
  description: Dtk common is needed to use dtk-client gem, provides common libraries
56
98
  for running DTK CLI.
57
99
  email:
@@ -60,8 +102,8 @@ executables: []
60
102
  extensions: []
61
103
  extra_rdoc_files: []
62
104
  files:
63
- - .gitignore
64
- - .license_header
105
+ - ".gitignore"
106
+ - ".license_header"
65
107
  - Gemfile
66
108
  - Gemfile.lock
67
109
  - LICENSE
@@ -69,6 +111,7 @@ files:
69
111
  - Rakefile
70
112
  - dtk-common.gemspec
71
113
  - lib/common_patch.rb
114
+ - lib/docker/commander.rb
72
115
  - lib/dsl.rb
73
116
  - lib/dsl/directory_parser.rb
74
117
  - lib/dsl/directory_parser/git.rb
@@ -102,6 +145,7 @@ files:
102
145
  - lib/module_parser/module_parser.rb
103
146
  - lib/module_version.rb
104
147
  - lib/require_first.rb
148
+ - lib/utils/open3.rb
105
149
  - rich_tests/README.md
106
150
  - rich_tests/dsl_test1.rb
107
151
  - rich_tests/dsl_test2.rb
@@ -190,17 +234,17 @@ require_paths:
190
234
  - lib
191
235
  required_ruby_version: !ruby/object:Gem::Requirement
192
236
  requirements:
193
- - - ! '>='
237
+ - - ">="
194
238
  - !ruby/object:Gem::Version
195
239
  version: '0'
196
240
  required_rubygems_version: !ruby/object:Gem::Requirement
197
241
  requirements:
198
- - - ! '>='
242
+ - - ">="
199
243
  - !ruby/object:Gem::Version
200
244
  version: '0'
201
245
  requirements: []
202
246
  rubyforge_project:
203
- rubygems_version: 2.4.8
247
+ rubygems_version: 2.4.1
204
248
  signing_key:
205
249
  specification_version: 4
206
250
  summary: Common libraries used for DTK CLI client.