OMG-4586 - Added support for production server dashboard

This commit is contained in:
Irfan Ghaffar 2018-11-07 15:03:56 +05:00
parent 1473e39784
commit 1c822b9263
9 changed files with 62 additions and 205 deletions

View file

@ -5,17 +5,17 @@
* Jira Ticket : https://oliveruk.atlassian.net/browse/OMG-4586
*********************************************************************************************/
-- Function: register_prod_servers(character varying, integer, integer)
-- Function: register_prod_servers(character varying, integer)
DROP FUNCTION IF EXISTS register_prod_servers(character varying, integer, integer);
DROP FUNCTION IF EXISTS register_prod_servers(character varying, integer);
CREATE OR REPLACE FUNCTION register_prod_servers(
server_num character varying,
server_status integer)
RETURNS integer AS
RETURNS character varying AS
$BODY$
DECLARE
lastid int;
lastid character varying;
BEGIN
-- insert a new record into prod_servers
WITH upsert AS (UPDATE "public"."prod_servers"

View file

@ -38,7 +38,7 @@ plugins:
AutoCommit: 1
log_queries: 1
domain: 'http://192.168.154.138:5000/'
domain: 'http://192.168.10.66:5000/'
admin_email: "devops@oliver.agency"
sender_email: "devops@oliver.agency"

View file

@ -15,5 +15,7 @@ get '/' => \&homepage_controller::showHomepage;
########## API ROUTES ###########################################
post '/api/registerServer' => \&production_controller::registerServers;
post '/api/updateServer' => \&production_controller::updateServers;
get '/api/ragupdate' => \&production_controller::ragUpdate;
true;

View file

@ -0,0 +1,3 @@
#!/usr/bin/perl
destination_ip => 'http://192.168.10.66:5000',

View file

@ -0,0 +1,37 @@
#!/usr/bin/perl
use Dancer2;
use strict;
use LWP::UserAgent;
use Data::Dumper;
use JSON qw(decode_json encode_json);
my %daemon_config;
if ( -e 'daemon_config.pl'){
%daemon_config = do 'daemon_config.pl';
}
sub main{
my $dashboard_url;
if(%daemon_config) {
$dashboard_url = $daemon_config{destination_ip};
}else{
$dashboard_url = 'localhost';
}
my $http_client = LWP::UserAgent->new;
my $http_response = $http_client->get("$dashboard_url/api/ragupdate");
if ($http_response->is_success) {
my $response = decode_json($http_response->decoded_content) ;
if(defined $response->{error}){
print Dumper $response->{error}->{message};
}
}
}
main();
1;

View file

@ -16,10 +16,7 @@ use POSIX ();
sub showHomepage {
my $error;
try {
print "\n\n Before server list print \n\n";
my $servers_list = production_helper::getAllProdServers();
print "\n\n Before server list print \n\n";
print Dumper $servers_list;
my $local_domain = config->{domain};
return template 'homepage/homepage', {

View file

@ -14,7 +14,7 @@ sub registerServer {
my $ser_id;
try {
$sth = database->prepare("select * from register_prod_server (?, ?)");
$sth = database->prepare("select * from register_prod_servers (?, ?)");
$sth->execute( $server_id, $status );
$ser_id = $sth->fetchrow_array;
@ -33,7 +33,7 @@ sub updateServer {
my $ser_id;
try {
$sth = database->prepare("select * from register_prod_server (?, ?)");
$sth = database->prepare("select * from register_prod_servers (?, ?)");
$sth->execute( $server_id, $status );
$ser_id = $sth->fetchrow_array;
@ -63,14 +63,14 @@ sub getAllProdServers{
}
sub addLogEntry{
my ($hub_number, $activity, $message, $channel_id, $file_name, $file_size) = @_;
my ($server_num, $activity, $message) = @_;
my $sth;
my $log_record_id;
try {
$sth = database->prepare("select * from create_otp_log_entry (?, ?, ?, ?, ?, ?)");
$sth->execute( $hub_number, $activity, $message, $channel_id, $file_name, $file_size );
$sth = database->prepare("select * from create_prod_log_entry (?, ?, ?)");
$sth->execute( $server_num, $activity, $message );
$log_record_id = $sth->fetchrow_array;
@ -81,80 +81,5 @@ sub addLogEntry{
return $log_record_id;
}
# Deletes all channels for single HUB ID passed
sub deleteAllChannels{
my $hub_id = shift;
my $sth;
my $node_id;
try {
$sth = database->prepare("select * from delete_node_channels (?)");
$sth->execute( $hub_id );
} catch {
errors::dbError->from_handle($sth, 'deleteAllChannels')->throw();
}
return;
}
# Adds a channel record in otp_channels table
sub addNodeChannel{
my ($hub_id, $channel_id, $destination_id, $RAG_status, $channel_name) = @_;
my $sth;
my $new_channel_id;
try {
$sth = database->prepare("select * from add_node_channel (?, ?, ?, ?, ?)");
$sth->execute( $hub_id, $channel_id, $destination_id, $RAG_status, $channel_name );
$new_channel_id = $sth->fetchrow_array;
} catch {
errors::dbError->from_handle($sth, 'addNodeConfig')->throw();
}
return $new_channel_id;
}
# gets list of all channels for passed hub id
sub getAllChannels{
my $hub_id = shift;
my $sth;
my $channels_list;
try {
$sth = database->prepare("select * from get_all_otp_channels ( ? )");
$sth->execute( $hub_id );
$channels_list = $sth->fetchall_arrayref({});
} catch {
errors::dbError->from_handle($sth, 'getAllChannels')->throw();
}
return $channels_list;
}
# update file_name field in channels table with passed file_name
# file name is only populated if file is in progress (being transferred) for that channel
# otherwise field is kept empty
sub updateChannelTransferActivity{
my($hub_id, $channel_id, $file_name) = @_;
my $sth;
try {
$sth = database->prepare("select * from channel_update_filename (?, ?, ?)");
$sth->execute( $hub_id, $channel_id, $file_name );
} catch {
errors::dbError->from_handle($sth, 'updateChannelTransferActivity')->throw();
}
return;
}
1;

View file

@ -32,7 +32,7 @@ sub registerServers {
};
}
sub updateServers{
sub updateServers {
my $error;
try {
@ -43,7 +43,7 @@ sub updateServers{
my $db_status = $AMBER_COLOR; # If status not received, set to AMBER initially.
if(defined $status){
if($status eq "OK"){
if($status == 1){
$db_status = $GREEN_COLOR;
}else{
$db_status = $RED_COLOR;
@ -62,12 +62,11 @@ sub updateServers{
};
}
sub ragUpdate{
sub ragUpdate {
my $error;
try {
my $servers_list = production_helper::getAllProdServers();
my $current_time = time();
foreach my $server (@$servers_list){
@ -75,8 +74,6 @@ sub ragUpdate{
serverUpdate( $server, $current_time );
}
production_helper::checkStateChange( $nodes_list );
return ajax_data_response(
message => 'Successful.'
);
@ -86,7 +83,7 @@ sub ragUpdate{
}
# Update server and set colour as per time passed
sub serverUpdate{
sub serverUpdate {
my ($server, $current_time) = @_;
my $amber_threshold = 3*60; # 3 mins
@ -96,59 +93,14 @@ sub serverUpdate{
if($time_diff_in_sec >= $amber_threshold && $time_diff_in_sec < $error_threshold){
#update Amber status
production_helper::updateServer($server->{id}, $AMBER_COLOR);
production_logs_helper::addLogEntry($server->{id}, 'SERVER_TIMEOUT', 'Timeout Warning');
production_helper::updateServer($server->{server_number}, $AMBER_COLOR);
production_logs_helper::addLogEntry($server->{server_number}, 'SERVER_TIMEOUT', 'Timeout Warning');
}elsif($time_diff_in_sec > $error_threshold){
#update Error status
production_helper::updateServer($server->{id}, $RED_COLOR);
production_logs_helper::addLogEntry($server->{id}, 'SERVER_TIMEOUT', 'Timeout Critical');
production_helper::updateServer($server->{server_number}, $RED_COLOR);
production_logs_helper::addLogEntry($server->{server_number}, 'SERVER_TIMEOUT', 'Timeout Critical');
}
}
sub saveConfig{
my $error;
try {
my $servers_list = config->{servers_list};
foreach my $server_id in (@$servers_list){
# Register servers in the table and mark them down initially
my $registration_id = production_helper::registerServer($server_id, $RED_COLOR);
}
return ajax_data_response(
message => 'Successful.'
);
} catch($error){
return handleException( $error );
};
}
# Update file transfer information in channels and log table
sub updateFileTransferStatus{
my $error;
try {
my $hub_id = param('hubid');
my $channel_id = param('channelid');
my $post_params = params();
my $transfer_status = $post_params->{'transfer_status'};
my $transfer_msg = $post_params->{'transfer_msg'};
my $file_name = $post_params->{'file_name'};
my $file_size = $post_params->{'file_size'};
# add file transfer info in log. Size is in MBs
otp_logs_helper::addLogEntry($hub_id, $transfer_status, $transfer_msg, $channel_id, $file_name, $file_size);
# update filename field in channels table
otp_helper::updateChannelTransferActivity($hub_id, $channel_id, $transfer_status, $file_name);
return ajax_data_response(
message => 'Successful.'
);
} catch($error){
return handleException( $error );
};
}
1;
1;

View file

@ -33,64 +33,5 @@ sub updateServer {
return $servers_id;
}
# Check if status for any node/channel is changed from previous state, send emails
sub checkStateChange{
my $nodes_list = shift;
foreach my $node (@$nodes_list){
# send emails for hub status change
sendHubMasterEmails( $node );
# send emails for any status change in hub channels
sendHubChannelEmails( $node );
}
}
# send emails for hub status change
sub sendHubMasterEmails{
my $node = shift;
my $subject = '';
if( $node->{status} != 0 && $node->{status} != $node->{last_status} ){
# send email
if( $node->{status} == 3 ){
$subject = "OTP Node $node->{hub_id}: $node->{hub_name} has gone RED";
}
if( $node->{status} == 1 ){
$subject = "OTP Node $node->{hub_id}: $node->{hub_name} has reverted to GREEN";
}
if( $subject ne '' ){
email_helper::sendMail(config->{sender_email}, config->{admin_email}, $subject, $subject);
}
}
}
# send emails for any status change in hub channels
sub sendHubChannelEmails{
my $node = shift;
my $subject = '';
my $node_channels_list = getAllChannels($node->{hub_id});
foreach my $channel (@$node_channels_list){
if( $channel->{status} != 0 && $channel->{status} != $channel->{last_status} ){
# send channel fail email
if( $channel->{status} == 3 ){
$subject = "OTP Channel $channel->{channel_id} in Node $node->{hub_id}: $node->{hub_name} has gone RED";
}
if( $channel->{status} == 1 ){
$subject = "OTP Channel $channel->{channel_id} in Node $node->{hub_id}: $node->{hub_name} has reverted to GREEN";
}
if( $subject ne '' ){
email_helper::sendMail(config->{sender_email}, config->{admin_email}, $subject, $subject);
}
}
}
}
1;
1;