Merge "Reconfigure serivce and service group member lists"

This commit is contained in:
Zuul 2019-05-02 18:00:31 +00:00 committed by Gerrit Code Review
commit 84a616a258
6 changed files with 154 additions and 10 deletions

View File

@ -169,7 +169,8 @@ static SmErrorT sm_service_group_member_table_add( void* user_data[],
service_group_member->service_failure_impact
= db_service_group_member->service_failure_impact;
service_group_member->service_failure_timestamp = 0;
service_group_member->provisioned = db_service_group_member->provisioned;
SM_LIST_PREPEND( _service_group_members,
(SmListEntryDataPtrT) service_group_member );
@ -177,12 +178,65 @@ static SmErrorT sm_service_group_member_table_add( void* user_data[],
service_group_member->id = db_service_group_member->id;
service_group_member->service_failure_impact
= db_service_group_member->service_failure_impact;
service_group_member->provisioned = db_service_group_member->provisioned;
}
return( SM_OKAY );
}
// ****************************************************************************
SmErrorT sm_service_group_member_provision(char service_group_name[], char service_name[])
{
SmErrorT error;
SmDbServiceGroupMemberT db_service_group_member;
SmServiceGroupMemberT* service_group_member;
service_group_member = sm_service_group_member_table_read(service_group_name, service_name);
if(NULL != service_group_member)
{
return SM_OKAY;
}
error = sm_db_service_group_members_read( _sm_db_handle, service_group_name, service_name,
&db_service_group_member );
if(SM_OKAY != error)
{
DPRINTFE("Service group member %s:%s was not found", service_group_name, service_name);
return SM_FAILED;
}
error = sm_service_group_member_table_add(NULL, &db_service_group_member);
if(SM_OKAY != error)
{
DPRINTFE("Failed to provision service group member %s:%s. Error %s",
service_group_name, service_name, sm_error_str(error));
return SM_FAILED;
}
service_group_member = sm_service_group_member_table_read(service_group_name, service_name);
if(NULL == service_group_member)
{
DPRINTFE("Service group member %s:%s not found", service_group_name, service_name);
return SM_FAILED;
}
return error;
}
SmErrorT sm_service_group_member_deprovision(char service_group_name[], char service_name[])
{
SmServiceGroupMemberT* service_group_member;
service_group_member = sm_service_group_member_table_read(service_group_name, service_name);
if(NULL == service_group_member)
{
DPRINTFI("Service group member %s:%s was not found, already deprovisioned?",
service_group_name, service_name);
return SM_OKAY;
}
SM_LIST_REMOVE( _service_group_members, (SmListEntryDataPtrT) service_group_member );
return SM_OKAY;
}
// ****************************************************************************
// Service Group Member Table - Load
// =================================
@ -192,6 +246,12 @@ SmErrorT sm_service_group_member_table_load( void )
SmDbServiceGroupMemberT service_group_member;
SmErrorT error;
if( NULL != _service_group_members )
{
SM_LIST_CLEANUP_ALL( _service_group_members );
_service_group_members = NULL;
}
snprintf( db_query, sizeof(db_query), "%s = 'yes'",
SM_SERVICE_GROUP_MEMBERS_TABLE_COLUMN_PROVISIONED );
@ -223,6 +283,7 @@ SmErrorT sm_service_group_member_table_persist(
memset( &db_service_group_member, 0, sizeof(db_service_group_member) );
db_service_group_member.id = service_group_member->id;
db_service_group_member.provisioned = service_group_member->provisioned;
snprintf( db_service_group_member.name,
sizeof(db_service_group_member.name),
"%s", service_group_member->name );

View File

@ -25,6 +25,7 @@ typedef struct
SmServiceConditionT service_condition;
SmServiceSeverityT service_failure_impact;
long service_failure_timestamp;
bool provisioned;
} SmServiceGroupMemberT;
typedef void (*SmServiceGroupMemberTableForEachCallbackT)
@ -66,6 +67,10 @@ extern void sm_service_group_member_table_foreach_member(
SmServiceGroupMemberTableForEachCallbackT callback );
// ****************************************************************************
extern SmErrorT sm_service_group_member_provision(char service_group_name[], char service_name[]);
extern SmErrorT sm_service_group_member_deprovision(char service_group_name[], char service_name[]);
// ****************************************************************************
// Service Group Member Table - Load
// =================================

