percheron 0.2.3 → 0.2.4

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f46c7382608bc1a9d0df8f0cfb476fdd3db6d168
4
- data.tar.gz: 80f069209a8756e8e8ffd7ad5e9306439258d75e
3
+ metadata.gz: 3b2f1f9c52b7ccd444bd59daed1a2c5deeee49d1
4
+ data.tar.gz: efcdb60313993319297a27521355529e987fb664
5
5
  SHA512:
6
- metadata.gz: 0994145a901b28e2cc993b3659128ff69e12e8253e0598b0f79a604bb64dde23a6ae19fa2ff96c35bf2442b883de6c2c22b6b4e96d90ebd43aa15fccd4c7263f
7
- data.tar.gz: 686b119e1190e27e7cbf7cf96e1785eb5c4d0f941cb1816135b4cb49a13d374a5813d6096d757f6f744567351a2f65b8bcc683b2c8f49e2ce52da2f5d77ebc61
6
+ metadata.gz: 593dc6d5b9cc520eeaaf570d9a45a21b5c47a2a649a0537cd41f484460b1474575135fccefaa6c30fd3fc7fba25ac32771b4aa02f9fab9d7e20cfb202cedebfc
7
+ data.tar.gz: 30b83d1150ccde52bc2b5bbbb7c57a4db8566d5d55c325238b01e440886fe2d44c1c8480cab392de7fcb946f5a2aff32fde3d0fc2616646bc82d18f24c297152
data/Gemfile CHANGED
@@ -7,6 +7,6 @@ group :test do
7
7
  end
8
8
 
9
9
  group :development do
10
- gem 'pry-byebug', '~> 2.0'
10
+ gem 'pry-byebug', '~> 3.0'
11
11
  gem 'awesome_print', '~> 1.0'
12
12
  end
