void MI_CALL OsConfigResource_Invoke_TestTargetResource()

in src/adapters/mc/OsConfigResource.c [1008:1243]


void MI_CALL OsConfigResource_Invoke_TestTargetResource(
    OsConfigResource_Self* self,
    MI_Context* context,
    const MI_Char* nameSpace,
    const MI_Char* className,
    const MI_Char* methodName,
    const OsConfigResource* instanceName,
    const OsConfigResource_TestTargetResource* in)
{
    MI_UNREFERENCED_PARAMETER(self);
    MI_UNREFERENCED_PARAMETER(nameSpace);
    MI_UNREFERENCED_PARAMETER(className);
    MI_UNREFERENCED_PARAMETER(methodName);
    MI_UNREFERENCED_PARAMETER(instanceName);

    OsConfigResource_TestTargetResource test_result_object = {{0},{0},{0},{0},{0},{0}};

    MI_Result miResult = MI_RESULT_OK;
    MI_Result miCleanup = MI_RESULT_OK;
    MI_Boolean isCompliant = MI_FALSE;

    MI_Value miValueResult;
    memset(&miValueResult, 0, sizeof(MI_Value));

    if ((in == NULL) || (in->InputResource.exists == MI_FALSE) || (in->InputResource.value == NULL))
    {
        miResult = MI_RESULT_FAILED;
        LogError(context, miResult, GetLog(), "[OsConfigResource.Test] Invalid Test argument");
        goto Exit;
    }

    // Read the rule id from the input resource values
    if ((MI_TRUE == in->InputResource.value->RuleId.exists) && (NULL != in->InputResource.value->RuleId.value))
    {
        FREE_MEMORY(g_ruleId);
        if (NULL == (g_ruleId = DuplicateString(in->InputResource.value->RuleId.value)))
        {
            LogError(context, miResult, GetLog(), "[OsConfigResource.Test] DuplicateString(%s) failed", in->InputResource.value->RuleId.value);
            g_ruleId = DuplicateString(g_defaultValue);
            miResult = MI_RESULT_FAILED;
            goto Exit;
        }
    }
    else
    {
        LogError(context, miResult, GetLog(), "[OsConfigResource.Test] No RuleId");
        miResult = MI_RESULT_FAILED;
        goto Exit;
    }

    // Read the payload key from the input resource values
    if ((MI_TRUE == in->InputResource.value->PayloadKey.exists) && (NULL != in->InputResource.value->PayloadKey.value))
    {
        FREE_MEMORY(g_payloadKey);
        if (NULL == (g_payloadKey = DuplicateString(in->InputResource.value->PayloadKey.value)))
        {
            LogError(context, miResult, GetLog(), "[OsConfigResource.Test] DuplicateString(%s) failed", in->InputResource.value->PayloadKey.value);
            g_payloadKey = DuplicateString(g_defaultValue);
            miResult = MI_RESULT_FAILED;
            goto Exit;
        }
    }
    else
    {
        LogError(context, miResult, GetLog(), "[OsConfigResource.Test] No PayloadKey");
        miResult = MI_RESULT_FAILED;
        goto Exit;
    }

    // Read the MIM component name from the input resource values
    if ((MI_TRUE == in->InputResource.value->ComponentName.exists) && (NULL != in->InputResource.value->ComponentName.value))
    {
        FREE_MEMORY(g_componentName);
        if (NULL == (g_componentName = DuplicateString(in->InputResource.value->ComponentName.value)))
        {
            LogError(context, miResult, GetLog(), "[OsConfigResource.Test] DuplicateString(%s) failed", in->InputResource.value->ComponentName.value);
            g_componentName = DuplicateString(g_defaultValue);
            miResult = MI_RESULT_FAILED;
            goto Exit;
        }
    }
    else
    {
        LogError(context, miResult, GetLog(), "[OsConfigResource.Test] No ComponentName");
        miResult = MI_RESULT_FAILED;
        goto Exit;
    }

    // Read the MIM initialization object name from the input resource values
    if ((MI_TRUE == in->InputResource.value->InitObjectName.exists) && (NULL != in->InputResource.value->InitObjectName.value))
    {
        FREE_MEMORY(g_initObjectName);
        if (NULL == (g_initObjectName = DuplicateString(in->InputResource.value->InitObjectName.value)))
        {
            LogError(context, miResult, GetLog(), "[OsConfigResource.Test] DuplicateString(%s) failed", in->InputResource.value->InitObjectName.value);
            g_initObjectName = DuplicateString(g_defaultValue);
            miResult = MI_RESULT_FAILED;
            goto Exit;
        }
    }
    else
    {
        // Not an error
        LogInfo(context, GetLog(), "[OsConfigResource.Test] No InitObjectName");
        FREE_MEMORY(g_initObjectName);
    }

    // Read the MIM reported object name from the input resource values
    if ((MI_TRUE == in->InputResource.value->ReportedObjectName.exists) && (NULL != in->InputResource.value->ReportedObjectName.value))
    {
        FREE_MEMORY(g_reportedObjectName);
        if (NULL == (g_reportedObjectName = DuplicateString(in->InputResource.value->ReportedObjectName.value)))
        {
            LogError(context, miResult, GetLog(), "[OsConfigResource.Test] DuplicateString(%s) failed", in->InputResource.value->ReportedObjectName.value);
            g_reportedObjectName = DuplicateString(g_defaultValue);
            miResult = MI_RESULT_FAILED;
            goto Exit;
        }
    }
    else
    {
        LogError(context, miResult, GetLog(), "[OsConfigResource.Test] No ReportedObjectName");
        miResult = MI_RESULT_FAILED;
        goto Exit;
    }

    // Read the desired MIM object value from the input resource values
    if ((in->InputResource.value->DesiredObjectValue.exists == MI_TRUE) && (in->InputResource.value->DesiredObjectValue.value != NULL))
    {
        FREE_MEMORY(g_desiredObjectValue);
        if (NULL == (g_desiredObjectValue = DuplicateString(in->InputResource.value->DesiredObjectValue.value)))
        {
            LogError(context, miResult, GetLog(), "[OsConfigResource.Test] DuplicateString(%s) failed", in->InputResource.value->DesiredObjectValue.value);
            g_desiredObjectValue = DuplicateString(g_failValue);
        }
    }

    // Check if we have the optional MIM procedure object name in the input resource value
    if ((MI_TRUE == in->InputResource.value->ProcedureObjectName.exists) && (NULL != in->InputResource.value->ProcedureObjectName.value))
    {
        FREE_MEMORY(g_procedureObjectName);
        if (NULL == (g_procedureObjectName = DuplicateString(in->InputResource.value->ProcedureObjectName.value)))
        {
            LogError(context, miResult, GetLog(), "[OsConfigResource.Test] DuplicateString(%s) failed", in->InputResource.value->ProcedureObjectName.value);
            g_procedureObjectName = DuplicateString(g_defaultValue);
            miResult = MI_RESULT_FAILED;
            goto Exit;
        }
        else
        {
            // We have a procedure object name, next see if we also have a procedure object value (also optional)
            if ((MI_TRUE == in->InputResource.value->ProcedureObjectValue.exists) && (NULL != in->InputResource.value->ProcedureObjectValue.value))
            {
                FREE_MEMORY(g_procedureObjectValue);
                if (NULL == (g_procedureObjectValue = DuplicateString(in->InputResource.value->ProcedureObjectValue.value)))
                {
                    miResult = MI_RESULT_FAILED;
                    LogError(context, miResult, GetLog(), "[OsConfigResource.Test] DuplicateString(%s) failed", in->InputResource.value->ProcedureObjectValue.value);
                    g_procedureObjectValue = DuplicateString(g_defaultValue);
                    goto Exit;
                }
                else
                {
                    // We have both a procedure object name and value, we need to set then now to apply context for compliance
                    SetDesiredObjectValueToDevice("OsConfigResource.Test", g_componentName, g_procedureObjectName, g_procedureObjectValue, context);
                }
            }
            else
            {
                // Cannot have a procedure object name without a procedure object value
                miResult = MI_RESULT_FAILED;
                LogError(context, miResult, GetLog(), "[OsConfigResource.Test] No ProcedureObjectValue");
                FREE_MEMORY(g_procedureObjectValue);
                goto Exit;
            }
        }
    }
    else
    {
        // Not an error
        LogInfo(context, GetLog(), "[OsConfigResource.Test] No ProcedureObjectName");
        FREE_MEMORY(g_procedureObjectName);
    }

    // Read the reported MIM object value from the local device
    if (MI_RESULT_OK != (miResult = GetReportedObjectValueFromDevice("OsConfigResource.Test", g_componentName, context)))
    {
        goto Exit;
    }

    // Determine compliance
    if ((in->InputResource.value->ExpectedObjectValue.exists == MI_TRUE) && (in->InputResource.value->ExpectedObjectValue.value != NULL))
    {
        isCompliant = (g_reportedObjectValue && (0 == strncmp(in->InputResource.value->ExpectedObjectValue.value, g_reportedObjectValue, strlen(in->InputResource.value->ExpectedObjectValue.value)))) ? MI_TRUE : MI_FALSE;
    }
    else
    {
        LogInfo(context, GetLog(), "[OsConfigResource.Test] %s: no ExpectedObjectValue, assuming '%s' is expected", g_payloadKey, g_expectedObjectValue);
        isCompliant = (g_reportedObjectValue && (0 == strncmp(g_expectedObjectValue, g_reportedObjectValue, strlen(g_expectedObjectValue)))) ? MI_TRUE : MI_FALSE;
    }

    LogInfo(context, GetLog(), "[OsConfigResource.Test] %s: %s", g_payloadKey, isCompliant ? "compliant" : "incompliant");

    if (MI_RESULT_OK != (miResult = OsConfigResource_TestTargetResource_Construct(&test_result_object, context)))
    {
        LogError(context, miResult, GetLog(), "[OsConfigResource.Test] TestTargetResource_Construct failed with %d", miResult);
        goto Exit;
    }

    if (MI_RESULT_OK != (miResult = OsConfigResource_TestTargetResource_Set_MIReturn(&test_result_object, 0)))
    {
        LogError(context, miResult, GetLog(), "[OsConfigResource.Test] TestTargetResource_Set_MIReturn failed with %d", miResult);
        goto Exit;
    }

    OsConfigResource_TestTargetResource_Set_Result(&test_result_object, isCompliant);
    MI_Context_PostInstance(context, &(test_result_object.__instance));

Exit:
    if ((NULL != miValueResult.instance) && (MI_RESULT_OK != (miCleanup = MI_Instance_Delete(miValueResult.instance))))
    {
        LogInfo(context, GetLog(), "[OsConfigResource.Test] MI_Instance_Delete failed with %d", miCleanup);
    }

    if (MI_RESULT_OK != (miCleanup = OsConfigResource_TestTargetResource_Destruct(&test_result_object)))
    {
        LogInfo(context, GetLog(), "[OsConfigResource.Test] TestTargetResource_Destruct failed with %d", miCleanup);
    }

    if (MI_RESULT_OK != miResult)
    {
        LogError(context, miResult, GetLog(), "[OsConfigResource.Test] Test complete with miResult %d", miResult);
    }

    MI_Context_PostResult(context, miResult);
}