View File

@ -28,6 +28,7 @@
static SmListT* _services = NULL;
static SmDbHandleT* _sm_db_handle = NULL;
static SmErrorT sm_service_table_add( void* user_data[], void* record );
// ****************************************************************************
// Service Table - Read
// ====================
@ -123,7 +124,7 @@ SmServiceT* sm_service_table_read_by_action_pid( int pid )
// ****************************************************************************
// Service Table - For Each
// ========================
void sm_service_table_foreach( void* user_data[],
void sm_service_table_foreach( void* user_data[],
SmServiceTableForEachCallbackT callback )
{
SmListT* entry = NULL;
@ -145,6 +146,12 @@ static SmErrorT sm_service_table_add( void* user_data[], void* record )
SmDbServiceT* db_service = (SmDbServiceT*) record;
SmDbServiceInstanceT db_service_instance;
SmErrorT error;
int *count = NULL;
if(user_data)
{
count = (int*)user_data[0];
(*count) ++;
}
error = sm_db_service_instances_read( _sm_db_handle, db_service->name,
&db_service_instance );
@ -183,7 +190,7 @@ static SmErrorT sm_service_table_add( void* user_data[], void* record )
service->max_failures = db_service->max_failures;
service->fail_count = 0;
service->fail_countdown = db_service->fail_countdown;
service->fail_countdown_interval_in_ms
service->fail_countdown_interval_in_ms
= db_service->fail_countdown_interval_in_ms;
service->fail_countdown_timer_id = SM_TIMER_ID_INVALID;
service->audit_timer_id = SM_TIMER_ID_INVALID;
@ -222,7 +229,7 @@ static SmErrorT sm_service_table_add( void* user_data[], void* record )
return( error );
}
error = sm_service_enable_exists( service,
error = sm_service_enable_exists( service,
&service->enable_action_exists );
if( SM_OKAY != error )
{
@ -270,7 +277,7 @@ static SmErrorT sm_service_table_add( void* user_data[], void* record )
SM_LIST_PREPEND( _services, (SmListEntryDataPtrT) service );
} else {
} else {
service->id = db_service->id;
snprintf( service->instance_name, sizeof(service->instance_name),
"%s", db_service_instance.instance_name );
@ -278,33 +285,88 @@ static SmErrorT sm_service_table_add( void* user_data[], void* record )
"%s", db_service_instance.instance_params );
service->max_failures = db_service->max_failures;
service->fail_countdown = db_service->fail_countdown;
service->fail_countdown_interval_in_ms
service->fail_countdown_interval_in_ms
= db_service->fail_countdown_interval_in_ms;
service->max_action_failures = db_service->max_action_failures;
service->max_transition_failures = db_service->max_transition_failures;
snprintf( service->pid_file, sizeof(service->pid_file), "%s",
db_service->pid_file );
}
service->provisioned = db_service->provisioned;
return( SM_OKAY );
}
// ****************************************************************************
SmErrorT sm_service_provision(char service_name[])
{
SmServiceT* service = sm_service_table_read(service_name);
if(NULL != service)
{
return SM_OKAY;
}
SmErrorT error;
SmDbServiceT db_service;
error = sm_db_services_read( _sm_db_handle, service_name, &db_service );
if(SM_OKAY != error)
{
return error;
}
error = sm_service_table_add(NULL, &db_service);
if(SM_OKAY != error)
{
DPRINTFE("Failed to provision service %s, error %s", service_name, sm_error_str(error));
return SM_FAILED;
}
service = sm_service_table_read(service_name);
if(NULL == service)
{
DPRINTFE("Service %s not found.", service_name);
return SM_FAILED;
}
return SM_OKAY;
}
SmErrorT sm_service_deprovision(char service_name[])
{
SmServiceT* service = sm_service_table_read(service_name);
if(NULL == service)
{
DPRINTFI("Service %s not found in provisioned list. Already deprovisioned?", service_name);
return SM_OKAY;
}
SM_LIST_REMOVE( _services, (SmListEntryDataPtrT) service );
return SM_OKAY;
}
// ****************************************************************************
// Service Table - Load
// ====================
SmErrorT sm_service_table_load( void )
{
char db_query[SM_DB_QUERY_STATEMENT_MAX_CHAR];
char db_query[SM_DB_QUERY_STATEMENT_MAX_CHAR];
SmDbServiceT service;
SmErrorT error;
int count = 0;
void* user_data[] = {&count};
if( NULL != _services )
{
SM_LIST_CLEANUP_ALL( _services );
_services = NULL;
}
snprintf( db_query, sizeof(db_query), "%s = 'yes'",
SM_SERVICES_TABLE_COLUMN_PROVISIONED );
error = sm_db_foreach( SM_DATABASE_NAME, SM_SERVICES_TABLE_NAME,
db_query, &service, sm_db_services_convert,
sm_service_table_add, NULL );
sm_service_table_add, user_data );
if( SM_OKAY != error )
{
DPRINTFE( "Failed to loop over services in database, error=%s.",
@ -312,6 +374,8 @@ SmErrorT sm_service_table_load( void )
return( error );
}
DPRINTFI("load %d services", count);
return( SM_OKAY );
}
// ****************************************************************************
@ -327,6 +391,7 @@ SmErrorT sm_service_table_persist( SmServiceT* service )
memset( &db_service, 0, sizeof(db_service) );
db_service.id = service->id;
db_service.provisioned = service->provisioned;
snprintf( db_service.name, sizeof(db_service.name), "%s", service->name );
db_service.desired_state = service->desired_state;
db_service.state = service->state;
@ -334,7 +399,7 @@ SmErrorT sm_service_table_persist( SmServiceT* service )
db_service.condition = service->condition;
db_service.max_failures = service->max_failures;
db_service.fail_countdown = service->fail_countdown;
db_service.fail_countdown_interval_in_ms
db_service.fail_countdown_interval_in_ms
= service->fail_countdown_interval_in_ms;
db_service.max_action_failures = service->max_action_failures;
db_service.max_transition_failures = service->max_transition_failures;

