Help:Public API/management/containers: Difference between revisions

From Svacer Wiki
m (replace brackets with dash in headings)
 
(One intermediate revision by the same user not shown)
Line 5: Line 5:
Для выполнения операций получения списка контейнеров, их создания, изменения и удаления существует http-ресурс
Для выполнения операций получения списка контейнеров, их создания, изменения и удаления существует http-ресурс


<pre style="white-space: pre;">
POST /api/public/admin/server/containers
POST /api/public/admin/server/containers
</pre>


Для операций управления составом групп проектов существует http-ресурс  
Для операций управления составом групп проектов существует http-ресурс  


<pre style="white-space: pre;">
POST /api/public/admin/server/project-groups
POST /api/public/admin/server/project-groups
</pre>


Для операции переименования снимков существует http-ресурс
Для операции переименования снимков существует http-ресурс


<pre>
PUT /api/public/snapshots/{snapshot_id}/update
PUT /api/public/snapshots/{snapshot_id}/update
</pre>


{{Note|type=warn|text=Для использования ресурсов необходимо использовать http-запросы с токеном пользователя имеющего соответствующие права}}
{{Note|type=warn|text=Для использования ресурсов необходимо использовать http-запросы с токеном пользователя имеющего соответствующие права}}


== <code>POST /api/public/admin/server/containers</code> - управление набором проектов, веток, групп проектов ==
== <code>POST /api/public/admin/server/containers</code> управление набором проектов, веток, групп проектов ==


Формат запроса:
Формат запроса:
Line 55: Line 49:
</pre>
</pre>


Назначение полей запроса и установка значений полей ответа зависит от типа операции и определяется значением поля запроса <code>action</code>.
Назначение полей запроса и установка значений полей ответа зависит от типа операции и определяется значением поля запроса '''action'''.


{| class="wikitable"
{| class="wikitable"
|+ style=white-space:nowrap | Поддерживаемыe значения поля <code>action</code>
|+ style=white-space:nowrap | Поддерживаемыe значения поля action
|-
|-
!Значение
!Значение
!Тип операции
!Тип операции
|-
|-
|<code>list</code>
|list
|Получение списка контейнеров
|Получение списка контейнеров
|-
|-
|<code>add</code>
|add
|Создание контейнера
|Создание контейнера
|-
|-
|<code>update</code>
|update
|Изменение контейнера
|Изменение контейнера
|-
|-
|<code>remove</code>
|remove
|Удаление контейнера
|Удаление контейнера
|}
|}


=== Получение списка контейнеров: "action": "list" ===
=== Получение списка контейнеров "action": "list" ===


{| class="wikitable"
{| class="wikitable"
|+ style=white-space:nowrap | Назначение полей запроса
|-
|-
!Поле
!Поле
!Описание
!Описание
|-
|-
|<code>action</code>
|id
|<code>list</code>
|-
|<code>id</code>
|Если не пустое: идентификатор контейнера, для которого будут загружены "связанные" контейнеры:
|Если не пустое: идентификатор контейнера, для которого будут загружены "связанные" контейнеры:
:- если передан id группы проектов - вернётся список проектов входящих в данную группу
:- если передан id группы проектов вернётся список проектов входящих в данную группу
:- если передан id проекта - вернётся список групп проектов, в который входит проект + список его веток
:- если передан id проекта вернётся список групп проектов, в который входит проект + список его веток
:- если передан id ветки - вернётся список снимков данной ветки
:- если передан id ветки вернётся список снимков данной ветки
|-
|-
|<code>type</code>
|type
|Допустимые значения: <code>project</code>, <code>branch</code>, <code>project-group</code>
|Допустимые значения: '''project''', '''branch''', '''project-group'''


Если не пустое: отфильтровывает список контейнеров по типу
Если не пустое: отфильтровывает список контейнеров по типу


Если пустое:
Если пустое:
:- если поле <code>id</code> пустое - возвращается объединённый список проектов и групп проектов
:- если поле id пустое возвращается объединённый список проектов и групп проектов
|-
|-
|<code>name</code>
|name
|Если не пустое:
|Если не пустое:
:- если поле <code>id</code> пустое - отфильтровывает список контейнеров по названию
:- если поле id пустое отфильтровывает список контейнеров по названию
:- если поле <code>id</code> НЕ пустое - фильтр по названию НЕ применяется
:- если поле id не пустое фильтр по названию не применяется
|-
|-
|<code>parent</code>
|parent
|Не используется
|Не используется
|-
|-
|<code>review_with_comment</code>
|review_with_comment
|Не используется
|Не используется
|}
|}


