X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_export%2Fprizm.pm;h=02e89c6d3bd63981f6ec08548b2304dc4c359da7;hb=06ff7e9531ea00cc23131661e2a95611456e248d;hp=c5eff2536f62617c9890da56cac23b042c8210e4;hpb=48cab6f96369ca68934796fc374d0e8a5eca8a2c;p=freeside.git diff --git a/FS/FS/part_export/prizm.pm b/FS/FS/part_export/prizm.pm index c5eff2536..02e89c6d3 100644 --- a/FS/FS/part_export/prizm.pm +++ b/FS/FS/part_export/prizm.pm @@ -1,18 +1,20 @@ package FS::part_export::prizm; -use vars qw(@ISA %info %options $DEBUG); +use vars qw(@ISA %info %options $DEBUG $me); use Tie::IxHash; -use FS::Record qw(fields); +use FS::Record qw(fields dbh); use FS::part_export; @ISA = qw(FS::part_export); -$DEBUG = 1; +$DEBUG = 0; +$me = '[' . __PACKAGE__ . ']'; tie %options, 'Tie::IxHash', 'url' => { label => 'Northbound url', default=>'https://localhost:8443/prizm/nbi' }, 'user' => { label => 'Northbound username', default=>'nbi' }, 'password' => { label => 'Password', default => '' }, 'ems' => { label => 'Full EMS', type => 'checkbox' }, + 'always_bam' => { label => 'Always activate/suspend authentication', type => 'checkbox' }, 'element_name_length' => { label => 'Size of siteName (best left blank)' }, ; @@ -87,7 +89,7 @@ EOT sub prizm_command { my ($self,$namespace,$method) = (shift,shift,shift); - eval "use Net::Prizm qw(CustomerInfo PrizmElement);"; + eval "use Net::Prizm 0.04 qw(CustomerInfo PrizmElement);"; die $@ if $@; my $prizm = new Net::Prizm ( @@ -103,7 +105,7 @@ sub prizm_command { sub queued_prizm_command { # subroutine my( $url, $user, $password, $namespace, $method, @args ) = @_; - eval "use Net::Prizm qw(CustomerInfo PrizmElement);"; + eval "use Net::Prizm 0.04 qw(CustomerInfo PrizmElement);"; die $@ if $@; my $prizm = new Net::Prizm ( @@ -124,6 +126,9 @@ sub queued_prizm_command { # subroutine sub _export_insert { my( $self, $svc ) = ( shift, shift ); + warn "$me: _export_insert called for export ". $self->exportnum. + " on service ". $svc->svcnum. "\n" + if $DEBUG; my $cust_main = $svc->cust_svc->cust_pkg->cust_main; @@ -150,6 +155,7 @@ sub _export_insert { my $pcustomer; if ($err_or_som->result->[0]) { $pcustomer = $err_or_som->result->[0]->customerId; + warn "$me: found customer $pcustomer in prizm\n" if $DEBUG; }else{ my $chashref = $cust_main->hashref; my $customerinfo = { @@ -176,6 +182,7 @@ sub _export_insert { unless ref($err_or_som); $pcustomer = $err_or_som->result; + warn "$me: added customer $pcustomer to prizm\n" if $DEBUG; } warn "multiple prizm customers found for $cust_main->custnum" if scalar(@$pcustomer) > 1; @@ -199,6 +206,32 @@ sub _export_insert { # } # } +# here we cope with a problem of prizm failing to insert for reason +# of duplicate mac addr, but doing so inconsistently... a race in prizm? + + $self->prizm_command( 'CustomerIfService', 'removeElementFromCustomer', + 0, + $cust_main->custnum, + 0, + $svc->mac_addr, + ); + + $err_or_som = $self->prizm_command( 'NetworkIfService', 'getPrizmElements', + [ 'MAC Address' ], + [ $svc->mac_addr ], + [ '=' ], + ); + if ( ref($err_or_som) && $err_or_som->result->[0] ) { # ignore errors + $self->prizm_command( 'NetworkIfService', 'deleteElement', + $err_or_som->result->[0], + 1, + ); + } +# end of coping + + my $performance_profile = $svc->performance_profile; + $performance_profile ||= $svc->cust_svc->cust_pkg->part_pkg->pkg; + my $element_name_length = 50; $element_name_length = $1 if $self->option('element_name_length') =~ /^\s*(\d+)\s*$/; @@ -209,13 +242,14 @@ sub _export_insert { 0, $element_name_length), $location, $contact, - sprintf("%032X", $svc->authkey), - $svc->cust_svc->cust_pkg->part_pkg->pkg, + sprintf("%032X", $svc->authkey || 0), + $performance_profile, $svc->vlan_profile, ($self->option('ems') ? 1 : 0 ), ); return $err_or_som unless ref($err_or_som); + warn "$me: added provisioned element to prizm\n" if $DEBUG; my (@names) = ('Management IP', 'GPS Latitude', @@ -243,6 +277,7 @@ sub _export_insert { ); return $err_or_som unless ref($err_or_som); + warn "$me: set element configuration\n" if $DEBUG; $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet', [ $element ], @@ -252,15 +287,17 @@ sub _export_insert { ); return $err_or_som unless ref($err_or_som); + warn "$me: set element vlan profile\n" if $DEBUG; $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet', [ $element ], - $svc->cust_svc->cust_pkg->part_pkg->pkg, + $performance_profile, 0, 1, ); return $err_or_som unless ref($err_or_som); + warn "$me: set element configset (performance profile)\n" if $DEBUG; $err_or_som = $self->prizm_command('NetworkIfService', 'activateNetworkElements', @@ -271,6 +308,7 @@ sub _export_insert { return $err_or_som unless ref($err_or_som); + warn "$me: activated element\n" if $DEBUG; $err_or_som = $self->prizm_command('CustomerIfService', 'addElementToCustomer', @@ -282,6 +320,7 @@ sub _export_insert { return $err_or_som unless ref($err_or_som); + warn "$me: added element to customer\n" if $DEBUG; ''; } @@ -289,6 +328,10 @@ sub _export_insert { sub _export_delete { my( $self, $svc ) = ( shift, shift ); + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + my $cust_pkg = $svc->cust_svc->cust_pkg; my $depend = []; @@ -298,7 +341,7 @@ sub _export_delete { 'svcnum' => $svc->svcnum, 'job' => 'FS::part_export::prizm::queued_prizm_command', }; - $queue->insert( + my $error = $queue->insert( ( map { $self->option($_) } qw( url user password ) ), 'CustomerIfService', @@ -307,10 +350,27 @@ sub _export_delete { $cust_pkg->custnum, 0, $svc->mac_addr, - ) && push @$depend, $queue->jobnum; + ); + + if ($error) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + push @$depend, $queue->jobnum; } - $self->queue_statuschange('deleteElement', $depend, $svc, 1); + my $err_or_queue = + $self->queue_statuschange('deleteElement', $depend, $svc, 1); + + unless (ref($err_or_queue)) { + $dbh->rollback if $oldAutoCommit; + return $err_or_queue; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + ''; } sub _export_replace { @@ -373,20 +433,93 @@ sub _export_replace { return $err_or_som unless ref($err_or_som); + my $performance_profile = $new->performance_profile; + $performance_profile ||= $new->cust_svc->cust_pkg->part_pkg->pkg; + + $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet', + [ $element ], + $performance_profile, + 0, + 1, + ); + return $err_or_som + unless ref($err_or_som); + ''; } sub _export_suspend { my( $self, $svc ) = ( shift, shift ); + my $depend = []; my $ems = $self->option('ems') ? 1 : 0; - $self->queue_statuschange('suspendNetworkElements', [], $svc, 1, $ems); + my $err_or_queue = ''; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + $err_or_queue = + $self->queue_statuschange('suspendNetworkElements', [], $svc, 1, $ems); + unless (ref($err_or_queue)) { + $dbh->rollback if $oldAutoCommit; + return $err_or_queue; + } + push @$depend, $err_or_queue->jobnum; + + if ($ems && $self->option('always_bam')) { + $err_or_queue = + $self->queue_statuschange('suspendNetworkElements', $depend, $svc, 1, 0); + unless (ref($err_or_queue)) { + $dbh->rollback if $oldAutoCommit; + return $err_or_queue; + } + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + ''; } sub _export_unsuspend { my( $self, $svc ) = ( shift, shift ); + my $depend = []; my $ems = $self->option('ems') ? 1 : 0; - $self->queue_statuschange('activateNetworkElements', [], $svc, 1, $ems); + my $err_or_queue = ''; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + if ($ems && $self->option('always_bam')) { + $err_or_queue = + $self->queue_statuschange('activateNetworkElements', [], $svc, 1, 0); + unless (ref($err_or_queue)) { + $dbh->rollback if $oldAutoCommit; + return $err_or_queue; + } + push @$depend, $err_or_queue->jobnum; + } + + $err_or_queue = + $self->queue_statuschange('activateNetworkElements', $depend, $svc, 1, $ems); + unless (ref($err_or_queue)) { + $dbh->rollback if $oldAutoCommit; + return $err_or_queue; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + ''; +} + +sub export_links { + my( $self, $svc, $arrayref ) = ( shift, shift, shift ); + + push @$arrayref, + 'SM'; + + ''; } sub queue_statuschange { @@ -398,7 +531,7 @@ sub queue_statuschange { 'svcnum' => $svc->svcnum, 'job' => 'FS::part_export::prizm::statuschange', }; - $queue->insert( + my $error = $queue->insert( ( map { $self->option($_) } qw( url user password ) ), $method, @@ -406,18 +539,19 @@ sub queue_statuschange { @args, ); - if ($queue->jobnum) { # successful insertion + unless ($error) { # successful insertion foreach my $job ( @$jobs ) { - $queue->depend_insert($job); + $error ||= $queue->depend_insert($job); } } + $error or $queue; } sub statuschange { # subroutine my( $url, $user, $password, $method, $mac_addr, @args) = @_; - eval "use Net::Prizm qw(CustomerInfo PrizmElement);"; + eval "use Net::Prizm 0.04 qw(CustomerInfo PrizmElement);"; die $@ if $@; my $prizm = new Net::Prizm (