merge job rusage and pending reason support
This commit is contained in:
parent
30824ae5ea
commit
cb0c7fe9e7
82 changed files with 4280 additions and 2561 deletions
|
|
@ -17,19 +17,22 @@ extern scaler_provider_t* provider_get(scaler_obj_mgr_t*, char*);
|
|||
|
||||
extern int template_add(scaler_obj_mgr_t*, scaler_template_t*);
|
||||
extern scaler_template_t* template_get(scaler_obj_mgr_t*, char*);
|
||||
extern scaler_template_t* template_get_by_id(scaler_obj_mgr_t*, scaler_template_id_t*);
|
||||
extern scaler_template_t* template_get_by_id(scaler_obj_mgr_t*,
|
||||
scaler_template_id_t*);
|
||||
extern int template_del(scaler_obj_mgr_t*, char*);
|
||||
extern int template_cmp(const void* a, const void* b);
|
||||
extern int merge_templates(scaler_obj_mgr_t*, scaler_obj_mgr_t*, char*);
|
||||
extern int merge_templates(scaler_obj_mgr_t*, scaler_obj_mgr_t*, char*);
|
||||
|
||||
extern int request_add(scaler_obj_mgr_t*, scaler_request_t*);
|
||||
extern scaler_request_t* request_get(scaler_obj_mgr_t*, char*);
|
||||
extern int request_update_status(scaler_obj_mgr_t*, char*, scaler_req_status_t, time_t);
|
||||
extern int request_del(scaler_obj_mgr_t*, char*);
|
||||
extern int request_update_status(scaler_obj_mgr_t*, char*, scaler_req_status_t,
|
||||
time_t);
|
||||
extern int request_del(scaler_obj_mgr_t*, char*);
|
||||
|
||||
extern int instance_add(scaler_obj_mgr_t*, scaler_instance_t*);
|
||||
extern scaler_instance_t* instance_get(scaler_obj_mgr_t*, char*);
|
||||
extern int instance_update_status(scaler_obj_mgr_t*, char*, scaler_alloc_status_t, char*, char*);
|
||||
extern int instance_update_status(scaler_obj_mgr_t*, char*,
|
||||
scaler_alloc_status_t, char*, char*);
|
||||
extern int instance_del(scaler_obj_mgr_t*, char*);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
#ifndef _PLUG_MGR_H_
|
||||
#define _PLUG_MGR_H_
|
||||
|
||||
#include <cjson/cJSON.h>
|
||||
#include "scaler/types.h"
|
||||
#include <cjson/cJSON.h>
|
||||
|
||||
extern int get_available_templates(char* prov_name);
|
||||
extern int trigger_create(scaler_demand_t* demand);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ typedef struct {
|
|||
// Structure for YAML providers configuration
|
||||
typedef struct {
|
||||
yaml_provider_t* providers;
|
||||
size_t providers_count;
|
||||
size_t providers_count;
|
||||
} yaml_providers_config_t;
|
||||
|
||||
extern int load_providers(const char*);
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@
|
|||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <basiclib/list.h>
|
||||
#include "config.h"
|
||||
#include "htab.h"
|
||||
#include "mylock.h"
|
||||
|
|
@ -13,6 +12,7 @@
|
|||
#include "xce/types.h"
|
||||
#include "xlist.h"
|
||||
#include "zarray.h"
|
||||
#include <basiclib/list.h>
|
||||
|
||||
// in seconds
|
||||
#define DEFAULT_CHECK_INTERVAL 30
|
||||
|
|
@ -44,7 +44,7 @@ typedef struct {
|
|||
pthread_t threads[2];
|
||||
int running;
|
||||
#define SCALER_MENU_CHANGED 0x1
|
||||
int flag;
|
||||
int flag;
|
||||
} autoscaler_context_t;
|
||||
|
||||
extern autoscaler_context_t g_scaler_ctx;
|
||||
|
|
|
|||
|
|
@ -48,7 +48,8 @@ typedef struct {
|
|||
} v;
|
||||
} scaler_template_attr_t;
|
||||
|
||||
// Template available number of quota and current pricing (for spot/bid instances)
|
||||
// Template available number of quota and current pricing (for spot/bid
|
||||
// instances)
|
||||
typedef struct {
|
||||
char* id; // unique id: __as__provider#template
|
||||
scaler_template_id_t tpl_id;
|
||||
|
|
@ -65,9 +66,11 @@ typedef enum {
|
|||
ALLOC_STATUS_NONE = 0,
|
||||
ALLOC_STATUS_ALLOCATED, /* get a running instance from cloud */
|
||||
ALLOC_STATUS_RECLAIMED, /* cloud reclaimed this instance */
|
||||
ALLOC_STATUS_RELINQUISH_REQ_SENT, /* request is sent to scheduler that it should relinquish this instance */
|
||||
ALLOC_STATUS_RELINQUISH_REQ_SENT, /* request is sent to scheduler that it
|
||||
should relinquish this instance */
|
||||
ALLOC_STATUS_RELINQUISHED, /* scheduler relinquished this instance */
|
||||
ALLOC_STATUS_DEALLOCATE_REQ_SENT, /* release/deallocate request is sent to cloud to terminate this instance */
|
||||
ALLOC_STATUS_DEALLOCATE_REQ_SENT, /* release/deallocate request is sent to
|
||||
cloud to terminate this instance */
|
||||
ALLOC_STATUS_DONE
|
||||
} scaler_alloc_status_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,18 +1,19 @@
|
|||
#ifndef __JSON_UTILS_H__
|
||||
#define __JSON_UTILS_H__
|
||||
#include "scaler/types.h"
|
||||
#include <cjson/cJSON.h>
|
||||
#include <cjson/s2j.h>
|
||||
#include "scaler/types.h"
|
||||
|
||||
extern int write_json_to_file(const char* filename, cJSON* json);
|
||||
extern int read_json_file(const char* filename, cJSON** json);
|
||||
extern cJSON* s2j_demand_t(scaler_demand_t* demand);
|
||||
extern cJSON* s2j_instance_id_list_t(instance_id_list_t* instance_ids);
|
||||
extern cJSON* s2j_request_id_list_t(scaler_request_t* req);
|
||||
extern scaler_instance_t* j2s_instance_t(cJSON* json, scaler_req_type_t req_type);
|
||||
extern int write_json_to_file(const char* filename, cJSON* json);
|
||||
extern int read_json_file(const char* filename, cJSON** json);
|
||||
extern cJSON* s2j_demand_t(scaler_demand_t* demand);
|
||||
extern cJSON* s2j_instance_id_list_t(instance_id_list_t* instance_ids);
|
||||
extern cJSON* s2j_request_id_list_t(scaler_request_t* req);
|
||||
extern scaler_instance_t* j2s_instance_t(cJSON* json,
|
||||
scaler_req_type_t req_type);
|
||||
extern scaler_instance_id_t* j2s_instance_id_t(cJSON* json);
|
||||
extern scaler_template_t* j2s_template_t(char* provider_name, cJSON* json);
|
||||
extern cJSON* s2j_create_empty_obj();
|
||||
extern cJSON* s2j_create_empty_obj();
|
||||
|
||||
extern char* attrs_to_str(scaler_template_attr_t* attrs, int num_attr);
|
||||
extern int str_to_attr(char* str, scaler_template_attr_t** out_attrs);
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ extern int my_snprintf(char* buf, size_t size, const char* fmt, ...);
|
|||
extern int create_temp_file(char* file_name);
|
||||
extern int my_strcmp(const char* p1, const char* p2);
|
||||
extern char* my_strdup(char*);
|
||||
extern int cmp_template_id(scaler_template_id_t* p1, scaler_template_id_t* p2);
|
||||
extern int cmp_template_id(scaler_template_id_t* p1, scaler_template_id_t* p2);
|
||||
|
||||
extern void print_demand_list(scaler_demand_array_t*);
|
||||
extern void print_request(void*);
|
||||
|
|
|
|||
|
|
@ -12,8 +12,9 @@ extern void template_fields_fini(void*);
|
|||
extern void template_fini(void*);
|
||||
extern int template_cpy(scaler_template_t*, scaler_template_t*);
|
||||
|
||||
extern void request_fini(void*);
|
||||
extern scaler_request_t* new_create_request(const char*, const char*, int, const char*);
|
||||
extern void request_fini(void*);
|
||||
extern scaler_request_t* new_create_request(const char*, const char*, int,
|
||||
const char*);
|
||||
extern scaler_request_t* new_release_request(const char*, char*);
|
||||
|
||||
extern void instance_id_fields_fini(void*);
|
||||
|
|
|
|||
|
|
@ -41,10 +41,7 @@ int scaler_obj_mgr_count(scaler_obj_mgr_t* mgr)
|
|||
return count;
|
||||
}
|
||||
|
||||
static int _obj_mgr_add(scaler_obj_mgr_t* mgr,
|
||||
void* obj,
|
||||
char* key,
|
||||
int* idx)
|
||||
static int _obj_mgr_add(scaler_obj_mgr_t* mgr, void* obj, char* key, int* idx)
|
||||
{
|
||||
hent_t* e = NULL;
|
||||
int i;
|
||||
|
|
@ -132,10 +129,8 @@ static void* obj_mgr_get_ex(scaler_obj_mgr_t* mgr, char* key)
|
|||
return _obj_mgr_get(mgr, key);
|
||||
}
|
||||
|
||||
static int obj_mgr_add_ex(scaler_obj_mgr_t* mgr,
|
||||
void* obj,
|
||||
char* key,
|
||||
char* type)
|
||||
static int obj_mgr_add_ex(scaler_obj_mgr_t* mgr, void* obj, char* key,
|
||||
char* type)
|
||||
{
|
||||
int idx = -1;
|
||||
int ret;
|
||||
|
|
@ -198,7 +193,8 @@ scaler_template_t* template_get(scaler_obj_mgr_t* mgr, char* key)
|
|||
return (scaler_template_t*)obj_mgr_get_ex(mgr, key);
|
||||
}
|
||||
|
||||
scaler_template_t* template_get_by_id(scaler_obj_mgr_t* mgr, scaler_template_id_t* tid)
|
||||
scaler_template_t* template_get_by_id(scaler_obj_mgr_t* mgr,
|
||||
scaler_template_id_t* tid)
|
||||
{
|
||||
if (!mgr || !tid) {
|
||||
return NULL;
|
||||
|
|
@ -212,7 +208,8 @@ int template_del(scaler_obj_mgr_t* mgr, char* id)
|
|||
{
|
||||
return obj_mgr_del_ex(mgr, id, SC_TEMPLATE);
|
||||
}
|
||||
static int attribute_cmp(const scaler_template_attr_t* a1, const scaler_template_attr_t* a2)
|
||||
static int attribute_cmp(const scaler_template_attr_t* a1,
|
||||
const scaler_template_attr_t* a2)
|
||||
{
|
||||
if (!a1 || !a2) {
|
||||
return -EINVAL;
|
||||
|
|
@ -349,7 +346,7 @@ static int _add_not_found_template_id(void* arg, void* data)
|
|||
static int _clean_not_found_template(void* data, void* arg)
|
||||
{
|
||||
char* id = (char*)data;
|
||||
if (! id) {
|
||||
if (!id) {
|
||||
return 0;
|
||||
}
|
||||
template_del(&g_scaler_ctx.templates, id);
|
||||
|
|
@ -358,7 +355,8 @@ static int _clean_not_found_template(void* data, void* arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int merge_templates(scaler_obj_mgr_t* tgt, scaler_obj_mgr_t* src, char* provider_name)
|
||||
int merge_templates(scaler_obj_mgr_t* tgt, scaler_obj_mgr_t* src,
|
||||
char* provider_name)
|
||||
{
|
||||
tpl_arg_t tmp;
|
||||
xlist_t l;
|
||||
|
|
@ -395,7 +393,8 @@ scaler_request_t* request_get(scaler_obj_mgr_t* mgr, char* key)
|
|||
return (scaler_request_t*)obj_mgr_get_ex(mgr, key);
|
||||
}
|
||||
|
||||
int request_update_status(scaler_obj_mgr_t* mgr, char* req_id, scaler_req_status_t status, time_t now)
|
||||
int request_update_status(scaler_obj_mgr_t* mgr, char* req_id,
|
||||
scaler_req_status_t status, time_t now)
|
||||
{
|
||||
scaler_request_t* req_in_mgr;
|
||||
|
||||
|
|
@ -435,11 +434,9 @@ scaler_instance_t* instance_get(scaler_obj_mgr_t* mgr, char* key)
|
|||
return (scaler_instance_t*)obj_mgr_get_ex(mgr, key);
|
||||
}
|
||||
|
||||
int instance_update_status(scaler_obj_mgr_t* mgr,
|
||||
char* instance_id,
|
||||
scaler_alloc_status_t alloc_status,
|
||||
char* inst_state,
|
||||
char* relinquish_id)
|
||||
int instance_update_status(scaler_obj_mgr_t* mgr, char* instance_id,
|
||||
scaler_alloc_status_t alloc_status, char* inst_state,
|
||||
char* relinquish_id)
|
||||
{
|
||||
scaler_instance_t* inst;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
// Main functions:
|
||||
#include <cjson/cJSON.h>
|
||||
#include "obj_mgr.h"
|
||||
#include "scaler.h"
|
||||
#include "scaler_json.h"
|
||||
#include "scaler_misc.h"
|
||||
#include "scaler_obj.h"
|
||||
#include "utils.h"
|
||||
#include <cjson/cJSON.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
|
|
@ -13,11 +13,13 @@
|
|||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static cJSON* invoke(scaler_provider_t* prov, INTERFACE_ACTION ACTION, cJSON* in_json);
|
||||
static cJSON* invoke(scaler_provider_t* prov, INTERFACE_ACTION ACTION,
|
||||
cJSON* in_json);
|
||||
|
||||
/*
|
||||
* This function call invoke() to execute shell script of provider->scripts[GET_AVAILABLE_TEMPLATES]
|
||||
* Get all available templates from the provider. Add the templates to g_scaler_ctx.templates.
|
||||
* This function call invoke() to execute shell script of
|
||||
* provider->scripts[GET_AVAILABLE_TEMPLATES] Get all available templates from
|
||||
* the provider. Add the templates to g_scaler_ctx.templates.
|
||||
*/
|
||||
int get_available_templates(char* prov_name)
|
||||
{
|
||||
|
|
@ -116,8 +118,7 @@ int trigger_create(scaler_demand_t* demand)
|
|||
if (req_id_item && cJSON_IsString(req_id_item)) {
|
||||
strncpy(req_id, req_id_item->valuestring, sizeof(req_id) - 1);
|
||||
req = new_create_request(demand->tpl_id.provider_name,
|
||||
demand->tpl_id.template_id,
|
||||
demand->count,
|
||||
demand->tpl_id.template_id, demand->count,
|
||||
req_id);
|
||||
ret = request_add(&g_scaler_ctx.requests, req);
|
||||
if (ret < 0) {
|
||||
|
|
@ -179,11 +180,9 @@ int trigger_release(char* prov_name, instance_id_list_t* inst_ids)
|
|||
return ret;
|
||||
}
|
||||
for (int i = 0; i < inst_ids->num; i++) {
|
||||
ret = instance_update_status(&g_scaler_ctx.instances,
|
||||
inst_ids->instance_ids[i].instance_id,
|
||||
ALLOC_STATUS_DEALLOCATE_REQ_SENT,
|
||||
NULL,
|
||||
req_id);
|
||||
ret = instance_update_status(
|
||||
&g_scaler_ctx.instances, inst_ids->instance_ids[i].instance_id,
|
||||
ALLOC_STATUS_DEALLOCATE_REQ_SENT, NULL, req_id);
|
||||
if (ret < 0) {
|
||||
ERROR("Failed to mark instance %s as RELINQUISHED",
|
||||
inst_ids->instance_ids[i].instance_id);
|
||||
|
|
@ -264,10 +263,12 @@ int get_request_status(scaler_request_t* req)
|
|||
|
||||
// Safe string duplication with null checks
|
||||
if (req->tpl_id.provider_name) {
|
||||
inst->tpl_id.provider_name = strdup(req->tpl_id.provider_name);
|
||||
inst->tpl_id.provider_name
|
||||
= strdup(req->tpl_id.provider_name);
|
||||
}
|
||||
if (req->tpl_id.template_id) {
|
||||
inst->tpl_id.template_id = strdup(req->tpl_id.template_id);
|
||||
inst->tpl_id.template_id
|
||||
= strdup(req->tpl_id.template_id);
|
||||
}
|
||||
if (req->request_id) {
|
||||
inst->request_id = strdup(req->request_id);
|
||||
|
|
@ -275,16 +276,15 @@ int get_request_status(scaler_request_t* req)
|
|||
|
||||
int ret = instance_add(&g_scaler_ctx.instances, inst);
|
||||
if (ret < 0 && ret != -EEXIST) {
|
||||
ERROR("Failed to add instance %s, ret %d", inst->instance_id, ret);
|
||||
ERROR("Failed to add instance %s, ret %d",
|
||||
inst->instance_id, ret);
|
||||
instance_fini(inst);
|
||||
}
|
||||
} else if (req->type == SCALER_REQ_TYPE_RET) {
|
||||
inst->relinquish_id = strdup(req->request_id);
|
||||
instance_update_status(&g_scaler_ctx.instances,
|
||||
inst->instance_id,
|
||||
inst->alloc_status,
|
||||
inst->inst_state,
|
||||
NULL);
|
||||
instance_update_status(
|
||||
&g_scaler_ctx.instances, inst->instance_id,
|
||||
inst->alloc_status, inst->inst_state, NULL);
|
||||
instance_fini(inst);
|
||||
}
|
||||
}
|
||||
|
|
@ -295,7 +295,8 @@ int get_request_status(scaler_request_t* req)
|
|||
status = REQ_STATUS_COMPLETED;
|
||||
} else if (strcmp(status_item->valuestring, "running") == 0) {
|
||||
status = REQ_STATUS_RUNNING;
|
||||
} else if (strcmp(status_item->valuestring, "complete_with_error") == 0) {
|
||||
} else if (strcmp(status_item->valuestring, "complete_with_error")
|
||||
== 0) {
|
||||
status = REQ_STATUS_COMPLETE_WITH_ERROR;
|
||||
} else {
|
||||
ERROR("Invalid request status %s", status_item->valuestring);
|
||||
|
|
@ -308,7 +309,8 @@ int get_request_status(scaler_request_t* req)
|
|||
req->request_id, status, req->status);
|
||||
continue;
|
||||
}
|
||||
ret = request_update_status(&g_scaler_ctx.requests, req->request_id, status, now);
|
||||
ret = request_update_status(&g_scaler_ctx.requests, req->request_id,
|
||||
status, now);
|
||||
if (ret < 0) {
|
||||
ERROR("Failed to update request status for %s, ret %d",
|
||||
req->request_id, ret);
|
||||
|
|
@ -368,11 +370,8 @@ int get_return_request(char* prov_name, instance_id_list_t* inst_ids)
|
|||
ERROR("Failed to parse instance ID from request object");
|
||||
continue;
|
||||
}
|
||||
instance_update_status(&g_scaler_ctx.instances,
|
||||
inst_id->instance_id,
|
||||
ALLOC_STATUS_RECLAIMED,
|
||||
NULL,
|
||||
NULL);
|
||||
instance_update_status(&g_scaler_ctx.instances, inst_id->instance_id,
|
||||
ALLOC_STATUS_RECLAIMED, NULL, NULL);
|
||||
instance_id_fini(inst_id);
|
||||
}
|
||||
|
||||
|
|
@ -418,7 +417,8 @@ static int write_input_json(const char* filename, cJSON* json)
|
|||
* It takes a JSON input, invokes the script, and returns a JSON output.
|
||||
* All 5 interfaces can be called in this way.
|
||||
*/
|
||||
static cJSON* invoke(scaler_provider_t* prov, INTERFACE_ACTION ACTION, cJSON* in_json)
|
||||
static cJSON* invoke(scaler_provider_t* prov, INTERFACE_ACTION ACTION,
|
||||
cJSON* in_json)
|
||||
{
|
||||
char in_file[64] = "/tmp/sc_in_XXXXXX";
|
||||
char out_file[64] = "/tmp/sc_out_XXXXXX";
|
||||
|
|
@ -452,10 +452,7 @@ static cJSON* invoke(scaler_provider_t* prov, INTERFACE_ACTION ACTION, cJSON* in
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
// Build command to call the script
|
||||
my_snprintf(cmd,
|
||||
sizeof(cmd),
|
||||
"%s/scripts/%s",
|
||||
prov->scriptPath,
|
||||
my_snprintf(cmd, sizeof(cmd), "%s/scripts/%s", prov->scriptPath,
|
||||
prov->scripts[ACTION]);
|
||||
|
||||
// Redirect stdout and stderr to file
|
||||
|
|
|
|||
|
|
@ -167,8 +167,7 @@ typedef struct {
|
|||
instance_id_list_t* id_list;
|
||||
} prov_inst_id_list_t;
|
||||
|
||||
static int
|
||||
_add_relinquished_inst_id(void* arg, void* data)
|
||||
static int _add_relinquished_inst_id(void* arg, void* data)
|
||||
{
|
||||
prov_inst_id_list_t* l = (prov_inst_id_list_t*)arg;
|
||||
scaler_instance_t* inst = (scaler_instance_t*)data;
|
||||
|
|
@ -205,8 +204,7 @@ static int _grab_relinquished_hosts_list(prov_inst_id_list_t* l)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
_add_allocated_inst_id(void* arg, void* data)
|
||||
static int _add_allocated_inst_id(void* arg, void* data)
|
||||
{
|
||||
prov_inst_id_list_t* l = (prov_inst_id_list_t*)arg;
|
||||
scaler_instance_t* inst = (scaler_instance_t*)data;
|
||||
|
|
@ -258,8 +256,8 @@ static int _get_reclaimed_hosts(void* data, void* arg)
|
|||
return -ENOMEM;
|
||||
}
|
||||
id_list->num = 0;
|
||||
id_list->instance_ids = (scaler_instance_id_t*)calloc(g_scaler_ctx.instances.array.count,
|
||||
sizeof(scaler_instance_id_t));
|
||||
id_list->instance_ids = (scaler_instance_id_t*)calloc(
|
||||
g_scaler_ctx.instances.array.count, sizeof(scaler_instance_id_t));
|
||||
|
||||
l.provider_name = p->name;
|
||||
l.id_list = id_list;
|
||||
|
|
@ -275,8 +273,7 @@ static int _get_reclaimed_hosts(void* data, void* arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
_add_done_instance_id(void* arg, void* data)
|
||||
static int _add_done_instance_id(void* arg, void* data)
|
||||
{
|
||||
xlist_t* l = (xlist_t*)arg;
|
||||
scaler_instance_t* inst = (scaler_instance_t*)data;
|
||||
|
|
@ -327,8 +324,7 @@ typedef struct {
|
|||
int reclaimed;
|
||||
} demand_count_t;
|
||||
|
||||
static int
|
||||
_count_allocated_instances(void* arg1, void* arg2)
|
||||
static int _count_allocated_instances(void* arg1, void* arg2)
|
||||
{
|
||||
demand_count_t* counts = (demand_count_t*)arg1;
|
||||
scaler_instance_t* inst = (scaler_instance_t*)arg2;
|
||||
|
|
@ -408,12 +404,14 @@ static int calculate(scaler_demand_t* demand)
|
|||
|
||||
// Count allocated instances
|
||||
mylock_lock(&(g_scaler_ctx.instances.lock));
|
||||
zarray_iter(&(g_scaler_ctx.instances.array), _count_allocated_instances, &t_count);
|
||||
zarray_iter(&(g_scaler_ctx.instances.array), _count_allocated_instances,
|
||||
&t_count);
|
||||
mylock_unlock(&(g_scaler_ctx.instances.lock));
|
||||
|
||||
// Count requesting instances
|
||||
mylock_lock(&(g_scaler_ctx.requests.lock));
|
||||
zarray_iter(&(g_scaler_ctx.requests.array), _count_requesting_instances, &t_count);
|
||||
zarray_iter(&(g_scaler_ctx.requests.array), _count_requesting_instances,
|
||||
&t_count);
|
||||
mylock_unlock(&(g_scaler_ctx.requests.lock));
|
||||
|
||||
template_max = _get_template_max_number(&demand->tpl_id);
|
||||
|
|
@ -422,7 +420,8 @@ static int calculate(scaler_demand_t* demand)
|
|||
|
||||
left = template_max - total;
|
||||
if (left <= 0) {
|
||||
INFO("Template %s reached max number %d, no new instances can be created",
|
||||
INFO("Template %s reached max number %d, no new instances can be "
|
||||
"created",
|
||||
demand->tpl_id.template_id, template_max);
|
||||
demand->count = 0;
|
||||
return 0;
|
||||
|
|
@ -437,9 +436,10 @@ static int calculate(scaler_demand_t* demand)
|
|||
new_demand = 0;
|
||||
}
|
||||
|
||||
INFO("Demand %s: requested %d, allocated %d, requesting %d, reclaimed %d, new demand %d",
|
||||
demand->tpl_id.template_id, demand->count, t_count.allocated, t_count.requesting,
|
||||
t_count.reclaimed, new_demand);
|
||||
INFO("Demand %s: requested %d, allocated %d, requesting %d, reclaimed %d, "
|
||||
"new demand %d",
|
||||
demand->tpl_id.template_id, demand->count, t_count.allocated,
|
||||
t_count.requesting, t_count.reclaimed, new_demand);
|
||||
demand->count = new_demand;
|
||||
return demand->count;
|
||||
}
|
||||
|
|
@ -459,8 +459,8 @@ static int _return_relinquished_hosts(void* data, void* arg)
|
|||
return -ENOMEM;
|
||||
}
|
||||
id_list->num = 0;
|
||||
id_list->instance_ids = (scaler_instance_id_t*)calloc(g_scaler_ctx.instances.array.count,
|
||||
sizeof(scaler_instance_id_t));
|
||||
id_list->instance_ids = (scaler_instance_id_t*)calloc(
|
||||
g_scaler_ctx.instances.array.count, sizeof(scaler_instance_id_t));
|
||||
|
||||
l.provider_name = p->name;
|
||||
l.id_list = id_list;
|
||||
|
|
@ -507,19 +507,19 @@ int request_delete_instances(instance_id_list_t* inst_ids)
|
|||
ERROR("Null instance ID list");
|
||||
return -EINVAL;
|
||||
}
|
||||
// Do not directly trigger release. Instead, mark the instances as RELINQUISHED
|
||||
// Do not directly trigger release. Instead, mark the instances as
|
||||
// RELINQUISHED
|
||||
for (int i = 0; i < inst_ids->num; i++) {
|
||||
ret = instance_update_status(&g_scaler_ctx.instances,
|
||||
inst_ids->instance_ids[i].instance_id,
|
||||
ALLOC_STATUS_RELINQUISHED,
|
||||
NULL,
|
||||
NULL);
|
||||
ALLOC_STATUS_RELINQUISHED, NULL, NULL);
|
||||
if (ret < 0) {
|
||||
ERROR("Failed to mark instance %s as RELINQUISHED",
|
||||
inst_ids->instance_ids[i].instance_id);
|
||||
continue;
|
||||
}
|
||||
TRACE("Marked instance %s as RELINQUISHED", inst_ids->instance_ids[i].instance_id);
|
||||
TRACE("Marked instance %s as RELINQUISHED",
|
||||
inst_ids->instance_ids[i].instance_id);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -593,7 +593,7 @@ int scaler_start()
|
|||
}
|
||||
|
||||
demand_thread = &g_scaler_ctx.threads[1];
|
||||
ret = pthread_create(demand_thread, NULL, scaler_demand_handler, NULL);
|
||||
ret = pthread_create(demand_thread, NULL, scaler_demand_handler, NULL);
|
||||
if (ret != 0) {
|
||||
ERROR("Failed to create demand handler thread: %s", strerror(ret));
|
||||
goto Err_Exit;
|
||||
|
|
|
|||
|
|
@ -14,7 +14,8 @@ int scaler_ctx_init(char* prv_file)
|
|||
memset(&g_scaler_ctx, 0, sizeof(g_scaler_ctx));
|
||||
|
||||
if (prv_file) {
|
||||
strncpy(g_scaler_ctx.configs.providers_file, prv_file, XCE_MAXPATH_LEN - 1);
|
||||
strncpy(g_scaler_ctx.configs.providers_file, prv_file,
|
||||
XCE_MAXPATH_LEN - 1);
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -66,7 +67,7 @@ int scaler_ctx_is_menu_changed()
|
|||
int flag = 0;
|
||||
|
||||
mylock_lock(&g_scaler_ctx.lock);
|
||||
flag = g_scaler_ctx.flag & SCALER_MENU_CHANGED;
|
||||
flag = g_scaler_ctx.flag & SCALER_MENU_CHANGED;
|
||||
mylock_unlock(&g_scaler_ctx.lock);
|
||||
|
||||
return flag;
|
||||
|
|
@ -79,4 +80,3 @@ int scaler_ctx_reset_menu_changed()
|
|||
mylock_unlock(&g_scaler_ctx.lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -63,8 +63,7 @@ int read_json_file(const char* filename, cJSON** json)
|
|||
return 0;
|
||||
}
|
||||
|
||||
cJSON*
|
||||
s2j_demand_t(scaler_demand_t* demand)
|
||||
cJSON* s2j_demand_t(scaler_demand_t* demand)
|
||||
{
|
||||
if (!demand)
|
||||
return NULL;
|
||||
|
|
@ -89,8 +88,7 @@ s2j_demand_t(scaler_demand_t* demand)
|
|||
return json;
|
||||
}
|
||||
|
||||
cJSON*
|
||||
s2j_instance_id_list_t(instance_id_list_t* instance_ids)
|
||||
cJSON* s2j_instance_id_list_t(instance_id_list_t* instance_ids)
|
||||
{
|
||||
if (!instance_ids)
|
||||
return NULL;
|
||||
|
|
@ -111,8 +109,10 @@ s2j_instance_id_list_t(instance_id_list_t* instance_ids)
|
|||
ERROR("Failed to create machine JSON object");
|
||||
return NULL;
|
||||
}
|
||||
cJSON_AddStringToObject(machine, "name", instance_ids->instance_ids[i].hostname);
|
||||
cJSON_AddStringToObject(machine, "machineId", instance_ids->instance_ids[i].instance_id);
|
||||
cJSON_AddStringToObject(machine, "name",
|
||||
instance_ids->instance_ids[i].hostname);
|
||||
cJSON_AddStringToObject(machine, "machineId",
|
||||
instance_ids->instance_ids[i].instance_id);
|
||||
cJSON_AddItemToArray(machines, machine);
|
||||
}
|
||||
cJSON_AddItemToObject(json, "machines", machines);
|
||||
|
|
@ -121,10 +121,10 @@ s2j_instance_id_list_t(instance_id_list_t* instance_ids)
|
|||
}
|
||||
|
||||
/*
|
||||
* This is the abstracted function to convert scaler_request_t to JSON. It only save the request_id.
|
||||
* This is the abstracted function to convert scaler_request_t to JSON. It only
|
||||
* save the request_id.
|
||||
*/
|
||||
cJSON*
|
||||
s2j_request_id_list_t(scaler_request_t* req)
|
||||
cJSON* s2j_request_id_list_t(scaler_request_t* req)
|
||||
{
|
||||
if (!req)
|
||||
return NULL;
|
||||
|
|
@ -150,10 +150,7 @@ s2j_request_id_list_t(scaler_request_t* req)
|
|||
return json;
|
||||
}
|
||||
|
||||
cJSON* s2j_create_empty_obj()
|
||||
{
|
||||
return cJSON_CreateObject();
|
||||
}
|
||||
cJSON* s2j_create_empty_obj() { return cJSON_CreateObject(); }
|
||||
|
||||
// convert scaler_template_attr_t array to cJSON object
|
||||
cJSON* s2j_attribute_t(scaler_template_attr_t* attrs, int num_attr)
|
||||
|
|
@ -175,7 +172,9 @@ cJSON* s2j_attribute_t(scaler_template_attr_t* attrs, int num_attr)
|
|||
switch (attrs[i].type) {
|
||||
case SCALER_ATTR_TYPE_BOOL:
|
||||
cJSON_AddItemToArray(attr_array, cJSON_CreateString("Boolean"));
|
||||
cJSON_AddItemToArray(attr_array, cJSON_CreateString(attrs[i].v.bool_val ? "1" : "0"));
|
||||
cJSON_AddItemToArray(
|
||||
attr_array,
|
||||
cJSON_CreateString(attrs[i].v.bool_val ? "1" : "0"));
|
||||
break;
|
||||
case SCALER_ATTR_TYPE_NUM: {
|
||||
char buf[32];
|
||||
|
|
@ -185,7 +184,9 @@ cJSON* s2j_attribute_t(scaler_template_attr_t* attrs, int num_attr)
|
|||
} break;
|
||||
case SCALER_ATTR_TYPE_STR:
|
||||
cJSON_AddItemToArray(attr_array, cJSON_CreateString("String"));
|
||||
cJSON_AddItemToArray(attr_array, cJSON_CreateString(attrs[i].v.str_val ? attrs[i].v.str_val : ""));
|
||||
cJSON_AddItemToArray(
|
||||
attr_array, cJSON_CreateString(
|
||||
attrs[i].v.str_val ? attrs[i].v.str_val : ""));
|
||||
break;
|
||||
default:
|
||||
cJSON_AddItemToArray(attr_array, cJSON_CreateString("Null"));
|
||||
|
|
@ -223,12 +224,10 @@ static int j2s_attribute_t(cJSON* attrs_obj, scaler_template_attr_t** out_attrs)
|
|||
cJSON* attr = NULL;
|
||||
int count = 0;
|
||||
int idx = 0;
|
||||
cJSON_ArrayForEach(attr, attrs_obj)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
cJSON_ArrayForEach(attr, attrs_obj) { count++; }
|
||||
num_attrs = count;
|
||||
attrs = (scaler_template_attr_t*)calloc(count, sizeof(scaler_template_attr_t));
|
||||
attrs = (scaler_template_attr_t*)calloc(count,
|
||||
sizeof(scaler_template_attr_t));
|
||||
|
||||
cJSON_ArrayForEach(attr, attrs_obj)
|
||||
{
|
||||
|
|
@ -241,13 +240,15 @@ static int j2s_attribute_t(cJSON* attrs_obj, scaler_template_attr_t** out_attrs)
|
|||
if (cJSON_IsArray(attr)) {
|
||||
cJSON* type_item = cJSON_GetArrayItem(attr, 0);
|
||||
cJSON* value_item = cJSON_GetArrayItem(attr, 1);
|
||||
if (type_item && cJSON_IsString(type_item)
|
||||
&& value_item && cJSON_IsString(value_item)) {
|
||||
if (type_item && cJSON_IsString(type_item) && value_item
|
||||
&& cJSON_IsString(value_item)) {
|
||||
const char* type_str = type_item->valuestring;
|
||||
const char* value_str = value_item->valuestring;
|
||||
if (strcmp(type_str, "Boolean") == 0) {
|
||||
attrs[idx].type = SCALER_ATTR_TYPE_BOOL;
|
||||
attrs[idx].v.bool_val = (strcmp(value_str, "1") == 0 || strcasecmp(value_str, "true") == 0);
|
||||
attrs[idx].type = SCALER_ATTR_TYPE_BOOL;
|
||||
attrs[idx].v.bool_val
|
||||
= (strcmp(value_str, "1") == 0
|
||||
|| strcasecmp(value_str, "true") == 0);
|
||||
} else if (strcmp(type_str, "Numeric") == 0) {
|
||||
attrs[idx].type = SCALER_ATTR_TYPE_NUM;
|
||||
attrs[idx].v.num_val = atoi(value_str);
|
||||
|
|
@ -304,7 +305,8 @@ scaler_template_t* j2s_template_t(char* provider_name, cJSON* json)
|
|||
if (item && cJSON_IsString(item)) {
|
||||
char key[256];
|
||||
tpl->tpl_id.template_id = strdup(item->valuestring);
|
||||
my_snprintf(key, sizeof(key), "%s#%s", tpl->tpl_id.provider_name, tpl->tpl_id.template_id);
|
||||
my_snprintf(key, sizeof(key), "%s#%s", tpl->tpl_id.provider_name,
|
||||
tpl->tpl_id.template_id);
|
||||
tpl->id = strdup(key);
|
||||
} else {
|
||||
ERROR("No templateId define in json.");
|
||||
|
|
@ -347,7 +349,8 @@ scaler_instance_id_t* j2s_instance_id_t(cJSON* json)
|
|||
if (!json)
|
||||
return NULL;
|
||||
|
||||
scaler_instance_id_t* inst_id = (scaler_instance_id_t*)calloc(1, sizeof(scaler_instance_id_t));
|
||||
scaler_instance_id_t* inst_id
|
||||
= (scaler_instance_id_t*)calloc(1, sizeof(scaler_instance_id_t));
|
||||
if (!inst_id)
|
||||
return NULL;
|
||||
|
||||
|
|
@ -378,7 +381,8 @@ scaler_instance_t* j2s_instance_t(cJSON* json, scaler_req_type_t req_type)
|
|||
return NULL;
|
||||
|
||||
item = cJSON_GetObjectItem(json, "result");
|
||||
if (item && cJSON_IsString(item) && strcmp(item->valuestring, "succeed") == 0) {
|
||||
if (item && cJSON_IsString(item)
|
||||
&& strcmp(item->valuestring, "succeed") == 0) {
|
||||
inst = (scaler_instance_t*)calloc(1, sizeof(scaler_instance_t));
|
||||
if (req_type == SCALER_REQ_TYPE_REQ) {
|
||||
inst->alloc_status = ALLOC_STATUS_ALLOCATED;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,8 @@ int my_snprintf(char* buf, size_t size, const char* fmt, ...)
|
|||
return ret;
|
||||
}
|
||||
if ((size_t)ret >= size) {
|
||||
WARN("my_snprintf: output truncated for format: %s (needed %d bytes, buffer size %zu)",
|
||||
WARN("my_snprintf: output truncated for format: %s (needed %d bytes, "
|
||||
"buffer size %zu)",
|
||||
fmt, ret + 1, size);
|
||||
}
|
||||
return ret;
|
||||
|
|
@ -33,14 +34,16 @@ int my_snprintf(char* buf, size_t size, const char* fmt, ...)
|
|||
* like "/tmp/as_in_XXXXXX.json". The 'X's will be replaced with a unique
|
||||
* sequence to ensure the file name is unique.
|
||||
*
|
||||
* Returns 0 on success, -1 on failure. file_name will contain the name of the created file.
|
||||
* Returns 0 on success, -1 on failure. file_name will contain the name of the
|
||||
* created file.
|
||||
*/
|
||||
int create_temp_file(char* file_name)
|
||||
{
|
||||
// Call mkstemp to create a temporary file
|
||||
int fd = mkstemp(file_name);
|
||||
if (fd == -1) {
|
||||
ERROR("Failed to create temporary file, errno %d : %s.", errno, strerror(errno));
|
||||
ERROR("Failed to create temporary file, errno %d : %s.", errno,
|
||||
strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
close(fd);
|
||||
|
|
@ -87,10 +90,8 @@ void print_demand_list(scaler_demand_array_t* d_list)
|
|||
INFO("Number of demands: %d", d_list->num);
|
||||
for (int i = 0; i < d_list->num; i++) {
|
||||
scaler_demand_t* demand = &d_list->data[i];
|
||||
INFO("Demand %d: provider=%s, template=%s, count=%d",
|
||||
i,
|
||||
demand->tpl_id.provider_name,
|
||||
demand->tpl_id.template_id,
|
||||
INFO("Demand %d: provider=%s, template=%s, count=%d", i,
|
||||
demand->tpl_id.provider_name, demand->tpl_id.template_id,
|
||||
demand->count);
|
||||
}
|
||||
}
|
||||
|
|
@ -112,9 +113,9 @@ void print_request(void* data)
|
|||
return;
|
||||
}
|
||||
|
||||
INFO("Request: req_id=%s, type=%d, status=%d, provider=%s, template=%s, count=%d",
|
||||
request->request_id ? request->request_id : "NULL",
|
||||
request->type,
|
||||
INFO("Request: req_id=%s, type=%d, status=%d, provider=%s, template=%s, "
|
||||
"count=%d",
|
||||
request->request_id ? request->request_id : "NULL", request->type,
|
||||
request->status,
|
||||
request->tpl_id.provider_name ? request->tpl_id.provider_name : "NULL",
|
||||
request->tpl_id.template_id ? request->tpl_id.template_id : "NULL",
|
||||
|
|
@ -153,10 +154,8 @@ void print_instance(void* p)
|
|||
inst->instance_id ? inst->instance_id : "NULL",
|
||||
inst->hostname ? inst->hostname : "NULL",
|
||||
inst->private_ip ? inst->private_ip : "NULL",
|
||||
inst->public_ip ? inst->public_ip : "NULL",
|
||||
(long)inst->launch_time,
|
||||
inst->alloc_status,
|
||||
inst->inst_state ? inst->inst_state : "NULL",
|
||||
inst->public_ip ? inst->public_ip : "NULL", (long)inst->launch_time,
|
||||
inst->alloc_status, inst->inst_state ? inst->inst_state : "NULL",
|
||||
inst->tpl_id.provider_name ? inst->tpl_id.provider_name : "NULL",
|
||||
inst->tpl_id.template_id ? inst->tpl_id.template_id : "NULL",
|
||||
inst->request_id ? inst->request_id : "NULL",
|
||||
|
|
@ -193,7 +192,4 @@ int float_cmp_ex(float a, float b, float ep)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int float_cmp(float a, float b)
|
||||
{
|
||||
return float_cmp_ex(a, b, DEFAULT_EPSILON);
|
||||
}
|
||||
int float_cmp(float a, float b) { return float_cmp_ex(a, b, DEFAULT_EPSILON); }
|
||||
|
|
|
|||
|
|
@ -4,17 +4,17 @@
|
|||
|
||||
typedef void (*obj_fields_fini_t)(void*);
|
||||
|
||||
#define OBJ_ARRAY_FINI(arr_ptr, field_fini_func, type) \
|
||||
do { \
|
||||
type* _arr = (type*)(arr_ptr); \
|
||||
if (!_arr) { \
|
||||
break; \
|
||||
} \
|
||||
for (int i = 0; i < _arr->num; ++i) { \
|
||||
field_fini_func(&(_arr->data[i])); \
|
||||
} \
|
||||
FREEUP(_arr->data); \
|
||||
_arr->num = 0; \
|
||||
#define OBJ_ARRAY_FINI(arr_ptr, field_fini_func, type) \
|
||||
do { \
|
||||
type* _arr = (type*)(arr_ptr); \
|
||||
if (!_arr) { \
|
||||
break; \
|
||||
} \
|
||||
for (int i = 0; i < _arr->num; ++i) { \
|
||||
field_fini_func(&(_arr->data[i])); \
|
||||
} \
|
||||
FREEUP(_arr->data); \
|
||||
_arr->num = 0; \
|
||||
} while (0)
|
||||
|
||||
int provider_init(scaler_provider_t* p, char* name, char* type)
|
||||
|
|
@ -86,7 +86,8 @@ void template_fields_fini(void* p)
|
|||
if (tpl->attrs[i].name) {
|
||||
FREEUP(tpl->attrs[i].name);
|
||||
}
|
||||
if (tpl->attrs[i].type == SCALER_ATTR_TYPE_STR && tpl->attrs[i].v.str_val) {
|
||||
if (tpl->attrs[i].type == SCALER_ATTR_TYPE_STR
|
||||
&& tpl->attrs[i].v.str_val) {
|
||||
FREEUP(tpl->attrs[i].v.str_val);
|
||||
}
|
||||
}
|
||||
|
|
@ -124,7 +125,8 @@ int template_cpy(scaler_template_t* tgt, scaler_template_t* src)
|
|||
// Allocate and copy attributes
|
||||
tgt->num_attrs = src->num_attrs;
|
||||
if (src->num_attrs > 0) {
|
||||
tgt->attrs = (scaler_template_attr_t*)calloc(src->num_attrs, sizeof(scaler_template_attr_t));
|
||||
tgt->attrs = (scaler_template_attr_t*)calloc(
|
||||
src->num_attrs, sizeof(scaler_template_attr_t));
|
||||
if (!tgt->attrs) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
@ -158,12 +160,12 @@ int template_cpy(scaler_template_t* tgt, scaler_template_t* src)
|
|||
}
|
||||
|
||||
scaler_request_t* new_create_request(const char* provider_name,
|
||||
const char* template_id,
|
||||
int count,
|
||||
const char* template_id, int count,
|
||||
const char* request_id)
|
||||
{
|
||||
scaler_request_t* r = (scaler_request_t*)calloc(1, sizeof(scaler_request_t));
|
||||
time_t now = time(NULL);
|
||||
scaler_request_t* r
|
||||
= (scaler_request_t*)calloc(1, sizeof(scaler_request_t));
|
||||
time_t now = time(NULL);
|
||||
|
||||
if (!r) {
|
||||
ERROR("Memory allocation failed for scaler_request_t");
|
||||
|
|
@ -196,10 +198,12 @@ scaler_request_t* new_create_request(const char* provider_name,
|
|||
return r;
|
||||
}
|
||||
|
||||
scaler_request_t* new_release_request(const char* request_id, char* provider_name)
|
||||
scaler_request_t* new_release_request(const char* request_id,
|
||||
char* provider_name)
|
||||
{
|
||||
scaler_request_t* r = (scaler_request_t*)calloc(1, sizeof(scaler_request_t));
|
||||
time_t now = time(NULL);
|
||||
scaler_request_t* r
|
||||
= (scaler_request_t*)calloc(1, sizeof(scaler_request_t));
|
||||
time_t now = time(NULL);
|
||||
|
||||
if (!r) {
|
||||
ERROR("Memory allocation failed for scaler_request_t");
|
||||
|
|
|
|||
|
|
@ -7,15 +7,9 @@
|
|||
extern void test_plug_mgr(void);
|
||||
extern void test_scale_misc(void);
|
||||
|
||||
void setUp(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
void setUp(void) { return; }
|
||||
|
||||
void tearDown(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
void tearDown(void) { return; }
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
|
|
|
|||
|
|
@ -29,16 +29,20 @@ static void global_init(void)
|
|||
scaler_obj_mgr_init(&g_scaler_ctx.requests, request_fini);
|
||||
scaler_obj_mgr_init(&g_scaler_ctx.instances, instance_fini);
|
||||
|
||||
scaler_provider_t* prov = (scaler_provider_t*)malloc(sizeof(scaler_provider_t));
|
||||
scaler_provider_t* prov
|
||||
= (scaler_provider_t*)malloc(sizeof(scaler_provider_t));
|
||||
|
||||
provider_init(prov, TEST_PROVIDER, TEST_PROVIDER_TYPE);
|
||||
prov->confPath = strdup("./testsuite");
|
||||
prov->scriptPath = strdup("./testsuite");
|
||||
prov->scripts[GET_AVAILABLE_TEMPLATES] = strdup(PROV_SCRIPTS[GET_AVAILABLE_TEMPLATES]);
|
||||
prov->scripts[REQUEST_MACHINES] = strdup(PROV_SCRIPTS[REQUEST_MACHINES]);
|
||||
prov->scripts[GET_REQUEST_STATUS] = strdup(PROV_SCRIPTS[GET_REQUEST_STATUS]);
|
||||
prov->scripts[GET_RETURN_REQUEST] = strdup(PROV_SCRIPTS[GET_RETURN_REQUEST]);
|
||||
prov->scripts[RETURN_MACHINES] = strdup(PROV_SCRIPTS[RETURN_MACHINES]);
|
||||
prov->confPath = strdup("./testsuite");
|
||||
prov->scriptPath = strdup("./testsuite");
|
||||
prov->scripts[GET_AVAILABLE_TEMPLATES]
|
||||
= strdup(PROV_SCRIPTS[GET_AVAILABLE_TEMPLATES]);
|
||||
prov->scripts[REQUEST_MACHINES] = strdup(PROV_SCRIPTS[REQUEST_MACHINES]);
|
||||
prov->scripts[GET_REQUEST_STATUS]
|
||||
= strdup(PROV_SCRIPTS[GET_REQUEST_STATUS]);
|
||||
prov->scripts[GET_RETURN_REQUEST]
|
||||
= strdup(PROV_SCRIPTS[GET_RETURN_REQUEST]);
|
||||
prov->scripts[RETURN_MACHINES] = strdup(PROV_SCRIPTS[RETURN_MACHINES]);
|
||||
provider_add(&g_scaler_ctx.providers, prov);
|
||||
}
|
||||
|
||||
|
|
@ -73,17 +77,16 @@ static void test_trigger_create(void)
|
|||
int ret = trigger_create(&demand);
|
||||
TEST_ASSERT_EQUAL_INT(0, ret);
|
||||
TEST_ASSERT_EQUAL_INT(1, g_scaler_ctx.requests.array.count);
|
||||
scaler_request_t* req = request_get(&g_scaler_ctx.requests, TEST_REQUEST_ID_CREATE);
|
||||
scaler_request_t* req
|
||||
= request_get(&g_scaler_ctx.requests, TEST_REQUEST_ID_CREATE);
|
||||
TEST_ASSERT_NOT_NULL(req);
|
||||
TEST_ASSERT_EQUAL_STRING(TEST_PROVIDER, req->tpl_id.provider_name);
|
||||
}
|
||||
|
||||
static void test_trigger_release(void)
|
||||
{
|
||||
scaler_instance_id_t inst_id = {
|
||||
.instance_id = TEST_INSTANCE_ID,
|
||||
.hostname = TEST_HOSTNAME
|
||||
};
|
||||
scaler_instance_id_t inst_id
|
||||
= { .instance_id = TEST_INSTANCE_ID, .hostname = TEST_HOSTNAME };
|
||||
instance_id_list_t inst_ids;
|
||||
inst_ids.num = 1;
|
||||
inst_ids.instance_ids = &inst_id;
|
||||
|
|
@ -91,14 +94,16 @@ static void test_trigger_release(void)
|
|||
int ret = trigger_release(TEST_PROVIDER, &inst_ids);
|
||||
TEST_ASSERT_EQUAL_INT(0, ret);
|
||||
TEST_ASSERT_EQUAL_INT(2, g_scaler_ctx.requests.array.count);
|
||||
scaler_request_t* req = request_get(&g_scaler_ctx.requests, TEST_REQUEST_ID_RELEASE);
|
||||
scaler_request_t* req
|
||||
= request_get(&g_scaler_ctx.requests, TEST_REQUEST_ID_RELEASE);
|
||||
TEST_ASSERT_NOT_NULL(req);
|
||||
TEST_ASSERT_EQUAL(SCALER_REQ_TYPE_RET, req->type);
|
||||
}
|
||||
|
||||
static void test_get_create_request_status(void)
|
||||
{
|
||||
scaler_request_t* req = new_create_request(TEST_PROVIDER, TEST_TEMPLATE, 1, TEST_REQUEST_ID_CREATE);
|
||||
scaler_request_t* req = new_create_request(TEST_PROVIDER, TEST_TEMPLATE, 1,
|
||||
TEST_REQUEST_ID_CREATE);
|
||||
|
||||
int ret = get_request_status(req);
|
||||
request_fini(req);
|
||||
|
|
@ -106,7 +111,8 @@ static void test_get_create_request_status(void)
|
|||
TEST_ASSERT_EQUAL_INT(0, ret);
|
||||
TEST_ASSERT_EQUAL(REQ_STATUS_COMPLETED, req->status);
|
||||
TEST_ASSERT_EQUAL_INT(2, g_scaler_ctx.instances.array.count);
|
||||
scaler_instance_t* inst = instance_get(&g_scaler_ctx.instances, TEST_INSTANCE_ID);
|
||||
scaler_instance_t* inst
|
||||
= instance_get(&g_scaler_ctx.instances, TEST_INSTANCE_ID);
|
||||
TEST_ASSERT_NOT_NULL(inst);
|
||||
TEST_ASSERT_EQUAL_STRING(TEST_PRIVATE_IP, inst->private_ip);
|
||||
TEST_ASSERT_EQUAL(ALLOC_STATUS_ALLOCATED, inst->alloc_status);
|
||||
|
|
@ -114,14 +120,16 @@ static void test_get_create_request_status(void)
|
|||
|
||||
static void test_get_release_request_status(void)
|
||||
{
|
||||
scaler_request_t* req = new_release_request(TEST_REQUEST_ID_RELEASE, TEST_PROVIDER);
|
||||
int ret = get_request_status(req);
|
||||
scaler_request_t* req
|
||||
= new_release_request(TEST_REQUEST_ID_RELEASE, TEST_PROVIDER);
|
||||
int ret = get_request_status(req);
|
||||
request_fini(req);
|
||||
req = request_get(&g_scaler_ctx.requests, TEST_REQUEST_ID_CREATE);
|
||||
TEST_ASSERT_EQUAL_INT(0, ret);
|
||||
TEST_ASSERT_EQUAL(REQ_STATUS_COMPLETED, req->status);
|
||||
TEST_ASSERT_EQUAL_INT(2, g_scaler_ctx.instances.array.count);
|
||||
scaler_instance_t* inst = instance_get(&g_scaler_ctx.instances, TEST_INSTANCE_ID);
|
||||
scaler_instance_t* inst
|
||||
= instance_get(&g_scaler_ctx.instances, TEST_INSTANCE_ID);
|
||||
TEST_ASSERT_NOT_NULL(inst);
|
||||
TEST_ASSERT_EQUAL_STRING(TEST_PRIVATE_IP, inst->private_ip);
|
||||
TEST_ASSERT_EQUAL(ALLOC_STATUS_DONE, inst->alloc_status);
|
||||
|
|
@ -129,16 +137,19 @@ static void test_get_release_request_status(void)
|
|||
|
||||
static void test_get_return_request(void)
|
||||
{
|
||||
instance_id_list_t* inst_id_list = (instance_id_list_t*)malloc(sizeof(instance_id_list_t));
|
||||
inst_id_list->num = 1;
|
||||
inst_id_list->instance_ids = (scaler_instance_id_t*)malloc(sizeof(scaler_instance_id_t));
|
||||
instance_id_list_t* inst_id_list
|
||||
= (instance_id_list_t*)malloc(sizeof(instance_id_list_t));
|
||||
inst_id_list->num = 1;
|
||||
inst_id_list->instance_ids
|
||||
= (scaler_instance_id_t*)malloc(sizeof(scaler_instance_id_t));
|
||||
inst_id_list->instance_ids[0].instance_id = strdup(TEST_INSTANCE_ID);
|
||||
inst_id_list->instance_ids[0].hostname = strdup(TEST_HOSTNAME);
|
||||
|
||||
int ret = get_return_request(TEST_PROVIDER, inst_id_list);
|
||||
instance_id_list_fini(inst_id_list);
|
||||
TEST_ASSERT_EQUAL_INT(0, ret);
|
||||
scaler_instance_t* inst = instance_get(&g_scaler_ctx.instances, TEST_INSTANCE_ID);
|
||||
scaler_instance_t* inst
|
||||
= instance_get(&g_scaler_ctx.instances, TEST_INSTANCE_ID);
|
||||
TEST_ASSERT_NOT_NULL(inst);
|
||||
TEST_ASSERT_EQUAL_STRING(TEST_HOSTNAME, inst->hostname);
|
||||
TEST_ASSERT_EQUAL_STRING(TEST_INSTANCE_ID, inst->instance_id);
|
||||
|
|
|
|||
|
|
@ -9,28 +9,29 @@
|
|||
#include "unity.h"
|
||||
|
||||
#ifndef TEST_ASSERT_NOT_EQUAL_STRING
|
||||
#define TEST_ASSERT_NOT_EQUAL_STRING(a, b) \
|
||||
do { \
|
||||
if (strcmp(a, b) == 0) { \
|
||||
TEST_FAIL_MESSAGE(#a " and " #b " are equal"); \
|
||||
} \
|
||||
#define TEST_ASSERT_NOT_EQUAL_STRING(a, b) \
|
||||
do { \
|
||||
if (strcmp(a, b) == 0) { \
|
||||
TEST_FAIL_MESSAGE(#a " and " #b " are equal"); \
|
||||
} \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
static void
|
||||
test_my_snprintf(void)
|
||||
static void test_my_snprintf(void)
|
||||
{
|
||||
char buffer[50];
|
||||
int result;
|
||||
|
||||
// Test normal formatting
|
||||
result = my_snprintf(buffer, sizeof(buffer), "Hello %s, number: %d", "World", 42);
|
||||
result = my_snprintf(buffer, sizeof(buffer), "Hello %s, number: %d",
|
||||
"World", 42);
|
||||
TEST_ASSERT_EQUAL_STRING("Hello World, number: 42", buffer);
|
||||
TEST_ASSERT_EQUAL_INT(strlen("Hello World, number: 42"), result);
|
||||
|
||||
// Test buffer size limit
|
||||
char small_buffer[10];
|
||||
result = my_snprintf(small_buffer, sizeof(small_buffer), "This is a very long string");
|
||||
result = my_snprintf(small_buffer, sizeof(small_buffer),
|
||||
"This is a very long string");
|
||||
TEST_ASSERT_EQUAL_INT(strlen("This is a very long string"), result);
|
||||
|
||||
// Test empty format
|
||||
|
|
@ -90,25 +91,17 @@ static void test_my_strcmp(void)
|
|||
|
||||
static void test_cmp_template_id(void)
|
||||
{
|
||||
scaler_template_id_t id1 = {
|
||||
.provider_name = "aws",
|
||||
.template_id = "t2.micro"
|
||||
};
|
||||
scaler_template_id_t id1
|
||||
= { .provider_name = "aws", .template_id = "t2.micro" };
|
||||
|
||||
scaler_template_id_t id2 = {
|
||||
.provider_name = "aws",
|
||||
.template_id = "t2.micro"
|
||||
};
|
||||
scaler_template_id_t id2
|
||||
= { .provider_name = "aws", .template_id = "t2.micro" };
|
||||
|
||||
scaler_template_id_t id3 = {
|
||||
.provider_name = "azure",
|
||||
.template_id = "t2.micro"
|
||||
};
|
||||
scaler_template_id_t id3
|
||||
= { .provider_name = "azure", .template_id = "t2.micro" };
|
||||
|
||||
scaler_template_id_t id4 = {
|
||||
.provider_name = "aws",
|
||||
.template_id = "t2.small"
|
||||
};
|
||||
scaler_template_id_t id4
|
||||
= { .provider_name = "aws", .template_id = "t2.small" };
|
||||
|
||||
// Test both NULL
|
||||
TEST_ASSERT_TRUE(cmp_template_id(NULL, NULL));
|
||||
|
|
@ -127,9 +120,12 @@ static void test_cmp_template_id(void)
|
|||
TEST_ASSERT_FALSE(cmp_template_id(&id1, &id4));
|
||||
|
||||
// Test with NULL fields
|
||||
scaler_template_id_t id_null1 = { .provider_name = NULL, .template_id = "test" };
|
||||
scaler_template_id_t id_null2 = { .provider_name = "test", .template_id = NULL };
|
||||
scaler_template_id_t id_null3 = { .provider_name = NULL, .template_id = NULL };
|
||||
scaler_template_id_t id_null1
|
||||
= { .provider_name = NULL, .template_id = "test" };
|
||||
scaler_template_id_t id_null2
|
||||
= { .provider_name = "test", .template_id = NULL };
|
||||
scaler_template_id_t id_null3
|
||||
= { .provider_name = NULL, .template_id = NULL };
|
||||
|
||||
TEST_ASSERT_FALSE(cmp_template_id(&id1, &id_null1));
|
||||
TEST_ASSERT_FALSE(cmp_template_id(&id1, &id_null2));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue