label => 'Export provisioned services',
description => 'will export provisioned services of part service with Saisei export attached.',
html_label => '<b>Export provisioned services attached to this export.</b>',
+ error_url => '/edit/part_export.cgi?',
+ success_message => 'Saisei export of provisioned services successful',
},
;
tower.up_rate_limit as tower_upratelimit,
tower.down_rate_limit as tower_downratelimit,
tower_sector.sectorname,
+ tower_sector.towernum,
tower_sector.up_rate_limit as sector_upratelimit,
tower_sector.down_rate_limit as sector_downratelimit ',
'addl_from' => 'LEFT JOIN tower USING ( towernum )',
my $tower_opt = {
'tower_name' => $tower_name,
+ 'tower_num' => $tower_sector->{Hash}->{towernum},
'tower_uprate_limit' => $tower_sector->{Hash}->{tower_upratelimit},
'tower_downrate_limit' => $tower_sector->{Hash}->{tower_downratelimit},
};
my $sector_opt = {
'tower_name' => $tower_name,
+ 'tower_num' => $tower_sector->{Hash}->{towernum},
'sector_name' => $sector_name,
'sector_uprate_limit' => $tower_sector->{Hash}->{sector_upratelimit},
'sector_downrate_limit' => $tower_sector->{Hash}->{sector_downratelimit},
+ 'rateplan' => $rateplan_name,
};
my $accesspoint = process_sector($self, $sector_opt);
return $self->api_error if $self->{'__saisei_error'};
$tower_name =~ s/\s/_/g;
my $tower_opt = {
'tower_name' => $tower_name,
+ 'tower_num' => $tower->{Hash}->{towernum},
'tower_uprate_limit' => $tower->{Hash}->{up_rate_limit},
'tower_downrate_limit' => $tower->{Hash}->{down_rate_limit},
'modify_existing' => '1', # modify an existing access point with this info
$sector_name =~ s/\s/_/g;
my $sector_opt = {
'tower_name' => $tower_name,
+ 'tower_num' => $tower_sector->{Hash}->{towernum},
'sector_name' => $sector_name,
'sector_uprate_limit' => $tower_sector->{Hash}->{up_rate_limit},
'sector_downrate_limit' => $tower_sector->{Hash}->{down_rate_limit},
if ($client->responseCode() eq '200' || $client->responseCode() eq '201') {
eval { $result = decode_json($client->responseContent()) };
unless ($result) {
- $self->{'__saisei_error'} = "Error decoding json from Saisei";
+ $self->{'__saisei_error'} = "There was an error decoding the JSON data from Saisei. Bad JSON data logged in error log if debug option was set.";
warn "Saisei RC 201 Response Content is not json\n".$client->responseContent()."\n" if $self->option('debug');
return;
}
elsif ($client->responseCode() eq '404') {
eval { $result = decode_json($client->responseContent()) };
unless ($result) {
- $self->{'__saisei_error'} = "Error decoding json from Saisei";
+ $self->{'__saisei_error'} = "There was an error decoding the JSON data from Saisei. Bad JSON data logged in error log if debug option was set.";
warn "Saisei RC 404 Response Content is not json\n".$client->responseContent()."\n" if $self->option('debug');
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;
+ $self->{'__saisei_error'} = "Saisei Error: ".$result->{message} unless $does_not_exist;
warn "Saisei 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();
+ $self->{'__saisei_error'} = "Could not connect to the Saisei export host machine (".$self->{Hash}->{machine}.':'.$self->option('port').") during $method , we received the responce code: " . $client->responseCode();
warn "Saisei Response Content is\n".$client->responseContent."\n" if $self->option('debug');
return;
}
else {
- $self->{'__saisei_error'} = "Bad response from server during $method , received responce code: " . $client->responseCode() . " and message: " . $client->responseContent();
+ $self->{'__saisei_error'} = "Received Bad response from server during $method , we received responce code: " . $client->responseCode();
warn "Saisei Response Content is\n".$client->responseContent."\n" if $self->option('debug');
return;
}
my $get_policies = $self->api_call("GET", '/policies/?token=1&order=name&start=0&limit=20&select=name%2Cpercent_rate%2Cassured%2C');
return if $self->api_error;
- $self->{'__saisei_error'} = "Did not receive any global policies"
+ $self->{'__saisei_error'} = "Did not receive any global policies from Saisei."
unless $get_policies;
return $get_policies->{collection};
sub api_create_rateplan {
my ($self, $svc, $rateplan) = @_;
- $self->{'__saisei_error'} = "No downrate listed for service $rateplan" if !$svc->{Hash}->{speed_down};
- $self->{'__saisei_error'} = "No uprate listed for service $rateplan" if !$svc->{Hash}->{speed_up};
+ $self->{'__saisei_error'} = "There is no download speed set for the service !--service,".$svc->svcnum.",".$rateplan."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a download speed set for them." if !$svc->{Hash}->{speed_down};
+ $self->{'__saisei_error'} = "There is no upload speed set for the service !--service,".$svc->svcnum.",".$rateplan."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a upload speed set for them." if !$svc->{Hash}->{speed_up};
my $new_rateplan = $self->api_call(
"PUT",
},
) unless $self->{'__saisei_error'};
- $self->{'__saisei_error'} = "Rate Plan not created"
+ $self->{'__saisei_error'} = "Saisei could not create the rate plan $rateplan."
unless ($new_rateplan || $self->{'__saisei_error'});
return $new_rateplan;
},
);
- $self->{'__saisei_error'} = "Rate Plan not modified after create"
+ $self->{'__saisei_error'} = "Saisei could not modify the rate plan $rateplan_name after it was created."
unless ($modified_rateplan || $self->{'__saisei_error'}); # should never happen
}
sub api_modify_existing_rateplan {
my ($self,$svc,$rateplan_name) = @_;
+ $self->{'__saisei_error'} = "There is no download speed set for the service !--service,".$svc->svcnum.",".$rateplan_name."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a download speed set for them." if !$svc->{Hash}->{speed_down};
+ $self->{'__saisei_error'} = "There is no upload speed set for the service !--service,".$svc->svcnum.",".$rateplan_name."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a upload speed set for them." if !$svc->{Hash}->{speed_up};
+
my $modified_rateplan = $self->api_call(
"PUT",
"/rate_plans/$rateplan_name",
},
);
- $self->{'__saisei_error'} = "Rate Plan not modified"
+ $self->{'__saisei_error'} = "Saisei could not modify the rate plan $rateplan_name."
unless ($modified_rateplan || $self->{'__saisei_error'}); # should never happen
return;
},
);
- $self->{'__saisei_error'} = "User not created"
+ $self->{'__saisei_error'} = "Saisei could not create the user $user"
unless ($new_user || $self->{'__saisei_error'}); # should never happen
return $new_user;
},
);
- $self->{'__saisei_error'} = "Access point not created"
+ $self->{'__saisei_error'} = "Saisei could not create the access point $accesspoint"
unless ($new_accesspoint || $self->{'__saisei_error'}); # should never happen
return;
},
);
- $self->{'__saisei_error'} = "Rate Plan not modified"
+ $self->{'__saisei_error'} = "Saisei could not modify the access point $accesspoint after it was created."
unless ($modified_accesspoint || $self->{'__saisei_error'}); # should never happen
return;
},
);
- $self->{'__saisei_error'} = "Access point not modified"
+ $self->{'__saisei_error'} = "Saisei could not modify the access point $accesspoint."
unless ($modified_accesspoint || $self->{'__saisei_error'}); # should never happen
return;
},
);
- $self->{'__saisei_error'} = "Host not created"
+ $self->{'__saisei_error'} = "Saisei could not create the host $ip"
unless ($new_host || $self->{'__saisei_error'}); # should never happen
return $new_host;
my $default_rate_plan = $self->api_call("GET", '?token=1&select=default_rate_plan');
return if $self->api_error;
- $self->{'__saisei_error'} = "Did not receive a default rate plan"
+ $self->{'__saisei_error'} = "Can not delete the host as Saisei did not return a default rate plan. Please make sure Saisei has a default rateplan setup."
unless $default_rate_plan;
my $default_rateplan_name = $default_rate_plan->{collection}->[0]->{default_rate_plan}->{link}->{name};
},
);
- $self->{'__saisei_error'} = "Host not created"
+ $self->{'__saisei_error'} = "Saisei could not delete the host $ip"
unless ($delete_host || $self->{'__saisei_error'}); # should never happen
return $delete_host;
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";
+ $self->{'__saisei_error'} = "Could not export tower !--tower,".$opt->{tower_num}.",".$opt->{tower_name}."--! because there was no up or down rates attached to the tower. Saisei requires a up and down rate be attached to each tower.";
return { error => $self->api_error, };
}
sub process_sector {
my ($self, $opt) = @_;
+ if (!$opt->{sector_name} || $opt->{sector_name} eq '_default') {
+ $self->{'__saisei_error'} = "No sector attached to Tower (".$opt->{tower_name}.") for service ".$opt->{'rateplan'}.". Saisei requires a tower sector to be attached to each service that is exported to Saisei.";
+ return { error => $self->api_error, };
+ }
+
if (!$opt->{sector_uprate_limit} || !$opt->{sector_downrate_limit}) {
- $self->{'__saisei_error'} = "Can not export sector, no up or down rates attached to sector";
+ $self->{'__saisei_error'} = "Could not export sector !--tower,".$opt->{tower_num}.",".$opt->{sector_name}."--! because there was no up or down rates attached to the sector. Saisei requires a up and down rate be attached to each sector.";
return { error => $self->api_error, };
}
return $accesspoint;
}
+=head2 require_tower_and_sector
+
+sets whether the service export requires a sector with it's tower.
+
+=cut
+
+sub require_tower_and_sector {
+ 1;
+}
+
+sub required_fields {
+ my @fields = ('svc_broadband__ip_addr_required', 'svc_broadband__speed_up_required', 'svc_broadband__speed_down_required', 'svc_broadband__sectornum_required');
+ return @fields;
+}
+
sub process_virtual_ap {
my ($self, $opt) = @_;
my $param = shift;
my $part_export = FS::Record::qsearchs('part_export', { 'exportnum' => $param->{export_provisioned_services_exportnum}, } )
- or die "unknown exportnum $param->{export_provisioned_services_exportnum}";
+ or die "You are trying to use an unknown exportnum $param->{export_provisioned_services_exportnum}. This export does not exist.\n";
bless $part_export;
my @svcparts = FS::Record::qsearch({
if ($status{$process_count}) { my $s = $status{$process_count}; $job->update_statustext($s); }
## check if service exists as host if not export it.
my $host = api_get_host($part_export, $svc->{Hash}->{ip_addr});
- die $host->{message} if $host->{message};
+ die ("Please double check your credentials as ".$host->{message}."\n") 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;
+ if ($export_error) {
+ warn "Error exporting service ".$svc->{Hash}->{ip_addr}."\n" if ($part_export->option('debug'));
+ die ("$export_error\n");
+ }
$process_count++;
}