avm 0.0.0 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bdeb47dee18d0fbd23d5d424f89edbcde9903ef4c9502ae078a51897649f396f
4
- data.tar.gz: c7a7960a666cb29847623a4c63bcd4b90f941c64621ea103c665888e63e31b35
3
+ metadata.gz: aff175324c56cbd1e5b835ae4f206d4b2853f3bf4672fd77b36fc0c9f797a1ce
4
+ data.tar.gz: 227311552bda634562a11e6a82ddf17c267bc103b136b592e55ba3937b765391
5
5
  SHA512:
6
- metadata.gz: c861922d12f002db6a91a29c058870be2c465d9215df378ba9f2cfe47e79c166756562c1ef60189ce9405e6600c6af68643dbd3d3363ac03d90204d93b87f039
7
- data.tar.gz: 6f1bb3ff1e35dd95721c802493f0695bc28d7ea313c8e856afb839b211298ba080b1d0e937c6cbc416ca2e989203eafce4cdbde5aaf9556d0c783e554a2e608b
6
+ metadata.gz: 6353f5aeeff981be0c49935aeff371be50f2e29cd302a0564f7330f9475c78c82028d1b5f139cf757fce28c45b44bd8a55c03efdd21f14901548826c800d252f
7
+ data.tar.gz: 25165e9f7f862219eacbd82795778ebe0487e1b931fd1f6af2d20f3fbc2879dbe3b164bc5be8f9d8d27f79bbfcc623dded10bfd9525f3669720a7dca778dd737
data/lib/avm/docker.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module Docker
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_docker/executables'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Docker
8
+ class Container
9
+ enable_speaker
10
+ common_constructor :instance
11
+
12
+ def remove
13
+ ::EacDocker::Executables.docker.command.append(
14
+ ['rm', '--force', instance.docker_container_name]
15
+ ).system!
16
+ end
17
+
18
+ def run(options = {})
19
+ infov 'Container name', instance.docker_container_name
20
+ infov 'Container exist?', instance.docker_container_exist?
21
+ remove if options[:clear] && instance.docker_container_exist?
22
+ if instance.docker_container_exist?
23
+ run_start
24
+ else
25
+ run_run(options)
26
+ end
27
+ end
28
+
29
+ def run_run(options)
30
+ infom "\"docker run #{instance.docker_container_name}...\""
31
+ ::EacDocker::Executables.docker.command.append(run_run_arguments(options)).system!
32
+ end
33
+
34
+ def run_start
35
+ infom "\"docker start #{instance.docker_container_name}...\""
36
+ ::EacDocker::Executables.docker.command.append(run_start_arguments).system!
37
+ end
38
+
39
+ def run_run_arguments(options)
40
+ entrypoint_args = options[:entrypoint_args].if_present([])
41
+ ['run', '-it', '--name', instance.docker_container_name] + instance.docker_run_arguments +
42
+ [instance.docker_image.tag] + entrypoint_args
43
+ end
44
+
45
+ def run_start_arguments
46
+ ['start', '-ai', instance.docker_container_name]
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/version'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'eac_docker/images/templatized'
6
+
7
+ module Avm
8
+ module Docker
9
+ class Image < ::EacDocker::Images::Templatized
10
+ attr_reader :registry
11
+ attr_accessor :snapshot
12
+ attr_accessor :version
13
+
14
+ def initialize(registry)
15
+ @registry = registry
16
+ self.snapshot = true
17
+ self.version = true
18
+ end
19
+
20
+ def build(extra_args = [])
21
+ nyi "Extra args: #{extra_args}" if extra_args.any?
22
+
23
+ provide
24
+ end
25
+
26
+ def generator_version
27
+ ::Avm::VERSION
28
+ end
29
+
30
+ def push
31
+ ::EacDocker::Executables.docker.command.append(['push', tag]).system!
32
+ end
33
+
34
+ def read_entry(path, options = {})
35
+ method = path.gsub('.', '_')
36
+ return send(method) if respond_to?(path, true)
37
+ return instance.read_entry(path, options) if respond_to?(:instance)
38
+
39
+ raise "Method \"#{method}\" not found for entry \"#{path}\""
40
+ end
41
+
42
+ def run(instance)
43
+ run_run(instance) if container_exist?(instance)
44
+ end
45
+
46
+ def tag
47
+ r = tag_name
48
+ r += ":#{tag_version}" if tag_version.present?
49
+ r
50
+ end
51
+
52
+ def tag_name
53
+ return registry.name if registry.name.present?
54
+
55
+ raise 'Registry name is blank'
56
+ end
57
+
58
+ def tag_version
59
+ [tag_version_version, stereotype_tag].reject(&:blank?).join('_')
60
+ end
61
+
62
+ def tag_version_version
63
+ return nil unless version
64
+
65
+ r = generator_version
66
+ r += '-snapshot' if snapshot
67
+ r
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_docker/registry'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Docker
8
+ class Runner
9
+ enable_speaker
10
+ enable_simple_cache
11
+
12
+ runner_with :help do
13
+ desc 'Manipulate Docker images.'
14
+ arg_opt '-n', '--registry-name', 'Docker registry\'s name.'
15
+ bool_opt '-p', '--push', 'Push the image to Docker registry.'
16
+ bool_opt '-r', '--run', 'Run or start a container with builded image.'
17
+ arg_opt '-B', '--build-arg', 'Argument for "docker build".', repeat: true
18
+ arg_opt '-E', '--entrypoint-arg', 'Argument for entrypoint on "docker run"', repeat: true
19
+ bool_opt '-c', '--clear', 'Remove container if exist before run.'
20
+ bool_opt '-S', '--no-snapshot', 'Does not add "-snapshot" to image tag.'
21
+ bool_opt '-V', '--no-version', 'Does not add version to image tag.'
22
+ end
23
+
24
+ def run
25
+ setup
26
+ banner
27
+ build
28
+ push
29
+ container_run
30
+ end
31
+
32
+ private
33
+
34
+ def setup
35
+ instance.docker_image_options = {
36
+ registry: registry,
37
+ snapshot: snapshot?,
38
+ version: version?
39
+ }
40
+ end
41
+
42
+ def banner
43
+ infov 'Registry name', registry
44
+ infov 'Version?', version?
45
+ infov 'Snapshot?', snapshot?
46
+ infov 'Image name', docker_image.tag
47
+ infov 'Build arguments', build_args
48
+ infov 'Entrypoint arguments', entrypoint_args
49
+ end
50
+
51
+ def build
52
+ docker_image.build(build_args)
53
+ success 'Docker image builded'
54
+ end
55
+
56
+ def build_args
57
+ parsed.build_arg
58
+ end
59
+
60
+ def docker_container
61
+ instance.docker_container
62
+ end
63
+
64
+ def docker_image
65
+ instance.docker_image
66
+ end
67
+
68
+ def entrypoint_args
69
+ parsed.entrypoint_arg
70
+ end
71
+
72
+ def push
73
+ docker_image.push if parsed.push?
74
+ end
75
+
76
+ def container_run
77
+ return unless parsed.run?
78
+
79
+ docker_container.run(
80
+ entrypoint_args: entrypoint_args,
81
+ clear: parsed.clear?
82
+ )
83
+ end
84
+
85
+ def registry_uncached
86
+ registry_from_option || registry_from_instance || registry_from_default ||
87
+ fatal_error('No registry defined')
88
+ end
89
+
90
+ def registry_from_option
91
+ parsed.registry_name.if_present { |v| ::EacDocker::Registry.new(v) }
92
+ end
93
+
94
+ def registry_from_instance
95
+ if if_respond(:use_default_registry?, true)
96
+ instance.docker_registry_optional.if_present { |v| ::EacDocker::Registry.new(v) }
97
+ else
98
+ ::EacDocker::Registry.new(instance.docker_registry)
99
+ end
100
+ end
101
+
102
+ def registry_from_default
103
+ return nil unless if_respond(:use_default_registry?, true)
104
+
105
+ nyi 'Was "::Avm::Docker::Registry.default"'
106
+ end
107
+
108
+ def snapshot?
109
+ !parsed.no_snapshot?
110
+ end
111
+
112
+ def version?
113
+ !parsed.no_version?
114
+ end
115
+
116
+ def instance
117
+ runner_context.call(:instance)
118
+ end
119
+ end
120
+ end
121
+ end
data/lib/avm/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Avm
4
- VERSION = '0.0.0'
4
+ VERSION = '0.1.0'
5
5
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ # A sequence of segments of integer versions (Ex.: 2, 1.0.1, 3.0.0.0.0).
5
+ class VersionNumber
6
+ include ::Comparable
7
+
8
+ SEGMENT_SEPARATOR = '.'
9
+
10
+ class << self
11
+ def segments_from_mixed(segments)
12
+ (segments.is_a?(::Enumerable) ? segments.to_a : segments.to_s.split(SEGMENT_SEPARATOR))
13
+ .map(&:to_i)
14
+ end
15
+ end
16
+
17
+ attr_reader :segments
18
+
19
+ def initialize(segments)
20
+ @segments = self.class.segments_from_mixed(segments).freeze
21
+ end
22
+
23
+ delegate :[], to: :segments
24
+
25
+ def <=>(other)
26
+ segments <=> other.segments
27
+ end
28
+
29
+ def to_s
30
+ segments.join(SEGMENT_SEPARATOR)
31
+ end
32
+
33
+ # @return [Avm::Version]
34
+ def increment_segment(segment_index)
35
+ x = [segments.count, segment_index + 1].max.times.map do |index|
36
+ value = index < segments.count ? segments[index] : 0
37
+ next value if index < segment_index
38
+ next value + 1 if index == segment_index
39
+
40
+ 0
41
+ end
42
+ self.class.new x
43
+ end
44
+ end
45
+ end
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo H. Bogoni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-04 00:00:00.000000000 Z
11
+ date: 2021-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: eac_docker
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.2.2
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.2.2
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: eac_ruby_utils
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -45,7 +65,12 @@ extensions: []
45
65
  extra_rdoc_files: []
46
66
  files:
47
67
  - lib/avm.rb
68
+ - lib/avm/docker.rb
69
+ - lib/avm/docker/container.rb
70
+ - lib/avm/docker/image.rb
71
+ - lib/avm/docker/runner.rb
48
72
  - lib/avm/version.rb
73
+ - lib/avm/version_number.rb
49
74
  homepage:
50
75
  licenses: []
51
76
  metadata: {}