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>',
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>',
-Provision the service, making sure to enter the IP address associated with this service and select the tower and sector for it's access point.
+Provision the service, making sure to enter the IP address associated with this service, the upload and download speed are correct, and select the tower and sector for it's access point.
This provisioned service will then be exported as a host to Saisei.
<P>
Unprovisioning this service will set the host entry at Saisei to the default rate plan with the user and access point set to <i>none</i>.
This provisioned service will then be exported as a host to Saisei.
<P>
Unprovisioning this service will set the host entry at Saisei to the default rate plan with the user and access point set to <i>none</i>.
tower.up_rate_limit as tower_upratelimit,
tower.down_rate_limit as tower_downratelimit,
tower_sector.sectorname,
tower.up_rate_limit as tower_upratelimit,
tower.down_rate_limit as tower_downratelimit,
tower_sector.sectorname,
tower_sector.up_rate_limit as sector_upratelimit,
tower_sector.down_rate_limit as sector_downratelimit ',
'addl_from' => 'LEFT JOIN tower USING ( towernum )',
tower_sector.up_rate_limit as sector_upratelimit,
tower_sector.down_rate_limit as sector_downratelimit ',
'addl_from' => 'LEFT JOIN tower USING ( towernum )',
'tower_uprate_limit' => $tower_sector->{Hash}->{tower_upratelimit},
'tower_downrate_limit' => $tower_sector->{Hash}->{tower_downratelimit},
};
'tower_uprate_limit' => $tower_sector->{Hash}->{tower_upratelimit},
'tower_downrate_limit' => $tower_sector->{Hash}->{tower_downratelimit},
};
'sector_name' => $sector_name,
'sector_uprate_limit' => $tower_sector->{Hash}->{sector_upratelimit},
'sector_downrate_limit' => $tower_sector->{Hash}->{sector_downratelimit},
'sector_name' => $sector_name,
'sector_uprate_limit' => $tower_sector->{Hash}->{sector_upratelimit},
'sector_downrate_limit' => $tower_sector->{Hash}->{sector_downratelimit},
};
my $accesspoint = process_sector($self, $sector_opt);
return $self->api_error if $self->{'__saisei_error'};
};
my $accesspoint = process_sector($self, $sector_opt);
return $self->api_error if $self->{'__saisei_error'};
'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
'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,
$sector_name =~ s/\s/_/g;
my $sector_opt = {
'tower_name' => $tower_name,
'sector_name' => $sector_name,
'sector_uprate_limit' => $tower_sector->{Hash}->{up_rate_limit},
'sector_downrate_limit' => $tower_sector->{Hash}->{down_rate_limit},
'modify_existing' => '1', # modify an existing access point with this info
};
'sector_name' => $sector_name,
'sector_uprate_limit' => $tower_sector->{Hash}->{up_rate_limit},
'sector_downrate_limit' => $tower_sector->{Hash}->{down_rate_limit},
'modify_existing' => '1', # modify an existing access point with this info
};
my $service_name = $svc_name ? $svc_name : $service_part->{Hash}->{svc};
my $rateplan_name = $service_name . " " . $svc_broadband->{Hash}->{speed_down} . "-" . $svc_broadband->{Hash}->{speed_up};
my $service_name = $svc_name ? $svc_name : $service_part->{Hash}->{svc};
my $rateplan_name = $service_name . " " . $svc_broadband->{Hash}->{speed_down} . "-" . $svc_broadband->{Hash}->{speed_up};
$client->setHost('http://'.$self->{Hash}->{machine}.':'.$self->option('port'));
$client->$method('/rest/top/configurations/running'.$path, $data, { "Content-type" => 'application/json'});
$client->setHost('http://'.$self->{Hash}->{machine}.':'.$self->option('port'));
$client->$method('/rest/top/configurations/running'.$path, $data, { "Content-type" => 'application/json'});
my $result;
if ($client->responseCode() eq '200' || $client->responseCode() eq '201') {
eval { $result = decode_json($client->responseContent()) };
unless ($result) {
my $result;
if ($client->responseCode() eq '200' || $client->responseCode() eq '201') {
eval { $result = decode_json($client->responseContent()) };
unless ($result) {
return;
}
}
elsif ($client->responseCode() eq '404') {
eval { $result = decode_json($client->responseContent()) };
unless ($result) {
return;
}
}
elsif ($client->responseCode() eq '404') {
eval { $result = decode_json($client->responseContent()) };
unless ($result) {
return;
}
## check if message is for empty hash.
my($does_not_exist) = $result->{message} =~ /'(.*)' does not exist$/;
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);
+ $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);
- $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');
+ $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');
- $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');
+ $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');
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;
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;
sub api_create_rateplan {
my ($self, $svc, $rateplan) = @_;
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};
sub api_modify_existing_rateplan {
my ($self,$svc,$rateplan_name) = @_;
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",
my $modified_rateplan = $self->api_call(
"PUT",
"/rate_plans/$rateplan_name",
my $default_rate_plan = $self->api_call("GET", '?token=1&select=default_rate_plan');
return if $self->api_error;
my $default_rate_plan = $self->api_call("GET", '?token=1&select=default_rate_plan');
return if $self->api_error;
unless $default_rate_plan;
my $default_rateplan_name = $default_rate_plan->{collection}->[0]->{default_rate_plan}->{link}->{name};
unless $default_rate_plan;
my $default_rateplan_name = $default_rate_plan->{collection}->[0]->{default_rate_plan}->{link}->{name};
- $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.";
+ 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, };
+ }
+
- $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.";
# set access point to existing one or newly created one.
my $accesspoint = $existing_sector_ap ? $existing_sector_ap : $self->api_get_accesspoint($sector_name);
# set access point to existing one or newly created one.
my $accesspoint = $existing_sector_ap ? $existing_sector_ap : $self->api_get_accesspoint($sector_name);
+=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;
+}
+
my $param = shift;
my $part_export = FS::Record::qsearchs('part_export', { 'exportnum' => $param->{export_provisioned_services_exportnum}, } )
my $param = shift;
my $part_export = FS::Record::qsearchs('part_export', { 'exportnum' => $param->{export_provisioned_services_exportnum}, } )
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});
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});
warn "Exporting service ".$svc->{Hash}->{ip_addr}."\n" if ($part_export->option('debug'));
my $export_error = _export_insert($part_export,$svc) unless $host->{collection};
warn "Exporting service ".$svc->{Hash}->{ip_addr}."\n" if ($part_export->option('debug'));
my $export_error = _export_insert($part_export,$svc) unless $host->{collection};