mirror of https://github.com/sipwise/heartbeat.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
8.3 KiB
307 lines
8.3 KiB
/*
|
|
* operation_provider.c: HA_Operation provider
|
|
*
|
|
* Author: Jia Ming Pan <jmltc@cn.ibm.com>
|
|
* Copyright (c) 2005 International Business Machines
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*
|
|
*/
|
|
|
|
#include <lha_internal.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
#include <cmpidt.h>
|
|
#include <cmpift.h>
|
|
#include <cmpimacs.h>
|
|
#include <hb_api.h>
|
|
#include "cmpi_utils.h"
|
|
#include "cluster_info.h"
|
|
|
|
static const char * PROVIDER_ID = "cim-op";
|
|
static char ClassName [] = "HA_Operation";
|
|
static CMPIBroker * Broker = NULL;
|
|
|
|
DeclareInstanceFunctions(Operation);
|
|
|
|
static struct ha_msg *
|
|
find_operation(const char * rscid, const char *opid)
|
|
{
|
|
struct ha_msg *ops, *operation = NULL;
|
|
if ((ops = cim_get_rscops(rscid)) == NULL ) {
|
|
cl_log(LOG_WARNING, "%s: none ops of %s found.",
|
|
__FUNCTION__, rscid);
|
|
return NULL;
|
|
}
|
|
if ((operation = cim_msg_find_child(ops, opid)) ){
|
|
operation = ha_msg_copy(operation);
|
|
}
|
|
ha_msg_del(ops);
|
|
return operation;
|
|
}
|
|
|
|
static CMPIInstance *
|
|
operation_make_instance(CMPIObjectPath * op, char* rscid,
|
|
const char * opid, struct ha_msg *operation, CMPIStatus * rc)
|
|
{
|
|
char caption[MAXLEN];
|
|
CMPIInstance * ci = NULL;
|
|
|
|
ci = CMNewInstance(Broker, op, rc);
|
|
if ( CMIsNullObject(ci) ) {
|
|
cl_log(LOG_ERR, "%s: couldn't create instance", __FUNCTION__);
|
|
CMSetStatusWithChars(Broker, rc,
|
|
CMPI_RC_ERR_FAILED, "Could not create instance.");
|
|
return NULL;
|
|
}
|
|
|
|
cmpi_msg2inst(Broker, ci, HA_OPERATION, operation, rc);
|
|
snprintf(caption, MAXLEN, "Operation.%s", opid);
|
|
CMSetProperty(ci, "Caption", caption, CMPI_chars);
|
|
CMSetProperty(ci, "ResourceId", rscid, CMPI_chars);
|
|
return ci;
|
|
}
|
|
|
|
static int
|
|
operation_enum_insts(CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt,
|
|
CMPIObjectPath * ref, int EnumInst, CMPIStatus * rc)
|
|
{
|
|
char *namespace;
|
|
CMPIObjectPath * op = NULL;
|
|
char *opid, *rscid;
|
|
struct ha_msg *msg, *rsclist, *ops, *operation;
|
|
int i, j, rsccount, opcount;
|
|
|
|
DEBUG_ENTER();
|
|
namespace = CMGetCharPtr(CMGetNameSpace(ref, rc));
|
|
if ( namespace == NULL ) {
|
|
return HA_FAIL;
|
|
}
|
|
|
|
if ((msg = cim_get_all_rsc_list())== NULL
|
|
|| (rsclist = cim_traverse_allrsc(msg)) == NULL ) {
|
|
goto done;
|
|
}
|
|
ha_msg_del(msg);
|
|
|
|
rsccount = cim_list_length(rsclist);
|
|
for (i = 0; i < rsccount; i++){
|
|
rscid = cim_list_index(rsclist, i);
|
|
if (rscid == NULL || (ops = cim_get_rscops(rscid)) == NULL ){
|
|
continue;
|
|
}
|
|
opcount = cim_msg_children_count(ops);
|
|
for (j = 0; j < opcount; j++) {
|
|
const char *const_opid;
|
|
if(( operation = cim_msg_child_index(ops, j)) == NULL
|
|
||(const_opid=cl_get_string(operation, "id"))== NULL){
|
|
continue;
|
|
}
|
|
opid = cim_strdup(const_opid);
|
|
op = CMNewObjectPath(Broker, namespace, ClassName, rc);
|
|
if ( EnumInst ) {
|
|
CMPIInstance * ci = NULL;
|
|
ci = operation_make_instance(op, rscid,
|
|
opid, operation, rc);
|
|
CMReturnInstance(rslt, ci);
|
|
} else { /* enumerate instance names */
|
|
CMAddKey(op, "ResourceId", rscid, CMPI_chars);
|
|
CMAddKey(op, "Id", opid, CMPI_chars);
|
|
CMReturnObjectPath(rslt, op);
|
|
}
|
|
cim_free(opid);
|
|
}
|
|
}
|
|
ha_msg_del(rsclist);
|
|
done:
|
|
rc->rc = CMPI_RC_OK;
|
|
CMReturnDone(rslt);
|
|
DEBUG_LEAVE();
|
|
return HA_OK;
|
|
}
|
|
|
|
|
|
/**********************************************
|
|
* Instance provider functions
|
|
**********************************************/
|
|
|
|
static CMPIStatus
|
|
OperationCleanup(CMPIInstanceMI * mi, CMPIContext * ctx)
|
|
{
|
|
|
|
CMReturn(CMPI_RC_OK);
|
|
}
|
|
|
|
static CMPIStatus
|
|
OperationEnumInstanceNames(CMPIInstanceMI * mi, CMPIContext * ctx,
|
|
CMPIResult * rslt, CMPIObjectPath * ref)
|
|
{
|
|
CMPIStatus rc = {CMPI_RC_OK, NULL};
|
|
PROVIDER_INIT_LOGGER();
|
|
operation_enum_insts(mi, ctx, rslt, ref, FALSE, &rc);
|
|
return rc;
|
|
}
|
|
|
|
|
|
static CMPIStatus
|
|
OperationEnumInstances(CMPIInstanceMI * mi, CMPIContext * ctx,
|
|
CMPIResult * rslt, CMPIObjectPath * ref, char ** properties)
|
|
{
|
|
CMPIStatus rc = {CMPI_RC_OK, NULL};
|
|
PROVIDER_INIT_LOGGER();
|
|
operation_enum_insts(mi, ctx, rslt, ref, TRUE, &rc);
|
|
return rc;
|
|
}
|
|
|
|
static CMPIStatus
|
|
OperationGetInstance(CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt,
|
|
CMPIObjectPath * cop, char ** properties)
|
|
{
|
|
CMPIObjectPath * op;
|
|
CMPIInstance * ci;
|
|
CMPIStatus rc;
|
|
char *rscid, *id;
|
|
struct ha_msg *operation = NULL;
|
|
|
|
PROVIDER_INIT_LOGGER();
|
|
|
|
id = CMGetKeyString(cop, "Id", &rc);
|
|
rscid = CMGetKeyString(cop, "ResourceId", &rc);
|
|
|
|
op = CMNewObjectPath(Broker, CMGetCharPtr(CMGetNameSpace(cop, &rc)),
|
|
ClassName, &rc);
|
|
if ( CMIsNullObject(op) ){
|
|
cl_log(LOG_WARNING, "inst_attr: can not create object path.");
|
|
CMReturnDone(rslt);
|
|
return rc;
|
|
}
|
|
|
|
operation = find_operation(rscid, id);
|
|
if ( operation == NULL) {
|
|
cl_log(LOG_ERR, "%s: can't find operation for %s",
|
|
__FUNCTION__, id);
|
|
CMReturnDone(rslt);
|
|
rc.rc = CMPI_RC_ERR_FAILED;
|
|
return rc;
|
|
}
|
|
|
|
ci = operation_make_instance(op, rscid, id, operation, &rc);
|
|
if ( CMIsNullObject(ci) ) {
|
|
CMReturnDone(rslt);
|
|
return rc;
|
|
}
|
|
|
|
CMReturnInstance(rslt, ci);
|
|
CMReturnDone(rslt);
|
|
CMReturn(CMPI_RC_OK);
|
|
}
|
|
|
|
static CMPIStatus
|
|
OperationCreateInstance(CMPIInstanceMI * mi, CMPIContext * ctx,
|
|
CMPIResult * rslt, CMPIObjectPath * cop, CMPIInstance * ci)
|
|
{
|
|
CMPIStatus rc = {CMPI_RC_OK, NULL};
|
|
struct ha_msg *operation;
|
|
char *id, *rscid;
|
|
|
|
id = CMGetKeyString(cop, "Id", &rc);
|
|
rscid = CMGetKeyString(cop, "ResourceId", &rc);
|
|
|
|
/* create an empty operatoin */
|
|
if ((operation = ha_msg_new(16)) == NULL ) {
|
|
cl_log(LOG_ERR, "%s: operation alloc failed.", __FUNCTION__);
|
|
rc.rc = CMPI_RC_ERR_FAILED;
|
|
goto done;
|
|
}
|
|
|
|
/* fill operation */
|
|
cmpi_inst2msg(ci, HA_OPERATION, operation, &rc);
|
|
|
|
/* add op to resource */
|
|
if (cim_add_rscop(rscid, operation) != HA_OK ) {
|
|
rc.rc = CMPI_RC_ERR_FAILED;
|
|
ha_msg_del(operation);
|
|
goto done;
|
|
}
|
|
|
|
ha_msg_del(operation);
|
|
rc.rc = CMPI_RC_OK;
|
|
done:
|
|
return rc;
|
|
}
|
|
|
|
|
|
static CMPIStatus
|
|
OperationSetInstance(CMPIInstanceMI * mi, CMPIContext * ctx,
|
|
CMPIResult * rslt, CMPIObjectPath * cop,
|
|
CMPIInstance * ci, char ** properties)
|
|
{
|
|
CMPIStatus rc = {CMPI_RC_OK, NULL};
|
|
struct ha_msg *operation;
|
|
char *id, *rscid;
|
|
|
|
id = CMGetKeyString(cop, "Id", &rc);
|
|
rscid = CMGetKeyString(cop, "ResourceId", &rc);
|
|
if ((operation = find_operation(rscid, id)) == NULL ) {
|
|
rc.rc = CMPI_RC_ERR_FAILED;
|
|
goto done;
|
|
}
|
|
cmpi_inst2msg(ci, HA_OPERATION, operation, &rc);
|
|
cim_update_rscop(rscid, id, operation);
|
|
rc.rc = CMPI_RC_OK;
|
|
done:
|
|
return rc;
|
|
}
|
|
|
|
|
|
static CMPIStatus
|
|
OperationDeleteInstance(CMPIInstanceMI * mi, CMPIContext * ctx,
|
|
CMPIResult * rslt, CMPIObjectPath * cop)
|
|
{
|
|
CMPIStatus rc = {CMPI_RC_OK, NULL};
|
|
char *id, *rscid;
|
|
id = CMGetKeyString(cop, "Id", &rc);
|
|
rscid = CMGetKeyString(cop, "ResourceId", &rc);
|
|
|
|
if ( cim_del_rscop(rscid, id) == HA_OK ) {
|
|
rc.rc = CMPI_RC_OK;
|
|
} else {
|
|
rc.rc = CMPI_RC_ERR_FAILED;
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
static CMPIStatus
|
|
OperationExecQuery(CMPIInstanceMI * mi, CMPIContext * ctx,
|
|
CMPIResult * rslt, CMPIObjectPath * ref,
|
|
char * lang, char * query)
|
|
{
|
|
CMPIStatus rc = {CMPI_RC_OK, NULL};
|
|
CMSetStatusWithChars(Broker, &rc, CMPI_RC_ERR_NOT_SUPPORTED,
|
|
"CIM_ERR_NOT_SUPPORTED");
|
|
return rc;
|
|
}
|
|
|
|
/*****************************************************
|
|
* install provider
|
|
****************************************************/
|
|
|
|
DeclareInstanceMI(Operation, HA_OperationProvider, Broker);
|
|
|