eac_tools 0.86.0 → 0.86.1
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/Gemfile.lock +23 -19
- data/lib/eac_tools/version.rb +1 -1
- data/sub/avm/Gemfile +8 -0
- data/sub/avm/avm.gemspec +30 -0
- data/sub/avm/lib/avm/application_scms/base.rb +39 -0
- data/sub/avm/lib/avm/application_scms.rb +9 -0
- data/sub/avm/lib/avm/application_stereotypes/base.rb +31 -0
- data/sub/avm/lib/avm/application_stereotypes.rb +9 -0
- data/sub/avm/lib/avm/applications/base/auto_local_source_path.rb +24 -0
- data/sub/avm/lib/avm/applications/base/local_instance.rb +31 -0
- data/sub/avm/lib/avm/applications/base/local_source.rb +30 -0
- data/sub/avm/lib/avm/applications/base/naming.rb +28 -0
- data/sub/avm/lib/avm/applications/base/organization.rb +29 -0
- data/sub/avm/lib/avm/applications/base/publishing.rb +43 -0
- data/sub/avm/lib/avm/applications/base/scm.rb +27 -0
- data/sub/avm/lib/avm/applications/base/stereotype.rb +31 -0
- data/sub/avm/lib/avm/applications/base.rb +37 -0
- data/sub/avm/lib/avm/applications.rb +9 -0
- data/sub/avm/lib/avm/data/callbacks.rb +37 -0
- data/sub/avm/lib/avm/data/clearer.rb +20 -0
- data/sub/avm/lib/avm/data/dumper.rb +142 -0
- data/sub/avm/lib/avm/data/loader.rb +28 -0
- data/sub/avm/lib/avm/data/package/base_performer.rb +38 -0
- data/sub/avm/lib/avm/data/package/build_directory.rb +28 -0
- data/sub/avm/lib/avm/data/package/clear.rb +22 -0
- data/sub/avm/lib/avm/data/package/dump.rb +45 -0
- data/sub/avm/lib/avm/data/package/load.rb +36 -0
- data/sub/avm/lib/avm/data/package.rb +67 -0
- data/sub/avm/lib/avm/data/performer.rb +49 -0
- data/sub/avm/lib/avm/data/rotate.rb +107 -0
- data/sub/avm/lib/avm/data/unit.rb +49 -0
- data/sub/avm/lib/avm/data/unit_with_commands.rb +52 -0
- data/sub/avm/lib/avm/docker/container.rb +50 -0
- data/sub/avm/lib/avm/docker/image.rb +76 -0
- data/sub/avm/lib/avm/docker/runner.rb +121 -0
- data/sub/avm/lib/avm/docker.rb +9 -0
- data/sub/avm/lib/avm/entries/auto_values/entry.rb +39 -0
- data/sub/avm/lib/avm/entries/auto_values/uri_entry.rb +24 -0
- data/sub/avm/lib/avm/entries/auto_values.rb +11 -0
- data/sub/avm/lib/avm/entries/base/inherited_entry_value.rb +46 -0
- data/sub/avm/lib/avm/entries/base/uri_component_entry_value/default_value.rb +28 -0
- data/sub/avm/lib/avm/entries/base/uri_component_entry_value/inherited_value.rb +39 -0
- data/sub/avm/lib/avm/entries/base/uri_component_entry_value/url_entry_value.rb +31 -0
- data/sub/avm/lib/avm/entries/base/uri_component_entry_value.rb +44 -0
- data/sub/avm/lib/avm/entries/base/uri_components_entries_values/component_factory.rb +42 -0
- data/sub/avm/lib/avm/entries/base/uri_components_entries_values/generic_component.rb +63 -0
- data/sub/avm/lib/avm/entries/base/uri_components_entries_values/path_component.rb +19 -0
- data/sub/avm/lib/avm/entries/base/uri_components_entries_values/url_component.rb +28 -0
- data/sub/avm/lib/avm/entries/base/uri_components_entries_values.rb +25 -0
- data/sub/avm/lib/avm/entries/base.rb +46 -0
- data/sub/avm/lib/avm/entries/entry.rb +65 -0
- data/sub/avm/lib/avm/entries/jobs/base.rb +62 -0
- data/sub/avm/lib/avm/entries/jobs/variables_source/read_entry.rb +50 -0
- data/sub/avm/lib/avm/entries/jobs/variables_source.rb +15 -0
- data/sub/avm/lib/avm/entries/jobs/with_variables_source.rb +15 -0
- data/sub/avm/lib/avm/entries/jobs.rb +11 -0
- data/sub/avm/lib/avm/entries/keys_constants_set.rb +43 -0
- data/sub/avm/lib/avm/entries/uri_builder.rb +91 -0
- data/sub/avm/lib/avm/entries.rb +9 -0
- data/sub/avm/lib/avm/executables.rb +24 -0
- data/sub/avm/lib/avm/file_formats/base.rb +35 -0
- data/sub/avm/lib/avm/file_formats/file_result.rb +13 -0
- data/sub/avm/lib/avm/file_formats/search_formatter.rb +87 -0
- data/sub/avm/lib/avm/file_formats/unknown.rb +18 -0
- data/sub/avm/lib/avm/file_formats/utf8_assert.rb +72 -0
- data/sub/avm/lib/avm/file_formats.rb +9 -0
- data/sub/avm/lib/avm/instances/base/auto_values/data.rb +25 -0
- data/sub/avm/lib/avm/instances/base/auto_values/database.rb +62 -0
- data/sub/avm/lib/avm/instances/base/auto_values/mailer.rb +35 -0
- data/sub/avm/lib/avm/instances/base/auto_values/source.rb +15 -0
- data/sub/avm/lib/avm/instances/base/auto_values.rb +14 -0
- data/sub/avm/lib/avm/instances/base/dockerizable.rb +45 -0
- data/sub/avm/lib/avm/instances/base/entry_keys.rb +27 -0
- data/sub/avm/lib/avm/instances/base/install.rb +24 -0
- data/sub/avm/lib/avm/instances/base/processes.rb +27 -0
- data/sub/avm/lib/avm/instances/base/subcommand_parent.rb +25 -0
- data/sub/avm/lib/avm/instances/base/web.rb +16 -0
- data/sub/avm/lib/avm/instances/base.rb +71 -0
- data/sub/avm/lib/avm/instances/data/files_unit.rb +59 -0
- data/sub/avm/lib/avm/instances/data/package.rb +27 -0
- data/sub/avm/lib/avm/instances/data/unit.rb +30 -0
- data/sub/avm/lib/avm/instances/data.rb +11 -0
- data/sub/avm/lib/avm/instances/docker_image.rb +15 -0
- data/sub/avm/lib/avm/instances/entry_keys.rb +43 -0
- data/sub/avm/lib/avm/instances/ids.rb +30 -0
- data/sub/avm/lib/avm/instances/process.rb +31 -0
- data/sub/avm/lib/avm/instances/runner.rb +37 -0
- data/sub/avm/lib/avm/instances.rb +9 -0
- data/sub/avm/lib/avm/launcher/context/instance_collector.rb +46 -0
- data/sub/avm/lib/avm/launcher/context/instance_discovery.rb +56 -0
- data/sub/avm/lib/avm/launcher/context/instance_manager/cached_instance.rb +37 -0
- data/sub/avm/lib/avm/launcher/context/instance_manager/cached_instances.rb +35 -0
- data/sub/avm/lib/avm/launcher/context/instance_manager.rb +77 -0
- data/sub/avm/lib/avm/launcher/context/settings.rb +53 -0
- data/sub/avm/lib/avm/launcher/context.rb +100 -0
- data/sub/avm/lib/avm/launcher/errors/base.rb +10 -0
- data/sub/avm/lib/avm/launcher/errors/non_project.rb +15 -0
- data/sub/avm/lib/avm/launcher/errors.rb +11 -0
- data/sub/avm/lib/avm/launcher/instances/base/cache.rb +43 -0
- data/sub/avm/lib/avm/launcher/instances/base/publishing.rb +53 -0
- data/sub/avm/lib/avm/launcher/instances/base.rb +78 -0
- data/sub/avm/lib/avm/launcher/instances/error.rb +10 -0
- data/sub/avm/lib/avm/launcher/instances/runner_helper.rb +47 -0
- data/sub/avm/lib/avm/launcher/instances/settings.rb +26 -0
- data/sub/avm/lib/avm/launcher/instances.rb +11 -0
- data/sub/avm/lib/avm/launcher/paths/logical.rb +80 -0
- data/sub/avm/lib/avm/launcher/paths/real.rb +44 -0
- data/sub/avm/lib/avm/launcher/paths.rb +11 -0
- data/sub/avm/lib/avm/launcher/project.rb +17 -0
- data/sub/avm/lib/avm/launcher/publish/base.rb +47 -0
- data/sub/avm/lib/avm/launcher/publish/check_result.rb +65 -0
- data/sub/avm/lib/avm/launcher/publish.rb +11 -0
- data/sub/avm/lib/avm/launcher/stereotype.rb +63 -0
- data/sub/avm/lib/avm/launcher.rb +9 -0
- data/sub/avm/lib/avm/launcher_stereotypes.rb +9 -0
- data/sub/avm/lib/avm/patches/eac_config/entry_path.rb +46 -0
- data/sub/avm/lib/avm/path_string.rb +27 -0
- data/sub/avm/lib/avm/registry/application_scms.rb +15 -0
- data/sub/avm/lib/avm/registry/application_stereotypes/build_available.rb +49 -0
- data/sub/avm/lib/avm/registry/application_stereotypes/stereotype_builder.rb +33 -0
- data/sub/avm/lib/avm/registry/application_stereotypes.rb +52 -0
- data/sub/avm/lib/avm/registry/applications.rb +38 -0
- data/sub/avm/lib/avm/registry/config_objects.rb +18 -0
- data/sub/avm/lib/avm/registry/file_formats.rb +20 -0
- data/sub/avm/lib/avm/registry/from_gems.rb +80 -0
- data/sub/avm/lib/avm/registry/instances.rb +16 -0
- data/sub/avm/lib/avm/registry/launcher_stereotypes.rb +11 -0
- data/sub/avm/lib/avm/registry/runners.rb +10 -0
- data/sub/avm/lib/avm/registry/scms.rb +10 -0
- data/sub/avm/lib/avm/registry/source_generators.rb +17 -0
- data/sub/avm/lib/avm/registry/sources.rb +31 -0
- data/sub/avm/lib/avm/registry/with_path/cache.rb +31 -0
- data/sub/avm/lib/avm/registry/with_path.rb +49 -0
- data/sub/avm/lib/avm/registry.rb +35 -0
- data/sub/avm/lib/avm/result.rb +82 -0
- data/sub/avm/lib/avm/rspec/setup/launcher.rb +19 -0
- data/sub/avm/lib/avm/rspec/setup/source_generator.rb +22 -0
- data/sub/avm/lib/avm/rspec/setup.rb +35 -0
- data/sub/avm/lib/avm/rspec/shared_examples/avm_file_format_file_resource_name.rb +15 -0
- data/sub/avm/lib/avm/rspec/shared_examples/avm_file_formats_with_fixtures.rb +31 -0
- data/sub/avm/lib/avm/rspec/shared_examples/avm_source_generated.rb +23 -0
- data/sub/avm/lib/avm/rspec/shared_examples/entries_values.rb +23 -0
- data/sub/avm/lib/avm/rspec/shared_examples/in_avm_registry.rb +11 -0
- data/sub/avm/lib/avm/rspec/shared_examples/not_in_avm_registry.rb +14 -0
- data/sub/avm/lib/avm/rspec.rb +9 -0
- data/sub/avm/lib/avm/runners/base.rb +27 -0
- data/sub/avm/lib/avm/scms/auto_commit/file_resource_name.rb +39 -0
- data/sub/avm/lib/avm/scms/auto_commit/for_file.rb +82 -0
- data/sub/avm/lib/avm/scms/auto_commit/rules/base.rb +40 -0
- data/sub/avm/lib/avm/scms/auto_commit/rules/last.rb +19 -0
- data/sub/avm/lib/avm/scms/auto_commit/rules/manual.rb +40 -0
- data/sub/avm/lib/avm/scms/auto_commit/rules/new.rb +24 -0
- data/sub/avm/lib/avm/scms/auto_commit/rules/nth.rb +31 -0
- data/sub/avm/lib/avm/scms/auto_commit/rules/unique.rb +21 -0
- data/sub/avm/lib/avm/scms/auto_commit/rules.rb +36 -0
- data/sub/avm/lib/avm/scms/auto_commit.rb +11 -0
- data/sub/avm/lib/avm/scms/base/commits.rb +34 -0
- data/sub/avm/lib/avm/scms/base/milestones.rb +21 -0
- data/sub/avm/lib/avm/scms/base.rb +56 -0
- data/sub/avm/lib/avm/scms/changed_file.rb +26 -0
- data/sub/avm/lib/avm/scms/commit.rb +66 -0
- data/sub/avm/lib/avm/scms/commit_info.rb +39 -0
- data/sub/avm/lib/avm/scms/inflector.rb +22 -0
- data/sub/avm/lib/avm/scms/interval.rb +18 -0
- data/sub/avm/lib/avm/scms/null/commit.rb +15 -0
- data/sub/avm/lib/avm/scms/null.rb +21 -0
- data/sub/avm/lib/avm/scms.rb +9 -0
- data/sub/avm/lib/avm/self/docker_image.rb +14 -0
- data/sub/avm/lib/avm/self/instance/entry_keys.rb +12 -0
- data/sub/avm/lib/avm/self/instance.rb +31 -0
- data/sub/avm/lib/avm/source_generators/base.rb +45 -0
- data/sub/avm/lib/avm/source_generators/option.rb +11 -0
- data/sub/avm/lib/avm/source_generators/option_list.rb +32 -0
- data/sub/avm/lib/avm/source_generators/runner.rb +58 -0
- data/sub/avm/lib/avm/source_generators.rb +9 -0
- data/sub/avm/lib/avm/sources/auto_commit/for_file.rb +31 -0
- data/sub/avm/lib/avm/sources/auto_commit.rb +11 -0
- data/sub/avm/lib/avm/sources/base/application.rb +34 -0
- data/sub/avm/lib/avm/sources/base/configuration.rb +92 -0
- data/sub/avm/lib/avm/sources/base/instance.rb +16 -0
- data/sub/avm/lib/avm/sources/base/locale.rb +33 -0
- data/sub/avm/lib/avm/sources/base/organizational.rb +32 -0
- data/sub/avm/lib/avm/sources/base/parent.rb +28 -0
- data/sub/avm/lib/avm/sources/base/stereotype.rb +18 -0
- data/sub/avm/lib/avm/sources/base/sub/remove.rb +38 -0
- data/sub/avm/lib/avm/sources/base/sub.rb +26 -0
- data/sub/avm/lib/avm/sources/base/subs.rb +67 -0
- data/sub/avm/lib/avm/sources/base/subs_paths.rb +32 -0
- data/sub/avm/lib/avm/sources/base/testing.rb +70 -0
- data/sub/avm/lib/avm/sources/base/update.rb +39 -0
- data/sub/avm/lib/avm/sources/base/update_sub.rb +57 -0
- data/sub/avm/lib/avm/sources/base/update_subs.rb +19 -0
- data/sub/avm/lib/avm/sources/base/version_bump.rb +29 -0
- data/sub/avm/lib/avm/sources/base.rb +51 -0
- data/sub/avm/lib/avm/sources/configuration/rubocop.rb +26 -0
- data/sub/avm/lib/avm/sources/configuration.rb +59 -0
- data/sub/avm/lib/avm/sources/runner.rb +40 -0
- data/sub/avm/lib/avm/sources/tests/builder.rb +96 -0
- data/sub/avm/lib/avm/sources/tests/performer.rb +35 -0
- data/sub/avm/lib/avm/sources/tests/result.rb +15 -0
- data/sub/avm/lib/avm/sources/tests/single.rb +75 -0
- data/sub/avm/lib/avm/sources/tests.rb +11 -0
- data/sub/avm/lib/avm/sources/update_error.rb +8 -0
- data/sub/avm/lib/avm/sources.rb +9 -0
- data/sub/avm/lib/avm/sync.rb +94 -0
- data/sub/avm/lib/avm/version.rb +5 -0
- data/sub/avm/lib/avm/version_number.rb +45 -0
- data/sub/avm/lib/avm/with/application_stereotype.rb +33 -0
- data/sub/avm/lib/avm/with/extra_subcommands.rb +44 -0
- data/sub/avm/lib/avm.rb +7 -0
- data/sub/avm/locale/en.yml +6 -0
- data/sub/avm/locale/pt-BR.yml +6 -0
- data/sub/avm/spec/lib/avm/applications/base/entries_spec.rb +31 -0
- data/sub/avm/spec/lib/avm/applications/base/entries_spec_files/config.yml +12 -0
- data/sub/avm/spec/lib/avm/applications/base_spec.rb +23 -0
- data/sub/avm/spec/lib/avm/applications/base_spec_fixture.yml +3 -0
- data/sub/avm/spec/lib/avm/file_formats/base_spec.rb +11 -0
- data/sub/avm/spec/lib/avm/instances/base_spec.rb +107 -0
- data/sub/avm/spec/lib/avm/instances/base_spec_files/config.yml +50 -0
- data/sub/avm/spec/lib/avm/launcher/instances/base_spec.rb +43 -0
- data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/avm-tools_stub/avm-tools.gemspec +29 -0
- data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/avm-tools_stub/lib/avm/tools/version.rb +7 -0
- data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/avm-tools_stub/lib/avm/tools.rb +6 -0
- data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/ruby_gem_stub/lib/ruby_gem_stub/version.rb +5 -0
- data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/ruby_gem_stub/lib/ruby_gem_stub.rb +3 -0
- data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/ruby_gem_stub/ruby_gem_stub.gemspec +16 -0
- data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/settings.yaml +5 -0
- data/sub/avm/spec/lib/avm/patches/eac_config/entry_path_spec.rb +28 -0
- data/sub/avm/spec/lib/avm/scms/auto_commit/file_resource_name_spec.rb +21 -0
- data/sub/avm/spec/lib/avm/scms/base_spec.rb +7 -0
- data/sub/avm/spec/lib/avm/sources/base_spec.rb +7 -0
- data/sub/avm/spec/lib/avm/sources/runner_spec.rb +9 -0
- data/sub/avm/spec/rubocop_spec.rb +3 -0
- data/sub/avm/spec/spec_helper.rb +4 -0
- data/sub/avm-eac_php_base0/Gemfile +2 -2
- data/sub/avm-eac_php_base0/avm-eac_php_base0.gemspec +5 -4
- data/sub/avm-eac_php_base0/lib/avm/eac_php_base0/executables.rb +1 -1
- data/sub/avm-eac_php_base0/lib/avm/eac_php_base0/version.rb +1 -1
- data/sub/avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec.rb +1 -1
- data/sub/avm-eac_php_base0/spec/lib/avm/eac_php_base0/source_generators/base_spec.rb +1 -1
- data/sub/avm-eac_php_base0/spec/lib/avm/eac_php_base0/sources/base_spec.rb +1 -1
- data/sub/avm-eac_php_base0/spec/rubocop_spec.rb +1 -1
- data/sub/avm-eac_php_base0/spec/spec_helper.rb +1 -1
- metadata +237 -5
|
@@ -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,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'avm/version'
|
|
4
|
+
require 'avm/entries/jobs/with_variables_source'
|
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
|
6
|
+
require 'eac_docker/images/templatized'
|
|
7
|
+
require 'eac_docker/registry'
|
|
8
|
+
|
|
9
|
+
module Avm
|
|
10
|
+
module Docker
|
|
11
|
+
class Image < ::EacDocker::Images::Templatized
|
|
12
|
+
prepend ::Avm::Entries::Jobs::WithVariablesSource
|
|
13
|
+
|
|
14
|
+
DEFAULT_REGISTRY_NAME = 'local'
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
# @return [EacDocker::Registry]
|
|
18
|
+
def default_registry
|
|
19
|
+
::EacDocker::Registry.new(DEFAULT_REGISTRY_NAME)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
attr_reader :registry
|
|
24
|
+
attr_accessor :snapshot, :version
|
|
25
|
+
|
|
26
|
+
def initialize(registry = nil)
|
|
27
|
+
super()
|
|
28
|
+
@registry = registry || self.class.default_registry
|
|
29
|
+
self.snapshot = true
|
|
30
|
+
self.version = true
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def build(extra_args = [])
|
|
34
|
+
nyi "Extra args: #{extra_args}" if extra_args.any?
|
|
35
|
+
|
|
36
|
+
provide
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def generator_version
|
|
40
|
+
::Avm::VERSION
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def push
|
|
44
|
+
::EacDocker::Executables.docker.command.append(['push', tag]).system!
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def run(instance)
|
|
48
|
+
run_run(instance) if container_exist?(instance)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def tag
|
|
52
|
+
r = tag_name
|
|
53
|
+
r += ":#{tag_version}" if tag_version.present?
|
|
54
|
+
r
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def tag_name
|
|
58
|
+
return registry.name if registry.name.present?
|
|
59
|
+
|
|
60
|
+
raise 'Registry name is blank'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def tag_version
|
|
64
|
+
[tag_version_version, stereotype_tag].compact_blank.join('_')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def tag_version_version
|
|
68
|
+
return nil unless version
|
|
69
|
+
|
|
70
|
+
r = generator_version
|
|
71
|
+
r += '-snapshot' if snapshot
|
|
72
|
+
r
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
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
|
+
DOCKER_DEFAULT_REGISTRY_METHOD = :docker_default_registry
|
|
10
|
+
|
|
11
|
+
enable_speaker
|
|
12
|
+
enable_simple_cache
|
|
13
|
+
|
|
14
|
+
runner_with :help do
|
|
15
|
+
desc 'Manipulate Docker images.'
|
|
16
|
+
bool_opt '-I', '--image-name', 'Output image name.'
|
|
17
|
+
arg_opt '-n', '--registry-name', 'Docker registry\'s name.'
|
|
18
|
+
bool_opt '-p', '--push', 'Push the image to Docker registry.'
|
|
19
|
+
bool_opt '-r', '--run', 'Run or start a container with builded image.'
|
|
20
|
+
arg_opt '-B', '--build-arg', 'Argument for "docker build".', repeat: true
|
|
21
|
+
arg_opt '-E', '--entrypoint-arg', 'Argument for entrypoint on "docker run"', repeat: true
|
|
22
|
+
bool_opt '-c', '--clear', 'Remove container if exist before run.'
|
|
23
|
+
bool_opt '-S', '--no-snapshot', 'Does not add "-snapshot" to image tag.'
|
|
24
|
+
bool_opt '-V', '--no-version', 'Does not add version to image tag.'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def run
|
|
28
|
+
setup
|
|
29
|
+
banner
|
|
30
|
+
build
|
|
31
|
+
output_image_name
|
|
32
|
+
push
|
|
33
|
+
container_run
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def setup
|
|
39
|
+
instance.docker_image_options = {
|
|
40
|
+
registry: registry,
|
|
41
|
+
snapshot: snapshot?,
|
|
42
|
+
version: version?
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def banner
|
|
47
|
+
infov 'Registry name', registry
|
|
48
|
+
infov 'Version?', version?
|
|
49
|
+
infov 'Snapshot?', snapshot?
|
|
50
|
+
infov 'Image name', docker_image.tag
|
|
51
|
+
infov 'Build arguments', build_args
|
|
52
|
+
infov 'Entrypoint arguments', entrypoint_args
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def build
|
|
56
|
+
docker_image.build(build_args)
|
|
57
|
+
success 'Docker image builded'
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def build_args
|
|
61
|
+
parsed.build_arg
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def docker_container
|
|
65
|
+
instance.docker_container
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def docker_image
|
|
69
|
+
instance.docker_image
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def entrypoint_args
|
|
73
|
+
parsed.entrypoint_arg
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def push
|
|
77
|
+
docker_image.push if parsed.push?
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def container_run
|
|
81
|
+
return unless parsed.run?
|
|
82
|
+
|
|
83
|
+
docker_container.run(
|
|
84
|
+
entrypoint_args: entrypoint_args,
|
|
85
|
+
clear: parsed.clear?
|
|
86
|
+
)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def output_image_name
|
|
90
|
+
return unless parsed.image_name
|
|
91
|
+
|
|
92
|
+
out("#{docker_image.tag.to_s.strip}\n")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def registry_uncached
|
|
96
|
+
registry_from_option || registry_from_instance || registry_from_default ||
|
|
97
|
+
fatal_error('No registry defined')
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def registry_from_option
|
|
101
|
+
parsed.registry_name.if_present { |v| ::EacDocker::Registry.new(v) }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def registry_from_instance
|
|
105
|
+
instance.docker_registry_optional.if_present { |v| ::EacDocker::Registry.new(v) }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def registry_from_default
|
|
109
|
+
if_respond(DOCKER_DEFAULT_REGISTRY_METHOD, nil)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def snapshot?
|
|
113
|
+
!parsed.no_snapshot?
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def version?
|
|
117
|
+
!parsed.no_version?
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_config/node'
|
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
|
5
|
+
|
|
6
|
+
module Avm
|
|
7
|
+
module Entries
|
|
8
|
+
module AutoValues
|
|
9
|
+
class Entry
|
|
10
|
+
class << self
|
|
11
|
+
# @param path [EacConfig::EntryPath]
|
|
12
|
+
# @return String
|
|
13
|
+
def auto_value_method_name(path)
|
|
14
|
+
"auto_#{::EacConfig::EntryPath.assert(path).to_string.gsub('.', '_')}"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @!method initialize(entries_provider, path)
|
|
19
|
+
# @param entries_provider
|
|
20
|
+
# @param path [EacConfig::EntryPath]
|
|
21
|
+
common_constructor :entries_provider, :path do
|
|
22
|
+
self.path = ::EacConfig::EntryPath.assert(path)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def auto_value_method
|
|
26
|
+
self.class.auto_value_method_name(path)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def found?
|
|
30
|
+
entries_provider.respond_to?(auto_value_method, true)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def value
|
|
34
|
+
entries_provider.if_respond(auto_value_method)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'avm/entries/uri_builder'
|
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
|
5
|
+
|
|
6
|
+
module Avm
|
|
7
|
+
module Entries
|
|
8
|
+
module AutoValues
|
|
9
|
+
class UriEntry
|
|
10
|
+
common_constructor :entries_provider, :suffix
|
|
11
|
+
|
|
12
|
+
def found?
|
|
13
|
+
value.present?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def value
|
|
17
|
+
::Avm::Entries::UriBuilder.from_all_fields do |field_name|
|
|
18
|
+
entries_provider.entry([suffix, field_name]).optional_value
|
|
19
|
+
end.to_uri.to_s
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'avm/entries/uri_builder'
|
|
4
|
+
require 'eac_config/entry_path'
|
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
|
6
|
+
|
|
7
|
+
module Avm
|
|
8
|
+
module Entries
|
|
9
|
+
module Base
|
|
10
|
+
class InheritedEntryValue
|
|
11
|
+
enable_method_class
|
|
12
|
+
common_constructor :entries_provider, :source_entry_suffix, :target_entry_suffix, :block,
|
|
13
|
+
block_arg: true
|
|
14
|
+
|
|
15
|
+
def result
|
|
16
|
+
self_entry_value.if_present do |instance_id|
|
|
17
|
+
other_entry_value(instance_id).if_present(&block)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @param provider_id [String]
|
|
22
|
+
# @return [Avm::Entries::Base]
|
|
23
|
+
def other_entries_provider(provider_id)
|
|
24
|
+
other_entries_provider_class.by_id(provider_id)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @return [Class]
|
|
28
|
+
def other_entries_provider_class
|
|
29
|
+
[::Avm::Instances::Base, ::Avm::Applications::Base].each do |klass|
|
|
30
|
+
return klass if entries_provider.is_a?(klass)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
raise "No provider class found for \"#{entries_provider}\""
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def other_entry_value(instance_id)
|
|
37
|
+
other_entries_provider(instance_id).read_entry_optional(target_entry_suffix)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self_entry_value
|
|
41
|
+
entries_provider.read_entry_optional(source_entry_suffix)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'avm/entries/uri_builder'
|
|
4
|
+
require 'eac_config/entry_path'
|
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
|
6
|
+
|
|
7
|
+
module Avm
|
|
8
|
+
module Entries
|
|
9
|
+
module Base
|
|
10
|
+
class UriComponentEntryValue
|
|
11
|
+
class DefaultValue
|
|
12
|
+
enable_method_class
|
|
13
|
+
common_constructor :uri_component_entry_value
|
|
14
|
+
delegate :component_entry_path, :entries_provider, to: :uri_component_entry_value
|
|
15
|
+
|
|
16
|
+
# @return [Symbol]
|
|
17
|
+
def default_value_method_name
|
|
18
|
+
component_entry_path.default_method_name
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def result
|
|
22
|
+
entries_provider.if_respond(default_value_method_name)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'avm/entries/uri_builder'
|
|
4
|
+
require 'eac_config/entry_path'
|
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
|
6
|
+
|
|
7
|
+
module Avm
|
|
8
|
+
module Entries
|
|
9
|
+
module Base
|
|
10
|
+
class UriComponentEntryValue
|
|
11
|
+
class InheritedValue
|
|
12
|
+
enable_method_class
|
|
13
|
+
common_constructor :uri_component_entry_value
|
|
14
|
+
delegate :entries_provider, :id_entry_path, :component_entry_path,
|
|
15
|
+
to: :uri_component_entry_value
|
|
16
|
+
|
|
17
|
+
def result
|
|
18
|
+
entries_provider.inherited_entry_value(
|
|
19
|
+
id_entry_path.to_string,
|
|
20
|
+
component_entry_path.to_string,
|
|
21
|
+
&inherited_value_block
|
|
22
|
+
)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def inherited_value_block
|
|
26
|
+
return nil unless entries_provider.respond_to?(inherited_value_block_method_name)
|
|
27
|
+
|
|
28
|
+
->(value) { entries_provider.send(inherited_value_block_method_name, value) }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @return [Symbol]
|
|
32
|
+
def inherited_value_block_method_name
|
|
33
|
+
component_entry_path.inherited_block_method_name
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'avm/entries/uri_builder'
|
|
4
|
+
require 'eac_config/entry_path'
|
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
|
6
|
+
|
|
7
|
+
module Avm
|
|
8
|
+
module Entries
|
|
9
|
+
module Base
|
|
10
|
+
class UriComponentEntryValue
|
|
11
|
+
class UrlEntryValue
|
|
12
|
+
enable_method_class
|
|
13
|
+
common_constructor :uri_component_entry_value
|
|
14
|
+
delegate :component, :entries_provider, :root_entry_path, to: :uri_component_entry_value
|
|
15
|
+
|
|
16
|
+
def result
|
|
17
|
+
return unless url_entry.context_found?
|
|
18
|
+
|
|
19
|
+
::Avm::Entries::UriBuilder.from_source(url_entry.value.to_uri)
|
|
20
|
+
.avm_field_get(component)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @return [Avm::Entries::Entry]
|
|
24
|
+
def url_entry
|
|
25
|
+
entries_provider.entry((root_entry_path + %w[url]).to_string)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'avm/entries/uri_builder'
|
|
4
|
+
require 'eac_config/entry_path'
|
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
|
6
|
+
|
|
7
|
+
module Avm
|
|
8
|
+
module Entries
|
|
9
|
+
module Base
|
|
10
|
+
class UriComponentEntryValue
|
|
11
|
+
enable_method_class
|
|
12
|
+
require_sub __FILE__, require_dependency: true
|
|
13
|
+
|
|
14
|
+
enable_listable
|
|
15
|
+
lists.add_symbol :option
|
|
16
|
+
|
|
17
|
+
common_constructor :entries_provider, :component_entry_path, :options, default: [{}] do
|
|
18
|
+
self.component_entry_path = ::EacConfig::EntryPath.assert(component_entry_path)
|
|
19
|
+
self.options = self.class.lists.option.hash_keys_validate!(options)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @return [EacConfig::EntryPath]
|
|
23
|
+
def id_entry_path
|
|
24
|
+
root_entry_path + %w[id]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @return [String, nil]
|
|
28
|
+
def result
|
|
29
|
+
url_entry_value || inherited_value || default_value
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @return [EacConfig::EntryPath]
|
|
33
|
+
def root_entry_path
|
|
34
|
+
component_entry_path[0..-2]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @return [String]
|
|
38
|
+
def component
|
|
39
|
+
component_entry_path.last
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
|
4
|
+
|
|
5
|
+
module Avm
|
|
6
|
+
module Entries
|
|
7
|
+
module Base
|
|
8
|
+
class UriComponentsEntriesValues
|
|
9
|
+
class ComponentFactory
|
|
10
|
+
enable_method_class
|
|
11
|
+
common_constructor :owner, :component
|
|
12
|
+
|
|
13
|
+
def result
|
|
14
|
+
component_class.new(owner, component)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def component_class
|
|
18
|
+
specific_class || generic_class
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def generic_class
|
|
22
|
+
parent_class.const_get('GenericComponent')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def parent_class
|
|
26
|
+
::Avm::Entries::Base::UriComponentsEntriesValues
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def specific_class
|
|
30
|
+
return nil unless parent_class.const_defined?(specific_class_basename)
|
|
31
|
+
|
|
32
|
+
parent_class.const_get(specific_class_basename)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def specific_class_basename
|
|
36
|
+
[component, 'component'].join('_').camelize
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'avm/entries/uri_builder'
|
|
4
|
+
require 'avm/patches/eac_config/entry_path'
|
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
|
6
|
+
|
|
7
|
+
module Avm
|
|
8
|
+
module Entries
|
|
9
|
+
module Base
|
|
10
|
+
class UriComponentsEntriesValues
|
|
11
|
+
class GenericComponent
|
|
12
|
+
common_constructor :owner, :component
|
|
13
|
+
delegate :entries_provider_class, :prefix, to: :owner
|
|
14
|
+
delegate :auto_method_name, :get_method_name, :get_optional_method_name,
|
|
15
|
+
to: :entry_key_path
|
|
16
|
+
|
|
17
|
+
def define_auto_method
|
|
18
|
+
outer_self = self
|
|
19
|
+
entries_provider_class.define_method(auto_method_name) do
|
|
20
|
+
uri_component_entry_value(outer_self.entry_key_path.to_string)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def define_get_method
|
|
25
|
+
outer_self = self
|
|
26
|
+
entries_provider_class.define_method(get_method_name) do
|
|
27
|
+
read_entry(outer_self.entry_key_path.to_string)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def define_get_optional_method
|
|
32
|
+
outer_self = self
|
|
33
|
+
entries_provider_class.define_method(get_optional_method_name) do
|
|
34
|
+
read_entry_optional(outer_self.entry_key_path.to_string)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def define_inherited_value_proc_method(&block)
|
|
39
|
+
entries_provider_class.define_method(inherited_value_proc_name, &block)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def entry_key_path
|
|
43
|
+
::EacConfig::EntryPath.assert([prefix, component])
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def id_component
|
|
47
|
+
@id_component ||= owner.component_factory('id')
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def inherited_value_proc_name
|
|
51
|
+
entry_key_path.inherited_block_method_name
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def setup
|
|
55
|
+
define_auto_method
|
|
56
|
+
define_get_method
|
|
57
|
+
define_get_optional_method
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'avm/entries/base/uri_components_entries_values/generic_component'
|
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
|
5
|
+
|
|
6
|
+
module Avm
|
|
7
|
+
module Entries
|
|
8
|
+
module Base
|
|
9
|
+
class UriComponentsEntriesValues
|
|
10
|
+
class PathComponent < ::Avm::Entries::Base::UriComponentsEntriesValues::GenericComponent
|
|
11
|
+
def setup
|
|
12
|
+
super
|
|
13
|
+
define_inherited_value_proc_method { |value| "#{value}/#{id}" }
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'avm/entries/base/uri_components_entries_values/generic_component'
|
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
|
5
|
+
|
|
6
|
+
module Avm
|
|
7
|
+
module Entries
|
|
8
|
+
module Base
|
|
9
|
+
class UriComponentsEntriesValues
|
|
10
|
+
class UrlComponent < ::Avm::Entries::Base::UriComponentsEntriesValues::GenericComponent
|
|
11
|
+
def define_auto_method
|
|
12
|
+
outer_self = self
|
|
13
|
+
entries_provider_class.define_method(auto_method_name) do
|
|
14
|
+
inherited_entry_value(outer_self.id_component.entry_key_path.to_string,
|
|
15
|
+
outer_self.entry_key_path.to_string) ||
|
|
16
|
+
outer_self.auto_install_url_by_parts(self)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def auto_install_url_by_parts(entries_provider)
|
|
21
|
+
require 'avm/entries/auto_values/uri_entry'
|
|
22
|
+
::Avm::Entries::AutoValues::UriEntry.new(entries_provider, 'install').value
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|