==== Примеры запросов с <code>"action": "list"</code> ====
==== Примеры запросов с "action": "list" ====
<pre>
<pre>
$ curl --data '{"action": "list"}' -X POST http://localhost:8080/api/public/admin/server/containers
$ curl --data '{"action": "list"}' -X POST http://localhost:8080/api/public/admin/server/containers
{"Containers":[{"id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","name":"projectGroupA","type":"project-group"},{"id":"20706313-6986-4c9d-9a4e-5e4908a11499","name":"projectGroupB","type":"project-group"},{"id":"a7e22042-96e5-4659-b21a-0615d434bed7","name":"bash","type":"project"},{"id":"a8e0352c-0408-417c-8fd0-4fbe03f38980","name":"iptables","type":"project"},{"id":"d53b0b92-d0fb-429a-8f86-c8fe6ee50c0c","name":"proftpd","type":"project"}]}
{"Containers":[{"id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","name":"projectGroupA","type":"project-group"},{"id":"20706313-6986-4c9d-9a4e-5e4908a11499","name":"projectGroupB","type":"project-group"},{"id":"a7e22042-96e5-4659-b21a-0615d434bed7","name":"bash","type":"project"},{"id":"a8e0352c-0408-417c-8fd0-4fbe03f38980","name":"iptables","type":"project"},{"id":"d53b0b92-d0fb-429a-8f86-c8fe6ee50c0c","name":"proftpd","type":"project"}]}
</pre>
 
<pre>
$ curl --data '{"action": "list", "type": "project-group"}' -X POST http://localhost:8080/api/public/admin/server/containers
$ curl --data '{"action": "list", "type": "project-group"}' -X POST http://localhost:8080/api/public/admin/server/containers
{"Containers":[{"id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","name":"projectGroupA","type":"project-group"},{"id":"20706313-6986-4c9d-9a4e-5e4908a11499","name":"projectGroupB","type":"project-group"}]}
{"Containers":[{"id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","name":"projectGroupA","type":"project-group"},{"id":"20706313-6986-4c9d-9a4e-5e4908a11499","name":"projectGroupB","type":"project-group"}]}
</pre>
 
<pre>
$ curl --data '{"action": "list", "name": "bas"}' -X POST http://localhost:8080/api/public/admin/server/containers
$ curl --data '{"action": "list", "name": "bas"}' -X POST http://localhost:8080/api/public/admin/server/containers
{"Containers":[{"id":"a7e22042-96e5-4659-b21a-0615d434bed7","name":"bash","type":"project"}]}
{"Containers":[{"id":"a7e22042-96e5-4659-b21a-0615d434bed7","name":"bash","type":"project"}]}
</pre>
 
<pre>
$ curl --data '{"action": "list", "id":"a7e22042-96e5-4659-b21a-0615d434bed7"}' -X POST http://localhost:8080/api/public/admin/server/containers
$ curl --data '{"action": "list", "id":"a7e22042-96e5-4659-b21a-0615d434bed7"}' -X POST http://localhost:8080/api/public/admin/server/containers
{"Containers":[{"id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","name":"projectGroupA","type":"project-group"},{"id":"ef9210db-180b-4351-8a2f-7e8ceaa42ec6","name":"master","type":"branch","parent":"a7e22042-96e5-4659-b21a-0615d434bed7"}]}
{"Containers":[{"id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","name":"projectGroupA","type":"project-group"},{"id":"ef9210db-180b-4351-8a2f-7e8ceaa42ec6","name":"master","type":"branch","parent":"a7e22042-96e5-4659-b21a-0615d434bed7"}]}
</pre>
</pre>


=== Создание контейнера: "action": "add" ===
=== Создание контейнера "action": "add" ===


