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 +5 -13
- data/Gemfile.lock +27 -1
- data/dtk-common.gemspec +3 -0
- data/lib/docker/commander.rb +98 -0
- data/lib/dtk-common/version.rb +1 -1
- data/lib/gitolite/repo.rb +2 -4
- data/lib/utils/open3.rb +103 -0
- metadata +55 -11
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
OWM5ZGEwOWQ5NzNlNWIzNmNkMGE4M2I0NDhjNjcxYTJiOGEyZjc2MA==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1ac08df1794efde0192217d1c31ac6085b50b8e7
|
4
|
+
data.tar.gz: 59890da1e2a0e361e54309aebd24d926e349db5b
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
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.
|
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
|
data/lib/dtk-common/version.rb
CHANGED
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=
|
58
|
-
|
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 = []
|
data/lib/utils/open3.rb
ADDED
@@ -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.
|
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-
|
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.
|
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.
|