Verified Commit 746cceb8 authored by Alberto Miranda's avatar Alberto Miranda ♨️
Browse files

Refactor ADM_qos_entity_t

parent 94f7b312
Loading
Loading
Loading
Loading
+26 −5
Original line number Diff line number Diff line
@@ -134,11 +134,32 @@ typedef enum {
typedef enum { ADM_QOS_CLASS_BANDWIDTH, ADM_QOS_CLASS_IOPS } ADM_qos_class_t;

/** An ADMIRE entity upon which QoS can be defined */
typedef union {
    ADM_node_t l_node;
    ADM_job_t l_job;
    ADM_dataset_handle_t l_dataset;
} ADM_qos_entity_t;
typedef struct adm_qos_entity* ADM_qos_entity_t;

/**
 * Create a QoS entity given a scope, a node, a dataset, or a job.
 *
 * @remark QoS entities need to be freed by calling ADM_qos_entity_destroy().
 *
 * @param scope The scope of the entity, i.e. ADM_QOS_SCOPE_DATASET,
 * ADM_QOS_SCOPE_NODE, or ADM_QOS_SCOPE_JOB.
 * @param ... A single argument with data from either a ADM_dataset_t,
 * ADM_node_t, or ADM_job_t variable. The argument must correspond properly
 * to the scope provided.
 * @return A valid ADM_qos_entity_t if successful or NULL in case of failure.
 */
ADM_qos_entity_t
ADM_qos_entity_create(ADM_qos_scope_t scope, ...);

/**
 * Destroy a QoS entity created by ADM_qos_entity_create().
 *
 * @param[in] entity A valid ADM_qos_entity_t
 * @return ADM_SUCCESS or corresponding ADM error code
 */
ADM_return_t
ADM_qos_entity_destroy(ADM_qos_entity_t entity);


/** A QoS limit */
typedef struct {
+55 −0
Original line number Diff line number Diff line
@@ -49,6 +49,15 @@ struct adm_job {
    uint64_t j_id;
};

struct adm_qos_entity {
    ADM_qos_scope_t e_scope;
    union {
        ADM_node_t e_node;
        ADM_job_t e_job;
        ADM_dataset_handle_t e_dataset;
    };
};

/** The I/O requirements for a job */
struct adm_job_requirements {
    /** An array of input datasets */
@@ -153,6 +162,52 @@ ADM_dataset_destroy(ADM_dataset_handle_t dataset) {
    return ret;
}

ADM_qos_entity_t
ADM_qos_entity_create(ADM_qos_scope_t scope, ...) {

    struct adm_qos_entity* adm_qos_entity =
            (struct adm_qos_entity*) malloc(sizeof(struct adm_qos_entity));

    if(!adm_qos_entity) {
        LOGGER_ERROR("Could not allocate ADM_qos_entity_t")
        return NULL;
    }

    adm_qos_entity->e_scope = scope;

    va_list ap;
    va_start(ap, scope);

    switch(scope) {
        case ADM_QOS_SCOPE_NODE:
            adm_qos_entity->e_node = va_arg(ap, ADM_node_t);
            break;
        case ADM_QOS_SCOPE_JOB:
            adm_qos_entity->e_job = va_arg(ap, ADM_job_t);
            break;
        case ADM_QOS_SCOPE_DATASET:
            adm_qos_entity->e_dataset = va_arg(ap, ADM_dataset_handle_t);
            break;
    }
    va_end(ap);

    return adm_qos_entity;
}

ADM_return_t
ADM_qos_entity_destroy(ADM_qos_entity_t entity) {

    ADM_return_t ret = ADM_SUCCESS;

    if(!entity) {
        LOGGER_ERROR("Invalid ADM_qos_entity_t")
        return ADM_EBADARGS;
    }

    free(entity);
    return ret;
}

ADM_job_requirements_t
ADM_job_requirements_create(ADM_dataset_handle_t inputs[], size_t inputs_len,
                            ADM_dataset_handle_t outputs[], size_t outputs_len,