{| class="wikitable"
{| class="wikitable"
|+ style=white-space:nowrap | Назначение полей запроса
|-
|-
!Поле
!Поле
!Описание
!Описание
|-
|-
|<code>action</code>
|id
|<code>add</code>
|-
|<code>id</code>
|Не используется
|Не используется
|-
|-
|<code>type</code>
|type
|Тип нового контейнера. Обязательное. Допустимые значения: <code>project</code>, <code>branch</code>, <code>project-group</code>
|Тип нового контейнера. Обязательное. Допустимые значения: '''project''', '''branch''', '''project-group'''
|-
|-
|<code>name</code>
|name
|Название нового контейнера. Обязательное
|Название нового контейнера. Обязательное
|-
|-
|<code>parent</code>
|parent
|Название или идентификатор проекта, в котором будет создана новая ветка
|Название или идентификатор проекта, в котором будет создана новая ветка
Если тип нового контейнера НЕ <code>branch</code>: не используется
Если тип нового контейнера не '''branch''', не используется
|-
|-
|<code>review_with_comment</code>
|review_with_comment
|Значение настройки проекта "Обязательный комментарий при разметке"
|Значение настройки проекта "Обязательный комментарий при разметке"
Если тип нового контейнера НЕ <code>project</code>: не используется
Если тип нового контейнера не '''project''', не используется
|}
|}


=== Изменение контейнера: "action": "update" ===
=== Изменение контейнера "action": "update" ===


{| class="wikitable"
{| class="wikitable"
|+ style=white-space:nowrap | Назначение полей запроса
|-
|-
!Поле
!Поле
!Описание
!Описание
|-
|-
|<code>action</code>
|id
|<code>update</code>
|-
|<code>id</code>
|Идентификатор изменяемого контейнера. Обязательное
|Идентификатор изменяемого контейнера. Обязательное
|-
|-
|<code>type</code>
|type
|Тип изменяемого контейнера. Используется для поиска контейнера вместе с id. Изменить тип контейнера нельзя. Необязательное. Допустимые значения: <code>project</code>, <code>branch</code>, <code>project-group</code>
|Тип изменяемого контейнера. Используется для поиска контейнера вместе с id. Изменить тип контейнера нельзя. Необязательное. Допустимые значения: '''project''', '''branch''', '''project-group'''
|-
|-
|<code>name</code>
|name
|Новое название контейнера. Обязательное
|Новое название контейнера. Обязательное
|-
|-
|<code>parent</code>
|parent
|Не используется. Изменить проект в котором создана ветка нельзя
|Не используется. Изменить проект в котором создана ветка нельзя
|-
|-
|<code>review_with_comment</code>
|review_with_comment
|Новое значение настройки проекта "Обязательный комментарий при разметке"
|Новое значение настройки проекта "Обязательный комментарий при разметке"
|}
|}


=== Удаление контейнера: "action": "remove" ===
=== Удаление контейнера "action": "remove" ===


{| class="wikitable"
{| class="wikitable"
|+ style=white-space:nowrap | Назначение полей запроса
|-
|-
!Поле
!Поле
!Описание
!Описание
|-
|-
|<code>action</code>
|id
|<code>remove</code>
|-
|<code>id</code>
|Идентификатор удаляемого контейнера. Обязательное
|Идентификатор удаляемого контейнера. Обязательное
|-
|-
|<code>type</code>
|type
|Тип удаляемого контейнера. Используется для поиска контейнера вместе с id. Необязательное. Допустимые значения: <code>project</code>, <code>branch</code>, <code>project-group</code>
|Тип удаляемого контейнера. Используется для поиска контейнера вместе с id. Необязательное. Допустимые значения: '''project''', '''branch''', '''project-group'''
|-
|-
|<code>name</code>
|name
|Не используется
|Не используется
|-
|-
|<code>parent</code>
|parent
|Не используется
|Не используется
|-
|-
|<code>review_with_comment</code>
|review_with_comment
|Не используется
|Не используется
|}
|}


== <code>POST /api/public/admin/server/project-groups</code> - управление составом групп проектов ==
== <code>POST /api/public/admin/server/project-groups</code> управление составом групп проектов ==


Формат запроса:
Формат запроса:
Line 238: Line 213:
</pre>
</pre>


Назначение полей запроса и ответа зависит от типа операции и определяется значением поля <code>action</code>.
Назначение полей запроса и ответа зависит от типа операции и определяется значением поля '''action'''.


