Bug #44013
Updated by Ernesto Puerta almost 4 years ago
Regardless the discussion on whether dashboard API should adhere more or less tightly to RESTful guidelines, it should at least try to keep internal consistency: * Most API Endpoints consistency (a few endpoints lie beneath @/api@ * However, a few the @/api/@ URL part, while most of them are below @/apiapi@, like Cephfs, ErasureCode, etc. directly exposed from the root). Currently we have some components with a REST API that diverges from the existing practices and general guidelines: * Verbs in endpoints: ** @GET /cephfs/{fs_id}/get_quotas@ vs. the existing @GET /rgw/user/{uid}/quota@. Same for CephFS set_quota. * Excess of endpoints and operations. REST APIs aim at being clear and concise interfaces. ** We currently expose 191 different endpoints (only the @/osd@ resource has 17, and that doesn't include the new ones for creating/deleting OSDs). This could be improved by aggregating endpoints (e.g.: @/osd/{id}, body: {down, out, up, in, lost..}@ instead of @/osd/{id}/mark_down@, @/osd/{id}/mark_out@, @/osd/{id}/mark_up@, @/osd/{id}/mark_in@, @/osd/{id}/mark_lost@,... ** That will also result in less redundant code to maintain and fix. ** We should also hide what we call UI endpoints (helper endpoints for the front-end). * Resources hidden in query params: REST APIs are great for exposing hierarchical resources, but Dashboard CephFS API has missed the chance to expose the CephFS filesystem hierarchy: ** for making a new dir it requires @POST /cephfs/{fs_id}/mk_dirs, body: {path: '/dira/dirb/...}@, when it'd be preferred the following @POST /cephfs/{fs_id}/dira/dirb, body: {name: 'dirC', type: 'dir'}@ * HTTP Verbs are wrongly used (POST is used for everything): ** @POST /cephfs/{fs_id}/rm_dir@ vs @DELETE /cephfs/{fs_id}/dirA/dirB/dir_to_delete@. The resources that seem best aligned to REST guidelines: * @/cluster_conf@ * @/host@ * @/iscsi@ * @/nfs-ganesha@ * @/pool@ * @/rgw@ The ones that should be improved: * @/cephfs@ * @/osd/{id}/mark_{in,down,..}@, uses POST and separate endpoints for setting individual flags, when that should be a single endpoint driven by a @PUT /osd/{id}, body: {out: true|false|undefined, down:...}@. * Perf-counters (@/perf_counter/{mgr,mon,osd,...}/{id}@) should be moved under their corresponding resources (@/{mgr,mon,osd...}/{id}/perf_counter@ * @POST /mgr/module/{module_name}/{enable,disable}@ should be @PUT /mgr/module/{name}, {enable: true|false}@ * @/prometheus/silence@ vs. @/prometheus/silences@ * @/block/mirroring/pool/...@ using POST instead of PUT.