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 +4 -4
- data/lib/avm/docker.rb +9 -0
- data/lib/avm/docker/container.rb +50 -0
- data/lib/avm/docker/image.rb +71 -0
- data/lib/avm/docker/runner.rb +121 -0
- data/lib/avm/version.rb +1 -1
- data/lib/avm/version_number.rb +45 -0
- metadata +27 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aff175324c56cbd1e5b835ae4f206d4b2853f3bf4672fd77b36fc0c9f797a1ce
|
4
|
+
data.tar.gz: 227311552bda634562a11e6a82ddf17c267bc103b136b592e55ba3937b765391
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6353f5aeeff981be0c49935aeff371be50f2e29cd302a0564f7330f9475c78c82028d1b5f139cf757fce28c45b44bd8a55c03efdd21f14901548826c800d252f
|
7
|
+
data.tar.gz: 25165e9f7f862219eacbd82795778ebe0487e1b931fd1f6af2d20f3fbc2879dbe3b164bc5be8f9d8d27f79bbfcc623dded10bfd9525f3669720a7dca778dd737
|
data/lib/avm/docker.rb
ADDED
@@ -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
@@ -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.
|
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-
|
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: {}
|