data/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/percheron.svg)](http://badge.fury.io/rb/percheron)
4
4
  [![Travis CI](https://travis-ci.org/ashmckenzie/percheron.svg)](https://travis-ci.org/ashmckenzie/percheron)
5
5
  [![Code Climate GPA](https://codeclimate.com/github/ashmckenzie/percheron/badges/gpa.svg)](https://codeclimate.com/github/ashmckenzie/percheron)
6
+ [![Dependency Status](https://gemnasium.com/ashmckenzie/percheron.svg)](https://gemnasium.com/ashmckenzie/percheron)
6
7
 
7
8
  Organise your Docker containers with muscle and intelligence.
8
9
 
data/bin/percheron CHANGED
@@ -9,7 +9,7 @@ require 'percheron/cli'
9
9
 
10
10
  $logger = Logger.new(STDOUT)
11
11
 
12
- logger_level = Logger::ERROR
12
+ logger_level = Logger::WARN
13
13
 
14
14
  if ENV['VERBOSE'] == 'true'
15
15
  logger_level = Logger::INFO
@@ -8,8 +8,12 @@ module Percheron
8
8
  end
9
9
 
10
10
  def execute!
11
- Container::Actions::Build.new(container).execute! unless image_exists?
12
- $logger.debug "Creating '#{container.name}'"
11
+ unless image_exists?
12
+ $logger.debug "Creating '#{container.image}' image"
13
+ Container::Actions::Build.new(container).execute!
14
+ end
15
+
16
+ $logger.debug "Creating '#{container.name}' container"
13
17
  Docker::Container.create(create_opts)
14
18
  end
15
19
 
@@ -12,6 +12,7 @@ module Percheron
12
12
  $logger.debug "Stopping '#{container.name}'"
13
13
  container.docker_container.stop!
14
14
  else
15
+ $logger.debug "Not stopping '#{container.name}' container as it's not running"
15
16
  raise Errors::ContainerNotRunning.new
16
17
  end
17
18
  end
@@ -5,10 +5,13 @@ module Percheron
5
5
  extend Forwardable
6
6
  extend ConfigDelegator
7
7
 
8
- def_delegators :container_config, :name, :version
8
+ def_delegators :container_config, :name, :dockerfile_md5
9
9
 
10
+ def_config_item_with_default :container_config, false, :auto_recreate
10
11
  def_config_item_with_default :container_config, [], :env, :ports, :volumes, :dependant_container_names
11
12
 
13
+ alias_method :auto_recreate?, :auto_recreate
14
+
12
15
  def initialize(config, stack, container_name)
13
16
  @config = config
14
17
  @stack = stack
@@ -17,23 +20,20 @@ module Percheron
17
20
  self
18
21
  end
19
22
 
20
- def stop!
21
- Container::Actions::Stop.new(self).execute!
22
- rescue Errors::ContainerNotRunning
23
- $logger.debug "Container '#{name}' is not running"
23
+ def id
24
+ exists? ? info.id[0...12] : 'N/A'
24
25
  end
25
26
 
26
- def start!
27
- Container::Actions::Create.new(self).execute! unless exists?
28
- Container::Actions::Start.new(self).execute!
27
+ def image
28
+ '%s:%s' % [ name, version.to_s ]
29
29
  end
30
30
 
31
- def id
32
- exists? ? info.id[0...12] : 'N/A'
31
+ def version
32
+ Semantic::Version.new(container_config.version)
33
33
  end
34
34
 
35
- def image
36
- '%s:%s' % [ name, version ]
35
+ def built_version
36
+ exists? ? Semantic::Version.new(built_image_version) : nil
37
37
  end
38
38
 
39
39
  def dockerfile
@@ -59,6 +59,25 @@ module Percheron
59
59
  Container::Null.new
60
60
  end
61
61
 
62
+ def stop!
63
+ Container::Actions::Stop.new(self).execute!
64
+ rescue Errors::ContainerNotRunning
65
+ $logger.debug "Container '#{name}' is not running"
66
+ end
67
+
68
+ def start!
69
+ Container::Actions::Create.new(self).execute! unless exists?
70
+ Container::Actions::Start.new(self).execute!
71
+ end
72
+
73
+ def recreatable?
74
+ exists? && !md5s_match?
75
+ end
76
+
77
+ def recreate?
78
+ recreatable? && versions_mismatch? && auto_recreate?
79
+ end
80
+
62
81
  def running?
63
82
  exists? && info.State.Running
64
83
  end
@@ -75,6 +94,26 @@ module Percheron
75
94
 
76
95
  attr_reader :config, :stack, :container_name
77
96
 
97
+ def md5s_match?
98
+ stored_dockerfile_md5 == current_dockerfile_md5
99
+ end
100
+
101
+ def versions_mismatch?
102
+ version > built_version
103
+ end
104
+
105
+ def built_image_version
106
+ info.Config.Image.split(':')[1]
107
+ end
108
+
109
+ def stored_dockerfile_md5
110
+ dockerfile_md5 || current_dockerfile_md5
111
+ end
112
+
113
+ def current_dockerfile_md5
114
+ Digest::MD5.file(dockerfile).hexdigest
115
+ end
116
+
78
117
  def info
79
118
  Hashie::Mash.new(docker_container.info)
80
119
  end
@@ -33,7 +33,7 @@ module Percheron
33
33
  [
34
34
  container_name,
35
35
  container.id,
36
- container.version,
36
+ container.built_version,
37
37
  container.running?
38
38
  ]
39
39
  end
@@ -33,7 +33,10 @@ module Percheron
33
33
  end
34
34
 
35
35
  def validate_version
36
- 'Version is invalid' if container.version.nil? || !container.version.to_s.match(/[\w\d]{1,}/)
36
+ container.version
37
+ nil
38
+ rescue ArgumentError
39
+ 'Version is invalid'
37
40
  end
38
41
 
39
42
  def validate_dockerfile
@@ -1,3 +1,3 @@
1
1
  module Percheron
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
data/lib/percheron.rb CHANGED
@@ -3,6 +3,7 @@ require 'forwardable'
3
3
  require 'pathname'
4
4
  require 'docker'
5
5
  require 'naught'
6
+ require 'semantic'
6
7
 
7
8
  require 'percheron/core_extensions'
8
9
  require 'percheron/version'
data/percheron.gemspec CHANGED
@@ -19,10 +19,11 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = [ 'lib' ]
20
20
 
21
21
  spec.add_runtime_dependency 'clamp', '~> 0.6'
22
- spec.add_runtime_dependency 'docker-api', '~> 1.13'
22
+ spec.add_runtime_dependency 'docker-api', '~> 1.20'
23
23
  spec.add_runtime_dependency 'hashie', '~> 3.2'
24
24
  spec.add_runtime_dependency 'terminal-table', '~> 1.4'
25
25
  spec.add_runtime_dependency 'naught', '~> 1.0'
26
+ spec.add_runtime_dependency 'semantic', '~> 1.4'
26
27
 
27
28
  spec.add_development_dependency 'bundler', '~> 1.7'
28
29
  spec.add_development_dependency 'rake', '~> 10.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: percheron
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ash McKenzie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-02 00:00:00.000000000 Z
11
+ date: 2015-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clamp
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.13'
33
+ version: '1.20'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.13'
40
+ version: '1.20'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: hashie
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: semantic
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.4'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.4'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: bundler
85
99
  requirement: !ruby/object:Gem::Requirement