{| class="wikitable"
{| class="wikitable"
|+ style=white-space:nowrap | Поддерживаемыe значения поля <code>action</code>
|+ style=white-space:nowrap | Поддерживаемыe значения поля action
|-
|-
!Значение
!Значение
!Тип операции
!Тип операции
|-
|-
|<code>get</code>
|get
|Получение экземпляра группы проектов
|Получение экземпляра группы проектов
|-
|-
|<code>add-project-to-group</code>
|add-project-to-group
|Добавление проекта в группу проектов
|Добавление проекта в группу проектов
|-
|-
|<code>remove-project-from-group</code>
|remove-project-from-group
|Исключение проекта из группы проектов
|Исключение проекта из группы проектов
|}
|}


=== Получение экземпляра группы проектов: "action": "get" ===
=== Получение экземпляра группы проектов "action": "get" ===


{| class="wikitable"
{| class="wikitable"
|+ style=white-space:nowrap | Назначение полей запроса
|-
|-
!Поле
!Поле
!Описание
!Описание
|-
|-
|<code>action</code>
|project_group_name_or_id
|<code>get</code>
|Название или идентификатор запрашиваемой группы проектов
{{Note|text=Поддержка названия добавлена после версии 9.0.2}}
|-
|-
|<code>project_group_name_or_id</code>
|project_name_or_id
|Название или идентификатор запрашиваемой группы проектов. {{Note|text= Поддержка названия добавлена ПОСЛЕ версии 9.0.2}}
|-
|<code>project_name_or_id</code>
|Не используется
|Не используется
|}
|}


=== Добавление проекта в группу проектов: "action": "add-project-to-group" ===
=== Добавление проекта в группу проектов "action": "add-project-to-group" ===


{| class="wikitable"
{| class="wikitable"
|+ style=white-space:nowrap | Назначение полей запроса
|-
|-
!Поле
!Поле
!Описание
!Описание
|-
|-
|<code>action</code>
|project_group_name_or_id
|<code>add-project-to-group</code>
|-
|<code>project_group_name_or_id</code>
|Название или идентификатор изменяемой группы проектов
|Название или идентификатор изменяемой группы проектов
|-
|-
|<code>project_name_or_id</code>
|project_name_or_id
|Название или идентификатор добавляемого проекта
|Название или идентификатор добавляемого проекта
|}
|}


=== Исключение проекта из группы проектов: "action": "remove-project-from-group" ===
=== Исключение проекта из группы проектов "action": "remove-project-from-group" ===


{| class="wikitable"
{| class="wikitable"
|+ style=white-space:nowrap | Назначение полей запроса
|-
|-
!Поле
!Поле
!Описание
!Описание
|-
|-
|<code>action</code>
|project_group_name_or_id
|<code>remove-project-from-group</code>
|-
|<code>project_group_name_or_id</code>
|Название или идентификатор изменяемой группы проектов
|Название или идентификатор изменяемой группы проектов
|-
|-
|<code>project_name_or_id</code>
|project_name_or_id
|Название или идентификатор исключаемого проекта
|Название или идентификатор исключаемого проекта
|}
|}
Line 317: Line 281:
$ curl --data '{"action": "get", "project_group_name_or_id": "projectGroupA"}' -X POST http://localhost:8080/api/public/admin/server/project-groups
$ curl --data '{"action": "get", "project_group_name_or_id": "projectGroupA"}' -X POST http://localhost:8080/api/public/admin/server/project-groups
{"action":"get","project_group_id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","project_group_name":"projectGroupA"}
{"action":"get","project_group_id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","project_group_name":"projectGroupA"}
</pre>
 
<pre>
$ curl --data '{"action": "add-project-to-group", "project_name_or_id": "iptables", "project_group_name_or_id": "projectGroupA"}' -X POST http://localhost:8080/api/public/admin/server/project-groups
$ curl --data '{"action": "add-project-to-group", "project_name_or_id": "iptables", "project_group_name_or_id": "projectGroupA"}' -X POST http://localhost:8080/api/public/admin/server/project-groups
{"action":"add-project-to-group","project_group_id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","project_group_name":"projectGroupA","project_id":"a8e0352c-0408-417c-8fd0-4fbe03f38980","project_name":"iptables"}
{"action":"add-project-to-group","project_group_id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","project_group_name":"projectGroupA","project_id":"a8e0352c-0408-417c-8fd0-4fbe03f38980","project_name":"iptables"}
</pre>
 