View File

@ -57,6 +57,7 @@ typedef struct
//flag to indicate disable a service without disabling its dependency
bool disable_skip_dependent;
char group_name[SM_SERVICE_GROUP_NAME_MAX_CHAR];
bool provisioned;
} SmServiceT;
typedef void (*SmServiceTableForEachCallbackT)
@ -93,6 +94,10 @@ extern void sm_service_table_foreach( void* user_data[],
SmServiceTableForEachCallbackT callback );
// ****************************************************************************
extern SmErrorT sm_service_provision(char service_name[]);
extern SmErrorT sm_service_deprovision(char service_name[]);
// ****************************************************************************
// Service Table - Load
// ====================

View File

@ -233,6 +233,10 @@ SmErrorT sm_db_service_group_members_update( SmDbHandleT* sm_db_handle,
sm_service_severity_str( record->service_failure_impact ) );
}
len += snprintf( sql+len, sizeof(sql)-len, "%s = '%s', ",
SM_SERVICE_GROUP_MEMBERS_TABLE_COLUMN_PROVISIONED,
record->provisioned ? "yes": "no" );
snprintf( sql+len-2, sizeof(sql)-len, " WHERE %s = '%s' and %s = '%s';",
SM_SERVICE_GROUP_MEMBERS_TABLE_COLUMN_NAME, record->name,
SM_SERVICE_GROUP_MEMBERS_TABLE_COLUMN_SERVICE_NAME,

View File

@ -337,6 +337,10 @@ SmErrorT sm_db_services_update( SmDbHandleT* sm_db_handle,
sm_service_condition_str( record->condition ) );
}
len += snprintf( sql+len, sizeof(sql)-len, "%s = '%s', ",
SM_SERVICES_TABLE_COLUMN_PROVISIONED,
record->provisioned ? "yes": "no" );
len += snprintf( sql+len, sizeof(sql)-len, "%s = '%i', ",
SM_SERVICES_TABLE_COLUMN_MAX_FAILURES,
record->max_failures );