From 0145da23c231ba278c4f7bc386a0783db466bded Mon Sep 17 00:00:00 2001 From: root Date: Fri, 8 Aug 2008 15:01:41 +0200 Subject: [PATCH] type param gone from clone --- handler_virt.c | 128 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 98 insertions(+), 30 deletions(-) diff --git a/handler_virt.c b/handler_virt.c index b3a0b6c..82ab936 100644 --- a/handler_virt.c +++ b/handler_virt.c @@ -239,6 +239,7 @@ cherokee_handler_virt_init (cherokee_handler_virt_t *hdl) } } + /* TODO: it would be nice to filter read_only methods already on this point */ hdl->action = not_implemented; switch (conn->header.method) { case http_get: @@ -266,6 +267,7 @@ cherokee_handler_virt_init (cherokee_handler_virt_t *hdl) else if (strncmp(this, "virStorage", 10) == 0) { if (strncmp(this+10, "Vol", 3) == 0) { if (strcmp(this+13, "CreateXML") == 0) hdl->action = storageVolCreateXML_args; + else if (strcmp(this+13, "Delete") == 0) hdl->action = storageVolDelete_args; else if (strcmp(this+13, "CloneXML") == 0) hdl->action = storageVolCloneXML_args; else if (strcmp(this+13, "GetXMLDesc") == 0) hdl->action = storageVolGetXMLDesc; } @@ -400,7 +402,7 @@ static ret_t save_xml(cherokee_handler_virt_t *hdl, virDomainPtr result, cheroke static ret_t -virt_virt_function(cherokee_handler_virt_t *hdl, virDomainPtr dom) { +virt_virt_function(cherokee_handler_virt_t *hdl, virDomainPtr dom, virConnectPtr virConn) { cherokee_connection_t *conn = HANDLER_CONN(hdl); cherokee_buffer_t *buf = &HDL_AVAHI(hdl)->buffer; @@ -430,12 +432,48 @@ virt_virt_function(cherokee_handler_virt_t *hdl, virDomainPtr dom) { cherokee_buffer_t xml = CHEROKEE_BUF_INIT; if (strcmp(temp, "disk") == 0) { - void *file, *device; - - if ((ret = cherokee_avl_get_ptr (conn->arguments, "file", &file)) == ret_ok && (ret = cherokee_avl_get_ptr (conn->arguments, "device", &device)) == ret_ok) { - cherokee_buffer_add_va (&xml, VIRT_DISK_XML, file, device); - } else { - ret = ret_error; + void *device; + // TODO pool= / volume= + if ((ret = cherokee_avl_get_ptr (conn->arguments, "device", &device)) == ret_ok) { + void *file; + if ((ret = cherokee_avl_get_ptr (conn->arguments, "file", &file)) == ret_ok) { + cherokee_buffer_add_va (&xml, VIRT_DISK_XML, file, device); + } else { + void *poolstr, *volumestr; + if ((ret = cherokee_avl_get_ptr (conn->arguments, "pool", &poolstr)) == ret_ok && + (ret = cherokee_avl_get_ptr (conn->arguments, "volume", &volumestr)) == ret_ok) { + cherokee_buffer_t fullvol = CHEROKEE_BUF_INIT; + virStoragePoolPtr pool; + virStorageVolPtr volume; + + pool = virStoragePoolLookupByName(virConn, poolstr); + if (pool == NULL) { + conn->error_code = http_not_found; + return ret_error; + } + + cherokee_buffer_add_va (&fullvol, "%s_%s", hdl->user.buf, volumestr); + volume = virStorageVolLookupByName(pool, fullvol.buf); + + cherokee_buffer_mrproper(&fullvol); + virStoragePoolFree(pool); + + if (volume == NULL) { + conn->error_code = http_not_found; + return ret_error; + } + file = virStorageVolGetPath(volume); + cherokee_buffer_add_va (&xml, VIRT_DISK_XML, file, device); + free(file); + + ret = ret_ok; + + virStorageVolFree(volume); + } else { + conn->error_code = http_bad_request; + return ret_error; + } + } } } @@ -602,6 +640,57 @@ virt_virt_new(cherokee_handler_virt_t *hdl, virConnectPtr virConn) virStorageVolPtr volume; switch (hdl->action) { + case storageVolDelete_args: { + cherokee_buffer_t fullvol = CHEROKEE_BUF_INIT; + void *temp; + ret_t ret; + ret = cherokee_connection_parse_args (conn); + + if (unlikely(ret < ret_ok)) { + conn->error_code = http_internal_error; + return ret_error; + } + + ret = cherokee_avl_get_ptr (conn->arguments, "pool", &temp); + if (unlikely(ret < ret_ok)) { + conn->error_code = http_bad_request; + return ret; + } + + pool = virStoragePoolLookupByName(virConn, temp); + + if (pool == NULL) { + conn->error_code = http_not_found; + return ret_error; + } + + ret = cherokee_avl_get_ptr (conn->arguments, "volume", &temp); + if (unlikely(ret < ret_ok)) { + conn->error_code = http_bad_request; + return ret; + } + + cherokee_buffer_add_va (&fullvol, "%s_%s", hdl->user.buf, temp); + printf("%s\n", fullvol.buf); + volume = virStorageVolLookupByName(pool, fullvol.buf); + + cherokee_buffer_mrproper(&fullvol); + virStoragePoolFree(pool); + + if (volume == NULL) { + conn->error_code = http_not_found; + return ret_error; + } + + cherokee_buffer_add_long10(buf, virStorageVolDelete(volume, 0)); + + ret = ret_ok; + + virStorageVolFree(volume); + + break; + } + case storageVolGetXMLDesc: { cherokee_buffer_t fullvol = CHEROKEE_BUF_INIT; void *temp; @@ -698,28 +787,6 @@ virt_virt_new(cherokee_handler_virt_t *hdl, virConnectPtr virConn) return ret; } - ret = cherokee_avl_get_ptr (conn->arguments, "type", &temp); - if (unlikely(ret < ret_ok)) { - virStorageVolFree(volume); - virStoragePoolFree(pool); - conn->error_code = http_bad_request; - return ret; - } - - - enum { UNKNOWN, RAW, QCOW } clone = UNKNOWN; - - if (strcmp("raw", temp) == 0) - clone = RAW; - else if (strcmp("qcow", temp) == 0) - clone = QCOW; - else { - virStorageVolFree(volume); - virStoragePoolFree(pool); - conn->error_code = http_bad_request; - return ret_error; - } - cherokee_buffer_t busy = CHEROKEE_BUF_INIT; cherokee_buffer_add_va (&busy, "/mnt/images/queue/%s_%s.queued", hdl->user.buf, name); @@ -928,6 +995,7 @@ virt_virt_do(cherokee_handler_virt_t *hdl, cherokee_buffer_t *domu, cherokee_buf } switch (hdl->action) { + case storageVolDelete_args: case storageVolGetXMLDesc: case storageVolCloneXML_args: case storageVolCreateXML_args: @@ -943,7 +1011,7 @@ virt_virt_do(cherokee_handler_virt_t *hdl, cherokee_buffer_t *domu, cherokee_buf if ((dom = virDomainLookupByName(virConn, domu->buf)) == NULL) { conn->error_code = http_not_found; } else { - ret = virt_virt_function(hdl, dom); + ret = virt_virt_function(hdl, dom, virConn); virDomainFree(dom); } } -- 2.11.4.GIT