From 4b73d0ac3f701f02471d66ef0239982c35e899ec Mon Sep 17 00:00:00 2001 From: Hui Yu Date: Thu, 18 Feb 2021 16:48:49 +0800 Subject: [PATCH] Add PATCH operation to the generic client --- examples/generic/main.c | 13 +++++++++- kubernetes/include/generic.h | 7 +++++- kubernetes/src/generic.c | 48 +++++++++++++++++++++++++++--------- 3 files changed, 54 insertions(+), 14 deletions(-) diff --git a/examples/generic/main.c b/examples/generic/main.c index 0c6e590..4f56290 100644 --- a/examples/generic/main.c +++ b/examples/generic/main.c @@ -46,6 +46,18 @@ int main(int argc, char *argv[]) printf("%s\n", update); free(update); + const char *patchBody = "[{\"op\": \"replace\", \"path\": \"/metadata/labels/foo\", \"value\": \"qux\" }]"; + list_t *contentType = list_create(); + // Kubernetes supports multiple content types: + list_addElement(contentType, "application/json-patch+json"); + // list_addElement(contentType, "application/merge-patch+json"); + // list_addElement(contentType, "application/strategic-merge-patch+json"); + // list_addElement(contentType, "application/apply-patch+yaml"); + char *patch = Generic_patchResource(genericClient, "test", patchBody, NULL, NULL, NULL, NULL, contentType); + printf("%s\n", patch); + list_free(contentType); + free(patch); + char *del = Generic_deleteResource(genericClient, "test"); printf("%s\n", del); free(del); @@ -53,7 +65,6 @@ int main(int argc, char *argv[]) genericClient_free(genericClient); genericClient = NULL; - apiClient_free(apiClient); apiClient = NULL; free_client_config(basePath, sslConfig, apiKeys); diff --git a/kubernetes/include/generic.h b/kubernetes/include/generic.h index 46e054d..7bd3e52 100644 --- a/kubernetes/include/generic.h +++ b/kubernetes/include/generic.h @@ -11,7 +11,7 @@ typedef struct genericClient_t { apiClient_t *client; char *apiGroup; char *apiVersion; - char *resourcePlural; + char *resourcePlural; } genericClient_t; genericClient_t* genericClient_create(apiClient_t *client, const char *apiGroup, const char* apiVersion, const char* resourcePlural); @@ -32,6 +32,11 @@ char* Generic_createResource(genericClient_t *client, const char* body); char* Generic_replaceNamespacedResource(genericClient_t *client, const char *ns, const char *name, const char* body); char* Generic_replaceResource(genericClient_t *client, const char *name, const char* body); +char* Generic_patchNamespacedResource(genericClient_t *client, const char *ns, const char *name, const char *body, list_t *queryParameters, list_t *headerParameters, list_t *formParameters, + list_t *headerType, list_t *contentType); +char* Generic_patchResource(genericClient_t *client, const char *name, const char *body, list_t *queryParameters, list_t *headerParameters, list_t *formParameters, list_t *headerType, + list_t *contentType); + #ifdef __cplusplus } #endif diff --git a/kubernetes/src/generic.c b/kubernetes/src/generic.c index ff699cd..d8e0706 100644 --- a/kubernetes/src/generic.c +++ b/kubernetes/src/generic.c @@ -50,8 +50,10 @@ void makeResourcePath(char* path, genericClient_t *client, const char* name) { } } -char* callInternal(genericClient_t *client, const char* path, const char* method, const char* body) { - apiClient_invoke(client->client, path, NULL, NULL, NULL, NULL, NULL, body, method); +char* callInternal(genericClient_t *client, + const char *path, list_t *queryParameters, list_t *headerParameters, list_t *formParameters, list_t *headerType, list_t *contentType, const char *body, const char *method) +{ + apiClient_invoke(client->client, path, queryParameters, headerParameters, formParameters, headerType, contentType, body, method); if (client->client->response_code == 200) { printf("%s\n","OK"); @@ -71,18 +73,23 @@ char* callInternal(genericClient_t *client, const char* path, const char* method return elementToReturn; } +char *callSimplifiedInternal(genericClient_t *client, const char *path, const char *method, const char *body) +{ + return callInternal(client, path, NULL, NULL, NULL, NULL, NULL, body, method); +} + char* Generic_readNamespacedResource(genericClient_t *client, const char *namespace, const char *name) { char path[128]; makeNamespacedResourcePath(path, client, namespace, name); - return callInternal(client, path, "GET", NULL); + return callSimplifiedInternal(client, path, "GET", NULL); } char* Generic_readResource(genericClient_t *client, const char *name) { char path[128]; makeResourcePath(path, client, name); - return callInternal(client, path, "GET", NULL); + return callSimplifiedInternal(client, path, "GET", NULL); } char *Generic_listNamespaced(genericClient_t *client, const char *namespace) { @@ -94,7 +101,7 @@ char *Generic_listNamespaced(genericClient_t *client, const char *namespace) { snprintf(path, 128, "/api/%s/namespaces/%s/%s", client->apiVersion, namespace, client->resourcePlural); } - return callInternal(client, path, "GET", NULL); + return callSimplifiedInternal(client, path, "GET", NULL); } char *Generic_list(genericClient_t *client) { @@ -106,42 +113,59 @@ char *Generic_list(genericClient_t *client) { snprintf(path, 128, "/api/%s/%s", client->apiVersion, client->resourcePlural); } - return callInternal(client, path, "GET", NULL); + return callSimplifiedInternal(client, path, "GET", NULL); } char* Generic_deleteNamespacedResource(genericClient_t *client, const char *namespace, const char *name) { char path[128]; makeNamespacedResourcePath(path, client, namespace, name); - return callInternal(client, path, "DELETE", NULL); + return callSimplifiedInternal(client, path, "DELETE", NULL); } char* Generic_deleteResource(genericClient_t *client, const char* name) { char path[128]; makeResourcePath(path, client, name); - return callInternal(client, path, "DELETE", NULL); + return callSimplifiedInternal(client, path, "DELETE", NULL); } char* Generic_createNamespacedResource(genericClient_t *client, const char *ns, const char* body) { char path[128]; makeNamespacedResourcePath(path, client, ns, ""); - return callInternal(client, path, "POST", body); + return callSimplifiedInternal(client, path, "POST", body); } char* Generic_createResource(genericClient_t *client, const char* body) { char path[128]; makeResourcePath(path, client, ""); printf("%s\n", path); - return callInternal(client, path, "POST", body); + return callSimplifiedInternal(client, path, "POST", body); } char* Generic_replaceNamespacedResource(genericClient_t *client, const char *ns, const char *name, const char* body) { char path[128]; makeNamespacedResourcePath(path, client, ns, name); - return callInternal(client, path, "PUT", body); + return callSimplifiedInternal(client, path, "PUT", body); } char* Generic_replaceResource(genericClient_t *client, const char *name, const char* body) { char path[128]; makeResourcePath(path, client, name); - return callInternal(client, path, "PUT", body); + return callSimplifiedInternal(client, path, "PUT", body); +} + +char* Generic_patchNamespacedResource(genericClient_t * client, + const char *ns, + const char *name, const char *body, list_t *queryParameters, list_t *headerParameters, list_t *formParameters, list_t *headerType, list_t *contentType) +{ + char path[128]; + makeNamespacedResourcePath(path, client, ns, name); + return callInternal(client, path, queryParameters, headerParameters, formParameters, headerType, contentType, body, "PATCH"); +} + +char* Generic_patchResource(genericClient_t * client, + const char *name, const char *body, list_t *queryParameters, list_t *headerParameters, list_t *formParameters, list_t *headerType, list_t *contentType) +{ + char path[128]; + makeResourcePath(path, client, name); + return callInternal(client, path, queryParameters, headerParameters, formParameters, headerType, contentType, body, "PATCH"); }