X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_export%2Fsaisei.pm;h=f409046a5ec1871ef3c1ed40bcff42dd9f6ba244;hp=c79f79dac086c833aa97e3e43da53b0f68c9fa27;hb=a9056b16e215e7ac8da9144106e34918cced951f;hpb=7ecaf988ed810746534bf85abde34022f2b5d6b2 diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm index c79f79dac..f409046a5 100644 --- a/FS/FS/part_export/saisei.pm +++ b/FS/FS/part_export/saisei.pm @@ -9,6 +9,7 @@ use MIME::Base64; use REST::Client; use Data::Dumper; use FS::Conf; +use Carp qw(carp); =pod @@ -200,12 +201,28 @@ sub _export_insert { my $accesspoint = process_sector($self, $sector_opt); return $self->api_error if $self->{'__saisei_error'}; +## get custnum and pkgpart from cust_pkg for virtual access point + my $cust_pkg = FS::Record::qsearchs({ + 'table' => 'cust_pkg', + 'hashref' => { 'pkgnum' => $svc_broadband->{Hash}->{pkgnum}, }, + }); + my $virtual_ap_name = $cust_pkg->{Hash}->{custnum}.'_'.$cust_pkg->{Hash}->{pkgpart}.'_'.$svc_broadband->{Hash}->{speed_down}.'_'.$svc_broadband->{Hash}->{speed_up}; + + my $virtual_ap_opt = { + 'virtual_name' => $virtual_ap_name, + 'sector_name' => $sector_name, + 'virtual_uprate_limit' => $svc_broadband->{Hash}->{speed_up}, + 'virtual_downrate_limit' => $svc_broadband->{Hash}->{speed_down}, + }; + my $virtual_ap = process_virtual_ap($self, $virtual_ap_opt); + return $self->api_error if $self->{'__saisei_error'}; + ## tie host to user add sector name as access point. $self->api_add_host_to_user( $user->{collection}->[0]->{name}, $rateplan->{collection}->[0]->{name}, $svc_broadband->{Hash}->{ip_addr}, - $accesspoint->{collection}->[0]->{name}, + $virtual_ap->{collection}->[0]->{name}, ) unless $self->{'__saisei_error'}; } @@ -215,8 +232,8 @@ sub _export_insert { sub _export_replace { my ($self, $svc_broadband) = @_; - $self->_export_insert($svc_broadband); - return ''; + my $error = $self->_export_insert($svc_broadband); + return $error; } sub _export_delete { @@ -245,6 +262,12 @@ sub _export_unsuspend { sub export_partsvc { my ($self, $svc_part) = @_; + if ( $FS::svc_Common::noexport_hack ) { + carp 'export_partsvc() suppressed by noexport_hack' + if $self->option('debug'); + return; + } + my $fcc_477_speeds; if ($svc_part->{Hash}->{svc_broadband__speed_down} eq "down" || $svc_part->{Hash}->{svc_broadband__speed_up} eq "up") { for my $type (qw( down up )) { @@ -296,6 +319,12 @@ sub export_partsvc { sub export_tower_sector { my ($self, $tower) = @_; + if ( $FS::svc_Common::noexport_hack ) { + carp 'export_tower_sector() suppressed by noexport_hack' + if $self->option('debug'); + return; + } + #modify tower or create it. my $tower_name = $tower->{Hash}->{towername}; $tower_name =~ s/\s/_/g; @@ -307,6 +336,7 @@ sub export_tower_sector { }; my $tower_access_point = process_tower($self, $tower_opt); + return $tower_access_point if $tower_access_point->{error}; #get list of all access points my $hash_opt = { @@ -327,6 +357,7 @@ sub export_tower_sector { 'modify_existing' => '1', # modify an existing access point with this info }; my $sector_access_point = process_sector($self, $sector_opt); + return $sector_access_point if $sector_access_point->{error}; } return $self->api_error; @@ -370,14 +401,14 @@ sub api_call { warn "Calling $method on http://" .$self->{Hash}->{machine}.':'.$self->option('port') - ."/rest/stm/configurations/running/$path\n" if $self->option('debug'); + ."/rest/top/configurations/running/$path\n" if $self->option('debug'); my $data = encode_json($params) if keys %{ $params }; my $client = REST::Client->new(); $client->addHeader("Authorization", "Basic ".encode_base64($auth_info)); $client->setHost('http://'.$self->{Hash}->{machine}.':'.$self->option('port')); - $client->$method('/rest/stm/configurations/running'.$path, $data, { "Content-type" => 'application/json'}); + $client->$method('/rest/top/configurations/running'.$path, $data, { "Content-type" => 'application/json'}); warn "Response Code is ".$client->responseCode()."\n" if $self->option('debug'); @@ -390,9 +421,25 @@ sub api_call { return; } } + elsif ($client->responseCode() eq '404') { + eval { $result = decode_json($client->responseContent()) }; + unless ($result) { + $self->{'__saisei_error'} = "Error decoding json: $@"; + return; + } + ## check if message is for empty hash. + my($does_not_exist) = $result->{message} =~ /'(.*)' does not exist$/; + $self->{'__saisei_error'} = "Error ".$result->{message} unless $does_not_exist; + warn "Response Content is\n".$client->responseContent."\n" if ($self->option('debug') && !$does_not_exist); + return; + } + elsif ($client->responseCode() eq '500') { + $self->{'__saisei_error'} = "Can't connect to host during $method , received responce code: " . $client->responseCode() . " and message: " . $client->responseContent(); + warn "Response Content is\n".$client->responseContent."\n" if $self->option('debug'); + return; + } else { - $self->{'__saisei_error'} = "Bad response from server during $method: " . $client->responseContent() - unless ($method eq "GET"); + $self->{'__saisei_error'} = "Bad response from server during $method , received responce code: " . $client->responseCode() . " and message: " . $client->responseContent(); warn "Response Content is\n".$client->responseContent."\n" if $self->option('debug'); return; } @@ -490,7 +537,7 @@ sub api_get_host { my $get_host = $self->api_call("GET", "/hosts/$ip"); - return if $self->api_error; + return $self->api_error if $self->api_error; return $get_host; } @@ -616,7 +663,6 @@ Creates a access point. sub api_create_accesspoint { my ($self,$accesspoint, $upratelimit, $downratelimit) = @_; - # this has not been tested, but should work, if needed. my $new_accesspoint = $self->api_call( "PUT", "/access_points/$accesspoint", @@ -745,6 +791,11 @@ sub api_delete_host_to_user { sub process_tower { my ($self, $opt) = @_; + if (!$opt->{tower_uprate_limit} || !$opt->{tower_downrate_limit}) { + $self->{'__saisei_error'} = "Can not export tower, no up or down rates attached to tower"; + return { error => $self->api_error, }; + } + my $existing_tower_ap; my $tower_name = $opt->{tower_name}; @@ -757,14 +808,14 @@ sub process_tower { '', # tower does not have a uplink on sectors. $opt->{tower_uprate_limit}, $opt->{tower_downrate_limit}, - ) if $existing_tower_ap && $opt->{modify_existing}; + ) if $existing_tower_ap->{collection} && $opt->{modify_existing}; #if tower does not exist as an access point create it. $self->api_create_accesspoint( $tower_name, $opt->{tower_uprate_limit}, - $opt->{tower_downrate_limit} - ) unless $existing_tower_ap; + $opt->{tower_downrate_limit}, + ) unless $existing_tower_ap->{collection}; my $accesspoint = $self->api_get_accesspoint($tower_name); @@ -774,6 +825,11 @@ sub process_tower { sub process_sector { my ($self, $opt) = @_; + if (!$opt->{sector_uprate_limit} || !$opt->{sector_downrate_limit}) { + $self->{'__saisei_error'} = "Can not export sector, no up or down rates attached to sector"; + return { error => $self->api_error, }; + } + my $existing_sector_ap; my $sector_name = $opt->{sector_name}; @@ -804,6 +860,44 @@ sub process_sector { return $accesspoint; } +sub process_virtual_ap { + my ($self, $opt) = @_; + + my $existing_virtual_ap; + my $virtual_name = $opt->{virtual_name}; + + #check if virtual_ap has been set up as an access point. + $existing_virtual_ap = $self->api_get_accesspoint($virtual_name); + + # modify the existing virtual accesspoint if changing it. this should never happen + $self->api_modify_existing_accesspoint ( + $virtual_name, + $opt->{sector_name}, + $opt->{virtual_uprate_limit}, + $opt->{virtual_downrate_limit}, + ) if $existing_virtual_ap && $opt->{modify_existing}; + + #if virtual ap does not exist as an access point create it. + $self->api_create_accesspoint( + $virtual_name, + $opt->{virtual_uprate_limit}, + $opt->{virtual_downrate_limit}, + ) unless $existing_virtual_ap; + + my $update_sector; + if ($existing_virtual_ap && (ref $existing_virtual_ap->{collection}->[0]->{uplink} eq "HASH") && ($existing_virtual_ap->{collection}->[0]->{uplink}->{link}->{name} ne $opt->{sector_name})) { + $update_sector = 1; + } + + # Attach newly created virtual ap to tower sector ap or if sector has changed. + $self->api_modify_accesspoint($virtual_name, $opt->{sector_name}) unless ($self->{'__saisei_error'} || ($existing_virtual_ap && !$update_sector)); + + # set access point to existing one or newly created one. + my $accesspoint = $existing_virtual_ap ? $existing_virtual_ap : $self->api_get_accesspoint($virtual_name); + + return $accesspoint; +} + sub export_provisioned_services { my $job = shift; my $param = shift; @@ -836,7 +930,11 @@ sub export_provisioned_services { foreach my $svc (@svcs) { if ($status{$process_count}) { my $s = $status{$process_count}; $job->update_statustext($s); } ## check if service exists as host if not export it. - _export_insert($part_export,$svc) unless api_get_host($part_export, $svc->{Hash}->{ip_addr}); + my $host = api_get_host($part_export, $svc->{Hash}->{ip_addr}); + die $host->{message} if $host->{message}; + warn "Exporting service ".$svc->{Hash}->{ip_addr}."\n" if ($part_export->option('debug')); + my $export_error = _export_insert($part_export,$svc) unless $host->{collection}; + die $export_error if $export_error; $process_count++; }