1462 lines
49 KiB
JSON
1462 lines
49 KiB
JSON
{
|
|
"swagger": "2.0",
|
|
"info": {
|
|
"title": "NodeMaster API",
|
|
"description": "API for managing a node, its services, and a cluster of remote nodes.\n",
|
|
"version": "1.0.0",
|
|
"contact": {
|
|
"email": "yves.cerezal@irt-saintexupery.com"
|
|
},
|
|
"license": {
|
|
"name": "Apache 2.0",
|
|
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
|
|
}
|
|
},
|
|
"basePath": "/v1",
|
|
"paths": {
|
|
"/node/": {
|
|
"get": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "get current node info including runtime config_file path\n\u003cbr\u003e",
|
|
"operationId": "NodeController.GetNode",
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.NodeInfo"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"put": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "update current node hostname, description, or restic_password (the repository password used to encrypt/decrypt all restic backup targets on this node)\n\u003cbr\u003e",
|
|
"operationId": "NodeController.UpdateNode",
|
|
"parameters": [
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "fields to update",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.NodeInfo"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "{string} update success"
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/node/backup": {
|
|
"get": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "get node backup configuration\n\u003cbr\u003e",
|
|
"operationId": "NodeController.GetBackup",
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupConfig"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"put": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "update node backup configuration\n\u003cbr\u003e",
|
|
"operationId": "NodeController.UpdateBackup",
|
|
"parameters": [
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "backup config",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupConfig"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "{string} update success"
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/node/backup/progress": {
|
|
"get": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "get the current/last run state for every node backup target\n\u003cbr\u003e",
|
|
"operationId": "NodeController.GetBackupProgress",
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.RunState"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/node/backup/run": {
|
|
"post": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "trigger an immediate node backup across all targets (asynchronous)\n\u003cbr\u003e",
|
|
"operationId": "NodeController.RunBackup",
|
|
"responses": {
|
|
"202": {
|
|
"description": "{string} backup started"
|
|
},
|
|
"400": {
|
|
"description": "no targets configured"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/node/backup/targets": {
|
|
"get": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "list node backup target definitions\n\u003cbr\u003e",
|
|
"operationId": "NodeController.GetBackupTargets",
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "define a new node backup target\n\u003cbr\u003e",
|
|
"operationId": "NodeController.AddBackupTarget",
|
|
"parameters": [
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "backup target definition",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/node/backup/targets/{tid}": {
|
|
"get": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "get a node backup target by id\n\u003cbr\u003e",
|
|
"operationId": "NodeController.GetBackupTarget",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "tid",
|
|
"description": "backup target id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
},
|
|
"put": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "update a node backup target definition\n\u003cbr\u003e",
|
|
"operationId": "NodeController.PutBackupTarget",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "tid",
|
|
"description": "backup target id",
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "updated backup target",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "delete a node backup target definition\n\u003cbr\u003e",
|
|
"operationId": "NodeController.DeleteBackupTarget",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "tid",
|
|
"description": "backup target id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "{string} delete success"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/node/backup/targets/{tid}/progress": {
|
|
"get": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "get the current/last run state for a node backup target\n\u003cbr\u003e",
|
|
"operationId": "NodeController.GetBackupTargetProgress",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "tid",
|
|
"description": "backup target id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.RunState"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/node/backup/targets/{tid}/run": {
|
|
"post": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "trigger an immediate backup for a single node target (asynchronous)\n\u003cbr\u003e",
|
|
"operationId": "NodeController.RunBackupTarget",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "tid",
|
|
"description": "backup target id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"202": {
|
|
"description": "{string} backup started"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/node/scan": {
|
|
"post": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "scan compose folders and index discovered services; accepts optional {\"folder\":\"/path\"} body\n\u003cbr\u003e",
|
|
"operationId": "NodeController.Scan",
|
|
"parameters": [
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "optional folder override",
|
|
"schema": {
|
|
"$ref": "#/definitions/object"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.ScanResult"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/node/updates": {
|
|
"get": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "list update history\n\u003cbr\u003e",
|
|
"operationId": "NodeController.GetUpdates",
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.UpdateRecord"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "record a new update entry\n\u003cbr\u003e",
|
|
"operationId": "NodeController.AddUpdate",
|
|
"parameters": [
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "update record",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.UpdateRecord"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.UpdateRecord"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/node/updates/{id}": {
|
|
"get": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "get a single update record\n\u003cbr\u003e",
|
|
"operationId": "NodeController.GetUpdate",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "update record id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.UpdateRecord"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": [
|
|
"node"
|
|
],
|
|
"description": "delete an update record\n\u003cbr\u003e",
|
|
"operationId": "NodeController.DeleteUpdate",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "update record id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "{string} delete success"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/nodes/": {
|
|
"get": {
|
|
"tags": [
|
|
"nodes"
|
|
],
|
|
"description": "list all registered remote nodes\n\u003cbr\u003e",
|
|
"operationId": "NodesController.GetAllNodes",
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.RemoteNode"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"nodes"
|
|
],
|
|
"description": "register a remote node\n\u003cbr\u003e",
|
|
"operationId": "NodesController.AddNode",
|
|
"parameters": [
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "node to register",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.RemoteNode"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.RemoteNode"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/nodes/aggregated": {
|
|
"get": {
|
|
"tags": [
|
|
"nodes"
|
|
],
|
|
"description": "query all registered nodes for their services and return an aggregated view\n\u003cbr\u003e",
|
|
"operationId": "NodesController.GetAggregated",
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/nodeServices"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/nodes/{id}": {
|
|
"get": {
|
|
"tags": [
|
|
"nodes"
|
|
],
|
|
"description": "get a remote node by id\n\u003cbr\u003e",
|
|
"operationId": "NodesController.GetNode",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "node id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.RemoteNode"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
},
|
|
"put": {
|
|
"tags": [
|
|
"nodes"
|
|
],
|
|
"description": "update a remote node\n\u003cbr\u003e",
|
|
"operationId": "NodesController.UpdateNode",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "node id",
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "updated node data",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.RemoteNode"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.RemoteNode"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": [
|
|
"nodes"
|
|
],
|
|
"description": "delete a remote node\n\u003cbr\u003e",
|
|
"operationId": "NodesController.DeleteNode",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "node id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "{string} delete success"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/services/": {
|
|
"get": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "list all services\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.GetAllServices",
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.Service"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "register a new service\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.AddService",
|
|
"parameters": [
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "service definition",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.Service"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.Service"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/services/{id}": {
|
|
"get": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "get a service by id\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.GetService",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.Service"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
},
|
|
"put": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "update a service definition\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.UpdateService",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "updated service data",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.Service"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.Service"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "delete a service\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.DeleteService",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "{string} delete success"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/services/{id}/backup": {
|
|
"post": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "trigger an immediate backup for a service across all targets (asynchronous)\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.BackupService",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"202": {
|
|
"description": "{string} backup started"
|
|
},
|
|
"400": {
|
|
"description": "no backup configured"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/services/{id}/backup/progress": {
|
|
"get": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "get the current/last run state for every backup target of a service\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.GetServiceBackupProgress",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.RunState"
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/services/{id}/backup/targets": {
|
|
"get": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "list a service's backup target definitions\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.GetServiceBackupTargets",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "define a new backup target for a service\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.AddServiceBackupTarget",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "backup target definition",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/services/{id}/backup/targets/{tid}": {
|
|
"get": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "get a service backup target by id\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.GetServiceBackupTarget",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"in": "path",
|
|
"name": "tid",
|
|
"description": "backup target id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
},
|
|
"put": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "update a service backup target definition\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.PutServiceBackupTarget",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"in": "path",
|
|
"name": "tid",
|
|
"description": "backup target id",
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"in": "body",
|
|
"name": "body",
|
|
"description": "updated backup target",
|
|
"required": true,
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "invalid body"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "delete a service backup target definition\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.DeleteServiceBackupTarget",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"in": "path",
|
|
"name": "tid",
|
|
"description": "backup target id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "{string} delete success"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/services/{id}/backup/targets/{tid}/progress": {
|
|
"get": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "get the current/last run state for a service backup target\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.GetServiceBackupTargetProgress",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"in": "path",
|
|
"name": "tid",
|
|
"description": "backup target id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"schema": {
|
|
"$ref": "#/definitions/models.RunState"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/services/{id}/backup/targets/{tid}/run": {
|
|
"post": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "trigger an immediate backup for a single service target (asynchronous)\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.RunServiceBackupTarget",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"in": "path",
|
|
"name": "tid",
|
|
"description": "backup target id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"202": {
|
|
"description": "{string} backup started"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/services/{id}/start": {
|
|
"post": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "start a service via its compose file\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.StartService",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "{string} started"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/services/{id}/stop": {
|
|
"post": {
|
|
"tags": [
|
|
"services"
|
|
],
|
|
"description": "stop a service via its compose file\n\u003cbr\u003e",
|
|
"operationId": "ServicesController.StopService",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"description": "service id",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "{string} stopped"
|
|
},
|
|
"404": {
|
|
"description": "not found"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"definitions": {
|
|
"models.BackupConfig": {
|
|
"title": "BackupConfig",
|
|
"type": "object",
|
|
"properties": {
|
|
"history": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.BackupExecution"
|
|
}
|
|
},
|
|
"last_run": {
|
|
"description": "aggregate: latest LastRun across Targets",
|
|
"type": "string",
|
|
"format": "datetime"
|
|
},
|
|
"next_run": {
|
|
"description": "aggregate: earliest NextRun across Targets",
|
|
"type": "string",
|
|
"format": "datetime"
|
|
},
|
|
"source_path": {
|
|
"type": "string"
|
|
},
|
|
"targets": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.BackupTarget"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"models.BackupExecution": {
|
|
"title": "BackupExecution",
|
|
"type": "object",
|
|
"properties": {
|
|
"duration_seconds": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
},
|
|
"success": {
|
|
"type": "boolean"
|
|
},
|
|
"target_id": {
|
|
"type": "string"
|
|
},
|
|
"timestamp": {
|
|
"type": "string",
|
|
"format": "datetime"
|
|
}
|
|
}
|
|
},
|
|
"models.BackupMethod": {
|
|
"title": "BackupMethod",
|
|
"type": "string",
|
|
"enum": [
|
|
"MethodRsync = \"rsync\"",
|
|
"MethodRestic = \"restic\"",
|
|
"MethodExternal = \"external\""
|
|
],
|
|
"example": "rsync"
|
|
},
|
|
"models.BackupTarget": {
|
|
"title": "BackupTarget",
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"last_run": {
|
|
"type": "string",
|
|
"format": "datetime"
|
|
},
|
|
"method": {
|
|
"$ref": "#/definitions/models.BackupMethod"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"next_run": {
|
|
"type": "string",
|
|
"format": "datetime"
|
|
},
|
|
"params": {
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"remote": {
|
|
"description": "destination: rsync target path (e.g. \"user@host:/path\") or restic repository string (e.g. \"/mnt/backup/repo\", \"s3:s3.amazonaws.com/bucket/path\", \"sftp:user@host:/path\")",
|
|
"type": "string"
|
|
},
|
|
"schedule": {
|
|
"description": "cron expression (5-field, standard). Empty = manual-only.",
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"models.NodeInfo": {
|
|
"title": "NodeInfo",
|
|
"type": "object",
|
|
"properties": {
|
|
"backup": {
|
|
"$ref": "#/definitions/models.BackupConfig"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"hostname": {
|
|
"type": "string"
|
|
},
|
|
"restic_password": {
|
|
"description": "repository password used to encrypt/decrypt all restic backup targets on this node",
|
|
"type": "string"
|
|
},
|
|
"update_history": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.UpdateRecord"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"models.RemoteNode": {
|
|
"title": "RemoteNode",
|
|
"type": "object",
|
|
"properties": {
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"last_seen": {
|
|
"type": "string",
|
|
"format": "datetime"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"status": {
|
|
"type": "string"
|
|
},
|
|
"tags": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"url": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"models.RunState": {
|
|
"title": "RunState",
|
|
"type": "object",
|
|
"properties": {
|
|
"eta": {
|
|
"type": "string"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
},
|
|
"method": {
|
|
"$ref": "#/definitions/models.BackupMethod"
|
|
},
|
|
"percent": {
|
|
"type": "number",
|
|
"format": "double"
|
|
},
|
|
"running": {
|
|
"type": "boolean"
|
|
},
|
|
"started_at": {
|
|
"type": "string",
|
|
"format": "datetime"
|
|
},
|
|
"target_id": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"models.ScanResult": {
|
|
"title": "ScanResult",
|
|
"type": "object",
|
|
"properties": {
|
|
"created": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.ServiceScanInfo"
|
|
}
|
|
},
|
|
"errors": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"found": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"scanned_paths": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"updated": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/models.ServiceScanInfo"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"models.Service": {
|
|
"title": "Service",
|
|
"type": "object",
|
|
"properties": {
|
|
"backup": {
|
|
"$ref": "#/definitions/models.BackupConfig"
|
|
},
|
|
"backup_folder": {
|
|
"type": "string"
|
|
},
|
|
"compose_file": {
|
|
"type": "string"
|
|
},
|
|
"compose_type": {
|
|
"type": "string"
|
|
},
|
|
"external_backup_start_minutes": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"external_backup_stop_minutes": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"status": {
|
|
"description": "\"up\", \"down\", \"unknown\"",
|
|
"type": "string"
|
|
},
|
|
"stop_on_backup": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
},
|
|
"models.ServiceScanInfo": {
|
|
"title": "ServiceScanInfo",
|
|
"type": "object",
|
|
"properties": {
|
|
"backup_folder": {
|
|
"type": "string"
|
|
},
|
|
"compose_file": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"status": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"models.UpdateRecord": {
|
|
"title": "UpdateRecord",
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
},
|
|
"packages": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"success": {
|
|
"type": "boolean"
|
|
},
|
|
"timestamp": {
|
|
"type": "string",
|
|
"format": "datetime"
|
|
}
|
|
}
|
|
},
|
|
"nodeServices": {
|
|
"title": "nodeServices",
|
|
"type": "object"
|
|
},
|
|
"object": {
|
|
"title": "object",
|
|
"type": "object"
|
|
}
|
|
},
|
|
"tags": [
|
|
{
|
|
"name": "node",
|
|
"description": "NodeController manages the current host node.\n"
|
|
},
|
|
{
|
|
"name": "nodes",
|
|
"description": "NodesController manages the registry of remote nodes.\n"
|
|
},
|
|
{
|
|
"name": "services",
|
|
"description": "ServicesController manages services on this host.\n"
|
|
}
|
|
]
|
|
} |