3scale_toolbox 0.15.0 → 0.18.2
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/3scale_toolbox.gemspec +2 -2
- data/README.md +15 -9
- data/lib/3scale_toolbox.rb +3 -1
- data/lib/3scale_toolbox/3scale_client_factory.rb +3 -4
- data/lib/3scale_toolbox/cli.rb +4 -0
- data/lib/3scale_toolbox/cli/custom_table_printer.rb +32 -0
- data/lib/3scale_toolbox/cli/error_handler.rb +17 -14
- data/lib/3scale_toolbox/cli/json_printer.rb +13 -0
- data/lib/3scale_toolbox/cli/output_flag.rb +20 -0
- data/lib/3scale_toolbox/cli/yaml_printer.rb +13 -0
- data/lib/3scale_toolbox/commands.rb +7 -1
- data/lib/3scale_toolbox/commands/activedocs_command/apply_command.rb +33 -10
- data/lib/3scale_toolbox/commands/activedocs_command/create_command.rb +22 -7
- data/lib/3scale_toolbox/commands/activedocs_command/list_command.rb +10 -17
- data/lib/3scale_toolbox/commands/application_command/apply_command.rb +27 -4
- data/lib/3scale_toolbox/commands/application_command/create_command.rb +16 -1
- data/lib/3scale_toolbox/commands/application_command/list_command.rb +10 -13
- data/lib/3scale_toolbox/commands/application_command/show_command.rb +8 -14
- data/lib/3scale_toolbox/commands/backend_command.rb +22 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command.rb +65 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_mapping_rules_task.rb +36 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_methods_task.rb +35 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_metrics_task.rb +30 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/create_or_update_target_backend_task.rb +46 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/task.rb +67 -0
- data/lib/3scale_toolbox/commands/copy_command.rb +2 -2
- data/lib/3scale_toolbox/commands/copy_command/service_command.rb +40 -0
- data/lib/3scale_toolbox/commands/import_command/issuer_type_transformer.rb +16 -0
- data/lib/3scale_toolbox/commands/import_command/openapi.rb +6 -2
- data/lib/3scale_toolbox/commands/import_command/openapi/create_mapping_rule_step.rb +2 -1
- data/lib/3scale_toolbox/commands/import_command/openapi/create_method_step.rb +5 -14
- data/lib/3scale_toolbox/commands/import_command/openapi/step.rb +4 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/update_service_proxy_step.rb +1 -0
- data/lib/3scale_toolbox/commands/methods_command/apply_command.rb +28 -8
- data/lib/3scale_toolbox/commands/methods_command/create_command.rb +23 -3
- data/lib/3scale_toolbox/commands/methods_command/delete_command.rb +1 -1
- data/lib/3scale_toolbox/commands/methods_command/list_command.rb +7 -13
- data/lib/3scale_toolbox/commands/metrics_command/apply_command.rb +26 -4
- data/lib/3scale_toolbox/commands/metrics_command/create_command.rb +23 -1
- data/lib/3scale_toolbox/commands/metrics_command/list_command.rb +7 -12
- data/lib/3scale_toolbox/commands/plans_command/apply_command.rb +36 -7
- data/lib/3scale_toolbox/commands/plans_command/create_command.rb +23 -1
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_limits_step.rb +1 -1
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_methods_step.rb +2 -2
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_metrics_step.rb +2 -2
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_pricing_rules_step.rb +1 -2
- data/lib/3scale_toolbox/commands/plans_command/export/step.rb +8 -20
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_limits_step.rb +12 -14
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_metrics_step.rb +6 -13
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_pricing_rules_step.rb +12 -20
- data/lib/3scale_toolbox/commands/plans_command/import/step.rb +2 -22
- data/lib/3scale_toolbox/commands/plans_command/list_command.rb +8 -13
- data/lib/3scale_toolbox/commands/plans_command/show_command.rb +7 -15
- data/lib/3scale_toolbox/commands/policies_command.rb +24 -0
- data/lib/3scale_toolbox/commands/policies_command/export_command.rb +98 -0
- data/lib/3scale_toolbox/commands/policies_command/import_command.rb +61 -0
- data/lib/3scale_toolbox/commands/product_command.rb +26 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command.rb +82 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command/copy_backends_task.rb +88 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command/delete_target_backend_usages_task.rb +48 -0
- data/lib/3scale_toolbox/commands/product_command/export_command.rb +81 -0
- data/lib/3scale_toolbox/commands/product_command/import_command.rb +125 -0
- data/lib/3scale_toolbox/commands/proxy_config_command.rb +5 -0
- data/lib/3scale_toolbox/commands/proxy_config_command/deploy_command.rb +54 -0
- data/lib/3scale_toolbox/commands/proxy_config_command/export_command.rb +74 -0
- data/lib/3scale_toolbox/commands/proxy_config_command/helper.rb +15 -0
- data/lib/3scale_toolbox/commands/proxy_config_command/list_command.rb +13 -29
- data/lib/3scale_toolbox/commands/proxy_config_command/show_command.rb +20 -23
- data/lib/3scale_toolbox/commands/service_command.rb +7 -5
- data/lib/3scale_toolbox/commands/service_command/apply_command.rb +69 -58
- data/lib/3scale_toolbox/commands/service_command/copy_command.rb +95 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/bump_proxy_version_task.rb +36 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_activedocs_task.rb +49 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_app_plans_task.rb +35 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_limits_task.rb +38 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_mapping_rules_task.rb +35 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_methods_task.rb +37 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_metrics_task.rb +37 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_policies_task.rb +17 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_pricingrules_task.rb +41 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_service_proxy_task.rb +32 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/create_or_update_service_task.rb +49 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/destroy_mapping_rules_task.rb +38 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/task.rb +85 -0
- data/lib/3scale_toolbox/commands/service_command/create_command.rb +58 -44
- data/lib/3scale_toolbox/commands/service_command/delete_command.rb +31 -33
- data/lib/3scale_toolbox/commands/service_command/list_command.rb +24 -34
- data/lib/3scale_toolbox/commands/service_command/show_command.rb +39 -44
- data/lib/3scale_toolbox/commands/update_command.rb +3 -3
- data/lib/3scale_toolbox/commands/update_command/{update_service.rb → service_command.rb} +22 -18
- data/lib/3scale_toolbox/commands/update_command/service_command/copy_service_settings_task.rb +35 -0
- data/lib/3scale_toolbox/commands/update_command/service_command/delete_activedocs_task.rb +24 -0
- data/lib/3scale_toolbox/crds.rb +16 -0
- data/lib/3scale_toolbox/crds/application_plan_dump.rb +19 -0
- data/lib/3scale_toolbox/crds/backend_dump.rb +39 -0
- data/lib/3scale_toolbox/crds/backend_mapping_rule_dump.rb +26 -0
- data/lib/3scale_toolbox/crds/backend_method_dump.rb +12 -0
- data/lib/3scale_toolbox/crds/backend_metric_dump.rb +13 -0
- data/lib/3scale_toolbox/crds/backend_parser.rb +55 -0
- data/lib/3scale_toolbox/crds/backend_usage_dump.rb +11 -0
- data/lib/3scale_toolbox/crds/limit_dump.rb +37 -0
- data/lib/3scale_toolbox/crds/mapping_rule_dump.rb +26 -0
- data/lib/3scale_toolbox/crds/method_dump.rb +12 -0
- data/lib/3scale_toolbox/crds/metric_dump.rb +13 -0
- data/lib/3scale_toolbox/crds/pricing_rule_dump.rb +38 -0
- data/lib/3scale_toolbox/crds/product_deployment_parser.rb +329 -0
- data/lib/3scale_toolbox/crds/product_dump.rb +157 -0
- data/lib/3scale_toolbox/crds/product_parser.rb +114 -0
- data/lib/3scale_toolbox/crds/remote.rb +682 -0
- data/lib/3scale_toolbox/entities.rb +8 -0
- data/lib/3scale_toolbox/entities/activedocs.rb +12 -0
- data/lib/3scale_toolbox/entities/application_plan.rb +74 -39
- data/lib/3scale_toolbox/entities/backend.rb +187 -0
- data/lib/3scale_toolbox/entities/backend_mapping_rule.rb +102 -0
- data/lib/3scale_toolbox/entities/backend_method.rb +99 -0
- data/lib/3scale_toolbox/entities/backend_metric.rb +98 -0
- data/lib/3scale_toolbox/entities/backend_usage.rb +105 -0
- data/lib/3scale_toolbox/entities/limit.rb +71 -0
- data/lib/3scale_toolbox/entities/mapping_rule.rb +90 -0
- data/lib/3scale_toolbox/entities/method.rb +33 -19
- data/lib/3scale_toolbox/entities/metric.rb +29 -18
- data/lib/3scale_toolbox/entities/pricing_rule.rb +63 -0
- data/lib/3scale_toolbox/entities/proxy_config.rb +0 -1
- data/lib/3scale_toolbox/entities/service.rb +166 -48
- data/lib/3scale_toolbox/error.rb +53 -0
- data/lib/3scale_toolbox/helper.rb +17 -0
- data/lib/3scale_toolbox/openapi/oas3.rb +1 -1
- data/lib/3scale_toolbox/proxy_logger.rb +5 -1
- data/lib/3scale_toolbox/remote_cache.rb +157 -0
- data/lib/3scale_toolbox/remotes.rb +2 -2
- data/lib/3scale_toolbox/version.rb +1 -1
- data/licenses.xml +113 -45
- metadata +75 -26
- data/lib/3scale_toolbox/commands/copy_command/copy_service.rb +0 -144
- data/lib/3scale_toolbox/tasks.rb +0 -15
- data/lib/3scale_toolbox/tasks/bump_proxy_version_task.rb +0 -32
- data/lib/3scale_toolbox/tasks/copy_activedocs_task.rb +0 -42
- data/lib/3scale_toolbox/tasks/copy_app_plans_task.rb +0 -31
- data/lib/3scale_toolbox/tasks/copy_limits_task.rb +0 -36
- data/lib/3scale_toolbox/tasks/copy_mapping_rules_task.rb +0 -32
- data/lib/3scale_toolbox/tasks/copy_methods_task.rb +0 -36
- data/lib/3scale_toolbox/tasks/copy_metrics_task.rb +0 -33
- data/lib/3scale_toolbox/tasks/copy_policies_task.rb +0 -13
- data/lib/3scale_toolbox/tasks/copy_pricingrules_task.rb +0 -41
- data/lib/3scale_toolbox/tasks/copy_service_proxy_task.rb +0 -13
- data/lib/3scale_toolbox/tasks/copy_service_settings_task.rb +0 -38
- data/lib/3scale_toolbox/tasks/copy_task.rb +0 -66
- data/lib/3scale_toolbox/tasks/delete_activedocs_task.rb +0 -22
- data/lib/3scale_toolbox/tasks/destroy_mapping_rules_task.rb +0 -22
- data/lib/3scale_toolbox/tasks/helper_task.rb +0 -25
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require '3scale_toolbox/commands/product_command/copy_command/delete_target_backend_usages_task'
|
|
2
|
+
require '3scale_toolbox/commands/product_command/copy_command/copy_backends_task'
|
|
3
|
+
|
|
4
|
+
module ThreeScaleToolbox
|
|
5
|
+
module Commands
|
|
6
|
+
module ProductCommand
|
|
7
|
+
class CopySubcommand < Cri::CommandRunner
|
|
8
|
+
include ThreeScaleToolbox::Command
|
|
9
|
+
|
|
10
|
+
def self.command
|
|
11
|
+
Cri::Command.define do
|
|
12
|
+
name 'copy'
|
|
13
|
+
usage 'copy [opts] -s <source-remote> -d <target-remote> <source-product>'
|
|
14
|
+
summary 'Copy product'
|
|
15
|
+
description <<-HEREDOC
|
|
16
|
+
This command makes a copy of the referenced product.
|
|
17
|
+
Target product will be searched by source product system name. System name can be overriden with `--target-system-name` option.
|
|
18
|
+
If a product with the selected `system_name` is not found, it will be created.
|
|
19
|
+
\n Components of the product being copied:
|
|
20
|
+
\nproduct configuration
|
|
21
|
+
\nproduct settings
|
|
22
|
+
\nproduct methods&metrics: Only missing metrics&methods will be created.
|
|
23
|
+
\nproduct mapping rules: Only missing mapping rules will be created.
|
|
24
|
+
\nproduct application plans & pricing rules & limits: Only missing application plans & pricing rules & limits will be created.
|
|
25
|
+
\nproduct application usage rules
|
|
26
|
+
\nproduct policies
|
|
27
|
+
\nproduct backends: Only missing backends will be created.
|
|
28
|
+
\nproduct activedocs: Only missing activedocs will be created.
|
|
29
|
+
HEREDOC
|
|
30
|
+
|
|
31
|
+
option :s, :source, '3scale source instance. Url or remote name', argument: :required
|
|
32
|
+
option :d, :destination, '3scale target instance. Url or remote name', argument: :required
|
|
33
|
+
option :t, 'target-system-name', 'Target system name. Default to source system name', argument: :required
|
|
34
|
+
param :source_product
|
|
35
|
+
|
|
36
|
+
runner CopySubcommand
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.workflow(context)
|
|
41
|
+
tasks = []
|
|
42
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::CreateOrUpdateTargetServiceTask.new(context)
|
|
43
|
+
tasks << CopyCommand::DeleteExistingTargetBackendUsagesTask.new(context)
|
|
44
|
+
tasks << CopyCommand::CopyBackendsTask.new(context)
|
|
45
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::CopyServiceProxyTask.new(context)
|
|
46
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::CopyMethodsTask.new(context)
|
|
47
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::CopyMetricsTask.new(context)
|
|
48
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::DestroyMappingRulesTask.new(context)
|
|
49
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::CopyMappingRulesTask.new(context)
|
|
50
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::CopyApplicationPlansTask.new(context)
|
|
51
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::CopyLimitsTask.new(context)
|
|
52
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::CopyPoliciesTask.new(context)
|
|
53
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::CopyPricingRulesTask.new(context)
|
|
54
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::CopyActiveDocsTask.new(context)
|
|
55
|
+
tasks.each(&:call)
|
|
56
|
+
|
|
57
|
+
# This should be the last step
|
|
58
|
+
ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::BumpProxyVersionTask.new(service: context[:target]).call
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def run
|
|
62
|
+
self.class.workflow(context)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def context
|
|
68
|
+
@context ||= create_context
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def create_context
|
|
72
|
+
{
|
|
73
|
+
source_remote: threescale_client(fetch_required_option(:source)),
|
|
74
|
+
target_remote: threescale_client(fetch_required_option(:destination)),
|
|
75
|
+
source_service_ref: arguments[:source_product],
|
|
76
|
+
option_target_system_name: options[:'target-system-name']
|
|
77
|
+
}
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
module ThreeScaleToolbox
|
|
2
|
+
module Commands
|
|
3
|
+
module ProductCommand
|
|
4
|
+
module CopyCommand
|
|
5
|
+
class CopyBackendsTask
|
|
6
|
+
attr_reader :context
|
|
7
|
+
|
|
8
|
+
def initialize(context)
|
|
9
|
+
@context = context
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# entrypoint
|
|
13
|
+
def call
|
|
14
|
+
backend_list = source.backend_usage_list
|
|
15
|
+
backend_list.each(&method(:create_backend))
|
|
16
|
+
logger.info "created/upated #{backend_list.size} backends"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def create_backend(backend_usage)
|
|
22
|
+
source_backend = Entities::Backend.new(id: backend_usage.backend_id, remote: source_remote)
|
|
23
|
+
backend_context = create_backend_context(source_backend)
|
|
24
|
+
|
|
25
|
+
tasks = []
|
|
26
|
+
tasks << Commands::BackendCommand::CopyCommand::CreateOrUpdateTargetBackendTask.new(backend_context)
|
|
27
|
+
# First metrics as methods need 'hits' metric in target backend
|
|
28
|
+
tasks << Commands::BackendCommand::CopyCommand::CopyMetricsTask.new(backend_context)
|
|
29
|
+
tasks << Commands::BackendCommand::CopyCommand::CopyMethodsTask.new(backend_context)
|
|
30
|
+
tasks << Commands::BackendCommand::CopyCommand::CopyMappingRulesTask.new(backend_context)
|
|
31
|
+
tasks.each(&:call)
|
|
32
|
+
|
|
33
|
+
# CreateOrUpdate task will keep reference of the target backend in
|
|
34
|
+
# backend_context[:target_backend]
|
|
35
|
+
target_backend = backend_context[:target_backend]
|
|
36
|
+
attrs = {
|
|
37
|
+
'backend_api_id' => target_backend.id,
|
|
38
|
+
'path' => backend_usage.path
|
|
39
|
+
}
|
|
40
|
+
# It is assumed there is no target backend usage with this backend_source's path
|
|
41
|
+
# DeleteExistingTargetBackendUsagesTask should provide that
|
|
42
|
+
Entities::BackendUsage.create(product: target, attrs: attrs)
|
|
43
|
+
|
|
44
|
+
backends_report.merge!(target_backend.system_name => backend_context.fetch(:report))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def source
|
|
48
|
+
context[:source]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def target
|
|
52
|
+
context[:target]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def source_remote
|
|
56
|
+
context[:source_remote]
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def target_remote
|
|
60
|
+
context[:target_remote]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def backends_report
|
|
64
|
+
report['backends'] ||= {}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def report
|
|
68
|
+
context.fetch(:report)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def logger
|
|
72
|
+
context.fetch(:logger)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def create_backend_context(source_backend)
|
|
76
|
+
{
|
|
77
|
+
source_remote: source_remote,
|
|
78
|
+
target_remote: target_remote,
|
|
79
|
+
source_backend: source_backend,
|
|
80
|
+
source_backend_ref: source_backend.id,
|
|
81
|
+
logger: logger
|
|
82
|
+
}
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
data/lib/3scale_toolbox/commands/product_command/copy_command/delete_target_backend_usages_task.rb
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module ThreeScaleToolbox
|
|
2
|
+
module Commands
|
|
3
|
+
module ProductCommand
|
|
4
|
+
module CopyCommand
|
|
5
|
+
class DeleteExistingTargetBackendUsagesTask
|
|
6
|
+
attr_reader :context
|
|
7
|
+
|
|
8
|
+
def initialize(context)
|
|
9
|
+
@context = context
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# entrypoint
|
|
13
|
+
def call
|
|
14
|
+
conflicting_target_backend_usage_list.each(&:delete)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
# List of target backend usage items that match source backend usage paths
|
|
20
|
+
def conflicting_target_backend_usage_list
|
|
21
|
+
# Compute array intersection
|
|
22
|
+
target_backend_usage_list.select do |target_usage|
|
|
23
|
+
source_backend_usage_list.find do |source_usage|
|
|
24
|
+
target_usage.path == source_usage.path
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def source_backend_usage_list
|
|
30
|
+
@source_backend_usage_list ||= source.backend_usage_list
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def target_backend_usage_list
|
|
34
|
+
@target_backend_usage_list ||= target.backend_usage_list
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def target
|
|
38
|
+
context[:target]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def source
|
|
42
|
+
context[:source]
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
module ThreeScaleToolbox
|
|
2
|
+
module Commands
|
|
3
|
+
module ProductCommand
|
|
4
|
+
class ExportSubcommand < Cri::CommandRunner
|
|
5
|
+
include ThreeScaleToolbox::Command
|
|
6
|
+
|
|
7
|
+
def self.command
|
|
8
|
+
Cri::Command.define do
|
|
9
|
+
name 'export'
|
|
10
|
+
usage 'export [opts] <remote> <product>'
|
|
11
|
+
summary 'Export product to serialized format'
|
|
12
|
+
description 'This command serializes the referenced product and associated backends into a yaml format'
|
|
13
|
+
|
|
14
|
+
option :f, :file, 'Write to file instead of stdout', argument: :required
|
|
15
|
+
param :remote
|
|
16
|
+
param :product_ref
|
|
17
|
+
|
|
18
|
+
runner ExportSubcommand
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def run
|
|
23
|
+
select_output do |output|
|
|
24
|
+
output.write(serialized_object.to_yaml)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def remote
|
|
31
|
+
@remote ||= threescale_client(arguments[:remote])
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def serialized_object
|
|
35
|
+
{
|
|
36
|
+
'apiVersion' => 'v1',
|
|
37
|
+
'kind' => 'List',
|
|
38
|
+
'items' => [product.to_cr] + product_backends.map(&:to_cr)
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def select_output
|
|
43
|
+
ios = if file
|
|
44
|
+
File.open(file, 'w')
|
|
45
|
+
else
|
|
46
|
+
$stdout
|
|
47
|
+
end
|
|
48
|
+
begin
|
|
49
|
+
yield(ios)
|
|
50
|
+
ensure
|
|
51
|
+
ios.close
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def product
|
|
56
|
+
@product ||= find_product
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def product_backends
|
|
60
|
+
product.backend_usage_list.map do |backend_usage|
|
|
61
|
+
Entities::Backend.new(id: backend_usage.backend_id, remote: remote)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def product_ref
|
|
66
|
+
arguments[:product_ref]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def find_product
|
|
70
|
+
Entities::Service.find(remote: remote, ref: product_ref).tap do |prd|
|
|
71
|
+
raise ThreeScaleToolbox::Error, "Product #{product_ref} does not exist" if prd.nil?
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def file
|
|
76
|
+
options[:file]
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
module ThreeScaleToolbox
|
|
2
|
+
module Commands
|
|
3
|
+
module ProductCommand
|
|
4
|
+
class ImportSubcommand < Cri::CommandRunner
|
|
5
|
+
include ThreeScaleToolbox::Command
|
|
6
|
+
include ThreeScaleToolbox::ResourceReader
|
|
7
|
+
|
|
8
|
+
def self.command
|
|
9
|
+
Cri::Command.define do
|
|
10
|
+
name 'import'
|
|
11
|
+
usage 'import [opts] <remote>'
|
|
12
|
+
summary 'Import product from serialized format'
|
|
13
|
+
description 'This command deserializes one product and associated backends'
|
|
14
|
+
|
|
15
|
+
option :f, :file, 'Read from file instead of stdin', argument: :required
|
|
16
|
+
ThreeScaleToolbox::CLI.output_flag(self)
|
|
17
|
+
param :remote
|
|
18
|
+
|
|
19
|
+
runner ImportSubcommand
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def run
|
|
24
|
+
validate_artifacts_resource!
|
|
25
|
+
|
|
26
|
+
product_list.each do |product|
|
|
27
|
+
context = {
|
|
28
|
+
target_remote: remote,
|
|
29
|
+
source_remote: crd_remote,
|
|
30
|
+
source_service_ref: product.system_name,
|
|
31
|
+
logger: Logger.new(File::NULL)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
Commands::ProductCommand::CopySubcommand.workflow(context)
|
|
35
|
+
|
|
36
|
+
report[product.system_name] = context.fetch(:report)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
printer.print_collection report
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def crd_remote
|
|
45
|
+
@crd_remote ||= CRD::Remote.new(product_list, backend_list)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def product_list
|
|
49
|
+
@product_list ||= product_resources.map do |product_cr|
|
|
50
|
+
CRD::ProductParser.new product_cr
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def backend_list
|
|
55
|
+
@backend_list ||= backend_resources.map do |backend_cr|
|
|
56
|
+
CRD::BackendParser.new backend_cr
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def validate_artifacts_resource!
|
|
61
|
+
# TODO: Add openapiV3 validation
|
|
62
|
+
# https://github.com/3scale/3scale-operator/blob/3scale-2.10.0-CR2/deploy/crds/capabilities.3scale.net_backends_crd.yaml
|
|
63
|
+
# https://github.com/3scale/3scale-operator/blob/3scale-2.10.0-CR2/deploy/crds/capabilities.3scale.net_products_crd.yaml
|
|
64
|
+
validate_api_version!
|
|
65
|
+
|
|
66
|
+
validate_kind!
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def validate_api_version!
|
|
70
|
+
artifacts_resource.fetch('apiVersion') do
|
|
71
|
+
raise ThreeScaleToolbox::Error, 'Invalid content. apiVersion not found'
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
raise ThreeScaleToolbox::Error, 'Invalid content. apiVersion wrong value ' unless artifacts_resource.fetch('apiVersion') == 'v1'
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def validate_kind!
|
|
78
|
+
artifacts_resource.fetch('kind') do
|
|
79
|
+
raise ThreeScaleToolbox::Error, 'Invalid content. kind not found'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
raise ThreeScaleToolbox::Error, 'Invalid content. kind wrong value ' unless artifacts_resource.fetch('kind') == 'List'
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def artifacts_resource_items
|
|
86
|
+
artifacts_resource.fetch('items') do
|
|
87
|
+
raise ThreeScaleToolbox::Error, 'Invalid content. items not found'
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def product_resources
|
|
92
|
+
artifacts_resource_items.select do |item|
|
|
93
|
+
item.respond_to?(:has_key?) &&
|
|
94
|
+
item.fetch('apiVersion', '').include?('capabilities.3scale.net') &&
|
|
95
|
+
item['kind'] == 'Product'
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def backend_resources
|
|
100
|
+
artifacts_resource_items.select do |item|
|
|
101
|
+
item.respond_to?(:has_key?) &&
|
|
102
|
+
item.fetch('apiVersion', '').include?('capabilities.3scale.net') &&
|
|
103
|
+
item['kind'] == 'Backend'
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def artifacts_resource
|
|
108
|
+
@artifacts_resource ||= load_resource(options[:file] || '-')
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def report
|
|
112
|
+
@report ||= {}
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def remote
|
|
116
|
+
@remote ||= threescale_client(arguments[:remote])
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def printer
|
|
120
|
+
options.fetch(:output, CLI::JsonPrinter.new)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
require 'cri'
|
|
2
2
|
require '3scale_toolbox/base_command'
|
|
3
|
+
require '3scale_toolbox/commands/proxy_config_command/helper'
|
|
3
4
|
require '3scale_toolbox/commands/proxy_config_command/list_command'
|
|
4
5
|
require '3scale_toolbox/commands/proxy_config_command/show_command'
|
|
5
6
|
require '3scale_toolbox/commands/proxy_config_command/promote_command'
|
|
7
|
+
require '3scale_toolbox/commands/proxy_config_command/export_command'
|
|
8
|
+
require '3scale_toolbox/commands/proxy_config_command/deploy_command'
|
|
6
9
|
|
|
7
10
|
module ThreeScaleToolbox
|
|
8
11
|
module Commands
|
|
@@ -25,6 +28,8 @@ module ThreeScaleToolbox
|
|
|
25
28
|
add_subcommand(List::ListSubcommand)
|
|
26
29
|
add_subcommand(Show::ShowSubcommand)
|
|
27
30
|
add_subcommand(Promote::PromoteSubcommand)
|
|
31
|
+
add_subcommand(Export::ExportSubcommand)
|
|
32
|
+
add_subcommand(DeploySubcommand)
|
|
28
33
|
end
|
|
29
34
|
end
|
|
30
35
|
end
|