dtk-common 0.9.0 → 0.9.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.
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.