avm 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: {}