From 9c103302c80d88afeb436cda9266bed6c6b357b0 Mon Sep 17 00:00:00 2001 From: Rene Krenn Date: Thu, 25 Jul 2024 17:34:04 +0200 Subject: [PATCH] MT#60575 dynamically load provisioning templates module Change-Id: Ibff509825f82a75c9b0221505a1673d78b401989 --- .../Controller/API/ProvisioningTemplates.pm | 4 +-- .../API/ProvisioningTemplatesItem.pm | 14 ++++---- .../Panel/Controller/BatchProvisioning.pm | 8 ++--- .../Form/ProvisioningTemplate/Reseller.pm | 8 ++--- .../Panel/Role/API/ProvisioningTemplates.pm | 22 ++++++------ lib/NGCP/Panel/Utils/Generic.pm | 34 +++++++++++++++++-- 6 files changed, 59 insertions(+), 31 deletions(-) diff --git a/lib/NGCP/Panel/Controller/API/ProvisioningTemplates.pm b/lib/NGCP/Panel/Controller/API/ProvisioningTemplates.pm index d1d8d646e7..ef9c72f952 100644 --- a/lib/NGCP/Panel/Controller/API/ProvisioningTemplates.pm +++ b/lib/NGCP/Panel/Controller/API/ProvisioningTemplates.pm @@ -9,7 +9,7 @@ use Data::HAL::Link qw(); use HTTP::Headers qw(); use HTTP::Status qw(:constants); -use NGCP::Panel::Utils::ProvisioningTemplates qw(); +use NGCP::Panel::Utils::Generic qw(run_module_method get_module_var); use NGCP::Panel::Utils::DateTime qw(); sub allowed_methods{ @@ -60,7 +60,7 @@ sub create_item { my ($self, $c, $resource, $form, $process_extras) = @_; - $resource->{yaml} = NGCP::Panel::Utils::ProvisioningTemplates::dump_template($c, + $resource->{yaml} = run_module_method('Utils::ProvisioningTemplates::dump_template',$c, $resource->{id}, $resource->{name}, delete $resource->{template}, diff --git a/lib/NGCP/Panel/Controller/API/ProvisioningTemplatesItem.pm b/lib/NGCP/Panel/Controller/API/ProvisioningTemplatesItem.pm index 7719cd83ee..70fa0c3042 100644 --- a/lib/NGCP/Panel/Controller/API/ProvisioningTemplatesItem.pm +++ b/lib/NGCP/Panel/Controller/API/ProvisioningTemplatesItem.pm @@ -11,7 +11,7 @@ require Catalyst::ActionRole::ACL; require NGCP::Panel::Role::HTTPMethods; require Catalyst::ActionRole::RequireSSL; use Scalar::Util qw/blessed/; -use NGCP::Panel::Utils::ProvisioningTemplates qw(); +use NGCP::Panel::Utils::Generic qw(run_module_method get_module_var); use NGCP::Panel::Role::API::Subscribers qw(); sub allowed_methods{ @@ -293,7 +293,7 @@ sub update_item_model { my($self, $c, $item, $old_resource, $resource, $form, $process_extras) = @_; - $resource->{yaml} = NGCP::Panel::Utils::ProvisioningTemplates::dump_template($c, + $resource->{yaml} = run_module_method('Utils::ProvisioningTemplates::dump_template',$c, $resource->{id}, $resource->{name}, delete $resource->{template}, @@ -352,16 +352,16 @@ sub post { if (!$non_json_data || !$data) { my $context; try { - $context = NGCP::Panel::Utils::ProvisioningTemplates::provision_begin( + $context = run_module_method('Utils::ProvisioningTemplates::provision_begin', c => $c, purge => $purge, ); - NGCP::Panel::Utils::ProvisioningTemplates::provision_commit_row( + run_module_method('Utils::ProvisioningTemplates::provision_commit_row', c => $c, context => $context, 'values' => $resource, ); - NGCP::Panel::Utils::ProvisioningTemplates::provision_finish( + run_module_method('Utils::ProvisioningTemplates::provision_finish', c => $c, context => $context, ); @@ -371,13 +371,13 @@ sub post { )); $c->response->header(Location => sprintf('%s%d', NGCP::Panel::Role::API::Subscribers::dispatch_path(), $context->{subscriber}->{id})); } catch($e) { - NGCP::Panel::Utils::ProvisioningTemplates::provision_cleanup($c, $context); + run_module_method('Utils::ProvisioningTemplates::provision_cleanup',$c, $context); $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Provisioning template '$id' failed", $e); return; } } else { try { - my ($linecount,$errors) = NGCP::Panel::Utils::ProvisioningTemplates::process_csv( + my ($linecount,$errors) = run_module_method('Utils::ProvisioningTemplates::process_csv', c => $c, data => \$data, purge => $purge, diff --git a/lib/NGCP/Panel/Controller/BatchProvisioning.pm b/lib/NGCP/Panel/Controller/BatchProvisioning.pm index 073af05e75..83097821bf 100644 --- a/lib/NGCP/Panel/Controller/BatchProvisioning.pm +++ b/lib/NGCP/Panel/Controller/BatchProvisioning.pm @@ -9,7 +9,7 @@ use NGCP::Panel::Utils::Message; use NGCP::Panel::Utils::Navigation; use NGCP::Panel::Utils::Datatables; use NGCP::Panel::Utils::DateTime qw(); -use NGCP::Panel::Utils::ProvisioningTemplates qw(); +use NGCP::Panel::Utils::Generic qw(run_module_method get_module_var); use NGCP::Panel::Form::ProvisioningTemplate::Admin qw(); use NGCP::Panel::Form::ProvisioningTemplate::Reseller qw(); @@ -25,7 +25,7 @@ sub auto :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRol sub template_list :Chained('/') :PathPart('batchprovisioning') :CaptureArgs(0) { my ( $self, $c ) = @_; - NGCP::Panel::Utils::ProvisioningTemplates::load_template_map($c); + run_module_method('Utils::ProvisioningTemplates::load_template_map',$c); $c->stash->{template_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [ { name => "id", search => 1, title => $c->loc('#') }, @@ -90,7 +90,7 @@ sub do_template_form :Chained('template_base') :PathPart('form') :Args(0) { $c->log->debug($c->stash->{provisioning_template_name}); $c->log->debug($c->uri_for_action('/batchprovisioning/root')); - NGCP::Panel::Utils::ProvisioningTemplates::create_provisioning_template_form( + run_module_method('Utils::ProvisioningTemplates::create_provisioning_template_form', c => $c, base_uri => $c->uri_for_action('/batchprovisioning/root'), ); @@ -125,7 +125,7 @@ sub do_template_upload :Chained('template_base') :PathPart('upload') :Args(0) { my $data = $upload->slurp; try { - my ($linecount,$errors) = NGCP::Panel::Utils::ProvisioningTemplates::process_csv( + my ($linecount,$errors) = run_module_method('Utils::ProvisioningTemplates::process_csv', c => $c, data => \$data, purge => $c->req->params->{purge_existing}, diff --git a/lib/NGCP/Panel/Form/ProvisioningTemplate/Reseller.pm b/lib/NGCP/Panel/Form/ProvisioningTemplate/Reseller.pm index 19b99139c3..7c22aaf32d 100644 --- a/lib/NGCP/Panel/Form/ProvisioningTemplate/Reseller.pm +++ b/lib/NGCP/Panel/Form/ProvisioningTemplate/Reseller.pm @@ -4,7 +4,7 @@ use HTML::FormHandler::Moose; extends 'HTML::FormHandler'; use HTML::FormHandler::Widget::Block::Bootstrap; -use NGCP::Panel::Utils::ProvisioningTemplates qw(); +use NGCP::Panel::Utils::Generic qw(run_module_method get_module_var); use NGCP::Panel::Utils::Generic qw(trim); use Storable qw(); @@ -137,8 +137,8 @@ sub validate_yaml { my ($self, $field) = @_; eval { - my $data = NGCP::Panel::Utils::ProvisioningTemplates::parse_template(undef, undef, undef, $field->value); - NGCP::Panel::Utils::ProvisioningTemplates::validate_template($data); + my $data = run_module_method('Utils::ProvisioningTemplates::parse_template',undef, undef, undef, $field->value); + run_module_method('Utils::ProvisioningTemplates::validate_template',$data); }; if ($@) { $field->add_error(trim($@)); @@ -164,7 +164,7 @@ sub validate { $reseller = $c->model('DB')->resultset('resellers')->find($resource->{reseller_id}) if $resource->{reseller_id}; eval { - NGCP::Panel::Utils::ProvisioningTemplates::validate_template_name($c, + run_module_method('Utils::ProvisioningTemplates::validate_template_name',$c, $field->value,$c->stash->{old_name},$reseller); }; if ($@) { diff --git a/lib/NGCP/Panel/Role/API/ProvisioningTemplates.pm b/lib/NGCP/Panel/Role/API/ProvisioningTemplates.pm index 1e53e7e3cc..0f272aa469 100644 --- a/lib/NGCP/Panel/Role/API/ProvisioningTemplates.pm +++ b/lib/NGCP/Panel/Role/API/ProvisioningTemplates.pm @@ -12,7 +12,7 @@ use HTTP::Status qw(:constants); use Scalar::Util qw/blessed/; use JSON qw(); -use NGCP::Panel::Utils::ProvisioningTemplates qw(); +use NGCP::Panel::Utils::Generic qw(run_module_method get_module_var); use NGCP::Panel::Utils::API qw(); use NGCP::Panel::Utils::Generic qw(trim); @@ -21,7 +21,7 @@ sub _item_rs { my ($self, $c) = @_; unless ($c->stash->{provisioning_templates}) { - NGCP::Panel::Utils::ProvisioningTemplates::load_template_map($c); + run_module_method('Utils::ProvisioningTemplates::load_template_map',$c); } my $editable; @@ -100,10 +100,10 @@ sub get_form { my ($self, $c, $type, $id) = @_; if ($type and 'form' eq lc($type)) { unless ($c->stash->{provisioning_templates}) { - NGCP::Panel::Utils::ProvisioningTemplates::load_template_map($c); + run_module_method('Utils::ProvisioningTemplates::load_template_map',$c); } $c->stash->{provisioning_template_name} = $id; - return NGCP::Panel::Utils::ProvisioningTemplates::get_provisioning_template_form($c); + return run_module_method('Utils::ProvisioningTemplates::get_provisioning_template_form',$c); } else { if ($c->user->is_superuser) { return NGCP::Panel::Form::get("NGCP::Panel::Form::ProvisioningTemplate::AdminAPI", $c); @@ -126,12 +126,12 @@ sub resource_from_item { $resource{template} = delete $resource{yaml}; } elsif ('json' eq lc($c->req->param('format'))) { eval { - $resource{template} = _template_as_json(NGCP::Panel::Utils::ProvisioningTemplates::parse_template($c, $resource{id}, $resource{name}, delete $resource{yaml})); + $resource{template} = _template_as_json(run_module_method('Utils::ProvisioningTemplates::parse_template',$c, $resource{id}, $resource{name}, delete $resource{yaml})); }; } } else { eval { - $resource{template} = NGCP::Panel::Utils::ProvisioningTemplates::parse_template($c, $resource{id}, $resource{name}, delete $resource{yaml}); + $resource{template} = run_module_method('Utils::ProvisioningTemplates::parse_template',$c, $resource{id}, $resource{name}, delete $resource{yaml}); }; } } else { @@ -147,7 +147,7 @@ sub resource_from_item { if ($c->req->param('format')) { if (grep { $_ eq lc($c->req->param('format')); } qw(yml yaml)) { eval { - $resource{template} = NGCP::Panel::Utils::ProvisioningTemplates::dump_template($c, $resource{id}, $resource{name}, $resource{template}); + $resource{template} = run_module_method('Utils::ProvisioningTemplates::dump_template',$c, $resource{id}, $resource{name}, $resource{template}); }; } elsif ('json' eq lc($c->req->param('format'))) { $resource{template} = _template_as_json($resource{template}); @@ -183,7 +183,7 @@ sub item_by_id { return unless length($id); unless ($c->stash->{provisioning_templates}) { - NGCP::Panel::Utils::ProvisioningTemplates::load_template_map($c); + run_module_method('Utils::ProvisioningTemplates::load_template_map',$c); } my $item = $c->stash->{provisioning_templates}->{$id}; @@ -212,7 +212,7 @@ sub check_resource { my $reseller; $reseller = $c->model('DB')->resultset('resellers')->find( $resource->{reseller_id}) if $resource->{reseller_id}; - NGCP::Panel::Utils::ProvisioningTemplates::validate_template_name($c, + run_module_method('Utils::ProvisioningTemplates::validate_template_name',$c, $resource->{name},($old_resource ? $old_resource->{name} : undef), $reseller); }; @@ -224,12 +224,12 @@ sub check_resource { eval { if ($c->req->param('format')) { if (grep { $_ eq lc($c->req->param('format')); } qw(yml yaml)) { - $resource->{template} = NGCP::Panel::Utils::ProvisioningTemplates::parse_template($c, $resource->{id}, $resource->{name}, $resource->{template}); + $resource->{template} = run_module_method('Utils::ProvisioningTemplates::parse_template',$c, $resource->{id}, $resource->{name}, $resource->{template}); } elsif ('json' eq lc($c->req->param('format'))) { $resource->{template} = _template_from_json($resource->{template}); } } - NGCP::Panel::Utils::ProvisioningTemplates::validate_template($resource->{template}); + run_module_method('Utils::ProvisioningTemplates::validate_template',$resource->{template}); }; if ($@) { $self->error($c, HTTP_UNPROCESSABLE_ENTITY,trim($@)); diff --git a/lib/NGCP/Panel/Utils/Generic.pm b/lib/NGCP/Panel/Utils/Generic.pm index aeda3bf474..8f0b7dc9a2 100644 --- a/lib/NGCP/Panel/Utils/Generic.pm +++ b/lib/NGCP/Panel/Utils/Generic.pm @@ -8,9 +8,9 @@ use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); $VERSION = 1.00; @ISA = qw(Exporter); @EXPORT = (); -@EXPORT_OK = qw(is_int is_integer is_decimal merge compare is_false is_true get_inflated_columns_all hash2obj mime_type_to_extension extension_to_mime_type array_to_map escape_js escape_uri trim escape_search_string_pattern); -%EXPORT_TAGS = ( DEFAULT => [qw(&is_int &is_integer &is_decimal &merge &compare &is_false &is_true &mime_type_to_extension &extension_to_mime_type &array_to_map &escape_js &escape_uri &trim &escape_search_string_pattern)], - all => [qw(&is_int &is_integer &is_decimal &merge &compare &is_false &is_true &get_inflated_columns_all &hash2obj &mime_type_to_extension &extension_to_mime_type &array_to_map &escape_js &escape_uri &trim &escape_search_string_pattern)]); +@EXPORT_OK = qw(is_int is_integer is_decimal merge compare is_false is_true get_inflated_columns_all hash2obj mime_type_to_extension extension_to_mime_type array_to_map escape_js escape_uri trim escape_search_string_pattern run_module_method get_module_var); +%EXPORT_TAGS = ( DEFAULT => [qw(&is_int &is_integer &is_decimal &merge &compare &is_false &is_true &mime_type_to_extension &extension_to_mime_type &array_to_map &escape_js &escape_uri &trim &escape_search_string_pattern &run_module_method &get_module_var)], + all => [qw(&is_int &is_integer &is_decimal &merge &compare &is_false &is_true &get_inflated_columns_all &hash2obj &mime_type_to_extension &extension_to_mime_type &array_to_map &escape_js &escape_uri &trim &escape_search_string_pattern &run_module_method &get_module_var)]); use Hash::Merge; use Data::Compare qw//; @@ -263,4 +263,32 @@ sub escape_search_string_pattern { } +sub _load_module { + my $package_element = shift; + eval { + (my $module = $package_element) =~ s/::[a-zA-Z_0-9]+$//g; + (my $file = $module) =~ s|::|/|g; + require $file . '.pm'; + #$module->import(); + 1; + } or do { + die($@); + }; +} + +sub run_module_method { + my $method_name = 'NGCP::Panel::' . shift; + _load_module($method_name); + no strict "refs"; ## no critic (ProhibitNoStrict) + return $method_name->(@_); +} + +sub get_module_var { + my $var_name = 'NGCP::Panel::' . shift; + _load_module($var_name); + no strict "refs"; ## no critic (ProhibitNoStrict) + return @{$var_name} if wantarray; + return ${$var_name}; +} + 1;