summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJavier Sánchez Parra <jsanchez@soleta.eu>2022-06-16 14:28:43 +0200
committerJavier Sánchez Parra <jsanchez@soleta.eu>2022-06-20 10:41:32 +0200
commit52a38d3e574fb25b47d230bc87754583eb17b4a6 (patch)
tree0cca8d4a0ef608459addd256b6740b0de044d2d6
parenta0a3470682852d5f72967553d5debe41e86eca78 (diff)
#915 Use the repository id on image creation
POST /image/create has two modes, image creation and update. You can find more information about the "creation" mode in commit: d2f20d0be06617f421eecca111449d94672695eb On image creation, use the id to identify repositories instead of the IP. This is a preparative commit to the support of repositories with several IPs. On image update, "repository_id" field is not needed because the image already has the repository assigned. This commit maintains backward compatibility with the Web Console (old web interface), because it only use the "update" mode of /image/create. Request POST /create/image: { "clients": [ "192.168.56.11" ], "disk": "1", "partition": "1", "name": "archlinux", "repository_id": 1, "id": "0", "code": "131", "description": "This is a test", "group_id": 0, "center_id": 1 } Response 200 OK
-rw-r--r--src/dbi.c79
-rw-r--r--src/dbi.h4
-rw-r--r--src/rest.c37
3 files changed, 64 insertions, 56 deletions
diff --git a/src/dbi.c b/src/dbi.c
index 0718126..a90d5ec 100644
--- a/src/dbi.c
+++ b/src/dbi.c
@@ -127,40 +127,6 @@ int og_dbi_get_computer_info(struct og_dbi *dbi, struct og_computer *computer,
return 0;
}
-const int og_dbi_get_repository(const struct og_dbi *dbi, const char *repo_ip)
-{
- const char *msglog;
- dbi_result result;
- int repo_id;
-
- /* database can store duplicated repositories, limit query to return
- * only one */
- result = dbi_conn_queryf(dbi->conn,
- "SELECT idrepositorio FROM repositorios "
- "WHERE ip = '%s' LIMIT 1",
- repo_ip);
- if (!result) {
- dbi_conn_error(dbi->conn, &msglog);
- syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
- __func__, __LINE__, msglog);
- return -1;
- }
-
- if (!dbi_result_next_row(result)) {
- dbi_conn_error(dbi->conn, &msglog);
- syslog(LOG_ERR,
- "software profile does not exist in database (%s:%d) %s\n",
- __func__, __LINE__, msglog);
- dbi_result_free(result);
- return -1;
- }
-
- repo_id = dbi_result_get_int(result, "idrepositorio");
- dbi_result_free(result);
-
- return repo_id;
-}
-
#define OG_UNASSIGNED_SW_ID 0
#define OG_IMAGE_DEFAULT_TYPE 1 /* monolithic */
@@ -168,14 +134,6 @@ int og_dbi_add_image(struct og_dbi *dbi, const struct og_image *image)
{
const char *msglog;
dbi_result result;
- int repo_id;
-
- repo_id = og_dbi_get_repository(dbi, image->repo_ip);
- if (repo_id < 0) {
- syslog(LOG_ERR, "failed to get repository (%s:%d)\n",
- __func__, __LINE__);
- return -1;
- }
result = dbi_conn_queryf(dbi->conn,
"SELECT nombreca FROM imagenes WHERE nombreca = '%s'",
@@ -208,7 +166,7 @@ int og_dbi_add_image(struct og_dbi *dbi, const struct og_image *image)
"VALUES ('%s', '%s', %u, %lu, '', %u, %lu, %u, '')",
image->name, image->description,
OG_UNASSIGNED_SW_ID, image->center_id,
- image->group_id, repo_id,
+ image->group_id, image->repo_id,
OG_IMAGE_DEFAULT_TYPE);
if (!result) {
@@ -221,3 +179,38 @@ int og_dbi_add_image(struct og_dbi *dbi, const struct og_image *image)
dbi_result_free(result);
return dbi_conn_sequence_last(dbi->conn, NULL);
}
+
+int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint64_t image_id,
+ char *repository_ip)
+{
+ const char *msglog, *dbi_repository_ip;
+ dbi_result result;
+
+ result = dbi_conn_queryf(dbi->conn,
+ "SELECT r.ip FROM imagenes i "
+ "JOIN repositorios r USING (idrepositorio) "
+ "WHERE i.idimagen = %lu",
+ image_id);
+ if (!result) {
+ dbi_conn_error(dbi->conn, &msglog);
+ syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
+ __func__, __LINE__, msglog);
+ return -1;
+ }
+
+ if (!dbi_result_next_row(result)) {
+ dbi_conn_error(dbi->conn, &msglog);
+ syslog(LOG_ERR,
+ "image with id %lu has no repository (%s:%d) %s\n",
+ image_id, __func__, __LINE__, msglog);
+ dbi_result_free(result);
+ return -1;
+ }
+
+ dbi_repository_ip = dbi_result_get_string(result, "ip");
+ snprintf(repository_ip, OG_DB_IP_MAXLEN + 1, "%s", dbi_repository_ip);
+
+ dbi_result_free(result);
+
+ return 0;
+}
diff --git a/src/dbi.h b/src/dbi.h
index 2423503..bebae02 100644
--- a/src/dbi.h
+++ b/src/dbi.h
@@ -58,6 +58,7 @@ struct og_image {
uint64_t center_id;
uint64_t datasize;
uint64_t group_id;
+ uint64_t repo_id;
uint64_t type;
uint64_t id;
struct stat image_stats;
@@ -110,4 +111,7 @@ int og_dbi_add_image(struct og_dbi *dbi, const struct og_image *image);
int og_dbi_schema_update(void);
+int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint64_t image_id,
+ char *repository_ip);
+
#endif
diff --git a/src/rest.c b/src/rest.c
index f0953b2..4e12643 100644
--- a/src/rest.c
+++ b/src/rest.c
@@ -2154,10 +2154,8 @@ int og_json_parse_create_image(json_t *element,
(char *)&params->image.name,
sizeof(params->image.name));
params->flags |= OG_REST_PARAM_NAME;
- } else if (!strcmp(key, "repository")) {
- err = og_json_parse_string_copy(value,
- (char *)&params->image.repo_ip,
- sizeof(params->image.repo_ip));
+ } else if (!strcmp(key, "repository_id")) {
+ err = og_json_parse_uint64(value, &params->image.repo_id);
params->flags |= OG_REST_PARAM_REPO;
} else if (!strcmp(key, "clients")) {
err = og_json_parse_clients(value, params);
@@ -2186,6 +2184,7 @@ int og_json_parse_create_image(json_t *element,
static int og_cmd_create_image(json_t *element, struct og_msg_params *params)
{
+ char repository_ip[OG_DB_IP_MAXLEN + 1];
char new_image_id[OG_DB_INT_MAXLEN + 1];
struct og_dbi *dbi;
json_t *clients;
@@ -2200,25 +2199,30 @@ static int og_cmd_create_image(json_t *element, struct og_msg_params *params)
OG_REST_PARAM_PARTITION |
OG_REST_PARAM_CODE |
OG_REST_PARAM_ID |
- OG_REST_PARAM_NAME |
- OG_REST_PARAM_REPO))
+ OG_REST_PARAM_NAME))
+ return -1;
+
+ dbi = og_dbi_open(&ogconfig.db);
+ if (!dbi) {
+ syslog(LOG_ERR,
+ "cannot open connection database (%s:%d)\n",
+ __func__, __LINE__);
return -1;
+ }
/* If there is a description, this means the image is not in the DB. */
if (params->image.description[0]) {
- dbi = og_dbi_open(&ogconfig.db);
- if (!dbi) {
- syslog(LOG_ERR,
- "cannot open connection database (%s:%d)\n",
- __func__, __LINE__);
+ if (!og_msg_params_validate(params, OG_REST_PARAM_REPO)) {
+ og_dbi_close(dbi);
return -1;
}
err = og_dbi_add_image(dbi, &params->image);
- og_dbi_close(dbi);
- if (err < 0)
+ if (err < 0) {
+ og_dbi_close(dbi);
return err;
+ }
snprintf(new_image_id, sizeof(new_image_id), "%u", err);
params->id = new_image_id;
@@ -2227,6 +2231,13 @@ static int og_cmd_create_image(json_t *element, struct og_msg_params *params)
clients = json_copy(element);
json_object_del(clients, "clients");
+ err = og_dbi_get_repository_ip(dbi, atoll(params->id), repository_ip);
+ og_dbi_close(dbi);
+ if (err < 0)
+ return err;
+
+ json_object_set_new(clients ,"repository", json_string(repository_ip));
+
return og_send_request(OG_METHOD_POST, OG_CMD_IMAGE_CREATE, params,
clients);
}