<pre>
$ curl --data '{"action": "remove-project-from-group", "project_name_or_id": "iptables", "project_group_name_or_id": "projectGroupA"}' -X POST http://localhost:8080/api/public/admin/server/project-groups
$ curl --data '{"action": "remove-project-from-group", "project_name_or_id": "iptables", "project_group_name_or_id": "projectGroupA"}' -X POST http://localhost:8080/api/public/admin/server/project-groups
{"action":"remove-project-from-group","project_group_id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","project_group_name":"projectGroupA","project_id":"a8e0352c-0408-417c-8fd0-4fbe03f38980","project_name":"iptables"}
{"action":"remove-project-from-group","project_group_id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","project_group_name":"projectGroupA","project_id":"a8e0352c-0408-417c-8fd0-4fbe03f38980","project_name":"iptables"}
</pre>
</pre>

Latest revision as of 18:59, 28 October 2024

Управление контейнерами (проектами, ветками, группами проектов)

В данном разделе содержится описание REST API управления контейнерами и их содержимым.

Для выполнения операций получения списка контейнеров, их создания, изменения и удаления существует http-ресурс

POST /api/public/admin/server/containers

Для операций управления составом групп проектов существует http-ресурс

POST /api/public/admin/server/project-groups

Для операции переименования снимков существует http-ресурс

PUT /api/public/snapshots/{snapshot_id}/update
Для использования ресурсов необходимо использовать http-запросы с токеном пользователя имеющего соответствующие права

POST /api/public/admin/server/containers — управление набором проектов, веток, групп проектов

Формат запроса:

{
  "action": "string",
  "id": "string",
  "type": "string",
  "name": "string",
  "parent": "string",
  "review_with_comment": true
}

Формат ответа:

{
  "Containers": [
    {
      "action": "string",
      "id": "string",
      "name": "string",
      "parent": "string",
      "review_with_comment": true,
      "type": "string"
    }
  ]
}

Назначение полей запроса и установка значений полей ответа зависит от типа операции и определяется значением поля запроса action.

Поддерживаемыe значения поля action
Значение Тип операции
list Получение списка контейнеров
add Создание контейнера
update Изменение контейнера
remove Удаление контейнера

Получение списка контейнеров — "action": "list"

Поле Описание
id Если не пустое: идентификатор контейнера, для которого будут загружены "связанные" контейнеры:
- если передан id группы проектов — вернётся список проектов входящих в данную группу
- если передан id проекта — вернётся список групп проектов, в который входит проект + список его веток
- если передан id ветки — вернётся список снимков данной ветки
type Допустимые значения: project, branch, project-group

Если не пустое: отфильтровывает список контейнеров по типу

Если пустое:

- если поле id пустое — возвращается объединённый список проектов и групп проектов
name Если не пустое:
- если поле id пустое — отфильтровывает список контейнеров по названию
- если поле id не пустое — фильтр по названию не применяется
parent Не используется
review_with_comment Не используется

Примеры запросов с "action": "list"

$ curl --data '{"action": "list"}' -X POST http://localhost:8080/api/public/admin/server/containers
{"Containers":[{"id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","name":"projectGroupA","type":"project-group"},{"id":"20706313-6986-4c9d-9a4e-5e4908a11499","name":"projectGroupB","type":"project-group"},{"id":"a7e22042-96e5-4659-b21a-0615d434bed7","name":"bash","type":"project"},{"id":"a8e0352c-0408-417c-8fd0-4fbe03f38980","name":"iptables","type":"project"},{"id":"d53b0b92-d0fb-429a-8f86-c8fe6ee50c0c","name":"proftpd","type":"project"}]}

$ curl --data '{"action": "list", "type": "project-group"}' -X POST http://localhost:8080/api/public/admin/server/containers
{"Containers":[{"id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","name":"projectGroupA","type":"project-group"},{"id":"20706313-6986-4c9d-9a4e-5e4908a11499","name":"projectGroupB","type":"project-group"}]}

$ curl --data '{"action": "list", "name": "bas"}' -X POST http://localhost:8080/api/public/admin/server/containers
{"Containers":[{"id":"a7e22042-96e5-4659-b21a-0615d434bed7","name":"bash","type":"project"}]}

