elders 0.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7d5f64b6b4e554a5e73d5262466b503430a03c4f
4
+ data.tar.gz: b81f05d2015f8afd189c216fcea139d7492f4b51
5
+ SHA512:
6
+ metadata.gz: 05ad36e734a945b2c8c5eab2136cc926f0ce1886ec67fbdf3e3c899bdddac3ea5d025070922ef2a5238e02fdb38037d5d682712f3d9eecefbb7039a8ee70e24f
7
+ data.tar.gz: 67694110b341ffc277eb04afce37ba38406e4410a8f64a53fdcd330cbde443609823decc90091b367ec9f5219f1913221fc8f681feea7d6a1c7734585c0569cf
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ sudo: required
2
+
3
+ language: ruby
4
+ rvm:
5
+ - 2.2.0
6
+
7
+ services:
8
+ - docker
9
+
10
+ script:
11
+ - bundle exec rspec
data/Dockerfile ADDED
@@ -0,0 +1,17 @@
1
+ # Ruby Image
2
+ FROM ruby:2.2.0
3
+
4
+ # Install Bundler
5
+ RUN gem install bundler --no-ri --no-rdoc
6
+
7
+ # Make the app folder
8
+ RUN mkdir elders/
9
+
10
+ # Set workdir
11
+ WORKDIR elders/
12
+
13
+ # Add the rest of the source
14
+ ADD . .
15
+
16
+ # Bundle install it
17
+ RUN bundle install
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,40 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ elders (0.0.0)
5
+ concurrent-ruby (~> 1.0)
6
+ docker-api (~> 1.26)
7
+ json (~> 1.8)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ concurrent-ruby (1.0.0)
13
+ diff-lcs (1.2.5)
14
+ docker-api (1.26.0)
15
+ excon (>= 0.38.0)
16
+ json
17
+ excon (0.45.4)
18
+ json (1.8.3)
19
+ rspec (3.0.0)
20
+ rspec-core (~> 3.0.0)
21
+ rspec-expectations (~> 3.0.0)
22
+ rspec-mocks (~> 3.0.0)
23
+ rspec-core (3.0.4)
24
+ rspec-support (~> 3.0.0)
25
+ rspec-expectations (3.0.4)
26
+ diff-lcs (>= 1.2.0, < 2.0)
27
+ rspec-support (~> 3.0.0)
28
+ rspec-mocks (3.0.4)
29
+ rspec-support (~> 3.0.0)
30
+ rspec-support (3.0.4)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ elders!
37
+ rspec (~> 3.0)
38
+
39
+ BUNDLED WITH
40
+ 1.11.2
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ ## Development
2
+ * Running tests:
3
+ 1. Build the Docker image: `docker build -t elders .`
4
+ 2. Run the RSpec: `docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock elders bundle exec rspec`
5
+
6
+ ### Extra
7
+ Interactive mode in the conteiner.
8
+
9
+ * `docker run --rm -it -v (PWD):/elders -v /var/run/docker.sock:/var/run/docker.sock elders /bin/bash`
data/elders.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ require './lib/elders/version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'elders'
5
+ s.version = Elders.version
6
+
7
+ s.summary = 'Docker based task runner.'
8
+ s.description = 'Docker based task runner.'
9
+
10
+ s.author = 'Gabriel Corado'
11
+ s.email = 'gabrielcorado@mail.com'
12
+ s.homepage = 'http://github.com/gabrielcorado/elders'
13
+
14
+ s.files = `git ls-files`.strip.split("\n")
15
+ s.executables = Dir["bin/*"].map { |f| File.basename(f) }
16
+
17
+ # Dependencies
18
+ s.add_dependency 'concurrent-ruby', '~> 1.0'
19
+ s.add_dependency 'docker-api', '~> 1.26'
20
+ s.add_dependency 'json', '~> 1.8'
21
+
22
+ # Development depencies
23
+ s.add_development_dependency 'rspec', '~> 3.0'
24
+ end
@@ -0,0 +1,69 @@
1
+ #
2
+ module Elders
3
+ #
4
+ class Stack
5
+ # Attributes
6
+ attr_reader :tasks
7
+ attr_accessor :promise
8
+
9
+ # Create a new the stack
10
+ # @param {Array<Task>} tasks - The tasks from the stack
11
+ def initialize(tasks)
12
+ # Set tasks
13
+ @tasks = tasks
14
+ end
15
+
16
+ # Start
17
+ # @param {String} params - Params used by all the tasks
18
+ def start(params = nil)
19
+ # Start the tasks and get it promises
20
+ promises = @tasks.map do |task|
21
+ # Start the task
22
+ task.start params
23
+
24
+ # Get the promise
25
+ task.promise
26
+ end
27
+
28
+ # Wait for all the tasks
29
+ @promise = Concurrent::Promise.all? *promises
30
+
31
+ # Execute the promises
32
+ @promise.execute
33
+ end
34
+
35
+ # Clean all the stack tasks
36
+ def clean
37
+ # Each the tasks
38
+ @tasks.each do |task|
39
+ # Clean all of them
40
+ task.clean
41
+ end
42
+ end
43
+
44
+ # Wait until all the promises to finish
45
+ # @param {Integer} limit - Limit of waiting in seconds
46
+ def wait(limit = nil)
47
+ # Define the timeout
48
+ timeout = Time.now.to_i + limit unless limit.nil?
49
+
50
+ # Success?
51
+ success = false
52
+
53
+ # Inifiny loop
54
+ loop do
55
+ # Timeout?
56
+ break if !timeout.nil? && Time.now.to_i >= timeout
57
+
58
+ # Set the success
59
+ success = @promise.fulfilled?
60
+
61
+ # Completed?
62
+ break if success
63
+ end
64
+
65
+ # Return the success
66
+ success
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,106 @@
1
+ #
2
+ class Elders::Task
3
+ # Task timeout
4
+ TIMEOUT = 1500
5
+
6
+ # Attributes
7
+ attr_reader :name, :command, :promise
8
+
9
+ # Creates a new task, but not start it
10
+ # @param {String} name - Task name
11
+ # @param {String} image - Docker image that the command
12
+ # is going to be runned on.
13
+ # @param {String} command - The `bash` command that is
14
+ # going to be runned.
15
+ def initialize(name, image, command)
16
+ # Define the values
17
+ @name = name
18
+ @image_name = image
19
+ @command = command
20
+ end
21
+
22
+ # Start the task
23
+ # Shellwords.escape
24
+ # @param {String} params - Params for the task/command
25
+ def start(params = nil, env = nil)
26
+ # Clean
27
+ clean
28
+
29
+ # Add params to the command
30
+ command = @command
31
+ command = "#{command} #{params}" unless params.nil?
32
+
33
+ # Create the container
34
+ @container = Docker::Container.create 'Image' => @image_name, 'Cmd' => Shellwords.split(command), 'Env' => env
35
+
36
+ # Start it
37
+ @container.start
38
+
39
+ # Wait for the container to end
40
+ @promise = Concurrent::Promise.execute { @container.wait }
41
+ end
42
+
43
+ # Stop the task
44
+ def stop
45
+ container.stop
46
+ end
47
+
48
+ # Task logs
49
+ def logs
50
+ container.logs stdout: true
51
+ end
52
+
53
+ # Delete the container
54
+ def delete
55
+ # Delete the containe
56
+ res = container.delete force: true
57
+
58
+ # Clean it
59
+ @container = nil if res == nil
60
+
61
+ # Return the result
62
+ res
63
+ end
64
+
65
+ # Clean the task
66
+ def clean
67
+ # There is nothing to clean
68
+ return true unless container?
69
+
70
+ # Delete the container
71
+ delete == nil
72
+ end
73
+
74
+ # Get the task container
75
+ def container
76
+ # Check if @container exists
77
+ raise 'Task was not started' unless container?
78
+
79
+ # Return the container
80
+ @container
81
+ end
82
+
83
+ # Check if the container exists
84
+ def container?
85
+ !@container.nil?
86
+ end
87
+
88
+ # Error in running the task?
89
+ def error?
90
+ # Check if the task is completed
91
+ return nil unless completed?
92
+
93
+ # Check the task status code
94
+ @promise.value['StatusCode'] > 0
95
+ end
96
+
97
+ # Completed the task?
98
+ def completed?
99
+ @promise.fulfilled?
100
+ end
101
+
102
+ # Check if the task was a success
103
+ def success?
104
+ completed? && !error?
105
+ end
106
+ end
@@ -0,0 +1,7 @@
1
+ #
2
+ module Elders
3
+ # Gem Version
4
+ def self.version
5
+ '0.0.0'.freeze
6
+ end
7
+ end
data/lib/elders.rb ADDED
@@ -0,0 +1,13 @@
1
+ # Dependencies
2
+ require 'shellwords'
3
+ require 'json'
4
+ require 'docker-api'
5
+ require 'concurrent'
6
+
7
+ # Initialize module
8
+ module Elders
9
+ end
10
+
11
+ # Elders modules
12
+ require 'elders/task'
13
+ require 'elders/stack'
@@ -0,0 +1,46 @@
1
+ # Include the helper
2
+ require 'spec_helper'
3
+
4
+ # Tests
5
+ describe 'Stack' do
6
+ # Time to complete the task
7
+ let(:time) { 3 }
8
+
9
+ # Create the task before the tests
10
+ before(:all) do
11
+ # Commands list
12
+ @tasks = ['sleep 2', 'ls', 'ls /bin'].map do |command|
13
+ # Generate a task for this command
14
+ Elders::Task.new("#{command[0..1]}-task", 'busybox', command)
15
+ end
16
+
17
+ # Generate the stack
18
+ @stack = Elders::Stack.new @tasks
19
+ end
20
+
21
+ # Delete the task
22
+ after(:all) do
23
+ @stack.clean
24
+ end
25
+
26
+ it 'should be created' do
27
+ # Assertions
28
+ expect(@stack.tasks[0]).to eq(@tasks[0])
29
+ expect(@stack.tasks[1]).to eq(@tasks[1])
30
+ expect(@stack.tasks[2]).to eq(@tasks[2])
31
+ end
32
+
33
+ it 'should be started' do
34
+ # Start it
35
+ @stack.start
36
+
37
+ # Wait for it run
38
+ @stack.wait
39
+
40
+ # Assertions
41
+ expect(@stack.promise.state).to be(:fulfilled)
42
+ expect(@stack.tasks[0].completed?).to eq(true)
43
+ expect(@stack.tasks[1].completed?).to eq(true)
44
+ expect(@stack.tasks[2].completed?).to eq(true)
45
+ end
46
+ end
@@ -0,0 +1,54 @@
1
+ # Include the helper
2
+ require 'spec_helper'
3
+
4
+ # Tests
5
+ describe 'Task' do
6
+ # Time to complete the task
7
+ let(:time) { 0.1 }
8
+
9
+ # Create the task before the tests
10
+ before(:all) do
11
+ @task = Elders::Task.new 'test-task', 'busybox', 'printenv'
12
+ end
13
+
14
+ # Delete the task
15
+ after(:all) do
16
+ @task.clean
17
+ end
18
+
19
+ it 'should be created' do
20
+ # Assertions
21
+ expect(@task.name).to eq('test-task')
22
+ expect(@task.command).to eq('printenv')
23
+ end
24
+
25
+ it 'should be started' do
26
+ # Start it
27
+ @task.start nil, ['APP_ENV=test']
28
+
29
+ # Wait for it run
30
+ sleep time
31
+
32
+ # Assertions
33
+ expect(@task.container).to be_a(Docker::Container)
34
+ expect(@task.completed?).to eq(true)
35
+ expect(@task.success?).to eq(true)
36
+ expect(@task.promise.state).to eq(:fulfilled)
37
+ expect(@task.logs.size).to be > 1
38
+ expect(@task.logs).to match(/APP_ENV/)
39
+ end
40
+
41
+ it 'should be deleted' do
42
+ # Start the task
43
+ @task.start
44
+
45
+ # Wait for the task
46
+ sleep time
47
+
48
+ # Delete it
49
+ @task.delete
50
+
51
+ # Container
52
+ expect { @task.container }.to raise_error
53
+ end
54
+ end
@@ -0,0 +1,8 @@
1
+ # Include Elders
2
+ require 'elders'
3
+
4
+ # Rspec conf
5
+ RSpec.configure do |config|
6
+ config.order = 'random'
7
+ config.seed = '12345'
8
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: elders
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Gabriel Corado
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: concurrent-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: docker-api
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.26'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.26'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.8'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description: Docker based task runner.
70
+ email: gabrielcorado@mail.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - ".travis.yml"
76
+ - Dockerfile
77
+ - Gemfile
78
+ - Gemfile.lock
79
+ - README.md
80
+ - elders.gemspec
81
+ - lib/elders.rb
82
+ - lib/elders/stack.rb
83
+ - lib/elders/task.rb
84
+ - lib/elders/version.rb
85
+ - spec/elders/stack_spec.rb
86
+ - spec/elders/task_spec.rb
87
+ - spec/spec_helper.rb
88
+ homepage: http://github.com/gabrielcorado/elders
89
+ licenses: []
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.4.5.1
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Docker based task runner.
111
+ test_files: []