From a6527bb4c7ee61c17b0276b2691bd150383baa86 Mon Sep 17 00:00:00 2001 From: Irina Peshinskaya Date: Thu, 30 Oct 2014 05:34:52 +0200 Subject: [PATCH] MT#9177 API for autoprov. Not tested yet. --- .../Panel/Controller/API/PbxDeviceModels.pm | 4 + lib/NGCP/Panel/Controller/API/PbxDevices.pm | 1 + lib/NGCP/Panel/Controller/Device.pm | 42 ++------ lib/NGCP/Panel/Form/Device/ModelAPI.pm | 2 +- lib/NGCP/Panel/Role/API/PbxDeviceModels.pm | 3 + lib/NGCP/Panel/Utils/DeviceBootstrap.pm | 99 ++++++++++++------- 6 files changed, 79 insertions(+), 72 deletions(-) diff --git a/lib/NGCP/Panel/Controller/API/PbxDeviceModels.pm b/lib/NGCP/Panel/Controller/API/PbxDeviceModels.pm index b7fa9f6413..4dd5446449 100644 --- a/lib/NGCP/Panel/Controller/API/PbxDeviceModels.pm +++ b/lib/NGCP/Panel/Controller/API/PbxDeviceModels.pm @@ -9,6 +9,7 @@ use HTTP::Status qw(:constants); use MooseX::ClassAttribute qw(class_has); use Data::Dumper; use NGCP::Panel::Utils::DateTime; +use NGCP::Panel::Utils::DeviceBootstrap; BEGIN { extends 'Catalyst::Controller::ActionRole'; } require Catalyst::ActionRole::ACL; require Catalyst::ActionRole::CheckTrailingSlash; @@ -257,7 +258,10 @@ sub POST :Allow { } try { + my $sync_parameters = NGCP::Panel::Utils::DeviceBootstrap::devmod_sync_parameters_prefetch($c, undef, $resource); $item = $c->model('DB')->resultset('autoprov_devices')->create($resource); + NGCP::Panel::Utils::DeviceBootstrap::devmod_sync_parameters_store($c, $item, $sync_parameters); + foreach my $range(@{ $linerange }) { unless(ref $range eq "HASH") { $c->log->error("all elements in linerange must be hashes, but this is " . ref $range . ": " . Dumper $range); diff --git a/lib/NGCP/Panel/Controller/API/PbxDevices.pm b/lib/NGCP/Panel/Controller/API/PbxDevices.pm index 41d378b951..fe80324f2f 100644 --- a/lib/NGCP/Panel/Controller/API/PbxDevices.pm +++ b/lib/NGCP/Panel/Controller/API/PbxDevices.pm @@ -8,6 +8,7 @@ use HTTP::Headers qw(); use HTTP::Status qw(:constants); use MooseX::ClassAttribute qw(class_has); use NGCP::Panel::Utils::DateTime; +use NGCP::Panel::Utils::DeviceBootstrap; BEGIN { extends 'Catalyst::Controller::ActionRole'; } require Catalyst::ActionRole::ACL; require Catalyst::ActionRole::CheckTrailingSlash; diff --git a/lib/NGCP/Panel/Controller/Device.pm b/lib/NGCP/Panel/Controller/Device.pm index 559d13e77c..dc95a257a4 100644 --- a/lib/NGCP/Panel/Controller/Device.pm +++ b/lib/NGCP/Panel/Controller/Device.pm @@ -8,6 +8,7 @@ use NGCP::Panel::Form::Device::Firmware; use NGCP::Panel::Form::Device::Config; use NGCP::Panel::Form::Device::Profile; use NGCP::Panel::Utils::Navigation; +use NGCP::Panel::Utils::DeviceBootstrap; BEGIN { extends 'Catalyst::Controller'; } @@ -178,9 +179,9 @@ sub devmod_create :Chained('base') :PathPart('model/create') :Args(0) :Does(ACL) } my $linerange = delete $form->params->{linerange}; - my $sync_parameters = $c->forward('devmod_sync_parameters_prefetch',[$schema,undef,$form->params] ); + my $sync_parameters = NGCP::Panel::Utils::DeviceBootstrap::devmod_sync_parameters_prefetch($c, undef, $form->params); my $devmod = $schema->resultset('autoprov_devices')->create($form->params); - $c->forward('devmod_sync_parameters_store',[$schema,$devmod,$sync_parameters] ); + NGCP::Panel::Utils::DeviceBootstrap::devmod_sync_parameters_store($c, $devmod, $sync_parameters); foreach my $range(@{ $linerange }) { delete $range->{id}; @@ -344,15 +345,15 @@ sub devmod_edit :Chained('devmod_base') :PathPart('edit') :Args(0) :Does(ACL) :A delete $form->params->{mac_image_type}; } - my $linerange = delete $form->params->{'linerange'}; - my $sync_parameters = $c->forward('devmod_sync_parameters_prefetch',[$schema,$c->stash->{devmod},$form->params] ); + my $linerange = delete $form->params->{linerange}; + my $sync_parameters = NGCP::Panel::Utils::DeviceBootstrap::devmod_sync_parameters_prefetch($c, $c->stash->{devmod}, $form->params); $c->stash->{devmod}->update($form->params); $schema->resultset('autoprov_sync')->search_rs({ device_id => $c->stash->{devmod}->id, })->delete; - $c->forward('devmod_sync_parameters_store',[$schema,$c->stash->{devmod},$sync_parameters] ); + NGCP::Panel::Utils::DeviceBootstrap::devmod_sync_parameters_store($c, $c->stash->{devmod}, $sync_parameters); my @existing_range = (); my $range_rs = $c->stash->{devmod}->autoprov_device_line_ranges; @@ -432,37 +433,6 @@ sub devmod_edit :Chained('devmod_base') :PathPart('edit') :Args(0) :Does(ACL) :A form => $form, ); } -sub devmod_sync_parameters_prefetch :Private { - my($self,$c,$schema,$devmod,$params) = @_; - #$schema ||= $c->model('DB'); - my $bootstrap_method = $params->{'bootstrap_method'}; - my $bootstrap_params_rs = $schema->resultset('autoprov_sync_parameters')->search_rs({ - 'me.bootstrap_method' => $bootstrap_method, - }); - my @parameters = (); - foreach ($bootstrap_params_rs->all){ - my $sync_parameter = { - device_id => $devmod ? $devmod->id : undef, - parameter_id => $_->id, - parameter_value => delete $params->{'bootstrap_config_'.$bootstrap_method.'_'.$_->parameter_name}, - }; - push @parameters,$sync_parameter; - } - foreach (keys %$params){ - if($_ =~/^bootstrap_config_/i){ - delete $params->{$_}; - } - } - return \@parameters; -} -sub devmod_sync_parameters_store :Private { - my($self,$c,$schema,$devmod,$sync_parameters) = @_; - foreach my $sync_parameter (@$sync_parameters){ - $sync_parameter->{device_id} ||= $devmod ? $devmod->id : undef - $schema->resultset('autoprov_sync')->create($sync_parameter); - } -} - sub devmod_download_frontimage_by_profile :Chained('devprof_base') :PathPart('frontimage') :Args(0) { my ($self, $c) = @_; diff --git a/lib/NGCP/Panel/Form/Device/ModelAPI.pm b/lib/NGCP/Panel/Form/Device/ModelAPI.pm index dce3d7b365..614c8c686c 100644 --- a/lib/NGCP/Panel/Form/Device/ModelAPI.pm +++ b/lib/NGCP/Panel/Form/Device/ModelAPI.pm @@ -7,7 +7,7 @@ use Moose::Util::TypeConstraints; has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/reseller vendor model linerange sync_uri sync_method sync_params/], + render_list => [qw/reseller vendor model linerange bootstrap_method bootstrap_config_http_sync_uri bootstrap_config_http_sync_method bootstrap_config_http_sync_params/], ); override 'field_list' => sub { diff --git a/lib/NGCP/Panel/Role/API/PbxDeviceModels.pm b/lib/NGCP/Panel/Role/API/PbxDeviceModels.pm index 1cc01cb86b..01a2a0c293 100644 --- a/lib/NGCP/Panel/Role/API/PbxDeviceModels.pm +++ b/lib/NGCP/Panel/Role/API/PbxDeviceModels.pm @@ -15,6 +15,7 @@ use JSON qw(); use File::Type; use Data::Dumper; use NGCP::Panel::Form::Device::ModelAPI; +use NGCP::Panel::Utils::DeviceBootstrap; sub get_form { my ($self, $c) = @_; @@ -156,7 +157,9 @@ sub update_item { $resource->{mac_image_type} = $ft->mime_type($resource->{mac_image}); } + my $sync_parameters = NGCP::Panel::Utils::DeviceBootstrap::devmod_sync_parameters_prefetch($c, $item, $resource); $item->update($resource); + NGCP::Panel::Utils::DeviceBootstrap::devmod_sync_parameters_store($c, $item, $sync_parameters); my @existing_range = (); my $range_rs = $item->autoprov_device_line_ranges; diff --git a/lib/NGCP/Panel/Utils/DeviceBootstrap.pm b/lib/NGCP/Panel/Utils/DeviceBootstrap.pm index b836cdffa9..5826a783b8 100644 --- a/lib/NGCP/Panel/Utils/DeviceBootstrap.pm +++ b/lib/NGCP/Panel/Utils/DeviceBootstrap.pm @@ -7,41 +7,6 @@ use Net::HTTPS::Any qw/https_post/; use RPC::XML::Parser::LibXML; use Data::Dumper; -sub bootstrap_config{ - my($c, $fdev, $contract) = @_; - - my $err = 0; - my $device = $fdev->profile->config->device; - - if(!$contract){ - $contract = $c->stash->{contract}; - } - my $credentials = $contract->vendor_credentials->search_rs({ - 'me.vendor' => lc($device->vendor), - })->first; - if($credentials){ - my $vendor_credentials = { map { $_ => $credentials->$_ } qw/user password/}; - - my $sync_params_rs = $device->autoprov_sync->search_rs({ - 'autoprov_sync_parameters.parameter_name' => 'sync_params', - },{ - join => 'autoprov_sync_parameters', - select => ['me.parameter_value'], - }); - my $sync_params = $sync_params_rs->first ? $sync_params_rs->first->parameter_value : ''; - NGCP::Panel::Utils::DeviceBootstrap::bootstrap({ - c => $c, - mac => $fdev->identifier, - bootstrap_method => $device->bootstrap_method, - redirect_uri_params => $sync_params, - credentials => $vendor_credentials, - }); - }else{ - $err = 1; - } - return $err; -} - sub bootstrap{ my ($params) = @_; my $c = $params->{c}; @@ -150,7 +115,71 @@ sub get_bootstrap_uri{ $uri .= $uri_params; return $uri; } +sub bootstrap_config{ + my($c, $fdev, $contract) = @_; + my $err = 0; + my $device = $fdev->profile->config->device; + + if(!$contract){ + $contract = $c->stash->{contract}; + } + my $credentials = $contract->vendor_credentials->search_rs({ + 'me.vendor' => lc($device->vendor), + })->first; + if($credentials){ + my $vendor_credentials = { map { $_ => $credentials->$_ } qw/user password/}; + + my $sync_params_rs = $device->autoprov_sync->search_rs({ + 'autoprov_sync_parameters.parameter_name' => 'sync_params', + },{ + join => 'autoprov_sync_parameters', + select => ['me.parameter_value'], + }); + my $sync_params = $sync_params_rs->first ? $sync_params_rs->first->parameter_value : ''; + NGCP::Panel::Utils::DeviceBootstrap::bootstrap({ + c => $c, + mac => $fdev->identifier, + bootstrap_method => $device->bootstrap_method, + redirect_uri_params => $sync_params, + credentials => $vendor_credentials, + }); + }else{ + $err = 1; + } + return $err; +} +sub devmod_sync_parameters_prefetch{ + my($c,$devmod,$params) = @_; + my $schema = $c->model('DB'); + my $bootstrap_method = $params->{'bootstrap_method'}; + my $bootstrap_params_rs = $schema->resultset('autoprov_sync_parameters')->search_rs({ + 'me.bootstrap_method' => $bootstrap_method, + }); + my @parameters = (); + foreach ($bootstrap_params_rs->all){ + my $sync_parameter = { + device_id => $devmod ? $devmod->id : undef, + parameter_id => $_->id, + parameter_value => delete $params->{'bootstrap_config_'.$bootstrap_method.'_'.$_->parameter_name}, + }; + push @parameters,$sync_parameter; + } + foreach (keys %$params){ + if($_ =~/^bootstrap_config_/i){ + delete $params->{$_}; + } + } + return \@parameters; +} +sub devmod_sync_parameters_store { + my($c,$devmod,$sync_parameters) = @_; + my $schema = $c->model('DB'); + foreach my $sync_parameter (@$sync_parameters){ + $sync_parameter->{device_id} ||= $devmod ? $devmod->id : undef + $schema->resultset('autoprov_sync')->create($sync_parameter); + } +} 1; =head1 NAME