$ curl --data '{"action": "list", "id":"a7e22042-96e5-4659-b21a-0615d434bed7"}' -X POST http://localhost:8080/api/public/admin/server/containers
{"Containers":[{"id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","name":"projectGroupA","type":"project-group"},{"id":"ef9210db-180b-4351-8a2f-7e8ceaa42ec6","name":"master","type":"branch","parent":"a7e22042-96e5-4659-b21a-0615d434bed7"}]}

Создание контейнера — "action": "add"

Поле Описание
id Не используется
type Тип нового контейнера. Обязательное. Допустимые значения: project, branch, project-group
name Название нового контейнера. Обязательное
parent Название или идентификатор проекта, в котором будет создана новая ветка

Если тип нового контейнера не branch, не используется

review_with_comment Значение настройки проекта "Обязательный комментарий при разметке"

Если тип нового контейнера не project, не используется

Изменение контейнера — "action": "update"

Поле Описание
id Идентификатор изменяемого контейнера. Обязательное
type Тип изменяемого контейнера. Используется для поиска контейнера вместе с id. Изменить тип контейнера нельзя. Необязательное. Допустимые значения: project, branch, project-group
name Новое название контейнера. Обязательное
parent Не используется. Изменить проект в котором создана ветка нельзя
review_with_comment Новое значение настройки проекта "Обязательный комментарий при разметке"

Удаление контейнера — "action": "remove"

Поле Описание
id Идентификатор удаляемого контейнера. Обязательное
type Тип удаляемого контейнера. Используется для поиска контейнера вместе с id. Необязательное. Допустимые значения: project, branch, project-group
name Не используется
parent Не используется
review_with_comment Не используется

POST /api/public/admin/server/project-groups — управление составом групп проектов

Формат запроса:

{
  "action": "string",
  "project_group_name_or_id": "string",
  "project_name_or_id": "string"
}

Формат ответа:

{
  "action": "string",
  "project_group_id": "string",
  "project_group_name": "string",
  "project_id": "string",
  "project_name": "string"
}

Назначение полей запроса и ответа зависит от типа операции и определяется значением поля action.

Поддерживаемыe значения поля action
Значение Тип операции
get Получение экземпляра группы проектов
add-project-to-group Добавление проекта в группу проектов
remove-project-from-group Исключение проекта из группы проектов

Получение экземпляра группы проектов — "action": "get"

Поле Описание
project_group_name_or_id Название или идентификатор запрашиваемой группы проектов
Поддержка названия добавлена после версии 9.0.2
project_name_or_id Не используется

Добавление проекта в группу проектов — "action": "add-project-to-group"

Поле Описание
project_group_name_or_id Название или идентификатор изменяемой группы проектов
project_name_or_id Название или идентификатор добавляемого проекта

Исключение проекта из группы проектов — "action": "remove-project-from-group"

Поле Описание
project_group_name_or_id Название или идентификатор изменяемой группы проектов
project_name_or_id Название или идентификатор исключаемого проекта

Примеры запросов управления составом групп

$ curl --data '{"action": "get", "project_group_name_or_id": "0f7da122-9c86-4384-b7bc-356bfb3b7f28"}' -X POST http://localhost:8080/api/public/admin/server/project-groups
{"action":"get","project_group_id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","project_group_name":"projectGroupA"}

$ curl --data '{"action": "get", "project_group_name_or_id": "projectGroupA"}' -X POST http://localhost:8080/api/public/admin/server/project-groups
{"action":"get","project_group_id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","project_group_name":"projectGroupA"}

$ curl --data '{"action": "add-project-to-group", "project_name_or_id": "iptables", "project_group_name_or_id": "projectGroupA"}' -X POST http://localhost:8080/api/public/admin/server/project-groups
{"action":"add-project-to-group","project_group_id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","project_group_name":"projectGroupA","project_id":"a8e0352c-0408-417c-8fd0-4fbe03f38980","project_name":"iptables"}

$ curl --data '{"action": "remove-project-from-group", "project_name_or_id": "iptables", "project_group_name_or_id": "projectGroupA"}' -X POST http://localhost:8080/api/public/admin/server/project-groups
{"action":"remove-project-from-group","project_group_id":"0f7da122-9c86-4384-b7bc-356bfb3b7f28","project_group_name":"projectGroupA","project_id":"a8e0352c-0408-417c-8fd0-4fbe03f38980","project_name":"iptables"}